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

标签 c linux gcc compiler-construction backend

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

我问这个是因为我想在 gimple 的中间文件中添加一些代码(通过使用标志 -fdump-tree-gimple 获得)格式.当然,我可以使用 Hook 并添加我自己的通行证,但我还不想达到那种复杂程度。我只想给 gcc 我修改后的中间文件,这样它就可以从那里开始编译并给我最终的目标文件。有什么想法可以实现吗?

最佳答案

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

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

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

关于从 gcc 的中间文件编译目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9104133/

相关文章:

c - If 语句在 C KDMF 驱动程序中失败

带有自定义 C++ 库的 PHP 扩展

c - 在 C 中,释放结构体时是否需要手动释放结构体中的指针?

linux - 创建仅在下次重新启动时运行的脚本的最简单方法是什么?

Python 版本无法在 Ubuntu 中找到模块

c++ - 共享内存中的队列正在运行

linux - Nasm - 符号 `printf' 导致 R_X86_64_PC32 重定位溢出

c - 如何将整数四舍五入到最接近的整数倍数?

C代码在Tiny C Compiler下编译并运行,但在GCC下无法运行

c - C 方法编程中的段错误错误