使用 gcc 的中间 GIMPLE 格式
根据这篇文章,gcc 在生成代码之前使用几种中间格式。我读到 GIMPLE 格式使用三个地址代码,这似乎是最容易使用的中间语言。但我需要更多细节,因为我需要构建一个工具,可以获取中间代码并在生成最终代码之前向其中插入一些代码。
为此,我首先需要知道如何生成 GIMPLE 格式代码并将其保存在文件中。所以我正在寻找一些文档和示例。另外,如果有人处理过这样的事情,我可以知道这个任务的复杂性,即在中间代码中插入一些代码吗?
According to this article gcc uses several intermediate formats before generating code. I read that the GIMPLE format uses three address code, which seems to be the easiest intermediate language to use. But I need some more detail, as I need to build a tool that can take the intermediate code and insert some code to it before generating the final code.
For this I first need to know how can I even generate the GIMPLE format code and save it in a file. So I'm looking for some documents and examples. Also, if anyone has worked with such things, can I know the complexity of this task, which is to insert some code into the intermediate code?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可能会发现为 GCC 编写 插件 更容易,这将允许您挂钩 GIMPLE 生成并在 GCC 内更改它,这应该会减少保存、编辑然后尝试从 GIMPLE 形式编译的停机时间。 MELT 就是这样一个插件(尽管它提供了方式 不仅仅是改变较低级别的表示)。 这里还有一个关于 GIMPLE 更改插件的漂亮 PDF 。
另外,您可以在此处查看有关 GCC GIMPLE 如何工作的信息。
就转储 GIMPLE 而言:
You might find it easier to write a plugin for GCC, which would allow you to hook the GIMPLE generation and alter it inside GCC, which should drop the downtime of saving, editing then trying to compile from GIMPLE form. MELT is one such plugin (though it offers way more than just altering the lower level representations). There is also a nice PDF here on GIMPLE altering plugins.
Else, you can look here for information on how GCC's GIMPLE works.
In terms of dumping GIMPLE out:
您可以使用标志 -fdump-tree-gimple 轻松生成任何文件的 GIMPLE 表示形式。
如果您想编写一个插件,那么您可能会对 pass 在 GCC 上的工作原理感兴趣。您可以看到带有以下形式标志的每个传递的输出:
其中
ir
可以是:tree
:GIMPLE 上的过程内传递ipa
:过程间传递在 GIMPLErtl
上:在 RTL 上进行过程内传递使用
= all
查看所有转储,例如-fdump-ipa-all
。You can easily generate GIMPLE representation of any file using the flag
-fdump-tree-gimple
.If you want to write a plugin, then you might be interested in how passes work on GCC. You can see the output of each pass with flags of the form:
where
ir
could be:tree
: Intraprocedural passes on GIMPLEipa
: Interprocedural passes on GIMPLErtl
: Intraprocedural passes on RTLUse
<passname> = all
to see all the dumps, e.g.-fdump-ipa-all
.从 GCC 7 开始,现在可以在函数的声明说明符中使用
__GIMPLE
以及-fgimple
命令行标志,让 GCC 直接编译 GIMPLE。 GCC 内部文档类似的基础设施也可用于 RTL
It is now possible, since GCC 7, to use
__GIMPLE
in a function's declaration specifiers, along with the-fgimple
command-line flag, to have GCC directly compile GIMPLE. This is explained in more detail in the documentation for GCCs internalsSimilar infrastructure is also available for RTL
我尝试了标志
-fdump-tree-gimple
。它仅适用于 C/C++ 语言,不适用于其他语言,例如 Java、Ada、Fortran 和 Objective-C)I tried the flag
-fdump-tree-gimple
. It works only for the C/C++ language, and not for other languages such as Java, Ada, Fortran, and Objective-C)