How are you building/running the tests? test/lit.cfg will link gcc_s into each test executable. If you’ve enabled the llvm unwinder, the tests are expected to fail on Linux.
Hmm. Just tested ToT libcxxabi and it passes for me.
When running make check-libcxxabi, you should see the following line:
lit.py: lit.cfg:215: note: inferred link_flags as: [’-lc++abi’, ‘-lgcc_eh’, ‘-lc’, ‘-lm’, ‘-lpthread’, ‘-lgcc_s’]
If I disable ld’s --as-needed support [0] tests pass for me too. But this means we are underlinking. For example pthread symbols are used in libcxxabi so we must link to pthread explicitly. Same for unwinding support those symbols are defined in gcc_s.
Ah. Okay, that makes sense. Odd that I don’t see it though.
-lpthread is fine to include unconditionally, but -lgcc_s should be linked based on LIBCXXABI_USE_LLVM_UNWINDER (if true, link libunwind, else link libgcc_s). libgcc is unfortunately far reaching, in that it has all of the compiler replacement functions and the unwinder, so that may not be quite correct. We may need to do -lunwind -lcompiler-rt in the case of LIBCXXABI_USE_LLVM_UNWINDER=ON, else -lgcc_s.
Submitted (with some slight modifications, s/libgcc_s/libgcc_eh/) as r212958. Tested with and without the LLVM unwinder, and things look good. Thanks again!
Submitted (with some slight modifications, s/libgcc_s/libgcc_eh/) as
r212958. Tested with and without the LLVM unwinder, and things look good.
Thanks again!
Changing gcc_s with gcc_eh doesn't look good. libcxxabi tests pass but
llvm MCJIT exception tests fail with:
"terminating with uncaught exception of type int"
Can you try to make a reduced test case for libcxxabi from this?
I've got the same issue.
On Linux (Trusty/x86_64), build clang with libc++/libc++abi (just
plain ninja clang cxx cxxabi w/o any special cmake flags), then use it
to bootstrap clang like this:
#0 0x00007ffff62b5bb9 in __GI_raise (sig=sig@entry=6) at
../nptl/sysdeps/unix/sysv/linux/raise.c:56 #1 0x00007ffff62b8fc8 in __GI_abort () at abort.c:89 #2 0x00007ffff7b60807 in abort_message (format=0x7ffff7bcdf13
"terminating with %s exception of type %s") at
../projects/libcxxabi/src/abort_message.cpp:66 #3 0x00007ffff7b60ad6 in default_terminate_handler () at
../projects/libcxxabi/src/cxa_default_handlers.cpp:68 #4 0x00007ffff7bc454e in std::__terminate (func=0x7ffff7b60900
<default_terminate_handler()>) at
../projects/libcxxabi/src/cxa_handlers.cpp:68 #5 0x00007ffff7bc31dd in __cxxabiv1::failed_throw
(exception_header=0x1e87240) at
../projects/libcxxabi/src/cxa_exception.cpp:149 #6 0x00007ffff7bc3136 in __cxa_throw (thrown_object=0x1e872b8,
tinfo=0x7ffff7dd83b0 <typeinfo for int>, dest=0x0) at
../projects/libcxxabi/src/cxa_exception.cpp:244 #7 0x00007ffff7ff502d in throwException () #8 0x00007ffff7ff503d in main () #9 0x0000000000beef04 in llvm::MCJIT::runFunction (this=0x1e74c30,
F=0x1e6b4b0, ArgValues=...) at
../lib/ExecutionEngine/MCJIT/MCJIT.cpp:500 #10 0x0000000000b26f90 in llvm::ExecutionEngine::runFunctionAsMain
(this=0x1e74c30, Fn=0x1e6b4b0, argv=..., envp=0x7fffffffe0d0)
at ../lib/ExecutionEngine/ExecutionEngine.cpp:393 #11 0x0000000000567cc4 in main (argc=4, argv=0x7fffffffe0a8,
envp=0x7fffffffe0d0) at ../tools/lli/lli.cpp:613
#0 0x00007ffff62b5bb9 in __GI_raise (sig=sig@entry=6) at
…/nptl/sysdeps/unix/sysv/linux/raise.c:56 #1 0x00007ffff62b8fc8 in __GI_abort () at abort.c:89 #2 0x00007ffff7b60807 in abort_message (format=0x7ffff7bcdf13
“terminating with %s exception of type %s”) at
…/projects/libcxxabi/src/abort_message.cpp:66 #3 0x00007ffff7b60ad6 in default_terminate_handler () at
…/projects/libcxxabi/src/cxa_default_handlers.cpp:68 #4 0x00007ffff7bc454e in std::__terminate (func=0x7ffff7b60900
<default_terminate_handler()>) at
…/projects/libcxxabi/src/cxa_handlers.cpp:68 #5 0x00007ffff7bc31dd in __cxxabiv1::failed_throw
(exception_header=0x1e87240) at
…/projects/libcxxabi/src/cxa_exception.cpp:149 #6 0x00007ffff7bc3136 in __cxa_throw (thrown_object=0x1e872b8,
tinfo=0x7ffff7dd83b0 , dest=0x0) at
…/projects/libcxxabi/src/cxa_exception.cpp:244 #7 0x00007ffff7ff502d in throwException () #8 0x00007ffff7ff503d in main () #9 0x0000000000beef04 in llvm::MCJIT::runFunction (this=0x1e74c30,
F=0x1e6b4b0, ArgValues=…) at
…/lib/ExecutionEngine/MCJIT/MCJIT.cpp:500 #10 0x0000000000b26f90 in llvm::ExecutionEngine::runFunctionAsMain
(this=0x1e74c30, Fn=0x1e6b4b0, argv=…, envp=0x7fffffffe0d0)
at …/lib/ExecutionEngine/ExecutionEngine.cpp:393 #11 0x0000000000567cc4 in main (argc=4, argv=0x7fffffffe0a8,
envp=0x7fffffffe0d0) at …/tools/lli/lli.cpp:613
Any update here Eric? Or others? Would really like to get the bootstrap clean with libc++abi.
The above steps assume that you already have libc++.so installed somewhere the linker can find it
and that libc++.so is a linker script that includes -lc++abi.
I turned LLVM_BUILD_PROJECTS off so that we aren’t contending with two different libc++abi binaries.
Alright, so the problem is that libgcc_eh.a marks most of the _Unwind symbols as hidden. This means that when libgcc_eh.a is linked into a shared library exceptions cannot be thrown beyond the library boundary. I think that both libgcc_s and libgcc_eh were being linked into lli causing the failures. Since we typically build libc++abi as a shared library we need to use libgcc_s.so instead. (I think we will still need to use libgcc_eh when creating a static libc++abi)
I think that libc++abi should link the default libraries exactly as clang would if we didn’t specify '-nodefaultlibs`. This resulting link line for libc++abi.so should look something like:
-lm -lgcc_s -lpthread -lc -lgcc_s
The resulting libc++abi.so will still have undefined references to libgcc.a’s _Unwind symbols but libgcc.a should always be linked into the final executable.
When using and testing libc++abi (via libc++) the link line should look something like: