diff --git a/clang/include/clang/Driver/SanitizerArgs.h b/clang/include/clang/Driver/SanitizerArgs.h index 047b50626c44c..07070ec4fc065 100644 --- a/clang/include/clang/Driver/SanitizerArgs.h +++ b/clang/include/clang/Driver/SanitizerArgs.h @@ -76,6 +76,7 @@ class SanitizerArgs { bool DiagnoseErrors = true); bool needsSharedRt() const { return SharedRuntime; } + bool needsStableAbi() const { return StableABI; } bool needsMemProfRt() const { return NeedsMemProfRt; } bool needsAsanRt() const { return Sanitizers.has(SanitizerKind::Address); } diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 65bd6c6a7eb35..239fbf21d77f5 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -1484,9 +1484,13 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, if (Sanitize.linkRuntimes()) { if (Sanitize.needsAsanRt()) { - assert(Sanitize.needsSharedRt() && - "Static sanitizer runtimes not supported"); - AddLinkSanitizerLibArgs(Args, CmdArgs, "asan"); + if (Sanitize.needsStableAbi()) { + AddLinkSanitizerLibArgs(Args, CmdArgs, "asan_abi", /*shared=*/false); + } else { + assert(Sanitize.needsSharedRt() && + "Static sanitizer runtimes not supported"); + AddLinkSanitizerLibArgs(Args, CmdArgs, "asan"); + } } if (Sanitize.needsLsanRt()) AddLinkSanitizerLibArgs(Args, CmdArgs, "lsan"); diff --git a/compiler-rt/test/asan_abi/CMakeLists.txt b/compiler-rt/test/asan_abi/CMakeLists.txt index a1f42ca076edf..f28cf6cd1da6e 100644 --- a/compiler-rt/test/asan_abi/CMakeLists.txt +++ b/compiler-rt/test/asan_abi/CMakeLists.txt @@ -13,7 +13,6 @@ set(ASAN_ABI_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS}) if(NOT COMPILER_RT_STANDALONE_BUILD) list(APPEND ASAN_ABI_TEST_DEPS asan_abi) endif() -set(ASAN_ABI_DYNAMIC_TEST_DEPS ${ASAN_ABI_TEST_DEPS}) set(ASAN_ABI_TEST_ARCH ${ASAN_ABI_SUPPORTED_ARCH}) if(APPLE) @@ -27,7 +26,6 @@ foreach(arch ${ASAN_ABI_TEST_ARCH}) string(TOLOWER "-${arch}-${OS_NAME}" ASAN_ABI_TEST_CONFIG_SUFFIX) get_bits_for_arch(${arch} ASAN_ABI_TEST_BITS) get_test_cc_for_arch(${arch} ASAN_ABI_TEST_TARGET_CC ASAN_ABI_TEST_TARGET_CFLAGS) - set(ASAN_ABI_TEST_DYNAMIC True) string(TOUPPER ${arch} ARCH_UPPER_CASE) set(CONFIG_NAME ${ARCH_UPPER_CASE}${OS_NAME}Config) diff --git a/compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp b/compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp index 96f59191b8d46..c651c32b489e4 100644 --- a/compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp +++ b/compiler-rt/test/asan_abi/TestCases/Darwin/llvm_interface_symbols.cpp @@ -1,6 +1,6 @@ // RUN: %clang_asan_abi -O0 -c -fsanitize-stable-abi -fsanitize=address %s -o %t.o // RUN: %clangxx -c %p/../../../../lib/asan_abi/asan_abi.cpp -o asan_abi.o -// RUN: %clangxx -dead_strip -o %t %t.o %libasan_abi asan_abi.o && %run %t 2>&1 +// RUN: %clangxx -dead_strip -o %t %t.o -fsanitize-stable-abi -fsanitize=address asan_abi.o && %run %t 2>&1 // RUN: %clangxx -x c++-header -o - -E %p/../../../../lib/asan/asan_interface.inc \ // RUN: | sed "s/INTERFACE_FUNCTION/\nINTERFACE_FUNCTION/g" > %t.asan_interface.inc // RUN: llvm-nm -g %libasan_abi \ @@ -22,6 +22,9 @@ // RUN: sort %t.exports | uniq > %t.exports-sorted // RUN: diff %t.imports-sorted %t.exports-sorted +// Ensure that there is no dynamic dylib linked. +// RUN: otool -L %t | (! grep -q "dynamic.dylib") + // UNSUPPORTED: ios int main() { return 0; } diff --git a/compiler-rt/test/asan_abi/TestCases/linkstaticlibrary.cpp b/compiler-rt/test/asan_abi/TestCases/linkstaticlibrary.cpp index 0bb14d322c67c..10d3645045dff 100644 --- a/compiler-rt/test/asan_abi/TestCases/linkstaticlibrary.cpp +++ b/compiler-rt/test/asan_abi/TestCases/linkstaticlibrary.cpp @@ -1,5 +1,5 @@ // RUN: %clang_asan_abi -O2 -c -fsanitize-stable-abi -fsanitize=address -O0 %s -o %t.o // RUN: %clangxx -c %p/../../../lib/asan_abi/asan_abi.cpp -o asan_abi.o -// RUN: %clangxx -o %t %t.o %libasan_abi asan_abi.o && %run %t 2>&1 +// RUN: %clangxx -o %t %t.o -fsanitize-stable-abi -fsanitize=address asan_abi.o && %run %t 2>&1 int main() { return 0; } diff --git a/compiler-rt/test/asan_abi/lit.site.cfg.py.in b/compiler-rt/test/asan_abi/lit.site.cfg.py.in index f4456f9a389be..0261159b664a2 100644 --- a/compiler-rt/test/asan_abi/lit.site.cfg.py.in +++ b/compiler-rt/test/asan_abi/lit.site.cfg.py.in @@ -8,7 +8,6 @@ config.bits = "@ASAN_ABI_TEST_BITS@" config.arm_thumb = "@COMPILER_RT_ARM_THUMB@" config.apple_platform = "@ASAN_ABI_TEST_APPLE_PLATFORM@" config.apple_platform_min_deployment_target_flag = "@ASAN_ABI_TEST_MIN_DEPLOYMENT_TARGET_FLAG@" -config.asan_abi_dynamic = @ASAN_ABI_TEST_DYNAMIC@ config.target_arch = "@ASAN_ABI_TEST_TARGET_ARCH@" # Load common config for all compiler-rt lit tests.