[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