1

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

4

1 回答 1

0

你是对的,为整个程序持有 IR 是有问题的。当前最先进的技术是黄金链接器,它负责在 GCC 和 LLVM 中启用整个程序优化。它早期的全程序优化设计草案是我发现的对其工作原理的最佳描述,当然自 2007 年以来发生了很多变化。

一般来说,它分为三个阶段:

  1. 每个编译单元都被单独编译和优化成一个目标文件*。此处的优化可以包括过程间优化,但不会跨越编译单元的界限。

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

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

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

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

于 2014-03-05T18:59:03.210 回答