问题标签 [gimple]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
411 浏览

gcc - 搜索最近的 GCC GIMPLE 语法

对于我的最后一年项目,我正在学习编译器技术,目前我正在尝试使用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?(高或低,...)
  • 哪一个更能代表未经优化的原始源代码的控制流?

谢谢你,

0 投票
1 回答
103 浏览

gcc - 获取 LTO 位码的 GCC 标志

我已经使用 LLVM/Clang 及其中间表示(IR)有一段时间了。我最近开始使用 GCC。我想将 IR 位码转储到一个文件中,类似于 LLVM 中的 (-flto -save-temps flag)。

我可以在构建时使用“-fdump-tree-cfg-raw”标志获得 gimple IR,但是对于多个输入文件,这会为每个源生成一个“.gimple”文件。

为了获得整个程序的视图,在 LLVM 中,我在 LDFLAGS 中使用了“-flto -Wl,-plugin-opt=save-temps”。在 GCC 中获得相同行为的正确方法是什么。

我尝试使用'gcc -fdump-tree-cfg-raw -flto -save-temps src1.c main.c',但我没有得到组合的 IR 文件。输出包括每个源的 .o、.s、.i 文件和每个源的 .cfg 文件。

0 投票
0 回答
67 浏览

c - 为什么 GCC -O0 转换按位与并乘以分支?

我正在探索 gcc 何时使用分支与条件移动,并在变量的位 0 上使用按位与运算时发现了一些奇怪的结果。具体来说,如果我这样做:

gcc at -O0 首先计算 argc & 0x1,然后根据该结果分支到不同的基本块。从算术到分支的转换似乎发生在早期转储原始树,我得到:

GIMPLE 是

如果我不使用按位 AND 的两侧,这似乎不会发生。如果我使用 0x2 而不是 0x1,它似乎也不会发生。在这些情况下,我得到纯粹的数据处理代码,没有跳转。当然,在优化级别为 1 或更高时,我得到了优化的无跳转代码,但我仍然很好奇 GCC 转换分支的原因/方式/位置。

在 Godbolt 上测试,似乎 clang 根本不这样做,并且 GCC 开始在 4.1.2 和 4.4.7 版本之间转换为分支。