【问题标题】:Compiling object file from an intermediate file of gcc从 gcc 的中间文件编译目标文件
【发布时间】:2012-02-24 14:58:06
【问题描述】:

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

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

【问题讨论】:

  • (+1) 也没有答案,但是,想要达到同样的效果。
  • 你见过this吗?

标签: c linux gcc compiler-construction backend


【解决方案1】:

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

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

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

【讨论】:

  • 我知道这样一个 gcc 项目,它被命名为 gcc-xil,并且感染了 GPL(免费下载)。 // 稍后我会删除这条评论。
  • 简而言之,您是说 LLVM 更容易使用?
【解决方案2】:

没有将文本 GIMPLE 表示转换回原始 GIMPLE 内部表示的内置工具。

您需要使用自定义前端(例如建议的 GIMPLE FE)来理解转储的 GIMPLE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2012-06-13
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多