从gcc的中间文件编译目标文件

Met*_*est 5 c linux compiler-construction gcc backend

通过使用-fdump-tree-*标志,可以在编译源代码文件期间转储一些中间格式文件.我的问题是,如果可以使用该中间文件作为gcc的输入来获取最终的目标文件.

我问这个是因为我想在gimple的中间文件中添加一些代码(通过使用flag -fdump-tree-gimple获得)格式.当然我可以使用钩子并添加我自己的传球,但我不想达到那种复杂程度.我只想给gcc我修改过的中间文件,所以它可以从那里开始编译并给我最终的目标文件.任何想法如何实现这一目标?

osg*_*sgx 4

GIMPLE 是一种二进制内部格式,很难完全转储并正确重新加载回来。与 LLVM 相比,LLVM IR 被设计为可转储和可重新加载到普通文件中(此类文件的文本和二进制格式可以完全相互转换)。您可以运行 Clang fronted 来发出 LLVMIR,然后启动opt程序并进行一些优化,然后进行其他优化,阶段之间将会有 LLVM IR 位码文件。然后您可以开始从 IR 位码到本机代码的代码生成(甚至,理论上,到不同的平台,请参阅 PNaCI 项目)。

有一些转储/重新加载 GCC 内部表示的项目。我知道这样的项目是为了将 gcc 与商业编译器工具集成而创建的。作者不能直接将商业代码与gcc链接,因为gcc是VIRAL的(它会感染任何带有反商业GPL的链接代码)。因此,作者将 GIMPLE 的 GPL 转储器/加载器编写为某种外部(xml)格式;专有工具能够读取此 XML 并将其转换为相同格式的其他 XML,然后使用 GPL 工具重新加载回来。

在较新的 gcc 中,您可以选择编写插件,就 GPL 而言,该插件是 VIRAL (23.2.1) 。插件将在程序的内存表示上运行,并且不会出现通过外部文件转储/重新加载 GIMPLE 的问题。有一些插件可以配置/可以使用用户提供的程序,例如 MELT (Lisp) 和 GCC Python (Python)。那里有一些 gcc 插件列表