6

LLVM 语言参考声明它可以用于

作为磁盘上的位码表示(适用于即时编译器的快速加载)

这种表示有多稳定?例如,我现在可以使用 LLVM 3.1 生成它,并且仍然期望它可以使用未来的 LLVM,比如三年后假设的 LLVM 4.5 吗?

假设我没有外部依赖项,我可以使用它为不同的架构生成二进制文件吗?

4

2 回答 2

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 本身是依赖于目标的。

于 2013-04-05T15:44:32.783 回答
4

回答你的第一个问题:这里引用了 LLVM 开发者政策。

当必须更改 IR 格式时,请记住,我们会尝试保持一些向后兼容性。这些规则旨在平衡 llvm 用户的便利性和不给 llvm 开发人员带来很大负担:

  • 文本格式不向后兼容。我们不会经常更改它,但没有具体的承诺。
  • XY 版本生成的位码格式将可由所有后续 XZ 版本和 (X+1).0 版本读取。
  • 较新的版本可以忽略旧版本的功能,但不能错误编译它们。例如,如果 nsw 曾经被其他东西替换,那么删除它将是升级 IR 的有效方法。
  • 调试元数据的特殊之处在于它当前在升级期间被丢弃。
  • 非调试元数据被定义为可以安全删除,因此升级它的有效方法是删除它。这对用户不是很友好,预计会付出更多的努力,但没有做出任何承诺。
于 2015-01-26T13:10:30.153 回答