On Thu, Nov 08, 2012 at 05:41:04PM +0100, Johann Klammer wrote:
> Hello,
> Some compilers feature function call interfaces for on-the-fly
> compilation (C# and lcc).

And most importantly, LLVM/Clang. (And also tinycc). LLVM is mostly a library 
to generate quite good machine code from some internal representation.

> Now I wonder if this is possible with gcc. Is there a
> documented/stable interface for compiling snippets of C code
> programatically from inside a C program? If not, how much work would
> it involve? Would it be possible to do certain initialisation steps
> only once? Does gcc leak memory? Would it be able to run for
> extended periods of time, without having to end the process? Which
> parts of the compiler are reentrant/thread safe? Is the state nicely
> encapsulated or strewn across loads of globals/statics?

I believe it is not easily doable for GCC, but it might not be important, 
because you can definitely fork a gcc command to make the compilation (or even 
a make command to drive the gcc command).

It is not easily doable, because GCC has a lot of global state, and may have 
some small memory leaks.
And GCC is definitely not re-entrant.

There has been some past exploratory efforts around the idea of a GCC compiler 
server.

And it might not be very important in practice, because GCC is mostly useful to 
compile optimized code from C (or C++, Ada, Fortran....) code (if you just want 
to translate quickly generated C code to slow x86 machine code, you might use 
tinycc); whatever technique or tool you use generating optimized code 
(i.e. code comparable in quality to what gcc -O2 produces) will take a 
significant
amount of CPU time, so the overhead of starting a new process is practically 
negligible.

However GCC does have a plugin ability. Perhaps you might bent your program to 
make it 
a GCC plugin.

FWIW, MELT on http://gcc-melt.org/ is a big GCC plugin 
translating a domain specific language called MELT to some kind of extension 
for GCC,
and MELT uses exactly the technique I am suggesting: generating C code on the 
fly,
forking a compiler (thru make -> gcc), and dlopen-ing the generated *.so 
module. This works
surprisingly well in practice, and is even compatible on current computers 
-laptops or desktops running GNU/Linux- with interactive use (you can type a 
sequence of MELT expressions which are translated to a .c file, then compiled 
to a .so file, then dlopen-ed, and all this happens in a fraction of a second).


So if you want to use GCC from inside a compiler, a practical way is to 
generate a C file and fork the compilation. This works very well, and many 
software products are doing that.

If you insist of having a reentrant easily usable library with a well defined 
interface to compile code to machine code or to object files, LLVM is today 
more suitable for this usage than GCC is. (but that might change in a few 
years).


Regards.
-- 
Basile STARYNKEVITCH         http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mines, sont seulement les miennes} ***

Reply via email to