只是为了确保: LLVM bitcode是跨平台的吗?我的意思是,生成的IR (".bc")文件可以在各种平台上分发和解释/JITed吗?
如果是这样的话,如何将C++转换成独立于平台的代码?而在C++语言本身中,在实际编译之前,需要使用预处理器来确定其目标平台。
发布于 2013-01-10 22:24:52
LLVM IR可以是跨平台的,除了其他人列出的明显例外。然而,这并不意味着Clang会生成跨平台代码。正如您注意到的,预处理器几乎普遍用于仅将部分代码传递给C/C++编译器,具体取决于平台。例如,如果在size_t是32位的平台上使用size_t将C代码编译为LLVM,那么LLVM现在就会使用i32来解决这个问题,而且在地狱中也没有办法通过反向工程来修复它。
谷歌的Portable Native Client项目(感谢@willglynn的链接),如果我理解正确的话,通过修复所有目标平台的ABI来实现可移植性。因此,从这个意义上说,它没有解决上述问题: LLVM IR不能移植到具有不同ABI的平台上。其可移植性更好的唯一原因是客户端提供了一个将PNaCl ABI与实际ABI相匹配的层。换句话说,PNaCl代码不能移植到许多平台上,而"PNaCl VM“却可以。
所以,归根结底:如果你非常小心,你可以在多个平台上使用LLVM IR,但不能不做重要的额外工作( Clang不做)来抽象ABI差异。
发布于 2013-01-10 21:31:13
给出一个IR文件,我能确定它能编译成我的目标吗?
您不能假设任意IR文件总是跨平台的,因为给定文件中的某些内容可能不是平台独立的。最值得注意的例子是IR可以包含实际的组装器序列(通过module-level或inline组装段),但还有其他示例-例如使用目标特定的内部函数或仅在某些目标上支持的调用约定。
是否可以生成保证在所有目标上都能编译的IR文件?
我不知道,但我相信你可以,特别是如果你避免指定内联汇编,调用约定,类型的必需/首选ABI等。这会影响编译器将执行的优化。
https://stackoverflow.com/questions/14258194
复制相似问题