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数据结构。