Author: Fangrui Song Date: 2024-07-10T17:32:17-07:00 New Revision: 9324c952e5d4744f86fc87662dee387134915bf0
URL: https://github.com/llvm/llvm-project/commit/9324c952e5d4744f86fc87662dee387134915bf0 DIFF: https://github.com/llvm/llvm-project/commit/9324c952e5d4744f86fc87662dee387134915bf0.diff LOG: [Driver] -fsanitize=numerical: work with ubsan and support -shared-libsan * `-fsanitize=numerical,undefined`: don't link in the ubsan standalone runtime. * `-shared-libsan`: link against `libclang_rt.nsan.so` The compiler-rt part will be properly fixed by #98415 Added: Modified: clang/lib/Driver/SanitizerArgs.cpp clang/lib/Driver/ToolChains/CommonArgs.cpp clang/test/Driver/sanitizer-ld.c Removed: ################################################################################ diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 86825a6ccf7a1..1fd870b72286e 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -285,8 +285,8 @@ bool SanitizerArgs::needsFuzzerInterceptors() const { bool SanitizerArgs::needsUbsanRt() const { // All of these include ubsan. - if (needsAsanRt() || needsMsanRt() || needsHwasanRt() || needsTsanRt() || - needsDfsanRt() || needsLsanRt() || needsCfiDiagRt() || + if (needsAsanRt() || needsMsanRt() || needsNsanRt() || needsHwasanRt() || + needsTsanRt() || needsDfsanRt() || needsLsanRt() || needsCfiDiagRt() || (needsScudoRt() && !requiresMinimalRuntime())) return false; diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ab1590104b790..80a2b2bf31183 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1409,6 +1409,8 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, if (!Args.hasArg(options::OPT_shared) && !TC.getTriple().isAndroid()) HelperStaticRuntimes.push_back("memprof-preinit"); } + if (SanArgs.needsNsanRt()) + SharedRuntimes.push_back("nsan"); if (SanArgs.needsUbsanRt()) { if (SanArgs.requiresMinimalRuntime()) SharedRuntimes.push_back("ubsan_minimal"); @@ -1479,7 +1481,7 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, if (SanArgs.linkCXXRuntimes()) StaticRuntimes.push_back("msan_cxx"); } - if (SanArgs.needsNsanRt()) + if (!SanArgs.needsSharedRt() && SanArgs.needsNsanRt()) StaticRuntimes.push_back("nsan"); if (!SanArgs.needsSharedRt() && SanArgs.needsTsanRt()) { StaticRuntimes.push_back("tsan"); diff --git a/clang/test/Driver/sanitizer-ld.c b/clang/test/Driver/sanitizer-ld.c index e215c034070e0..48e4ea1f7dcb5 100644 --- a/clang/test/Driver/sanitizer-ld.c +++ b/clang/test/Driver/sanitizer-ld.c @@ -646,6 +646,24 @@ // CHECK-NSAN-LINUX: libclang_rt.nsan.a" // CHECK-NSAN-LINUX: "-lpthread" "-lrt" "-lm" "-ldl" "-lresolv" +// RUN: %clang -### %s 2>&1 --target=x86_64-unknown-linux -fuse-ld=ld -fsanitize=numerical -shared-libsan \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-NSAN-SHARED-LINUX %s + +// CHECK-NSAN-SHARED-LINUX: libclang_rt.nsan.so" +// CHECK-NSAN-SHARED-LINUX-NOT: "-lpthread" +// CHECK-NSAN-SHARED-LINUX-NOT: "-ldl" +// CHECK-NSAN-SHARED-LINUX-NOT: "--dynamic-list + +// RUN: %clang -### %s 2>&1 --target=x86_64-unknown-linux -fsanitize=numerical,undefined \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-NSAN-UBSAN %s + +// CHECK-NSAN-UBSAN: "--whole-archive" "{{[^"]*}}libclang_rt.nsan.a" "--no-whole-archive" +// CHECK-NSAN-UBSAN-NOT: libclang_rt.ubsan + // CFI by itself does not link runtime libraries. // RUN: not %clang -fsanitize=cfi -### %s 2>&1 \ // RUN: --target=x86_64-unknown-linux -fuse-ld=ld -rtlib=platform \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits