diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 143 |
1 files changed, 112 insertions, 31 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index aa360a3ef..7dfb1ee28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,8 @@ include(CompilerRTUtils) option(COMPILER_RT_BUILD_BUILTINS "Build builtins" ON) mark_as_advanced(COMPILER_RT_BUILD_BUILTINS) +option(COMPILER_RT_BUILD_CRT "Build crtbegin.o/crtend.o" ON) +mark_as_advanced(COMPILER_RT_BUILD_CRT) option(COMPILER_RT_BUILD_SANITIZERS "Build sanitizers" ON) mark_as_advanced(COMPILER_RT_BUILD_SANITIZERS) option(COMPILER_RT_BUILD_XRAY "Build xray" ON) @@ -157,6 +159,9 @@ if ("${COMPILER_RT_DEFAULT_TARGET_TRIPLE}" MATCHES ".*android.*") endif() pythonize_bool(ANDROID) +set(ANDROID_NDK_VERSION 18 + CACHE STRING "Set this to the Android NDK version that you are using") + set(COMPILER_RT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(COMPILER_RT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) @@ -178,6 +183,27 @@ option(COMPILER_RT_EXTERNALIZE_DEBUGINFO # COMPILER_RT_DEBUG_PYBOOL is used by lit.common.configured.in. pythonize_bool(COMPILER_RT_DEBUG) +option(COMPILER_RT_INTERCEPT_LIBDISPATCH + "Support interception of libdispatch (GCD). Requires '-fblocks'" OFF) +option(COMPILER_RT_LIBDISPATCH_INSTALL_PATH + "Specify if libdispatch is installed in a custom location" "") +if (COMPILER_RT_INTERCEPT_LIBDISPATCH AND NOT APPLE) + set(COMPILER_RT_LIBDISPATCH_CFLAGS -fblocks) + set(COMPILER_RT_TEST_LIBDISPATCH_CFLAGS) + if (COMPILER_RT_LIBDISPATCH_INSTALL_PATH) + list(APPEND COMPILER_RT_TEST_LIBDISPATCH_CFLAGS + -I${COMPILER_RT_LIBDISPATCH_INSTALL_PATH}/include) + list(APPEND COMPILER_RT_TEST_LIBDISPATCH_CFLAGS + -L${COMPILER_RT_LIBDISPATCH_INSTALL_PATH}/lib + -Wl,-rpath=${COMPILER_RT_LIBDISPATCH_INSTALL_PATH}/lib) + endif() + list(APPEND COMPILER_RT_TEST_LIBDISPATCH_CFLAGS -lBlocksRuntime -ldispatch) +endif() +if (APPLE) # Always enable on Apple platforms. + set(COMPILER_RT_INTERCEPT_LIBDISPATCH ON) +endif() +pythonize_bool(COMPILER_RT_INTERCEPT_LIBDISPATCH) + if(APPLE AND SANITIZER_MIN_OSX_VERSION AND SANITIZER_MIN_OSX_VERSION VERSION_LESS "10.9") # Mac OS X prior to 10.9 had problems with exporting symbols from # libc++/libc++abi. @@ -194,27 +220,57 @@ if (cxxabi_supported AND SANITIZER_ALLOW_CXXABI) endif() pythonize_bool(SANITIZER_CAN_USE_CXXABI) +macro(handle_default_cxx_lib var) + if (${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++) +set(CXXABIS none default libstdc++ libc++ libcxxabi) set_property(CACHE SANITIZER_CXX_ABI PROPERTY STRINGS ;${CXXABIS}) +handle_default_cxx_lib(SANITIZER_CXX_ABI) -if (SANITIZER_CXX_ABI STREQUAL "default") - if (APPLE OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - set(SANITIZER_CXX_ABI_LIBNAME "libc++") - set(SANITIZER_CXX_ABI_SYSTEM 1) - elseif (FUCHSIA) - set(SANITIZER_CXX_ABI_LIBNAME "libc++") - set(SANITIZER_CXX_ABI_INTREE 1) - else() - set(SANITIZER_CXX_ABI_LIBNAME "libstdc++") - set(SANITIZER_CXX_ABI_SYSTEM 1) - endif() -else() - set(SANITIZER_CXX_ABI_LIBNAME "${SANITIZER_CXX_ABI}") - set(SANITIZER_CXX_ABI_SYSTEM 1) +# 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) +elseif (DEFINED LIBUNWIND_ENABLE_SHARED AND NOT LIBUNWIND_ENABLE_SHARED) + set(DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER ON) endif() +option(SANITIZER_USE_STATIC_LLVM_UNWINDER + "Use static LLVM unwinder." ${DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER}) + +set(DEFAULT_SANITIZER_USE_STATIC_CXX_ABI OFF) +if (DEFINED LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_SHARED) + set(DEFAULT_SANITIZER_USE_STATIC_CXX_ABI ON) +endif() + +option(SANITIZER_USE_STATIC_CXX_ABI + "Use static libc++abi." ${DEFAULT_SANITIZER_USE_STATIC_CXX_ABI}) + set(DEFAULT_COMPILER_RT_USE_BUILTINS_LIBRARY OFF) if (FUCHSIA) set(DEFAULT_COMPILER_RT_USE_BUILTINS_LIBRARY ON) @@ -342,9 +398,13 @@ if(MSVC) # warning from the MS linker complaining that it can't find the 'vc140.pdb' # file used by our object library compilations. list(APPEND SANITIZER_COMMON_CFLAGS /Z7) - llvm_replace_compiler_option(CMAKE_CXX_FLAGS "/Z[i7I]" "/Z7") - llvm_replace_compiler_option(CMAKE_CXX_FLAGS_DEBUG "/Z[i7I]" "/Z7") - llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/Z[i7I]" "/Z7") + foreach(var_to_update + CMAKE_CXX_FLAGS + CMAKE_CXX_FLAGS_DEBUG + CMAKE_CXX_FLAGS_RELWITHDEBINFO) + string(REGEX REPLACE "(^| )/Z[i7I]($| )" " /Z7 " + "${var_to_update}" "${${var_to_update}}") + endforeach() elseif(COMPILER_RT_HAS_GLINE_TABLES_ONLY_FLAG AND NOT COMPILER_RT_DEBUG) list(APPEND SANITIZER_COMMON_CFLAGS -gline-tables-only) elseif(COMPILER_RT_HAS_G_FLAG) @@ -372,6 +432,7 @@ append_list_if(MINGW -fms-extensions SANITIZER_COMMON_CFLAGS) # Set common link flags. append_list_if(COMPILER_RT_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs SANITIZER_COMMON_LINK_FLAGS) +append_list_if(COMPILER_RT_HAS_Z_TEXT -Wl,-z,text SANITIZER_COMMON_LINK_FLAGS) if (COMPILER_RT_USE_BUILTINS_LIBRARY) list(APPEND SANITIZER_COMMON_LINK_LIBS ${COMPILER_RT_BUILTINS_LIBRARY}) @@ -391,25 +452,36 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia") list(APPEND SANITIZER_COMMON_LINK_LIBS zircon) endif() -if (SANITIZER_CXX_ABI_LIBNAME STREQUAL "libc++") - if (SANITIZER_CXX_ABI_INTREE) - if (NOT LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_shared OR HAVE_LIBUNWIND)) - list(APPEND SANITIZER_CXX_ABI_LIBRARY unwind_shared) - elseif (LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_static OR HAVE_LIBUNWIND)) - list(APPEND SANITIZER_CXX_ABI_LIBRARY unwind_static) +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() - if (NOT LIBCXX_ENABLE_STATIC_ABI_LIBRARY AND (TARGET cxxabi_shared OR HAVE_LIBCXXABI)) - list(APPEND SANITIZER_CXX_ABI_LIBRARY cxxabi_shared) - elseif (LIBCXX_ENABLE_STATIC_ABI_LIBRARY AND (TARGET cxxabi_static OR HAVE_LIBCXXABI)) - list(APPEND SANITIZER_CXX_ABI_LIBRARY cxxabi_static) + + 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() else() - append_list_if(COMPILER_RT_HAS_LIBCXX c++ SANITIZER_CXX_ABI_LIBRARY) + append_list_if(COMPILER_RT_HAS_LIBCXX c++ ${var}_LIBRARIES) 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_LIBRARY "c++abi") + 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_LIBRARY) + append_list_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ SANITIZER_CXX_ABI_LIBRARIES) +endif() + +if (SANITIZER_TEST_CXX_LIBNAME STREQUAL "libc++") + append_libcxx_libs(SANITIZER_TEST_CXX) +elseif (SANITIZER_TEST_CXX_LIBNAME STREQUAL "libstdc++") + append_list_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ SANITIZER_TEST_CXX_LIBRARIES) endif() # Warnings to turn off for all libraries, not just sanitizers. @@ -440,6 +512,15 @@ if(COMPILER_RT_USE_LIBCXX) 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() set(COMPILER_RT_LLD_PATH ${LLVM_MAIN_SRC_DIR}/tools/lld) |