对于我的期末项目,我正在学习编译器技术,目前我正在尝试使用 GCC 中间表示(raw GIMPLE)并获得使用 GCC-5.4 控制来自不同源文件(C、Cpp 和 Java)的流程图。
到目前为止,我可以使用 -fdump-tree-all-graph-raw< 生成
但后来我想了解更多 GIMPLE 语言 所以我搜索了它的 grammar 并且我找到了这个:*.004t.gimple
和 *.011t.cfg
原始文件
- GIMPLE WIKI
- SIMPLE
- GENERIC and GIMPLE
- latest GIMPLE Doc (没有语法!!!)
- GCC FE
- grammar for gcc-4.3.6
- grammar for gcc-4.2.1
- GIMPLE Doc for gcc-5.4.0 (也没有语法!!!)
因此语言似乎在不断变化并且具有多种格式(High level GIMPLE、Low_level_GIMPLE、SSA GIMPLE、tree ) 而且语法似乎在版本之间不断变化,但我找不到最新版本的 GIMPLE 语法,特别是 GCC-5.4 中使用的语法,我无法理解不同的格式。
语法问题:
- 在哪里可以找到 GCC-5.4 和更新版本中使用的 GIMPLE 语法?
- 它是怎么写的? (在 BNF 或 EBNF 或...)
- GCC如何实现这个语法来生成、解析和理解 它生成 Gimple 文件,然后将它们转换为 RTL?
- 我可以编写一小部分GIMPLE 语法吗
在 Xtext 中来 self 生成的
*.004t.gimple
文件的示例?
关于格式的问题:
- 3 种 Gimple 格式之间有什么区别? (我似乎不能 在 wiki 中找到关于每一个的详细文档)
- 原始文件
*.c.004t.gimple
和*.c.011t.cfg
? (高或低,...) - 哪个更好地代表了原始来源的控制流 没有优化的代码?
谢谢你,
最佳答案
看起来你刚刚开始学习 GIMPLE,甚至没有阅读你上面发布的文档。我深入研究 GCC 有一段时间了,我会尽力回答您的问题。
无论如何,您需要阅读位于此处的
gccint
文档:https://gcc.gnu.org/onlinedocs/gccint.pdf它有助于回答一些问题并提供一些关于 GIMPLE 的信息,并且这是至少以某种方式描述 GIMPLE 的唯一文档。消息来源中最好的描述,它很悲伤但原样。也看这里,http://www.netgull.com/gcc/summit/2003/GENERIC%20and%20GIMPLE.pdf ,该文档基于gccint
并由一些摘录自。没有描述清楚的“GIMPLE语法”,比如C语言,只能看源码,也许网上有一些不好的例子。
我认为它是根据麦吉尔大学 McCAT 编译器项目 [SIMPLE] 使用的 SIMPLE IL 从树邻接语法 (TAG) 生成的。
GCC 如何实现和理解?同样,您需要深入了解 GCC,例如
gimple.h
、basic-block.h
、tree-pass.h
,所有这些都在$src/gcc/
中。GIMPLE
部分的gccint
中描述了部分功能。引用gccint
并不完全准确,它包含一些过时的函数和引用,您必须记住这一点(例如 FOR_EACH_BB,已于 2013 年弃用)。关于 Xtext,我从来没有用过,我不明白需要自己写一些 GIMPLE,这是中间语言
IL
你可以创建一个插件来优化你的代码流,但我看不出需要单独使用 GIMPLE。
关于格式。
有一种 GIMPLE 格式,但它可以有两种形式 AFAIK。
GIMPLE HIGH
它只是 GIMPLE,它没有完全降低,由传递pass_lower_cf
之前的 IL 组成。High GIMPLE
包含一些容器语句,如词法范围(由GIMPLE_BIND
表示)和嵌套表达式(例如,GIMPLE_TRY
)。Low GIMPLE
直接在IL
和EH
区域树(EH
表示异常处理
)。还有RAW
表示,据我所知,它是某种波兰符号,IMO 它比通常的表示更有用,你可以用-fdump-tree-all-all-raw 得到它
例如。*.c.004t.gimple
- 这是 GIMPLE 出现的第一步,*.c.011t.cfg
- 控制流的第一次尝试图(配置
)。 GIMPLE lower 的内部名称是 "lower
"你可以在gimple-low.c
部分看到它们const pass_data pass_data_lower_cf = { GIMPLE_PASS, /* type */ "lower", /* name */ OPTGROUP_NONE, /* optinfo_flags */ TV_NONE, /* tv_id */ PROP_gimple_any, /* properties_required */ PROP_gimple_lcf, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ 0, /* todo_flags_finish */ };
可以搜索一下,发现这个pass是
*.c.007t.lower
我认为答案在上面,我使用的是 RAW 表示形式,IMO 提供的信息量更大。
虽然不多,但我希望它能对您探索 GCC 有所帮助,并为我糟糕的“英语”感到抱歉。
关于gcc - 搜索最近的 GCC GIMPLE 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57100405/