只是为了确定:LLVM 位码是跨平台的吗?我的意思是,生成的 IR(“.bc”)文件可以在各种平台上分发和解释/JITed 吗?
如果是这样,Clang 如何将 C++ 转换为平台无关代码?而在 C++ 语言本身中,用于确定其目标平台的预处理器是在实际编译之前使用的。
只是为了确定:LLVM 位码是跨平台的吗?我的意思是,生成的 IR(“.bc”)文件可以在各种平台上分发和解释/JITed 吗?
如果是这样,Clang 如何将 C++ 转换为平台无关代码?而在 C++ 语言本身中,用于确定其目标平台的预处理器是在实际编译之前使用的。
LLVM IR 可以是跨平台的,除了其他人列出的明显例外。但是,这并不意味着 Clang 会生成跨平台代码。正如您所注意到的,预处理器几乎普遍用于仅将部分代码传递给 C/C++ 编译器,具体取决于平台。即使在用户代码中没有这样做,许多系统头文件也会包含一两个特定于平台的头文件,例如typedef
s。例如,如果您在32 位size_t
平台上使用 LLVM IR编译 C 代码,则 LLVM IR 现在用于此目的,并且您无法通过逆向工程来修复它。size_t
i32
如果我理解正确,Google 的Portable Native Client项目(感谢@willglynn 提供链接)通过修复所有目标平台的 ABI 来实现可移植性。所以从这个意义上说,它并没有解决上述问题:LLVM IR 不能移植到具有不同 ABI 的平台上。这更便携的唯一原因是客户端提供了一个将 PNaCl ABI 与实际 ABI 匹配的层。换句话说,PNaCl 代码不能移植到许多平台,“PNaCl VM”可以。
所以,底线:如果你非常小心,你可以在多个平台上使用 LLVM IR,但必须做大量的额外工作(Clang 不会做)来抽象 ABI 差异。