【问题标题】:Can GCC compile GIMPLE?GCC可以编译GIMPLE吗?
【发布时间】:2014-03-06 19:14:39
【问题描述】:

GIMPLE 是 GCC 系统的内部表示之一。可以通过 -fdump-* 编译器参数转储 GIMPLE 或任何其他内部表示。但是有没有办法编译转储的 GIMPLE 或任何其他表示? GCC 似乎没有 GIMPLE 前端。我想做的是转储、分析、修改然后重新编译转储的 GIMPLE 以执行各种代码检测。

PS 我知道 GCC 插件,也知道 LLVM/Clang,所以请尝试回答确切的问题,不要建议替代解决方案。谢谢!

【问题讨论】:

标签: gcc gimple


【解决方案1】:

这个项目被称为GIMPLE FE(前端)。第一次尝试从未达到可用状态。它在 GSoC'16 期间重新启动,并入 gcc-8,并且从那以后一直在定期改进。它通过-fgimple 启用。

目标是帮助编写测试用例。它不是 llvm 提供的完整转储/重新加载工具。您使用-fdump-* 获得的转储(有一个-gimple 修饰符,如-fdump-tree-all-gimple,以获得与FE 读取的内容相匹配的语法)很高兴让您知道发生了什么,但它们不会包含足够的信息来重建内部结构。 FE 读取的方言只允许您指定 GIMPLE 可以编码的信息的一小部分。

同样,对于 gcc 的其他内部表示,也存在部分 RTL front-end

LTO 提供了更完整的转储/重新加载。当您使用-flto -c 编译文件时,gcc 会在.o 文件的一部分中保存 GIMPLE 的字节码表示形式,当作为链接器调用时它可以再次读取该部分。这种表示几乎是完整的(我认为调试信息存在一些问题)。但是,它并不像文本转储那样易于阅读,并且确切的格式会随着编译器的每个次要版本而变化。此外,您只能在管道中的一个预定义点转储/重新加载,而不是在任意传递之后。

【讨论】:

  • 谢谢!您能否澄清 GIMPLE 中缺少哪些信息?它与 LLVM IR 基本上是相同的单个静态赋值形式,当我查看转储代码时,它似乎非常一致。
  • 我不记得那样了。我认为调试信息完全丢失。未列出全局变量。等等。
【解决方案2】:

我们面临同样的问题。我建议不要“转储/重新加载”GIMPLE 文件并在字符串级别对其进行操作,而是直接编写一个 gcc 插件并在此处操作 GIMPLE 数据结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多