GCC能编译GIMPLE吗


GIMPLE是GCC系统中的内部表示之一。可以通过-fdump-*编译器参数转储GIMPLE或任何其他内部表示。但是,有什么方法可以编译转储的GIMPLE或任何其他表示形式吗?GCC似乎没有GIMPLE前端。我想做的是转储、分析、修改并重新编译转储的GIMPLE,以执行各种代码插入。

PS我知道GCC插件,也知道LLVM/Crang,所以请尽量回答确切的问题,不要建议其他解决方案。谢谢

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

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

类似地,对于gcc的另一个内部表示,存在一个部分RTL前端。

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

我们面临着同样的问题。代替";转储/重新加载";GIMPLE文件并在字符串级别上操作它,我建议只编写一个gcc插件并在那里操作GIMPLE数据结构。

相关内容

  • 没有找到相关文章

最新更新