首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LLVM位码跨平台

LLVM位码跨平台
EN

Stack Overflow用户
提问于 2013-01-10 20:41:02
回答 2查看 7.6K关注 0票数 20

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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差异。

票数 24
EN

Stack Overflow用户

发布于 2013-01-10 21:31:13

给出一个IR文件,我能确定它能编译成我的目标吗?

您不能假设任意IR文件总是跨平台的,因为给定文件中的某些内容可能不是平台独立的。最值得注意的例子是IR可以包含实际的组装器序列(通过module-levelinline组装段),但还有其他示例-例如使用目标特定的内部函数或仅在某些目标上支持的调用约定。

是否可以生成保证在所有目标上都能编译的IR文件?

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14258194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档