3

对于我的最后一年项目,我正在学习编译器技术,目前我正在尝试使用GCC中间表示(原始 GIMPLE )并使用 GCC 从不同的源文件(C、 Cpp和 Java)获取控制流图- 5.4 .

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

所以语言似乎在不断变化,并且有多种格式(高级 GIMPLELow_level_GIMPLESSA GIMPLE),而且语法似乎在版本之间不断变化,但我找不到最新版本的 GIMPLE 语法,特别是一种在GCC-5.4中使用,我无法理解不同的格式。

关于语法的问题:

  • 我在哪里可以找到GCC-5.4和更新版本中使用的GIMPLE 语法?
  • 它是怎么写的?(在 BNF 或 EBNF 或 ...)
  • GCC 如何实现这个语法来生成、解析和理解它生成的 Gimple 文件,然后将它们转换为 RTL?
  • 我可以从我生成的文件示例 中用Xtext编写一小部分GIMPLE 语法吗?*.004t.gimple

关于格式的问题:

  • 3 种 Gimple 格式有什么区别?(我似乎无法在 wiki 中找到有关每个文档的详细文档)
  • *.c.004t.gimple原始文件中 使用哪种格式*.c.011t.cfg?(高或低,...)
  • 哪一个更能代表未经优化的原始源代码的控制流?

谢谢你,

4

1 回答 1

1

看起来您刚刚开始学习 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. 没有像 C 语言那样清晰地描述的“GIMPLE 语法”,只是查看源代码,可能是互联网上的一些糟糕的例子。

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

  4. GCC 如何实现和理解?再次,您需要深入研究 GCC,gimple.h例如,所有这些都basic-block.h位于. 部分功能在章节中描述。引用并不完全准确,它包含一些过时的函数和引用,您必须记住(例如,FOR_EACH_BB,2013 年已弃用)。tree-pass.h$src/gcc/gccintGIMPLEgccint

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

关于格式。

  1. 有一种 GIMPLE 格式,但它可以有两种 AFAIK 格式。GIMPLE HIGH它只是 GIMPLE 没有完全降低,并且由 pass 之前的 IL 组成pass_lower_cfHigh GIMPLE包含一些容器语句,如词法范围(由 表示GIMPLE_BIND)和嵌套表达式(例如,GIMPLE_TRY)。Low GIMPLE直接在ILEH区域树(EH手段Exception Handling)中公开所有控制和异常表达式的隐式跳转。还有RAW表示,据我了解,它是某种波兰符号,IMO 它比通常的表示更有用-fdump-tree-all-all-raw,例如,您可以使用它。

  2. *.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 */
    };
    

    可以使用搜索,发现这个pass是*.c.007t.lower

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

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

于 2019-07-25T07:40:34.910 回答