Index: compiler-rt/CMakeLists.txt =================================================================== --- compiler-rt/CMakeLists.txt +++ compiler-rt/CMakeLists.txt @@ -230,6 +230,26 @@ set_property(CACHE SANITIZER_GTEST_CXX PROPERTY STRINGS ;${CXXLIBS}) handle_default_cxx_lib(SANITIZER_GTEST_CXX) +set(SANITIZER_LIBCXX_CXX_ABI "default" CACHE STRING + "Specify C++ ABI library to use for libc++.") +set(CXXABIS none default libcxxabi libcxxrt libstdc++ libsupc++) +set_property(CACHE SANITIZER_LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS}) + +if (SANITIZER_LIBCXX_CXX_ABI STREQUAL "default") + if (APPLE OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + # Forward "default" and let libc++ handle the rest. + set(SANITIZER_LIBCXX_CXX_ABI_VALUE "default") + elseif (FUCHSIA) + set(SANITIZER_LIBCXX_CXX_ABI_VALUE "libcxxabi") + elseif (SANITIZER_CXX_ABI STREQUAL "libcxxabi") + set(SANITIZER_LIBCXX_CXX_ABI_VALUE "libcxxabi") + else() + set(SANITIZER_LIBCXX_CXX_ABI_VALUE "libstdc++") + endif() +else() + set(SANITIZER_LIBCXX_CXX_ABI_VALUE "${SANITIZER_LIBCXX_CXX_ABI}") +endif() + set(DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER OFF) if (FUCHSIA) set(DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER ON) Index: compiler-rt/cmake/Modules/AddCompilerRT.cmake =================================================================== --- compiler-rt/cmake/Modules/AddCompilerRT.cmake +++ compiler-rt/cmake/Modules/AddCompilerRT.cmake @@ -596,6 +596,7 @@ -DLLVM_BINARY_DIR=${prefix} -DLLVM_LIBRARY_OUTPUT_INTDIR=${prefix}/lib -DLIBCXX_STANDALONE_BUILD=ON + -DLIBCXX_CXX_ABI=${SANITIZER_LIBCXX_CXX_ABI_VALUE} ${LIBCXX_CMAKE_ARGS} INSTALL_COMMAND "" STEP_TARGETS configure build Index: compiler-rt/lib/fuzzer/CMakeLists.txt =================================================================== --- compiler-rt/lib/fuzzer/CMakeLists.txt +++ compiler-rt/lib/fuzzer/CMakeLists.txt @@ -134,8 +134,7 @@ CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON -DLIBCXX_ENABLE_EXCEPTIONS=OFF -DLIBCXX_ENABLE_SHARED=OFF - -DLIBCXX_ABI_NAMESPACE=Fuzzer - -DLIBCXX_CXX_ABI=none) + -DLIBCXX_ABI_NAMESPACE=Fuzzer) target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-build) target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) Index: compiler-rt/lib/msan/tests/CMakeLists.txt =================================================================== --- compiler-rt/lib/msan/tests/CMakeLists.txt +++ compiler-rt/lib/msan/tests/CMakeLists.txt @@ -50,8 +50,6 @@ -fsanitize=memory # Don't need -stdlib=libc++ because we explicitly list libc++.so in the linker # inputs. - # FIXME: we build libcxx without cxxabi and need libstdc++ to provide it. - -lstdc++ ) append_list_if(COMPILER_RT_HAS_LIBDL -ldl MSAN_UNITTEST_LINK_FLAGS) Index: libcxx/CMakeLists.txt =================================================================== --- libcxx/CMakeLists.txt +++ libcxx/CMakeLists.txt @@ -140,17 +140,17 @@ set(CXXABIS none default libcxxabi libcxxrt libstdc++ libsupc++ vcruntime) set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS}) +find_path( + LIBCXX_LIBCXXABI_INCLUDES_INTERNAL + cxxabi.h + PATHS ${LLVM_MAIN_SRC_DIR}/projects/libcxxabi/include + ${LLVM_MAIN_SRC_DIR}/runtimes/libcxxabi/include + ${LLVM_MAIN_SRC_DIR}/../libcxxabi/include + NO_DEFAULT_PATH + NO_CMAKE_FIND_ROOT_PATH +) # Setup the default options if LIBCXX_CXX_ABI is not specified. if (LIBCXX_CXX_ABI STREQUAL "default") - find_path( - LIBCXX_LIBCXXABI_INCLUDES_INTERNAL - cxxabi.h - PATHS ${LLVM_MAIN_SRC_DIR}/projects/libcxxabi/include - ${LLVM_MAIN_SRC_DIR}/runtimes/libcxxabi/include - ${LLVM_MAIN_SRC_DIR}/../libcxxabi/include - NO_DEFAULT_PATH - NO_CMAKE_FIND_ROOT_PATH - ) if (LIBCXX_TARGETING_MSVC) # FIXME: Figure out how to configure the ABI library on Windows. set(LIBCXX_CXX_ABI_LIBNAME "vcruntime") @@ -170,6 +170,10 @@ endif() else() set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}") + if (LIBCXX_CXX_ABI STREQUAL "libcxxabi" AND + IS_DIRECTORY "${LIBCXX_LIBCXXABI_INCLUDES_INTERNAL}") + set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_LIBCXXABI_INCLUDES_INTERNAL}") + endif() endif() # Use a static copy of the ABI library when linking libc++. This option