llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
26.71k stars 10.94k forks source link

[compiler-rt] build compiler-rt test with libc++ error #72108

Open PikachuHyA opened 7 months ago

PikachuHyA commented 7 months ago

Environment

centos 7

the latest LLVM cannot be built with gcc 4.8 on CentOS 7, then we use a prebuilt LLVM 17 with custom path (/opt/prebuilt_llvm). However, the compiler-rt test cannot be built due to errors like no member named 'make_unique' in namespace 'std'. Therefore, we need to use libc++ to build compiler-rt.

Error

build with libc++ shared

FAILED: compiler-rt/lib/interception/tests/Interception-x86_64-Test /llvm/build_compiler_rt_test_with_libcxx/runtimes/runtimes-bins/compiler-rt/lib/interception/tests/Interception-x86_64-Test
cd /llvm/build_compiler_rt_test_with_libcxx/runtimes/runtimes-bins/compiler-rt/lib/interception/tests && /llvm/build_compiler_rt_test_with_libcxx/./bin/clang++ INTERCEPTION_TEST_OBJECTS.interception_linux_test.cpp.x86_64.o INTERCEPTION_TEST_OBJECTS.interception_linux_foreign_test.cpp.x86_64.o INTERCEPTION_TEST_OBJECTS.interception_test_main.cpp.x86_64.o INTERCEPTION_TEST_OBJECTS.interception_win_test.cpp.x86_64.o INTERCEPTION_TEST_OBJECTS.gtest-all.cc.x86_64.o /llvm/build_compiler_rt_test_with_libcxx/runtimes/runtimes-bins/compiler-rt/lib/interception/tests/libRTInterception.test.x86_64.a -o /llvm/build_compiler_rt_test_with_libcxx/runtimes/runtimes-bins/compiler-rt/lib/interception/tests/./Interception-x86_64-Test -fuse-ld=lld -Wl,--color-diagnostics -Wthread-safety -Wthread-safety-reference -Wthread-safety-beta -nostdlib++ /llvm/build_compiler_rt_test_with_libcxx/lib64/libc++.so -g --driver-mode=g++ -ldl -lrt -pthread
ld.lld: error: unable to find library -lc++abi
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
[5/38] Generating X86_64LinuxConfig/Asan-x86_64-inline-Test
FAILED: compiler-rt/lib/asan/tests/X86_64LinuxConfig/Asan-x86_64-inline-Test /llvm/build_compiler_rt_test_with_libcxx/runtimes/runtimes-bins/compiler-rt/lib/asan/tests/X86_64LinuxConfig/Asan-x86_64-inline-Test
cd /llvm/build_compiler_rt_test_with_libcxx/runtimes/runtimes-bins/compiler-rt/lib/asan/tests && /llvm/build_compiler_rt_test_with_libcxx/./bin/clang++ ASAN_INST_TEST_OBJECTS.gtest-all.cc.x86_64-inline.o ASAN_INST_TEST_OBJECTS.asan_globals_test.cpp.x86_64-inline.o ASAN_INST_TEST_OBJECTS.asan_interface_test.cpp.x86_64-inline.o ASAN_INST_TEST_OBJECTS.asan_internal_interface_test.cpp.x86_64-inline.o ASAN_INST_TEST_OBJECTS.asan_test.cpp.x86_64-inline.o ASAN_INST_TEST_OBJECTS.asan_oob_test.cpp.x86_64-inline.o ASAN_INST_TEST_OBJECTS.asan_mem_test.cpp.x86_64-inline.o ASAN_INST_TEST_OBJECTS.asan_str_test.cpp.x86_64-inline.o ASAN_INST_TEST_OBJECTS.asan_test_main.cpp.x86_64-inline.o -o /llvm/build_compiler_rt_test_with_libcxx/runtimes/runtimes-bins/compiler-rt/lib/asan/tests/X86_64LinuxConfig/./Asan-x86_64-inline-Test -fuse-ld=lld -Wl,--color-diagnostics -Wthread-safety -Wthread-safety-reference -Wthread-safety-beta -nostdlib++ /llvm/build_compiler_rt_test_with_libcxx/lib64/libc++.so -g --driver-mode=g++ -fsanitize=address
ld.lld: error: unable to find library -lc++abi
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

