难以理解LLVM文本IR与跨版本的二进制表示之间的兼容性的不对称性

时间:2017-07-17 23:15:01

标签: compilation llvm bytecode llvm-ir bitcode

在阅读有关LLVM及其自身文档的各种文章时,我已经看到了对属性的引用,我发现它的IR的向后兼容性很奇怪。

有关IR的大部分文件都提到它不稳定,几乎可以在任何时候破坏。但是,它也经常提到bitcode IR比给定特定LLVM版本的文本IR更向后兼容(因为在更多版本中通常有效)#。

我的理解是字节码 - > bitcode转换几乎是一种直接映射。知道这一点,为什么/文本IR不兼容的原因是什么?我似乎无法找到驱动此行为的实际机制的文档。

关于IR兼容性的这种陈述的一个例子可以在这里找到:Documentation

2 个答案:

答案 0 :(得分:1)

作为开发人员而不是开发LLVM的人。

正如您所想象的那样,bitcode更像是一个虚拟机,其特定指令设置为64位,直到量子计算机指令很受欢迎,很少会改变。随着新的64位芯片的逐步增强功能的推出,并不是一个大手术来追加'新的bitcode处理。

另一方面,IR是一个文本表示,它将通过一个或多个传递来获取bitcode或机器代码。为了支持新功能,显然有一个网络添加' (新指示)以及对现有的修改。这不仅会影响IR解析器/发射器,还会影响它们之间使用的许多中间/短暂数据模型。显然,这也会影响C / C ++ LLVM API。非常昂贵的命题确实可以保持向后兼容性。

答案 1 :(得分:1)

我认为LLVM开发人员选择来承诺更多的bitcode兼容性,因为有更多明显的用例可以从后向兼容的bitcode中获益,而不是文本表示。

例如,您可以将库存储和分发为LLVM bitcode,并将它们加载到用户语言的某种即时编译解释器中。每当升级翻译时,必须升级bitcode可能不方便。 Bitcode是一个机器接口,在定义良好的兼容性方面更有用。

文本LLVM IR更常用于LLVM的调试,文档或内部测试,其中每当(不频繁)更改表示时更改任何失败代码更为实际。中间代码似乎不太可能长期存储或广泛分发。

由于保持向后兼容性会对实现工作(例如,参见C ++解析器)和语言的未来发展产生负面影响(想想现代编程语言为处理过去的回顾性不明智决策所做的努力), LLVM社区选择只在有明显好处时才这样做。我不认为格式中存在固有的技术原因,因为两种格式都必须正确解析和处理。