[LLVMdev] libstdc++ as bytecode, and compiling C++ to C
Reid Spencer
rspencer at reidspencer.com
Mon Nov 20 17:08:04 PST 2006
On Tue, 2006-11-21 at 10:57 +1100, Emil Mikulic wrote:
> >
> > llvmc isn't a completed tool. In particular it doesn't handle native
> > linking properly. However, I'm not sure what it would do in your example
> > above that would cause the program to seg fault. Can you get a stack
> > trace?
>
> Actually, it looks to me like it generates bad code.
Well, like I said, it isn't complete.
>
> $ llvm-dis < out.bc | grep -- -3
> %tmp4.i.i = getelementptr int (...)** %tmp.i.i, int -3
> [and a bunch more, one of which is in main()...]
I don't see what's so bad about this ?
> $ llc -march=c -o=cbe.c out.bc
> WARNING: this target does not support the llvm.stacksave intrinsic.
> $ gcc -g cbe.c
> [n.b.: compiles successfully!]
> $ gdb a.out
> (gdb) run
> Starting program: a.out
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x08048958 in main () at cbe.c:1154
> 1154 ltmp_173_15 = *((int *)(<mp_172_54[-3]));
> (gdb) print ltmp_172_54
> $1 = (int (**)()) 0x0
Yeah, I was asking for a stack trace in the program generated by llvmc.
The CBE isn't going to help much here, at least not without the cbe
source.
>
> Can I send you bytecode files or any further diagnostics to chase this
> up?
Sure.
>
> > > 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:
> >
> > llvm-link should work fine because its just dealing with bytecode. BTW,
> > You could put all the std/*.o and sup/*.o files into a bc archive using
> > llvm-ar and then just link with that archive.
>
> I thought so, and I even tried playing with llvm-ar, but couldn't figure
> it out.
>
> $ llvm-ar rs mylib.a std/*.o sup/*.o
> llvm-ar: creating mylib.a
That's correct.
> $ llvm-link -o=linked.o x.o mylib.a
> llvm-link: error loading file 'mylib.a'
llvm-link only understands bytecode files. It can't read archives. Try
llvm-ld or gccld instead. If gccld, use the -link-as-library option.
> > > $ 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)
> >
> > CBE doesn't support exceptions ?
>
> Fair enough. It's just that if I use llc to compile sup/eh_throw.o to a
> C file, it contains a __cxa_throw() function. (whether it does the
> right thing or not, I don't know - I haven't gotten that far)
Probably not. Again, the CBE doesn't support exceptions and it would
have to understand that __cxa_throw is part of the exception handling.
> But, after the big llvm-link step, cbe.c doesn't contain a __cxa_throw()
> function even though it's called from the code.
I'm not surprised.
>
> > > 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.
> >
> > CBE doesn't support llvm.stacksave
>
> Fair enough. =)
>
> > > $ gcc cbe.c
> > > $ ./a.out
> > > hello world
> > > $
> > >
> > > Works!
> >
> > However it doesn't seem to matter for this program.
>
> The program is very simple, and doesn't use any EH itself, but I think
> pieces of libstdc++ do...
Okay.
>
> --Emil
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list