build with libc++ static

FAILED: compiler-rt/lib/memprof/tests/MemProfUnitTests
: && /llvm/build_compiler_rt_test_with_libcxx/./bin/clang++ --target=x86_64-unknown-linux-gnu -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -Wall -Wno-unused-parameter -O3 -DNDEBUG -fuse-ld=lld -Wl,--color-diagnostics    -Wthread-safety -Wthread-safety-reference -Wthread-safety-beta -nostdlib++ -pthread compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_allocator.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_common.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_deadlock_detector1.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_deadlock_detector2.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_errno.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_file.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_flags.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_flag_parser.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_fuchsia.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_libc.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_libignore.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_linux.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_linux_s390.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_mac.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_mutex.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_netbsd.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_platform_limits_freebsd.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_platform_limits_linux.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_platform_limits_netbsd.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_platform_limits_posix.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_platform_limits_solaris.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_posix.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_printf.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_procmaps_common.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_procmaps_bsd.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_procmaps_fuchsia.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_procmaps_linux.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_procmaps_mac.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_procmaps_solaris.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_range.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_solaris.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_stoptheworld_fuchsia.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_stoptheworld_mac.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_stoptheworld_win.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_suppressions.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_tls_get_addr.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_thread_arg_retval.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_thread_registry.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_type_traits.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_win.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.x86_64.dir/sanitizer_termination.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonCoverage.x86_64.dir/sancov_flags.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonCoverage.x86_64.dir/sanitizer_coverage_fuchsia.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonCoverage.x86_64.dir/sanitizer_coverage_libcdep_new.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonCoverage.x86_64.dir/sanitizer_coverage_win_sections.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.x86_64.dir/sanitizer_common_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.x86_64.dir/sanitizer_allocator_checks.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.x86_64.dir/sanitizer_linux_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.x86_64.dir/sanitizer_mac_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.x86_64.dir/sanitizer_posix_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.x86_64.dir/sanitizer_stoptheworld_linux_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.x86_64.dir/sanitizer_stoptheworld_netbsd_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_allocator_report.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_chained_origin_depot.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_stack_store.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_stackdepot.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_stacktrace.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_stacktrace_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_stacktrace_printer.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_stacktrace_sparc.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_symbolizer.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_symbolizer_libbacktrace.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_symbolizer_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_symbolizer_mac.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_symbolizer_markup.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_symbolizer_posix_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_symbolizer_report.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_symbolizer_win.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_unwind_linux_libcdep.cpp.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.x86_64.dir/sanitizer_unwind_win.cpp.o compiler-rt/lib/memprof/tests/CMakeFiles/MemProfUnitTests.dir/rawprofile.cpp.o compiler-rt/lib/memprof/tests/CMakeFiles/MemProfUnitTests.dir/driver.cpp.o compiler-rt/lib/memprof/tests/CMakeFiles/MemProfUnitTests.dir/llvm/third-party/unittest/googletest/src/gtest-all.cc.o compiler-rt/lib/memprof/tests/CMakeFiles/MemProfUnitTests.dir/llvm/third-party/unittest/googlemock/src/gmock-all.cc.o compiler-rt/lib/memprof/tests/CMakeFiles/MemProfUnitTests.dir/llvm/compiler-rt/lib/memprof/memprof_mibmap.cpp.o compiler-rt/lib/memprof/tests/CMakeFiles/MemProfUnitTests.dir/llvm/compiler-rt/lib/memprof/memprof_rawprofile.cpp.o -o compiler-rt/lib/memprof/tests/MemProfUnitTests  /llvm/build_compiler_rt_test_with_libcxx/lib64/libc++.a  -ldl && :
ld.lld: error: undefined symbol: __cxa_begin_catch
>>> referenced by rawprofile.cpp
>>>               compiler-rt/lib/memprof/tests/CMakeFiles/MemProfUnitTests.dir/rawprofile.cpp.o:(__clang_call_terminate)
>>> referenced by string.cpp
>>>               string.cpp.o:(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>::reserve(unsigned long)) in archive /llvm/build_compiler_rt_test_with_libcxx/lib64/libc++.a
>>> referenced by ios.instantiations.cpp
>>>               ios.instantiations.cpp.o:(std::__1::basic_ostream<char, std::__1::char_traits<char>>::flush()) in archive /llvm/build_compiler_rt_test_with_libcxx/lib64/libc++.a
>>> referenced 113 more times

