LLVM bitcode跨平台

Tim*_*Tim 15 c++ cross-platform llvm

只是为了确定:LLVM bitcode是否跨平台?我的意思是,生成的IR(".bc")文件可以在各种平台上进行分解和解释/ JIT吗?

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

小智 19

LLVM IR可以是跨平台的,其他人列出的明显例外.但是,这并不意味着Clang会生成跨平台代码.如您所知,预处理器几乎普遍用于仅将部分代码传递给C/C++编译器,具体取决于平台.即使在用户代码中没有这样做,许多系统头文件也包含一些或两个特定于平台的头文件,例如typedefs.例如,如果您size_tsize_t32位平台上使用LLVM IR 编译C代码,那么LLVM IR现在就可以使用i32它,并且您无法对其进行反向工程来修复它.

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

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

  • Portable Native Client 的链接返回 404。 (2认同)

Oak*_*Oak 9

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

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

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

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