静态分析中的中间表示(IR)内存管理



我很想知道:在过程间数据流分析过程中,IR的内存管理目前的技术状况如何。我想知道在分析过程中,完整代码的IR是否驻留在内存中,或者应用一些内存管理技术在任何时刻加载和卸载IR。在llvm/gcc基础设施的上下文中,如何将任何分析扩展到数百万行代码。

您正确地认为,为整个程序保留IR是有问题的。目前的技术状态是黄金链接器,它负责在GCC和LLVM中实现整个程序的优化。它早期的整个程序优化设计草案是我发现的对其工作方式的最好描述,当然自2007年以来发生了很多变化。

一般来说,它有三个阶段:

  1. 每个编译单元都被单独编译和优化为一个对象文件*。这里的优化可以包括过程间优化,但这些优化不跨越编译单元边界。

  2. 链接器分析所有对象文件,并为整个程序构建一个控制流图。这是内存密集型的,但可以管理——这里不需要全功能代码。然后决定链接器应该执行哪些转换。

  3. 链接器执行步骤(2)中决定的转换。每一个都是本地化的,因此只需要加载整个程序代码的有限子集。

步骤(1)和(3)由许多可以并行执行的任务组成。

*使用编译器IR处理常规对象文件时,可以实现更好的优化。在GCC中,它通过将IR嵌入到对象文件中来工作;在LLVM中,它只需将LLVM IR文件作为对象文件提供给链接器即可工作。在这两种情况下,这都是通过使用链接器的插件来启用的

最新更新