ld.lld: error: undefined symbol: std::terminate()
>>> referenced by rawprofile.cpp
>>>               compiler-rt/lib/memprof/tests/CMakeFiles/MemProfUnitTests.dir/rawprofile.cpp.o:(__clang_call_terminate)
>>> referenced by exception.cpp
>>>               exception.cpp.o:(std::nested_exception::rethrow_nested() const) in archive /llvm/build_compiler_rt_test_with_libcxx/lib64/libc++.a
>>> referenced by exception.cpp
>>>               exception.cpp.o:(std::rethrow_exception(std::exception_ptr)) in archive /llvm/build_compiler_rt_test_with_libcxx/lib64/libc++.a

reproducer

set up build prerequisite

yum -y install gcc g++ gcc-c++ libatomic libstdc++-devel libstdc++-static binutils binutils-devel glibc glibc-static coreutils bash
yum -y install make dos2unix git chrpath perl-generators perl-Digest-MD5 libxml2-devel libffi-devel zlib-devel ncurses-devel libedit-devel perl-Sys-Syslog aone-yumtools perl-Data-Dumper perl-Encode elfutils-libelf-devel
yum -y install  python3 python3-pip python3-devel
yum -y install openssl-devel.x86_64

create build directory

cd /llvm
mkdir build_compiler_rt_test_with_libcxx
cd build_compiler_rt_test_with_libcxx

build with libc++ shared

LDFLAGS="-fuse-ld=lld -Wl,-q -Wl,-znow -Wl,-build-id=sha1" cmake -G Ninja \
    -DCMAKE_BUILD_TYPE="Release" \
    -DCMAKE_C_FLAGS="-Wno-backend-plugin" \
    -DCMAKE_CXX_FLAGS="-Wno-backend-plugin" \
    -DCMAKE_C_COMPILER="/opt/prebuilt_llvm/bin/clang" \
    -DCMAKE_CXX_COMPILER="/opt/prebuilt_llvm/bin/clang++" \
    -DLLVM_ENABLE_CLASSIC_FLANG=ON \
    -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;openmp" \
    -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi" \
    -DLLVM_LIBDIR_SUFFIX=64 \
    -DLLVM_USE_LINKER=lld \
    -DLLVM_PARALLEL_COMPILE_JOBS="96" \
    -DLLVM_PARALLEL_LINK_JOBS=96 \
    -DLLVM_ENABLE_NEW_PASS_MANAGER=ON \
    -DLLVM_TARGETS_TO_BUILD="X86;BPF;WebAssembly" \
    -DLLVM_ENABLE_LIBCXX=ON \
    -DLLVM_STATIC_LINK_CXX_STDLIB=ON \
    -DLLVM_BINUTILS_INCDIR="/usr/include" \
    -DLLVM_ENABLE_TERMINFO=OFF \
    -DLLVM_ENABLE_LIBXML2=OFF \
    -DLLVM_ENABLE_LIBEDIT=OFF \
    -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
    -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
    -DCOMPILER_RT_BUILD_XRAY=OFF \
    -DCOMPILER_RT_BUILD_ORC=OFF \
    -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
    -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=OFF \
    -DOPENMP_ENABLE_LIBOMPTARGET=OFF \
    -DOPENMP_ENABLE_OMPT_TOOLS=OFF \
    -DOPENMP_ENABLE_TESTING=OFF \
    -DCOMPILER_RT_LIT_USE_LIBCXX=ON \
    -DCOMPILER_RT_CXX_LIBRARY=libcxx \
    -DSANITIZER_CXX_ABI=libc++ \
    -DSANITIZER_CXX_ABI_INTREE=ON \
    -DSANITIZER_USE_STATIC_CXX_ABI=ON \
    -DSANITIZER_TEST_CXX=libc++ \
    -DSANITIZER_TEST_CXX_INTREE=ON \
    -DSANITIZER_USE_STATIC_TEST_CXX=OFF \
    ../llvm

