对于我的最后一年项目,我正在学习编译器技术,目前我正在尝试使用 GCC 中间表示(原始 GIMPLE)并使用GCC-5.4从不同的源文件(C、Cpp 和 Java)获取控制流图。
到目前为止,我可以使用-fdump-tree-all-graph-raw
生成*.004t.gimple
和*.011t.cfg
原始文件,但后来我希望更多地了解GIMPLE 语言,所以我搜索了它的语法,我找到了这个:
- 金普尔维基
- 简单
- 通用和瘟疫
- 最新的 GIMPLE 文档(没有语法!!)
- 海湾合作委员会有限元
- GCC-4.3.6 的语法
- GCC-4.2.1 的语法
- gcc-5.4.0 的 GIMPLE 文档(也没有语法!!)
所以语言似乎在不断变化,并且有多种格式(高级 GIMPLE、Low_level_GIMPLE、SSA GIMPLE、树),而且语法似乎在版本之间不断变化,但我找不到最新版本的 GIMPLE 语法,特别是GCC-5.4中使用的语法,我无法理解不同的格式。
关于语法的问题:
- 在哪里可以找到GCC-5.4和更新版本中使用的GIMPLE语法?
- 怎么写的?(在BNF或EBNF或...)
- GCC 如何实现此语法以生成、解析和理解 它生成的 Gimple 文件,然后将它们转换为 RTL? 我
- 是否可以从我生成的
*.004t.gimple
文件示例中在Xtext中编写GIMPLE 语法的一小部分?
关于格式的问题:
- 3 种 Gimple 格式有什么区别?(我似乎不能 在维基中查找有关每个文档的详细文档)
- 原始文件中使用哪种格式
*.c.004t.gimple
和*.c.011t.cfg
?(高或低,... - 哪一个更好地代表来自原始源的控制流 没有优化的代码?
谢谢
看起来你刚刚开始学习 GIMPLE,甚至没有阅读你上面发布的文档。我正在深入研究海湾合作委员会一段时间,我会尝试回答你的问题。
-
无论如何,您需要阅读此处
gccint
文档:https://gcc.gnu.org/onlinedocs/gccint.pdf 它有助于回答一些问题并提供有关 GIMPLE 的一些信息,这是至少以某种方式描述 GIMP le 的唯一文档。来源中最好的描述,这是可悲的,但原样。http://www.netgull.com/gcc/summit/2003/GENERIC%20and%20GIMPLE.pdf,另请参阅此处,此文档基于gccint
,并包含一些摘录。 -
没有像C语言那样清晰地描述"GIMPLE语法",只是查看资源,也许互联网上一些糟糕的例子。
-
我认为它是从树相邻语法(TAG)生成的,基于麦吉尔大学[SIMPLE]的McCAT编译器项目使用的SIMPLE IL。
-
海湾合作委员会如何实施和理解?同样,您需要深入了解 GCC,
gimple.h
basic-block.h
,例如tree-pass.h
所有这些$src/gcc/
.函数的某些部分在第GIMPLE
节的gccint
中进行了描述。参考gccint
并不完全准确,它由一些过时的函数和引用组成,您必须记住(例如FOR_EACH_BB,在 2013 年已弃用)。 -
关于 Xtext,我从未使用过,我不明白需要自己编写一些 GIMPLE,这是中间语言
IL
您可以创建一个插件来优化您的代码流,但我看不出需要单独使用 GIPPLE。
关于格式。
-
有一种 GIMPLE 格式,但它可以有两种形式 AFAIK。
GIMPLE HIGH
只是GIMPLE没有完全降低,并且由通过pass_lower_cf
之前的IL组成。High GIMPLE
包含一些容器语句,如词法作用域(由GIMPLE_BIND
表示)和嵌套表达式(例如GIMPLE_TRY
)。Low GIMPLE
直接在IL
和EH
区域树中公开控制和异常表达式的所有隐式跳转(EH
表示Exception Handling
)。还有RAW
表示,据我了解,它是某种波兰符号,IMO 它比通常的表示更有用,例如您可以使用-fdump-tree-all-all-raw
获得它。 -
*.c.004t.gimple
- 这是 GIMPLE 出现的第一步,*.c.011t.cfg
- 控制流图(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 */ };
您可以使用搜索并发现此通行证
*.c.007t.lower
-
答案在上面,我认为,我正在使用RAW表示,它的信息量更大IMO。
它不多,但我希望它能帮助您进行 GCC 探索,并为我糟糕的"英语"感到抱歉。