2014-03-05 94 views
1

我很好奇:在进程间数据流分析期间,IR的内存管理现状是什么。我想知道在分析过程中完整代码的IR驻留在内存中,或者在任何时刻应用一些内存管理技术来加载和卸载IR。 在llvm/gcc基础架构的情况下,如何将任何分析扩展为数百行代码。静态分析中的中间表示(IR)内存管理

回答

0

对于整个程序来说,保留IR是有问题的。目前的技术水平是gold linker,它负责在GCC和LLVM中实现整个程序优化。 Its early whole-program optimization design draft是我发现它是如何工作的最好的说明,但当然有很多已经自2007年以来

一般的改变,但有三个阶段:

  1. 每个编译单元编译和优化分开成一个目标文件*。这里的优化可以包括进程间优化,但是这些优化不会跨越编译单元边界。

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

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

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

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

+0

谢谢你的回答。根据我所研究的关于该主题的最新技术状态,通过聚类和分区可创建至少一百万行代码的调用图。问题仍然没有得到解决,那么是否仍然需要一个框架,可以通过IR的prpoer管理算法执行更复杂的过程间数据流分析,或者在文献中存在这样的信息。 – user3382041