highlight flags -DSANITIZER_TEST_CXX=libc++ -DSANITIZER_TEST_CXX_INTREE=ON -DSANITIZER_USE_STATIC_TEST_CXX=OFF

build

ninja
ninja check-compiler-rt

the error occur ld.lld: error: unable to find library -lc++abi

Reason: the path of libc++abi.so is not in search path due to our libc++ is not in standard path (e.g. /usr/lib64)

build with libc++ static

LDFLAGS="-fuse-ld=lld -Wl,-q -Wl,-znow -Wl,-build-id=sha1" cmake -G Ninja \
    -DCMAKE_BUILD_TYPE="Release" \
    -DCMAKE_C_FLAGS="-Wno-backend-plugin" \
    -DCMAKE_CXX_FLAGS="-Wno-backend-plugin" \
    -DCMAKE_C_COMPILER="/opt/prebuilt_llvm/bin/clang" \
    -DCMAKE_CXX_COMPILER="/opt/prebuilt_llvm/bin/clang++" \
    -DLLVM_ENABLE_CLASSIC_FLANG=ON \
    -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;openmp" \
    -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi" \
    -DLLVM_LIBDIR_SUFFIX=64 \
    -DLLVM_USE_LINKER=lld \
    -DLLVM_PARALLEL_COMPILE_JOBS="96" \
    -DLLVM_PARALLEL_LINK_JOBS=96 \
    -DLLVM_ENABLE_NEW_PASS_MANAGER=ON \
    -DLLVM_TARGETS_TO_BUILD="X86;BPF;WebAssembly" \
    -DLLVM_ENABLE_LIBCXX=ON \
    -DLLVM_STATIC_LINK_CXX_STDLIB=ON \
    -DLLVM_BINUTILS_INCDIR="/usr/include" \
    -DLLVM_ENABLE_TERMINFO=OFF \
    -DLLVM_ENABLE_LIBXML2=OFF \
    -DLLVM_ENABLE_LIBEDIT=OFF \
    -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
    -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
    -DCOMPILER_RT_BUILD_XRAY=OFF \
    -DCOMPILER_RT_BUILD_ORC=OFF \
    -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
    -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=OFF \
    -DOPENMP_ENABLE_LIBOMPTARGET=OFF \
    -DOPENMP_ENABLE_OMPT_TOOLS=OFF \
    -DOPENMP_ENABLE_TESTING=OFF \
    -DCOMPILER_RT_LIT_USE_LIBCXX=ON \
    -DCOMPILER_RT_CXX_LIBRARY=libcxx \
    -DSANITIZER_CXX_ABI=libc++ \
    -DSANITIZER_CXX_ABI_INTREE=ON \
    -DSANITIZER_USE_STATIC_CXX_ABI=ON \
    -DSANITIZER_TEST_CXX=libc++ \
    -DSANITIZER_TEST_CXX_INTREE=ON \
    -DSANITIZER_USE_STATIC_TEST_CXX=OFF \
    ../llvm

highlight flags -DSANITIZER_TEST_CXX=libc++ -DSANITIZER_TEST_CXX_INTREE=ON -DSANITIZER_USE_STATIC_TEST_CXX=ON

build

ninja
ninja check-compiler-rt

