gcc - 搜索最近的 GCC GIMPLE 语法

标签 gcc grammar xtext gcc5 gimple

对于我的期末项目,我正在学习编译器技术,目前我正在尝试使用 GCC 中间表示(raw GIMPLE)并获得使用 GCC-5.4 控制来自不同源文件(C、Cpp 和 Java)的流程图。

到目前为止,我可以使用 -fdump-tree-all-graph-raw< 生成 *.004t.gimple*.011t.cfg 原始文件 但后来我想了解更多 GIMPLE 语言 所以我搜索了它的 grammar 并且我找到了这个:

因此语言似乎在不断变化并且具有多种格式(High level GIMPLELow_level_GIMPLESSA GIMPLEtree ) 而且语法似乎在版本之间不断变化,但我找不到最新版本的 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 有一段时间了,我会尽力回答您的问题。

  1. 无论如何,您需要阅读位于此处的gccint 文档:https://gcc.gnu.org/onlinedocs/gccint.pdf它有助于回答一些问题并提供一些关于 GIMPLE 的信息,并且这是至少以某种方式描述 GIMPLE 的唯一文档。消息来源中最好的描述,它很悲伤但原样。也看这里,http://www.netgull.com/gcc/summit/2003/GENERIC%20and%20GIMPLE.pdf ,该文档基于 gccint 并由一些摘录自。

  2. 没有描述清楚的“GIMPLE语法”,比如C语言,只能看源码,也许网上有一些不好的例子。

  3. 我认为它是根据麦吉尔大学 McCAT 编译器项目 [SIMPLE] 使用的 SIMPLE IL 从树邻接语法 (TAG) 生成的。

  4. GCC 如何实现和理解?同样,您需要深入了解 GCC,例如 gimple.hbasic-block.htree-pass.h,所有这些都在 $src/gcc/ 中。 GIMPLE 部分的 gccint 中描述了部分功能。引用 gccint 并不完全准确,它包含一些过时的函数和引用,您必须记住这一点(例如 FOR_EACH_BB,已于 2013 年弃用)。

  5. 关于 Xtext,我从来没有用过,我不明白需要自己写一些 GIMPLE,这是中间语言 IL 你可以创建一个插件来优化你的代码流,但我看不出需要单独使用 GIMPLE。

关于格式。

  1. 有一种 GIMPLE 格式,但它可以有两种形式 AFAIK。 GIMPLE HIGH 它只是 GIMPLE,它没有完全降低,由传递 pass_lower_cf 之前的 IL 组成。 High GIMPLE 包含一些容器语句,如词法范围(由 GIMPLE_BIND 表示)和嵌套表达式(例如,GIMPLE_TRY)。 Low GIMPLE 直接在 ILEH 区域树(EH 表示 异常处理)。还有 RAW 表示,据我所知,它是某种波兰符号,IMO 它比通常的表示更有用,你可以用 -fdump-tree-all-all-raw 得到它 例如。

  2. *.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

  3. 我认为答案在上面,我使用的是 RAW 表示形式,IMO 提供的信息量更大。

虽然不多,但我希望它能对您探索 GCC 有所帮助,并为我糟糕的“英语”感到抱歉。

关于gcc - 搜索最近的 GCC GIMPLE 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57100405/

相关文章:

c++ - gcc 优化级别 1 的子选项

c++ - 如何仅为源代码的特定部分打开 -mavx2?

c - 当我在 makefile 中使用 "gcc"时,制作完成后,我得到了 "cc"输出

regex - Raku:捕获标记的效果丢失 "higher up"

java - Xtext运行时编译

保存时Java模型异常

c - 如何强制 OpenMPI 使用 GCC 而不是 ICC?是否需要重新编译 OpenMPI?

c - C 中的 "for"循环后面是否需要 "{}"?

parsing - Xtext和ANTLR之间有什么关系?

algorithm - LR、SLR 和 LALR 解析器之间有什么区别?