Reputation: 30815
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?
Upvotes: 19
Views: 15279
Reputation: 31
If you are playing locally, you should try
gcc -c -fdump-tree-gimple hi.c
It will generate a temp file naming like hi.c.004t.gimple
.
If you are playing in an online playground, like Godbolt.
You should try to add options -dump-tree-gimple
in a compiler windows
Upvotes: 0
Reputation: 428
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 internals
Similar infrastructure is also available for RTL
Upvotes: 2
Reputation: 26181
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:
You can request to dump a C-like representation of the GIMPLE form with the flag -fdump-tree-gimple.
Upvotes: 20
Reputation: 9071
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:
-fdump-<ir>-<passname>
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
.
Upvotes: 16
Reputation: 31
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)
Upvotes: 1