搜索最近的 GCC GIMPLE 语法



对于我的最后一年项目,我正在学习编译器技术,目前我正在尝试使用 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_GIMPLESSA 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,甚至没有阅读你上面发布的文档。我正在深入研究海湾合作委员会一段时间,我会尝试回答你的问题。

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

  2. 没有像C语言那样清晰地描述"GIMPLE语法",只是查看资源,也许互联网上一些糟糕的例子。

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

  4. 海湾合作委员会如何实施和理解?同样,您需要深入了解 GCC,gimple.hbasic-block.h,例如tree-pass.h所有这些$src/gcc/.函数的某些部分在第GIMPLE节的gccint中进行了描述。参考gccint并不完全准确,它由一些过时的函数和引用组成,您必须记住(例如FOR_EACH_BB,在 2013 年已弃用)。

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

关于格式。

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

    您可以使用搜索并发现此通行证*.c.007t.lower

  3. 答案在上面,我认为,我正在使用RAW表示,它的信息量更大IMO。

它不多,但我希望它能帮助您进行 GCC 探索,并为我糟糕的"英语"感到抱歉。

相关内容

  • 没有找到相关文章

最新更新