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

时间:2014-03-05 05:58:04

标签: gcc llvm code-analysis static-analysis llvm-ir

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

1 个答案:

答案 0 :(得分:0)

对于整个程序持有IR是正确的,这是有问题的。当前的技术水平是gold linker,它负责在GCC和LLVM中实现整个程序优化。 Its early whole-program optimization design draft是我发现它如何运作的最佳描述,但自2007年以来当然发生了很多变化。

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

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

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

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

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

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