[MELT] a successful compilation of GCC using a plugin

Pierre Vittet piervit@pvittet.com
Thu May 5 18:53:00 GMT 2011


Hello,

I would like to announce that I have been able to compile GCC while 
checking it with a simple MELT plugin that I have wrote. This plugin is 
integrated into GCC by using the MELT plugin. I guess this is the first 
successfull use of MELT with a huge real program like GCC.

For those who are not really aware about MELT and how it works:
	MELT is available into 2 forms:
		-A GCC branch
		-A GCC plugin

	Here I have use MELT as a GCC plugin.

	This GCC plugin loads a melt.so library which has severals modes. 
Firstly I have use the translatetomodule mode. This mode allows me to 
translate my plugin (which is a file "test_fopen.melt") into several C 
files and then into a dynamic test_fopen.so.

The command is the following:
     gcc 
-fplugin=/usr/lib64/gcc/x86_64-mandriva-linux-gnu/4.6.0/plugin/melt.so \
	-fplugin-arg-melt-mode=translatetomodule \
	-fplugin-arg-melt-arg=/home/mpierre/programmation/melt/test_fopen/test_fopen.melt \
     -c empty.c 2>fopen_compil_debug.txt



	The second step is to compile GCC using CFLAGS which define that we use 
the MELT plugin with the mode test_fopen which is defined in my plugin 
and precising the location of the test_fopen.so. This allows me to 
execute the pass defined in my plugin.

The command is the following:
	make CFLAGS="-fplugin=/usr/lib64/gcc/x86_64-mandriva-linux- 
gnu/4.6.0/plugin/melt.so -fplugin-arg-melt-mode=test_fopen 
-fplugin-arg-melt-init=@@:test_fopen 
-fplugin-arg-melt-module-path=$build 
-fplugin-arg-melt-source-path=$build -Wno-error"

What does my test_fopen.melt plugin?
	It searchs each call to the fopen function and get the lhs (under the 
form of a tree).
	After the fopen calls, it looks at the next gimple. If this not a 
gimple_cond_equal or gimple_cond_notequal between the lhs of the call 
and NULL, it returns a warning, explaining that the call was not tested.

	This is not perfect for now, it can find some false positifs, in some 
special cases, like this one:
s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode);
if (s->file == NULL) {
	...
}
...

It comes from the fact, that at GIMPLE state, the expression is separate 
into severals and the test is not made immediatly but after a few gimples.
	
	However, it sends also some pertinents warnings:
	-in gcc/gcc.c line 3422, function driver_handle_option:
		There is a call to fopen without test, I don't know much about what it 
does but can we be sure that the fopen always return somethings not NULL.
	note: in reality this is not the fopen function but the fopen_unlocked 
function which is called at this step (using a #define). I have adapted 
my plugin to search also for fopen_unlocked which call fopen without 
testing more the returned value.

	-in libcpp/files.c line 1468, function read_name_map:
		there is another call to the fopen function.

The full log of my GCC compilation can be found here: 
http://pvittet.com/GSOC/log.txt .
The plugin that I have written can be found here: 
https://github.com/Piervit/GMWarn/tree/master/test_fopen .

If you have any questions or remarks, I would be glad to read them :)



More information about the Gcc mailing list