llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-compiler-rt-sanitizer @llvm/pr-subscribers-clang Author: Vitaly Buka (vitalybuka) <details> <summary>Changes</summary> Linking this runtime requires C++ ABI, which breaks -nostdlib++ builds. However, UBSAN C++ runtime is only needed for CFI and VPTR checks. Unblocks #<!-- -->120370. --- Full diff: https://github.com/llvm/llvm-project/pull/121006.diff 9 Files Affected: - (modified) clang/include/clang/Driver/SanitizerArgs.h (+1) - (modified) clang/lib/Driver/SanitizerArgs.cpp (+8) - (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (+2-1) - (modified) compiler-rt/lib/asan/CMakeLists.txt (-2) - (modified) compiler-rt/lib/asan/tests/CMakeLists.txt (+2-4) - (modified) compiler-rt/lib/hwasan/CMakeLists.txt (-2) - (modified) compiler-rt/lib/msan/CMakeLists.txt (-1) - (modified) compiler-rt/lib/tsan/rtl/CMakeLists.txt (-1) - (modified) compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.cpp (+2) ``````````diff diff --git a/clang/include/clang/Driver/SanitizerArgs.h b/clang/include/clang/Driver/SanitizerArgs.h index 7410ad4303011c..3b275092bbbe86 100644 --- a/clang/include/clang/Driver/SanitizerArgs.h +++ b/clang/include/clang/Driver/SanitizerArgs.h @@ -99,6 +99,7 @@ class SanitizerArgs { } bool needsFuzzerInterceptors() const; bool needsUbsanRt() const; + bool needsUbsanCXXRt() const; bool requiresMinimalRuntime() const { return MinimalRuntime; } bool needsDfsanRt() const { return Sanitizers.has(SanitizerKind::DataFlow); } bool needsSafeStackRt() const { return SafeStackRuntime; } diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 7726e464f2b458..98116e2c8336b8 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -338,6 +338,14 @@ bool SanitizerArgs::needsUbsanRt() const { CoverageFeatures; } +bool SanitizerArgs::needsUbsanCXXRt() const { + // Link UBSAN C++ runtime very selectively, as it's needed in only very + // specific cases, but forces the program to depend on C++ ABI. UBSAN C++ + // runtime is not included with other sanitizers. + return static_cast<bool>(Sanitizers.Mask & NeedsUbsanCxxRt & + ~TrapSanitizers.Mask); +} + bool SanitizerArgs::needsCfiRt() const { return !(Sanitizers.Mask & SanitizerKind::CFI & ~TrapSanitizers.Mask) && CfiCrossDso && !ImplicitCfiRuntime; diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index e33fa443b3a0ec..f8f751cb6a66d5 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1454,6 +1454,7 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl<StringRef> &NonWholeStaticRuntimes, SmallVectorImpl<StringRef> &HelperStaticRuntimes, SmallVectorImpl<StringRef> &RequiredSymbols) { + assert(!TC.getTriple().isOSDarwin() && "it's not used by Darwin"); const SanitizerArgs &SanArgs = TC.getSanitizerArgs(Args); // Collect shared runtimes. if (SanArgs.needsSharedRt()) { @@ -1574,7 +1575,7 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, StaticRuntimes.push_back("cfi_diag"); } if (SanArgs.linkCXXRuntimes() && !SanArgs.requiresMinimalRuntime() && - ((!SanArgs.needsSharedRt() && SanArgs.needsUbsanRt()) || + ((!SanArgs.needsSharedRt() && SanArgs.needsUbsanCXXRt()) || SanArgs.needsCfiDiagRt())) { StaticRuntimes.push_back("ubsan_standalone_cxx"); } diff --git a/compiler-rt/lib/asan/CMakeLists.txt b/compiler-rt/lib/asan/CMakeLists.txt index 5ec995ae159b73..a2c15806f81a28 100644 --- a/compiler-rt/lib/asan/CMakeLists.txt +++ b/compiler-rt/lib/asan/CMakeLists.txt @@ -260,7 +260,6 @@ else() STATIC ARCHS ${ASAN_SUPPORTED_ARCH} OBJECT_LIBS RTAsan_cxx - RTUbsan_cxx CFLAGS ${ASAN_CFLAGS} DEFS ${ASAN_COMMON_DEFINITIONS} PARENT_TARGET asan) @@ -319,7 +318,6 @@ else() # add_dependencies(clang_rt.asan-dynamic-${arch} clang_rt.asan-dynamic-${arch}-version-list) # generates an order-only dependency in ninja. RTAsan_dynamic_version_script_dummy - RTUbsan_cxx ${ASAN_DYNAMIC_WEAK_INTERCEPTION} CFLAGS ${ASAN_DYNAMIC_CFLAGS} LINK_FLAGS ${ASAN_DYNAMIC_LINK_FLAGS} diff --git a/compiler-rt/lib/asan/tests/CMakeLists.txt b/compiler-rt/lib/asan/tests/CMakeLists.txt index 998e0ff24efa40..d80a9f11e50eed 100644 --- a/compiler-rt/lib/asan/tests/CMakeLists.txt +++ b/compiler-rt/lib/asan/tests/CMakeLists.txt @@ -275,8 +275,7 @@ if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID) $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}> $<TARGET_OBJECTS:RTSanitizerCommonSymbolizerInternal.${arch}> $<TARGET_OBJECTS:RTLSanCommon.${arch}> - $<TARGET_OBJECTS:RTUbsan.${arch}> - $<TARGET_OBJECTS:RTUbsan_cxx.${arch}>) + $<TARGET_OBJECTS:RTUbsan.${arch}>) endif() add_library(${ASAN_TEST_RUNTIME} STATIC ${ASAN_TEST_RUNTIME_OBJECTS}) set_target_properties(${ASAN_TEST_RUNTIME} PROPERTIES @@ -302,8 +301,7 @@ if(ANDROID) $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}> $<TARGET_OBJECTS:RTSanitizerCommonSymbolizerInternal.${arch}> $<TARGET_OBJECTS:RTLSanCommon.${arch}> - $<TARGET_OBJECTS:RTUbsan.${arch}> - $<TARGET_OBJECTS:RTUbsan_cxx.${arch}> + $<TARGET_OBJECTS:RTUbsan.${arch}>> ${COMPILER_RT_GTEST_SOURCE} ${ASAN_NOINST_TEST_SOURCES}) set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS}) diff --git a/compiler-rt/lib/hwasan/CMakeLists.txt b/compiler-rt/lib/hwasan/CMakeLists.txt index afafa0c4a92761..4372603b45a486 100644 --- a/compiler-rt/lib/hwasan/CMakeLists.txt +++ b/compiler-rt/lib/hwasan/CMakeLists.txt @@ -188,7 +188,6 @@ function(add_hwasan_runtimes arch use_aliases) STATIC ARCHS ${arch} OBJECT_LIBS RTHwasan_cxx - RTUbsan_cxx CFLAGS ${hwasan_rtl_flags} PARENT_TARGET hwasan) @@ -220,7 +219,6 @@ function(add_hwasan_runtimes arch use_aliases) RTSanitizerCommonSymbolizerInternal RTLSanCommon RTUbsan - RTUbsan_cxx # The only purpose of RTHWAsan_dynamic_version_script_dummy is to # carry a dependency of the shared runtime on the version script. # Replacing it with a straightforward diff --git a/compiler-rt/lib/msan/CMakeLists.txt b/compiler-rt/lib/msan/CMakeLists.txt index b9976b258deb23..a0b9c61584c98d 100644 --- a/compiler-rt/lib/msan/CMakeLists.txt +++ b/compiler-rt/lib/msan/CMakeLists.txt @@ -66,7 +66,6 @@ foreach(arch ${MSAN_SUPPORTED_ARCH}) STATIC ARCHS ${arch} SOURCES ${MSAN_RTL_CXX_SOURCES} - $<TARGET_OBJECTS:RTUbsan_cxx.${arch}> ADDITIONAL_HEADERS ${MSAN_RTL_HEADERS} CFLAGS ${MSAN_RTL_CFLAGS} PARENT_TARGET msan) diff --git a/compiler-rt/lib/tsan/rtl/CMakeLists.txt b/compiler-rt/lib/tsan/rtl/CMakeLists.txt index f40e72dbde1f98..d7d84706bfd58f 100644 --- a/compiler-rt/lib/tsan/rtl/CMakeLists.txt +++ b/compiler-rt/lib/tsan/rtl/CMakeLists.txt @@ -259,7 +259,6 @@ else() STATIC ARCHS ${arch} SOURCES ${TSAN_CXX_SOURCES} - $<TARGET_OBJECTS:RTUbsan_cxx.${arch}> ADDITIONAL_HEADERS ${TSAN_HEADERS} CFLAGS ${TSAN_RTL_CFLAGS} PARENT_TARGET tsan) diff --git a/compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.cpp b/compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.cpp index 2d729497548d90..60ef0e5b0de6fa 100644 --- a/compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.cpp +++ b/compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.cpp @@ -23,6 +23,8 @@ // RUN: | grep -v "__sanitizer_weak_hook" \ // RUN: | grep -v "__sanitizer_override_function" \ // RUN: | grep -v "__sanitizer_override_function_by_addr" \ +// RUN: | grep -v "__ubsan_handle_dynamic_type_cache_miss" \ +// RUN: | grep -v "__ubsan_handle_dynamic_type_cache_miss_abort" \ // RUN: | grep -v "__sanitizer_register_weak_function" \ // RUN: | sed -e "s/.*(//" -e "s/).*//" > %t.imports // `````````` </details> https://github.com/llvm/llvm-project/pull/121006 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits