diff --git a/clang/cmake/caches/Fuchsia-stage2.cmake b/clang/cmake/caches/Fuchsia-stage2.cmake --- a/clang/cmake/caches/Fuchsia-stage2.cmake +++ b/clang/cmake/caches/Fuchsia-stage2.cmake @@ -110,6 +110,8 @@ set(RUNTIMES_${target}_CMAKE_MODULE_LINKER_FLAGS "-fuse-ld=lld" CACHE STRING "") set(RUNTIMES_${target}_CMAKE_EXE_LINKER_FLAGS "-fuse-ld=lld" CACHE STRING "") set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_USE_LIBCXX ON CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_ENABLE_STATIC_LIBCXX ON CACHE BOOL "") set(RUNTIMES_${target}_COMPILER_RT_CAN_EXECUTE_TESTS ON CACHE BOOL "") set(RUNTIMES_${target}_LIBUNWIND_ENABLE_SHARED OFF CACHE BOOL "") set(RUNTIMES_${target}_LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") @@ -123,10 +125,6 @@ set(RUNTIMES_${target}_LIBCXX_ENABLE_STATIC_ABI_LIBRARY ON CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ABI_VERSION 2 CACHE STRING "") set(RUNTIMES_${target}_LLVM_ENABLE_ASSERTIONS OFF CACHE BOOL "") - set(RUNTIMES_${target}_SANITIZER_CXX_ABI "libc++" CACHE STRING "") - set(RUNTIMES_${target}_SANITIZER_CXX_ABI_INTREE ON CACHE BOOL "") - set(RUNTIMES_${target}_SANITIZER_TEST_CXX "libc++" CACHE STRING "") - set(RUNTIMES_${target}_SANITIZER_TEST_CXX_INTREE ON CACHE BOOL "") set(RUNTIMES_${target}_COMPILER_RT_TEST_COMPILER_CFLAGS "--unwindlib=libunwind -static-libgcc" CACHE STRING "") set(RUNTIMES_${target}_SANITIZER_COMMON_TEST_TARGET_CFLAGS "--unwindlib=libunwind -static-libgcc" CACHE STRING "") set(RUNTIMES_${target}_TSAN_TEST_TARGET_CFLAGS "--unwindlib=libunwind -static-libgcc" CACHE STRING "") @@ -177,6 +175,7 @@ set(RUNTIMES_${target}_CMAKE_EXE_LINKER_FLAGS ${FUCHSIA_${target}_LINKER_FLAGS} CACHE STRING "") set(RUNTIMES_${target}_CMAKE_SYSROOT ${FUCHSIA_${target}_SYSROOT} CACHE PATH "") set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_USE_LIBCXX ON CACHE BOOL "") set(RUNTIMES_${target}_LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") set(RUNTIMES_${target}_LIBUNWIND_HIDE_SYMBOLS ON CACHE BOOL "") set(RUNTIMES_${target}_LIBUNWIND_INSTALL_STATIC_LIBRARY OFF CACHE BOOL "") diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt --- a/compiler-rt/CMakeLists.txt +++ b/compiler-rt/CMakeLists.txt @@ -174,43 +174,6 @@ endif() pythonize_bool(SANITIZER_CAN_USE_CXXABI) -macro(handle_default_cxx_lib var) - # Specifying -stdlib= in CMAKE_CXX_FLAGS overrides the defaults. - if (CMAKE_CXX_FLAGS MATCHES "-stdlib=([a-zA-Z+]*)") - set(${var}_LIBNAME "${CMAKE_MATCH_1}") - set(${var}_SYSTEM 1) - elseif (${var} STREQUAL "default") - if (APPLE OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - set(${var}_LIBNAME "libc++") - set(${var}_SYSTEM 1) - elseif (FUCHSIA) - set(${var}_LIBNAME "libc++") - set(${var}_INTREE 1) - else() - set(${var}_LIBNAME "libstdc++") - set(${var}_SYSTEM 1) - endif() - else() - set(${var}_LIBNAME "${${var}}") - set(${var}_SYSTEM 1) - endif() -endmacro() - -# This is either directly the C++ ABI library or the full C++ library -# which pulls in the ABI transitively. -set(SANITIZER_CXX_ABI "default" CACHE STRING - "Specify C++ ABI library to use.") -set(CXXABIS none default libstdc++ libc++ libcxxabi) -set_property(CACHE SANITIZER_CXX_ABI PROPERTY STRINGS ;${CXXABIS}) -handle_default_cxx_lib(SANITIZER_CXX_ABI) - -# This needs to be a full C++ library for linking gtest and unit tests. -set(SANITIZER_TEST_CXX "default" CACHE STRING - "Specify C++ library to use for tests.") -set(CXXLIBS none default libstdc++ libc++) -set_property(CACHE SANITIZER_TEST_CXX PROPERTY STRINGS ;${CXXLIBS}) -handle_default_cxx_lib(SANITIZER_TEST_CXX) - set(DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER OFF) if (FUCHSIA) set(DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER ON) @@ -485,76 +448,95 @@ list(APPEND SANITIZER_COMMON_LINK_FLAGS -Wl,-z,defs) endif() -# TODO: COMPILER_RT_COMMON_CFLAGS and COMPILER_RT_COMMON_LINK_FLAGS are -# intended for use in non-sanitizer runtimes such as libFuzzer, profile or XRay, -# move these higher to include common flags, then derive SANITIZER_COMMON_CFLAGS -# and SANITIZER_COMMON_LINK_FLAGS from those and append sanitizer-specific flags. -set(COMPILER_RT_COMMON_CFLAGS ${SANITIZER_COMMON_CFLAGS}) -set(COMPILER_RT_COMMON_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}) +# TODO: There's a lot of duplication across lib/*/tests/CMakeLists.txt files, +# move some of the common flags to COMPILER_RT_UNITTEST_CFLAGS. -# We don't use the C++ standard library, so avoid including it by mistake. -append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ SANITIZER_COMMON_CFLAGS) -append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ SANITIZER_COMMON_LINK_FLAGS) +# When cross-compiling, COMPILER_RT_TEST_COMPILER_CFLAGS help in compilation +# and linking of unittests. +string(REPLACE " " ";" COMPILER_RT_UNITTEST_CFLAGS "${COMPILER_RT_TEST_COMPILER_CFLAGS}") +set(COMPILER_RT_UNITTEST_LINK_FLAGS ${COMPILER_RT_UNITTEST_CFLAGS}) -# Remove -stdlib= which is unused when passing -nostdinc++... -string(REGEX MATCHALL "-stdlib=[a-zA-Z+]*" stdlib_flag "${CMAKE_CXX_FLAGS}") -string(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +append_list_if(COMPILER_RT_DEBUG -DSANITIZER_DEBUG=1 COMPILER_RT_UNITTEST_CFLAGS) +append_list_if(COMPILER_RT_HAS_G_FLAG -g COMPILER_RT_UNITTEST_CFLAGS) +append_list_if(COMPILER_RT_HAS_WCOVERED_SWITCH_DEFAULT_FLAG -Wno-covered-switch-default COMPILER_RT_UNITTEST_CFLAGS) +append_list_if(COMPILER_RT_HAS_WSUGGEST_OVERRIDE_FLAG -Wno-suggest-override COMPILER_RT_UNITTEST_CFLAGS) -# ...we need it to build some runtimes and tests so readd it where appropriate. -list(APPEND COMPILER_RT_COMMON_CFLAGS ${stdlib_flag}) -list(APPEND COMPILER_RT_COMMON_LINK_FLAGS ${stdlib_flag}) +option(COMPILER_RT_USE_LIBCXX + "Enable compiler-rt to use libc++ from the source tree" ON) +if(COMPILER_RT_USE_LIBCXX) + # Disable the use of default standard library. + append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ SANITIZER_COMMON_CFLAGS) + append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ SANITIZER_COMMON_LINK_FLAGS) -macro(append_libcxx_libs var) - if (${var}_INTREE) - if (SANITIZER_USE_STATIC_LLVM_UNWINDER AND (TARGET unwind_static OR HAVE_LIBUNWIND)) - list(APPEND ${var}_LIBRARIES unwind_static) - elseif (TARGET unwind_shared OR HAVE_LIBUNWIND) - list(APPEND ${var}_LIBRARIES unwind_shared) - endif() + # Remove -stdlib= which is unused when passing -nostdinc++. + string(REGEX MATCHALL "-stdlib=[a-zA-Z+]*" stdlib_flag "${CMAKE_CXX_FLAGS}") + string(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - if (SANITIZER_USE_STATIC_CXX_ABI AND (TARGET cxxabi_static OR HAVE_LIBCXXABI)) - list(APPEND ${var}_LIBRARIES cxxabi_static) - elseif (TARGET cxxabi_shared OR HAVE_LIBCXXABI) - list(APPEND ${var}_LIBRARIES cxxabi_shared) - endif() + if (SANITIZER_USE_STATIC_LLVM_UNWINDER) + set(unwind_target unwind_static) else() - append_list_if(COMPILER_RT_HAS_LIBCXX c++ ${var}_LIBRARIES) + set(unwind_target unwind_shared) endif() -endmacro() - -if (SANITIZER_CXX_ABI_LIBNAME STREQUAL "libc++") - append_libcxx_libs(SANITIZER_CXX_ABI) -elseif (SANITIZER_CXX_ABI_LIBNAME STREQUAL "libcxxabi") - list(APPEND SANITIZER_CXX_ABI_LIBRARIES "c++abi") -elseif (SANITIZER_CXX_ABI_LIBNAME STREQUAL "libstdc++") - append_list_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ SANITIZER_CXX_ABI_LIBRARIES) -endif() - -if (SANITIZER_TEST_CXX_LIBNAME STREQUAL "libc++") - if (SANITIZER_TEST_CXX_INTREE) - if (SANITIZER_USE_STATIC_TEST_CXX) - set(cxx_target cxx_static) - else() - set(cxx_target cxx_shared) - endif() - list(APPEND SANITIZER_TEST_CXX_LIBRARIES "$<$>:$>") + list(APPEND SANITIZER_CXX_ABI_LIBRARIES "$<$:$>") + + if (SANITIZER_USE_STATIC_CXX_ABI) + set(cxxabi_target cxxabi_static) else() - append_list_if(COMPILER_RT_HAS_LIBCXX -lc++ SANITIZER_TEST_CXX_LIBRARIES) + set(cxxabi_target cxxabi_shared) endif() -elseif (SANITIZER_TEST_CXX_LIBNAME STREQUAL "libstdc++") - append_list_if(COMPILER_RT_HAS_LIBSTDCXX -lstdc++ SANITIZER_TEST_CXX_LIBRARIES) -endif() + list(APPEND SANITIZER_CXX_ABI_LIBRARIES "$<$:$>") -# TODO: There's a lot of duplication across lib/*/tests/CMakeLists.txt files, -# move some of the common flags to COMPILER_RT_UNITTEST_CFLAGS. + # TODO: COMPILER_RT_COMMON_CFLAGS and COMPILER_RT_COMMON_LINK_FLAGS are + # intended for use in non-sanitizer runtimes such as libFuzzer, profile or XRay, + # move these higher to include common flags, then derive SANITIZER_COMMON_CFLAGS + # and SANITIZER_COMMON_LINK_FLAGS from those and append sanitizer-specific flags. + set(COMPILER_RT_COMMON_CFLAGS ${SANITIZER_COMMON_CFLAGS}) + set(COMPILER_RT_COMMON_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}) + + if (COMPILER_RT_ENABLE_STATIC_LIBCXX) + set(cxx_target cxx_static) + else() + set(cxx_target cxx_shared) + endif() -# Unittests need access to C++ standard library. -string(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS " ${stdlib_flag}") + list(APPEND COMPILER_RT_COMMON_CFLAGS "$<$:-isystem$,$-isystem>>") + list(APPEND COMPILER_RT_COMMON_LINK_FLAGS "$<$:$>") -# When cross-compiling, COMPILER_RT_TEST_COMPILER_CFLAGS help in compilation -# and linking of unittests. -string(REPLACE " " ";" COMPILER_RT_UNITTEST_CFLAGS "${COMPILER_RT_TEST_COMPILER_CFLAGS}") -set(COMPILER_RT_UNITTEST_LINK_FLAGS ${COMPILER_RT_UNITTEST_CFLAGS}) + # Use the in-tree libc++ for unit tests as well. + append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ COMPILER_RT_UNITTEST_CFLAGS) + append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ COMPILER_RT_UNITTEST_LINK_FLAGS) + + list(APPEND COMPILER_RT_UNITTEST_CFLAGS "$<$:-isystem$,$-isystem>>") + list(APPEND COMPILER_RT_UNITTEST_LINK_FLAGS "$<$:$>") + + if(LLVM_ENABLE_PROJECTS_USED) + # Don't use libcxx if LLVM_ENABLE_PROJECTS does not enable it. + set(COMPILER_RT_LIBCXX_PATH ${LLVM_EXTERNAL_LIBCXX_SOURCE_DIR}) + set(COMPILER_RT_LIBCXXABI_PATH ${LLVM_EXTERNAL_LIBCXXABI_SOURCE_DIR}) + else() + foreach(path IN ITEMS ${LLVM_MAIN_SRC_DIR}/projects/libcxx + ${LLVM_MAIN_SRC_DIR}/runtimes/libcxx + ${LLVM_MAIN_SRC_DIR}/../libcxx + ${LLVM_EXTERNAL_LIBCXX_SOURCE_DIR}) + if(IS_DIRECTORY ${path}) + set(COMPILER_RT_LIBCXX_PATH ${path}) + break() + endif() + endforeach() + foreach(path IN ITEMS ${LLVM_MAIN_SRC_DIR}/projects/libcxxabi + ${LLVM_MAIN_SRC_DIR}/runtimes/libcxxabi + ${LLVM_MAIN_SRC_DIR}/../libcxxabi + ${LLVM_EXTERNAL_LIBCXXABI_SOURCE_DIR}) + if(IS_DIRECTORY ${path}) + set(COMPILER_RT_LIBCXXABI_PATH ${path}) + break() + endif() + endforeach() + endif() +else() + set(COMPILER_RT_COMMON_CFLAGS ${SANITIZER_COMMON_CFLAGS}) + set(COMPILER_RT_COMMON_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}) +endif() # Unittests support. set(COMPILER_RT_GTEST_PATH ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest) @@ -576,13 +558,6 @@ -I${COMPILER_RT_GMOCK_PATH} ) -if(COMPILER_RT_HAS_G_FLAG) - list(APPEND COMPILER_RT_UNITTEST_CFLAGS -g) -endif() -append_list_if(COMPILER_RT_DEBUG -DSANITIZER_DEBUG=1 COMPILER_RT_UNITTEST_CFLAGS) -append_list_if(COMPILER_RT_HAS_WCOVERED_SWITCH_DEFAULT_FLAG -Wno-covered-switch-default COMPILER_RT_UNITTEST_CFLAGS) -append_list_if(COMPILER_RT_HAS_WSUGGEST_OVERRIDE_FLAG -Wno-suggest-override COMPILER_RT_UNITTEST_CFLAGS) - if(MSVC) # gtest use a lot of stuff marked as deprecated on Windows. list(APPEND COMPILER_RT_GTEST_CFLAGS -Wno-deprecated-declarations) @@ -602,37 +577,6 @@ set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221") endif() -add_subdirectory(include) - -option(COMPILER_RT_USE_LIBCXX - "Enable compiler-rt to use libc++ from the source tree" ON) -if(COMPILER_RT_USE_LIBCXX) - if(LLVM_ENABLE_PROJECTS_USED) - # Don't use libcxx if LLVM_ENABLE_PROJECTS does not enable it. - set(COMPILER_RT_LIBCXX_PATH ${LLVM_EXTERNAL_LIBCXX_SOURCE_DIR}) - set(COMPILER_RT_LIBCXXABI_PATH ${LLVM_EXTERNAL_LIBCXXABI_SOURCE_DIR}) - else() - foreach(path IN ITEMS ${LLVM_MAIN_SRC_DIR}/projects/libcxx - ${LLVM_MAIN_SRC_DIR}/runtimes/libcxx - ${LLVM_MAIN_SRC_DIR}/../libcxx - ${LLVM_EXTERNAL_LIBCXX_SOURCE_DIR}) - if(IS_DIRECTORY ${path}) - set(COMPILER_RT_LIBCXX_PATH ${path}) - break() - endif() - endforeach() - foreach(path IN ITEMS ${LLVM_MAIN_SRC_DIR}/projects/libcxxabi - ${LLVM_MAIN_SRC_DIR}/runtimes/libcxxabi - ${LLVM_MAIN_SRC_DIR}/../libcxxabi - ${LLVM_EXTERNAL_LIBCXXABI_SOURCE_DIR}) - if(IS_DIRECTORY ${path}) - set(COMPILER_RT_LIBCXXABI_PATH ${path}) - break() - endif() - endforeach() - endif() -endif() - set(COMPILER_RT_LLD_PATH ${LLVM_MAIN_SRC_DIR}/tools/lld) if(EXISTS ${COMPILER_RT_LLD_PATH}/ AND LLVM_TOOL_LLD_BUILD) set(COMPILER_RT_HAS_LLD TRUE) @@ -652,6 +596,7 @@ pythonize_bool(COMPILER_RT_HAS_LLD) pythonize_bool(COMPILER_RT_TEST_USE_LLD) +add_subdirectory(include) add_subdirectory(lib) if(COMPILER_RT_INCLUDE_TESTS) diff --git a/compiler-rt/lib/fuzzer/CMakeLists.txt b/compiler-rt/lib/fuzzer/CMakeLists.txt --- a/compiler-rt/lib/fuzzer/CMakeLists.txt +++ b/compiler-rt/lib/fuzzer/CMakeLists.txt @@ -57,7 +57,7 @@ } " HAS_THREAD_LOCAL) -set(LIBFUZZER_CFLAGS ${COMPILER_RT_COMMON_CFLAGS}) +set(LIBFUZZER_CFLAGS ${SANITIZER_COMMON_CFLAGS}) if(OS_NAME MATCHES "Linux|Fuchsia" AND COMPILER_RT_LIBCXX_PATH AND