From df90d22704d8743746fa00bc6d67e2789ca9ee9e Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Thu, 2 Jun 2022 21:52:56 +0000 Subject: [PATCH] [CMake] Option to select C++ library for runtimes that use it We currently have an option to select C++ ABI and C++ library for tests but there are runtimes that use C++ library, specifically ORC and XRay, which aren't covered by existing options. This change introduces a new option to control the use of C++ libray for these runtimes. Ideally, this option should become the default way to select C++ library for all of compiler-rt replacing the existing options (the C++ ABI option could remain as a hidden internal option). Differential Revision: https://reviews.llvm.org/D128036 --- clang/cmake/caches/Fuchsia-stage2.cmake | 2 ++ compiler-rt/CMakeLists.txt | 31 +++++++++++++++++++++++++++++++ compiler-rt/lib/fuzzer/CMakeLists.txt | 1 + compiler-rt/lib/orc/CMakeLists.txt | 10 ++++++++-- compiler-rt/lib/xray/CMakeLists.txt | 24 ++++++++++++++++++------ 5 files changed, 60 insertions(+), 8 deletions(-) diff --git a/clang/cmake/caches/Fuchsia-stage2.cmake b/clang/cmake/caches/Fuchsia-stage2.cmake index 67c88b3..76666d0 100644 --- a/clang/cmake/caches/Fuchsia-stage2.cmake +++ b/clang/cmake/caches/Fuchsia-stage2.cmake @@ -110,6 +110,7 @@ foreach(target aarch64-unknown-linux-gnu;armv7-unknown-linux-gnueabihf;i386-unkn set(RUNTIMES_${target}_CMAKE_SHARED_LINKER_FLAGS "-fuse-ld=lld" CACHE STRING "") 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_CXX_LIBRARY "libcxx" CACHE STRING "") set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "") set(RUNTIMES_${target}_COMPILER_RT_USE_LLVM_UNWINDER ON CACHE BOOL "") set(RUNTIMES_${target}_COMPILER_RT_CAN_EXECUTE_TESTS ON CACHE BOOL "") @@ -178,6 +179,7 @@ if(FUCHSIA_SDK) set(RUNTIMES_${target}_CMAKE_MODULE_LINKER_FLAGS ${FUCHSIA_${target}_LINKER_FLAGS} CACHE STRING "") 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_CXX_LIBRARY "libcxx" CACHE STRING "") set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "") set(RUNTIMES_${target}_COMPILER_RT_USE_LLVM_UNWINDER ON CACHE BOOL "") set(RUNTIMES_${target}_LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt index cdafdfc..405583a 100644 --- a/compiler-rt/CMakeLists.txt +++ b/compiler-rt/CMakeLists.txt @@ -199,6 +199,7 @@ endmacro() # This is either directly the C++ ABI library or the full C++ library # which pulls in the ABI transitively. +# TODO: Mark this as internal flag, most users should use COMPILER_RT_CXX_LIBRARY. set(SANITIZER_CXX_ABI "default" CACHE STRING "Specify C++ ABI library to use.") set(CXXABIS none default libstdc++ libc++ libcxxabi) @@ -206,6 +207,7 @@ 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. +# TODO: Mark this as internal flag, most users should use COMPILER_RT_CXX_LIBRARY. set(SANITIZER_TEST_CXX "default" CACHE STRING "Specify C++ library to use for tests.") set(CXXLIBS none default libstdc++ libc++) @@ -246,6 +248,15 @@ option(SANITIZER_USE_STATIC_TEST_CXX "Use static libc++ for tests." ${DEFAULT_SANITIZER_USE_STATIC_TEST_CXX}) pythonize_bool(SANITIZER_USE_STATIC_TEST_CXX) +set(COMPILER_RT_SUPPORTED_CXX_LIBRARIES none default libcxx) +set(COMPILER_RT_CXX_LIBRARY "default" CACHE STRING "Specify C++ library to use. Supported values are ${COMPILER_RT_SUPPORTED_CXX_LIBRARIES}.") +if (NOT "${COMPILER_RT_CXX_LIBRARY}" IN_LIST COMPILER_RT_SUPPORTED_CXX_LIBRARIES) + message(FATAL_ERROR "Unsupported C++ library: '${COMPILER_RT_CXX_LIBRARY}'. Supported values are ${COMPILER_RT_SUPPORTED_CXX_LIBRARIES}.") +endif() +cmake_dependent_option(COMPILER_RT_STATIC_CXX_LIBRARY + "Statically link the C++ library." OFF + "COMPILER_RT_CXX_LIBRARY" OFF) + set(DEFAULT_COMPILER_RT_USE_BUILTINS_LIBRARY OFF) if (FUCHSIA) set(DEFAULT_COMPILER_RT_USE_BUILTINS_LIBRARY ON) @@ -519,6 +530,26 @@ if(COMPILER_RT_USE_LLVM_UNWINDER) list(APPEND SANITIZER_CXX_ABI_LIBRARIES "$<$:$>") endif() +if (COMPILER_RT_CXX_LIBRARY STREQUAL "libcxx") + # We are using the in-tree libc++ so avoid including the default one. + append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ COMPILER_RT_COMMON_CFLAGS) + append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ COMPILER_RT_COMMON_LINK_FLAGS) + # Use the in-tree libc++ through explicit include and library paths. + if (COMPILER_RT_STATIC_CXX_LIBRARY) + set(cxx_target cxx_static) + else() + set(cxx_target cxx_shared) + endif() + list(APPEND COMPILER_RT_CXX_CFLAGS "$<$:-isystem$,$-isystem>>") + list(APPEND COMPILER_RT_CXX_LINK_LIBS "$<$:$>") +elseif (COMPILER_RT_CXX_LIBRARY STREQUAL "none") + # We aren't using any C++ standard library so avoid including the default one. + append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ COMPILER_RT_COMMON_CFLAGS) + append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ COMPILER_RT_COMMON_LINK_FLAGS) +else() + # Nothing to be done for `default`. +endif() + macro(append_libcxx_libs var) if (${var}_INTREE) if (SANITIZER_USE_STATIC_LLVM_UNWINDER AND (TARGET unwind_static OR HAVE_LIBUNWIND)) diff --git a/compiler-rt/lib/fuzzer/CMakeLists.txt b/compiler-rt/lib/fuzzer/CMakeLists.txt index 4500c4f..a9a10f7 100644 --- a/compiler-rt/lib/fuzzer/CMakeLists.txt +++ b/compiler-rt/lib/fuzzer/CMakeLists.txt @@ -66,6 +66,7 @@ if(OS_NAME MATCHES "Linux|Fuchsia" AND append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ LIBFUZZER_CFLAGS) elseif(TARGET cxx-headers OR HAVE_LIBCXX) # libFuzzer uses C++ standard library headers. + list(APPEND LIBFUZZER_CFLAGS ${COMPILER_RT_CXX_CFLAGS}) set(LIBFUZZER_DEPS cxx-headers) endif() diff --git a/compiler-rt/lib/orc/CMakeLists.txt b/compiler-rt/lib/orc/CMakeLists.txt index b6f2c2d..ab32b6b 100644 --- a/compiler-rt/lib/orc/CMakeLists.txt +++ b/compiler-rt/lib/orc/CMakeLists.txt @@ -49,7 +49,11 @@ list(REMOVE_DUPLICATES ORC_ALL_SOURCE_FILES) include_directories(..) include_directories(../../include) -set(ORC_CFLAGS ${COMPILER_RT_COMMON_CFLAGS}) +set(ORC_CFLAGS + ${COMPILER_RT_COMMON_CFLAGS} + ${COMPILER_RT_CXX_CFLAGS}) +set(ORC_LINK_FLAGS ${COMPILER_RT_COMMON_LINK_FLAGS}) +set(ORC_LINK_LIBS ${COMPILER_RT_CXX_LINK_LIBS}) # Allow the ORC runtime to reference LLVM headers. foreach (DIR ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR}) @@ -83,7 +87,7 @@ if (APPLE) ARCHS ${ORC_SUPPORTED_ARCH} OBJECT_LIBS RTOrc CFLAGS ${ORC_CFLAGS} - LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} + LINK_FLAGS ${ORC_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} LINK_LIBS ${ORC_LINK_LIBS} PARENT_TARGET orc) else() # not Apple @@ -109,6 +113,8 @@ else() # not Apple STATIC ARCHS ${arch} CFLAGS ${ORC_CFLAGS} + LINK_FLAGS ${ORC_LINK_FLAGS} + LINK_LIBS ${ORC_LINK_LIBS} OBJECT_LIBS ${ORC_COMMON_RUNTIME_OBJECT_LIBS} RTOrc PARENT_TARGET orc) endforeach() diff --git a/compiler-rt/lib/xray/CMakeLists.txt b/compiler-rt/lib/xray/CMakeLists.txt index ca93897..5173a5e 100644 --- a/compiler-rt/lib/xray/CMakeLists.txt +++ b/compiler-rt/lib/xray/CMakeLists.txt @@ -138,7 +138,9 @@ endforeach() include_directories(..) include_directories(../../include) -set(XRAY_CFLAGS ${COMPILER_RT_COMMON_CFLAGS}) +set(XRAY_CFLAGS + ${COMPILER_RT_COMMON_CFLAGS} + ${COMPILER_RT_CXX_CFLAGS}) set(XRAY_COMMON_DEFINITIONS XRAY_HAS_EXCEPTIONS=1) # Too many existing bugs, needs cleanup. @@ -147,6 +149,9 @@ append_list_if(COMPILER_RT_HAS_WNO_FORMAT -Wno-format XRAY_CFLAGS) # We don't need RTTI in XRay, so turn that off. append_rtti_flag(OFF XRAY_CFLAGS) +set(XRAY_LINK_FLAGS ${COMPILER_RT_COMMON_LINK_FLAGS}) +set(XRAY_LINK_LIBS ${COMPILER_RT_CXX_LINK_LIBS}) + append_list_if( COMPILER_RT_HAS_XRAY_COMPILER_FLAG XRAY_SUPPORTED=1 XRAY_COMMON_DEFINITIONS) append_list_if( @@ -164,7 +169,6 @@ if (TARGET cxx-headers OR HAVE_LIBCXX) endif() if (APPLE) - set(XRAY_LINK_LIBS ${SANITIZER_COMMON_LINK_LIBS}) add_asm_sources(XRAY_ASM_SOURCES xray_trampoline_x86_64.S) add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS) @@ -213,7 +217,7 @@ if (APPLE) RTSanitizerCommonLibc CFLAGS ${XRAY_CFLAGS} DEFS ${XRAY_COMMON_DEFINITIONS} - LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} + LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} LINK_LIBS ${XRAY_LINK_LIBS} PARENT_TARGET xray) add_compiler_rt_runtime(clang_rt.xray-fdr @@ -223,7 +227,7 @@ if (APPLE) OBJECT_LIBS RTXrayFDR CFLAGS ${XRAY_CFLAGS} DEFS ${XRAY_COMMON_DEFINITIONS} - LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} + LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} LINK_LIBS ${XRAY_LINK_LIBS} PARENT_TARGET xray) add_compiler_rt_runtime(clang_rt.xray-basic @@ -233,7 +237,7 @@ if (APPLE) OBJECT_LIBS RTXrayBASIC CFLAGS ${XRAY_CFLAGS} DEFS ${XRAY_COMMON_DEFINITIONS} - LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} + LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} LINK_LIBS ${XRAY_LINK_LIBS} PARENT_TARGET xray) add_compiler_rt_runtime(clang_rt.xray-profiling @@ -243,7 +247,7 @@ if (APPLE) OBJECT_LIBS RTXrayPROFILING CFLAGS ${XRAY_CFLAGS} DEFS ${XRAY_COMMON_DEFINITIONS} - LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} + LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} LINK_LIBS ${XRAY_LINK_LIBS} PARENT_TARGET xray) else() # not Apple @@ -285,6 +289,8 @@ else() # not Apple STATIC ARCHS ${arch} CFLAGS ${XRAY_CFLAGS} + LINK_FLAGS ${XRAY_LINK_FLAGS} + LINK_LIBS ${XRAY_LINK_LIBS} DEFS ${XRAY_COMMON_DEFINITIONS} OBJECT_LIBS ${XRAY_COMMON_RUNTIME_OBJECT_LIBS} RTXray PARENT_TARGET xray) @@ -293,6 +299,8 @@ else() # not Apple STATIC ARCHS ${arch} CFLAGS ${XRAY_CFLAGS} + LINK_FLAGS ${XRAY_LINK_FLAGS} + LINK_LIBS ${XRAY_LINK_LIBS} DEFS ${XRAY_COMMON_DEFINITIONS} OBJECT_LIBS RTXrayFDR PARENT_TARGET xray) @@ -301,6 +309,8 @@ else() # not Apple STATIC ARCHS ${arch} CFLAGS ${XRAY_CFLAGS} + LINK_FLAGS ${XRAY_LINK_FLAGS} + LINK_LIBS ${XRAY_LINK_LIBS} DEFS ${XRAY_COMMON_DEFINITIONS} OBJECT_LIBS RTXrayBASIC PARENT_TARGET xray) @@ -309,6 +319,8 @@ else() # not Apple STATIC ARCHS ${arch} CFLAGS ${XRAY_CFLAGS} + LINK_FLAGS ${XRAY_LINK_FLAGS} + LINK_LIBS ${XRAY_LINK_LIBS} DEFS ${XRAY_COMMON_DEFINITIONS} OBJECT_LIBS RTXrayPROFILING PARENT_TARGET xray) -- 2.7.4