libstdc++ as bytecode, again

Okay, let's try this again. I've taken all the source and header files
needed to build libstdc++ and libsupc++, and put together a small and
very simple Makefile that automates the process.

Anyone interested can grab the whole thing from here: (101KB)

Usage instructions:

1) Run GNU make:
  $ gmake

This will produce dietstdcxx.bc - a bytecode / object file containing all of
stdc++ and supc++ llvm-link'd together.

2) Run:
  $ gmake test

This will build and run the test program.
  $ gmake test
  llvm-g++ -emit-llvm -c -o test.o test.cpp
  llvm-link -f -o linked.o test.o dietstdcxx.bc
  llvmc -o=reduced linked.o
  llc -f -o=out.c -march=c reduced.bc
  WARNING: this target does not support the llvm.stacksave intrinsic.
  gcc out.c
  hello world

Things I'm doing differently compared to last time:
- almost sane build infrastructure
- building dietstdcxx with -fno-exceptions (!)

Without the llvmc step to reduce the bytecode, I get three errors in the
gcc stage:
  $ llc -f -o=out2.c -march=c linked.o
  WARNING: this target does not support the llvm.stacksave intrinsic.
  $ gcc out2.c
  /var/tmp//cc79lj1N.o(.text+0xd726d): In function `__cxxabiv1::__pbase_type_info::__do_catch(std::type_info const*, void**, unsigned int) const':
  : undefined reference to `l182___cxa_bad_typeid'
  /var/tmp//cc79lj1N.o(.data+0x19fc): undefined reference to `std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::seekpos(std::fpos<__mbstate_t>, std::_Ios_Openmode)'
  /var/tmp//cc79lj1N.o(.data+0x1a3c): undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::seekpos(std::fpos<__mbstate_t>, std::_Ios_Openmode)'

And again, using llvmc instead of llvm-link produces bad code:

  $ gmake dietstdcxx.bc
  $ llvm-g++ -emit-llvm -c -o test.o test.cpp
  $ llvmc -o=linked test.o dietstdcxx.bc
  $ lli linked.bc
  Segmentation fault (core dumped)

Reid, you asked for a stack trace from a program generated by llvmc.
I tried this:
  $ gmake clean
  $ gmake [with CCFLAGS=-g]
  $ llvm-g++ -g -emit-llvm -c -o test.o test.cpp
  $ llvmc -native -g -o=native test.o dietstdcxx.bc

But there were no debug symbols. gdb says the problem is in main(),
but doesn't even give a line number.

It also complains about:
  DW_FORM_strp pointing outside of .debug_str section [in module /rest/dietstdcxx/native]

Did you mean something else?


(P.S. "diet" turned out to be something of a misnomer. In the end, I
didn't really strip out any code)