[LLVMdev] libstdc++ as bytecode, and compiling C++ to C

Emil Mikulic emil at cs.rmit.edu.au
Sun Nov 19 22:49:00 PST 2006


I've compiled all the object files that make up libstdc++ and libsupc++
into LLVM bytecode:
	http://goanna.cs.rmit.edu.au/~emil/libstdcxx.tar.bz2 (438KB)

A simple test program, x.cpp:

	#include <iostream>
	int main() { std::cout << "hello world\n"; return 0; }

$ llvm-g++ -emit-llvm -c x.cpp
$ llvmc -o=out x.o std/*.o sup/*.o
$ lli out.bc
Segmentation fault (core dumped)
$

Oops, no go.  Try a different way:

$ llvm-g++ -emit-llvm -c x.cpp
$ llvm-link -o=linked.o x.o std/*.o sup/*.o
$ lli linked.o
hello world
$

So far, so good!  Compile to C:

$ llc -o=cbe.c -march=c linked.o
WARNING: this target does not support the llvm.stacksave intrinsic.
$ gcc cbe.c
/var/tmp//ccVAM4W2.o(.text+0x329a): In function `operator new(unsigned int)':
: undefined reference to `__cxa_throw'
[...and more errors]
$

But __cxa_throw is right there, in sup/eh_throw.o, and in linked.o, it
just isn't being emitted as C code.  (at this point, I suspect the
problem might be that I don't quite understand how some of the llvm
tools are intended to work - e.g. llvm-link vs llvmc)

Strangely enough:

$ llvm-g++ -emit-llvm -c x.cpp
$ llvm-link -o=linked.o x.o std/*.o sup/*.o
$ llvmc -o=out linked.o
$ llc -o=cbe.c -march=c out.bc
WARNING: this target does not support the llvm.stacksave intrinsic.
$ gcc cbe.c
$ ./a.out
hello world
$

Works!

--Emil



More information about the llvm-dev mailing list