the error occur ld.lld: error: undefined symbol: __cxa_begin_catch

Reason: the libc++abi.a is not linked to binary

Reference

see https://libcxx.llvm.org/UsingLibcxx.html#using-a-custom-built-libc

ldionne commented 7 months ago

I think this has to do with how compiler-rt links against libc++, this doesn't seem to be a libc++ issue.

Also, libc++ doesn't support being built with such an old GCC. The oldest GCC we support is GCC 13, but IDK if that would solve your problem regardless.

PikachuHyA commented 7 months ago

I think this has to do with how compiler-rt links against libc++, this doesn't seem to be a libc++ issue.

yes.

libc++ doesn't support being built with such an old GCC. The oldest GCC we support is GCC 13

the libc++ here is built by our prebuilt clang with libc++, not GCC

IDK if that would solve your problem regardless.

I want to build compiler-rt test (e.g. asan test) with libc++

currently, I use the options -DSANITIZER_TEST_CXX=libc++ -DSANITIZER_TEST_CXX_INTREE=ON -DSANITIZER_USE_STATIC_TEST_CXX=ON, but some error occurred. see the ERROR part.

So I want to modify the CMakeLists.txt to solve the error with the patch https://github.com/llvm/llvm-project/pull/72111.

PikachuHyA commented 7 months ago

The oldest GCC we support is GCC 13, but IDK if that would solve your problem regardless.

I test with GCC 13 and Clang 17, the Error still occured.

Environment Setup

now we build llvm and errors occured

LDFLAGS="-fuse-ld=lld -Wl,-q -Wl,-znow -Wl,-build-id=sha1" cmake -G Ninja \
    -DCMAKE_BUILD_TYPE="Release" \
    -DCMAKE_C_FLAGS="-Wno-backend-plugin" \
    -DCMAKE_CXX_FLAGS="-Wno-backend-plugin" \
    -DCMAKE_C_COMPILER="clang" \
    -DCMAKE_CXX_COMPILER="clang++" \
    -DLLVM_ENABLE_CLASSIC_FLANG=ON \
    -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;openmp" \
    -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi" \
    -DLLVM_LIBDIR_SUFFIX=64 \
    -DLLVM_USE_LINKER=lld \
    -DLLVM_PARALLEL_COMPILE_JOBS="96" \
    -DLLVM_PARALLEL_LINK_JOBS=96 \
    -DLLVM_ENABLE_NEW_PASS_MANAGER=ON \
    -DLLVM_TARGETS_TO_BUILD="X86;BPF;WebAssembly" \
    -DLLVM_ENABLE_LIBCXX=OFF \
    -DLLVM_STATIC_LINK_CXX_STDLIB=OFF \
    -DLLVM_BINUTILS_INCDIR="/usr/include" \
    -DLLVM_ENABLE_TERMINFO=OFF \
    -DLLVM_ENABLE_LIBXML2=OFF \
    -DLLVM_ENABLE_LIBEDIT=OFF \
    -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
    -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
    -DCOMPILER_RT_BUILD_XRAY=OFF \
    -DCOMPILER_RT_BUILD_ORC=OFF \
    -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
    -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=OFF \
    -DOPENMP_ENABLE_LIBOMPTARGET=OFF \
    -DOPENMP_ENABLE_OMPT_TOOLS=OFF \
    -DOPENMP_ENABLE_TESTING=OFF \
    -DCOMPILER_RT_CXX_LIBRARY=libcxx \
    -DSANITIZER_CXX_ABI=libc++ \
    -DSANITIZER_CXX_ABI_INTREE=ON \
    -DSANITIZER_USE_STATIC_CXX_ABI=ON \
    -DSANITIZER_TEST_CXX=libc++ \
    -DSANITIZER_TEST_CXX_INTREE=ON \
    -DSANITIZER_USE_STATIC_TEST_CXX=ON \
    -DSANITIZER_LIT_USE_LIBCXX=ON \
    ../llvm
ninja && ninja check-compiler-rt