From: Basile Starynkevitch <bas...@starynkevitch.net> Subject: Re: How to parse a code snippet at front-end plugin Date: Sun, 12 Sep 2010 08:35:48 +0200
> On Sat, 11 Sep 2010 22:19:06 +0800 (CST) > "Thinker K.F. Li" <thin...@codemud.net> wrote: > >> Hi, >> >> I am try to make a plugin to analyze GIMPLE before genericize. It >> will insert some code defined by user into the tree. I want the user >> to specify the inserted code in C. For example, >> >> -------------------------------------------------- >> { >> static int i=0; >> >> printf("Hello %d\n", i++); >> } >> -------------------------------------------------- >> >> I try to find a way to make C language parser of GCC to compile it for >> me, and I will insert the code into the tree created from the main >> source. But, it seems provide only functions to parse a complete C >> source file, and I try to push a buffer to the reader of libcpp. But, >> it does not work. > > I am not sure that there exist enough plugin hooks to do that (I am not sure > even if there are plugin hooks to front-ends in GCC). However, I do see some > way to perhaps implement what you suggest even in 4.5 > > First, don't think of your problem as adding C code. Think of it as adding > Gimple stuff into some Gimple representation. > (I believe it is a case of aspect oriented programming, see > http://en.wikipedia.org/wiki/Aspect-oriented_programming for more). But you > want the user to specify the added code, using the already accepted C syntax > of GCC (i.e. without hacking GCC parser). > > So you could use attributes & pragmas or builtins for that purpose. > > First, your user define its code snipped to insert as a C function with a > special attribute, e.g. > > void say_hello(void) __attribute__((added_chunk)); > > void say_hello(void) > { > static int i; > printf("Hello %d\n", i++); > } > > Then, your user would mark with another attribute every function into which > your chunk should be added, perhaps > > int some_complex_function(int a, void*b) > __attribute((insert_chunk(say_hello))); > > Or perhaps have a pragram asking this to insert the chunk in every function > whose name start with some_ > > #pragma GCCMELT insert_chunk_prefix(say_hello, some_) > This is a good idea that user can define rules in a included file and include it in C files. I will try it. Thanks for your suggestion! > The point here is that with the tricks above, you don't have to change GCC > parser! and you could implement that using a plugin coded in C (this is not > so simple, you have to filter Gimple). Better yet, you could implement that > using GCC MELT http://gcc.gnu.org/wiki/MELT which provides pattern matching > facilities on Gimple to make such tasks much simpler. > > You still have to understand Gimple & Tree in detail and find a good position > in the pass machinery to insert your new pass or passes. > > If you succeed in making such a plugin please tell us. I would be delighted > if you coded it in MELT, as a MELT extension. > > Good luck. Actually, I have done something in C. It includes stuffs to filter Gimple and insert chunks into original Gimple representation. I am very glad to know MELT. I will try it. Thanks!