【问题标题】:Searching for recent GCC GIMPLE grammar搜索最近的 GCC GIMPLE 语法
【发布时间】:2019-11-27 17:41:13
【问题描述】:

对于我的最后一年项目,我正在学习编译器技术,目前我正在尝试使用 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 中来自我生成的 *.004t.gimple 文件的示例?

关于格式的问题:

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

谢谢,

【问题讨论】:

  • 我在哪里可以找到 GIMPLE 语法... 我认为不存在任何这样的定义。 Uday Khedeker 在第 33 页的slides 中给出了一个非常简单的概述。
  • GCC 如何实现此语法以生成、解析和理解它生成的 Gimple 文件... GCC 通常不会将 gimple 输出到文件(您可以要求转储,例如-fdump-tree-all,当然,但这是为编译器黑客准备的,不需要操作); gimple 结构由语言前端(和 gimplifier)生成,并在 内存中 保存和处理,rtl 是后来由它制成的。最近添加了一个 GIMPLE 前端(在 7.2,IIRC 中),但这绝不是完整的(同样,它的目的是使为编译器编写单元测试成为可能)。
  • 哦,我还在 Jason Merrill 的 GENERIC and GIMPLE: A New Tree Representation for Entire Functions 论文中找到了“粗略的 GIMPLE 语法”
  • @VladislavIvanishin 感谢幻灯片,我知道第一篇论文和 GCC-4.3.6 和 GCC-4.2.1 中有一个“粗略的 GIMPLE 语法”,您可以在我的链接中找到但我正在寻找一个更新的
  • 或者他们从文档中删除了语法,因为他们不再使用它了?!!那么它现在如何工作?!他们如何从内存结构中生成转储文件,转储文件是否完全代表源文​​件?

标签: gcc grammar xtext gcc5 gimple


【解决方案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] 使用的 SIMPLE IL。

  4. GCC 如何实现和理解?再次,您需要深入了解 GCC,gimple.hbasic-block.htree-pass.h,例如,所有这些都位于$src/gcc/。部分功能在gccint 部分GIMPLE 中进行了描述。引用 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 表示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 探索有所帮助,并为我的糟糕“英语”感到抱歉。

【讨论】:

  • 所以在浏览了源文件之后,我更好地理解了 GIMPLE 文件是如何生成的,但这仍然不能帮助我阅读(解析)这些文件,因为我试图提取一些存在于文件,甚至可能将它们翻译成另一种语言,就像这样。 (nkavvadias.com/hercules/#gimple2nac)
  • 尝试阅读 gccint 中的 GIMPLE 和 CFG,同时尝试查看 -fdump-tree-all-lineno-raw 生成的 gimple pass,这是我的方法,在这个时间我刚刚添加了一个处理我需要的情况的通行证。尝试更具体地询问。
猜你喜欢
  • 2018-12-23
  • 1970-01-01
  • 2012-02-24
  • 2014-03-06
  • 2014-03-04
  • 2012-05-05
  • 2012-12-28
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多