20

只是为了确定:LLVM 位码是跨平台的吗?我的意思是,生成的 IR(“.bc”)文件可以在各种平台上分发和解释/JITed 吗?

如果是这样,Clang 如何将 C++ 转换为平台无关代码?而在 C++ 语言本身中,用于确定其目标平台的预处理器是在实际编译之前使用的。

4

2 回答 2

24

LLVM IR 可以是跨平台的,除了其他人列出的明显例外。但是,这并不意味着 Clang 会生成跨平台代码。正如您所注意到的,预处理器几乎普遍用于仅将部分代码传递给 C/C++ 编译器,具体取决于平台。即使在用户代码中没有这样做,许多系统头文件也会包含一两个特定于平台的头文件,例如typedefs。例如,如果您在32 位size_t平台上使用 LLVM IR编译 C 代码,则 LLVM IR 现在用于此目的,并且您无法通过逆向工程来修复它。size_ti32

如果我理解正确,Google 的Portable Native Client项目(感谢@willglynn 提供链接)通过修复所有目标平台的 ABI 来实现可移植性。所以从这个意义上说,它并没有解决上述问题:LLVM IR 不能移植到具有不同 ABI 的平台上。这更便携的唯一原因是客户端提供了一个将 PNaCl ABI 与实际 ABI 匹配的层。换句话说,PNaCl 代码不能移植到许多平台,“PNaCl VM”可以。

所以,底线:如果你非常小心,你可以在多个平台上使用 LLVM IR,但必须做大量的额外工作(Clang 不会做)来抽象 ABI 差异。

于 2013-01-10T14:24:51.630 回答
11

给定一个 IR 文件,我可以确定它可以编译到我的目标吗?

不能假设任意 IR 文件始终是跨平台的,因为给定文件中的某些内容可能不与平台无关。最值得注意的例子是 IR 可以包含实际的汇编程序序列(通过模块级内联汇编段),但还有其他例子 - 例如使用目标特定的内在函数或仅在某些目标上支持的调用约定。

我可以生成保证在所有目标上编译的 IR 文件吗?

我不知道,但我相信你可以,特别是如果你避免指定内联汇编、调用约定、类型的必需/首选 ABI 等内容。不过,它会影响编译器将执行的优化。

于 2013-01-10T13:31:12.940 回答