LLVM汇编语言的稳定性如何?

时间:2013-04-05 14:24:59

标签: assembly llvm intermediate-language

LLVM Language Reference表示可以使用

  

作为磁盘上的bitcode表示(适合Just-In-Time编译器快速加载)

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

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

2 个答案:

答案 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的有效方法。
  •   
  • 调试元数据的特殊之处在于它在升级过程中当前被删除。
  •   
  • 非调试元数据被定义为可安全删除,因此升级它的有效方法是删除它。这不是非常用户友好,预计会有更多的努力,但没有任何承诺。
  •