GIMPLE 是 GCC 系统的内部表示之一。可以通过 -fdump-* 编译器参数转储 GIMPLE 或任何其他内部表示。但是有没有办法编译转储的 GIMPLE 或任何其他表示?GCC 似乎没有 GIMPLE 前端。我想做的是转储、分析、修改然后重新编译转储的 GIMPLE 以执行各种代码检测。
PS 我了解 GCC 插件,也了解 LLVM/Clang,所以请尝试回答确切的问题,不要建议替代解决方案。谢谢!
这个项目被称为GIMPLE FE(前端)。第一次尝试从未达到可用状态。它在 GSoC'16 期间重新启动,并入 gcc-8,并且从那以后一直在定期改进。它通过 启用-fgimple
。
目标是帮助编写测试用例。它不是llvm 提供的完整的转储/重新加载工具。您获得的转储-fdump-*
(有一个-gimple
修饰符,如-fdump-tree-all-gimple
,以获得与 FE 读取的内容相匹配的语法)很好地让您知道发生了什么,但它们不包含足够的信息来重建内部结构。FE 读取的方言只允许您指定 GIMPLE 可以编码的信息的一小部分。
类似地,存在一个部分RTL 前端,用于 gcc 的其他内部表示。
LTO 提供了更完整的转储/重新加载。当您使用 编译文件时-flto -c
,gcc 将 GIMPLE 的字节码表示形式保存在.o
文件的一部分中,当作为链接器调用时它可以再次读取。这种表示几乎是完整的(我认为调试信息存在一些问题)。但是,它并不像文本转储那样易于阅读,并且确切的格式会随着编译器的每个次要版本而变化。此外,您只能在管道中的一个预定义点转储/重新加载,而不是在任意通过之后。
我们面临着同样的问题。我建议不要“转储/重新加载” GIMPLE 文件并在字符串级别对其进行操作,而是直接编写一个 gcc 插件并在此处操作 GIMPLE 数据结构。