问题标签 [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.
gcc - 搜索最近的 GCC GIMPLE 语法
对于我的最后一年项目,我正在学习编译器技术,目前我正在尝试使用GCC中间表示(原始 GIMPLE )并使用 GCC 从不同的源文件(C、 Cpp和 Java)获取控制流图- 5.4 .
到目前为止,我可以使用生成*.004t.gimple
和*.011t.cfg
原始文件,-fdump-tree-all-graph-raw
但后来我希望了解更多GIMPLE 语言,所以我搜索了它的语法,我发现了这个:
- 金宝维基
- 简单的
- 通用和简单
- 最新的 GIMPLE Doc(没有语法!!!)
- 海湾合作委员会 FE
- gcc-4.3.6 的语法
- gcc-4.2.1 的语法
- gcc-5.4.0 的 GIMPLE Doc(也没有语法!!!)
所以语言似乎在不断变化,并且有多种格式(高级 GIMPLE、Low_level_GIMPLE、SSA 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
?(高或低,...)- 哪一个更能代表未经优化的原始源代码的控制流?
谢谢你,
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 文件。
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 版本之间转换为分支。