LLVM Language Reference表示可以使用
作为磁盘上的bitcode表示(适合Just-In-Time编译器快速加载)
这种表现有多稳定?例如,我今天可以使用LLVM 3.1生成它,并且仍然期望它可以使用未来的LLVM,比如三年假设的LLVM 4.5吗?
假设我没有外部依赖项,我可以使用它为不同的架构生成二进制文件吗?
答案 0 :(得分:8)
回答你的第一个问题:不。它不稳定。不,你不能指望由3.1生成的IR / bitcode在4.5中可读 - LLVM项目明确地没有做出这种保证,牺牲了向后兼容性,有利于更快地向前推进,创建更好的优化和工具,以及重构根据需要构建框架的一部分。 LLVM主要针对静态,提前(AOT)编译器,因此这种方法对大型播放器有意义。
我不太懂的第二个问题。 LLVM具有许多体系结构的目标(后端),并且适用于大多数流行的体系结构。但同样,他们的输入是IR,可能会在发布之间发生变化。另请务必阅读:http://llvm.org/docs/FAQ.html#can-i-compile-c-or-c-code-to-platform-independent-llvm-bitcode以及此处的“目标依赖”部分:https://llvm.org/docs/tutorial/LangImpl10.html
问题在于,当询问LLVM平台独立性时,许多人会问“从我的C代码编译的LLVM IR是否会与目标无关?”。答案是否定的,因为C本身是目标依赖的。
答案 1 :(得分:4)
回答您的第一个问题:这是LLVM开发者政策中的一个引用。
当必须更改IR格式时,请记住我们尝试保持一些向后兼容性。这些规则旨在平衡llvm用户的便利性,而不是给llvm开发人员带来很大的负担:
- 文本格式不向后兼容。我们不经常改变它,但没有具体的承诺。
- X.Y版本生成的bitcode格式将被以下所有X.Z版本和(X + 1).0版本读取。
- 较新的版本可以忽略旧版本中的功能,但不能错误编译它们。例如,如果nsw被替换为其他内容,则删除它将是升级IR的有效方法。
- 调试元数据的特殊之处在于它在升级过程中当前被删除。
- 非调试元数据被定义为可安全删除,因此升级它的有效方法是删除它。这不是非常用户友好,预计会有更多的努力,但没有任何承诺。