phosek updated this revision to Diff 213237. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65029/new/
https://reviews.llvm.org/D65029 Files: clang/include/clang/Driver/Options.td clang/include/clang/Driver/SanitizerArgs.h clang/lib/Driver/SanitizerArgs.cpp clang/test/Driver/sanitizer-ld.c
Index: clang/test/Driver/sanitizer-ld.c =================================================================== --- clang/test/Driver/sanitizer-ld.c +++ clang/test/Driver/sanitizer-ld.c @@ -28,6 +28,14 @@ // RUN: --sysroot=%S/Inputs/basic_linux_tree \ // RUN: | FileCheck --check-prefix=CHECK-SHARED-ASAN-LINUX %s +// RUN: %clang -fsanitize=address -fno-sanitize-link-runtime %s -### -o %t.o 2>&1 \ +// RUN: -target x86_64-unknown-linux -fuse-ld=ld \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-ASAN-NO-LINK-RUNTIME-LINUX %s +// +// CHECK-ASAN-NO-LINK-RUNTIME-LINUX-NOT: libclang_rt.asan-x86_64.a" + // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target i386-unknown-linux -fuse-ld=ld -fsanitize=address \ // RUN: -shared-libsan -static-libsan -shared-libasan \ Index: clang/lib/Driver/SanitizerArgs.cpp =================================================================== --- clang/lib/Driver/SanitizerArgs.cpp +++ clang/lib/Driver/SanitizerArgs.cpp @@ -208,7 +208,7 @@ // All of these include ubsan. if (needsAsanRt() || needsMsanRt() || needsHwasanRt() || needsTsanRt() || needsDfsanRt() || needsLsanRt() || needsCfiDiagRt() || - (needsScudoRt() && !requiresMinimalRuntime())) + (needsScudoRt() && !requiresMinimalRuntime()) || !LinkRuntimes) return false; return (Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || @@ -217,12 +217,12 @@ bool SanitizerArgs::needsCfiRt() const { return !(Sanitizers.Mask & SanitizerKind::CFI & ~TrapSanitizers.Mask) && - CfiCrossDso && !ImplicitCfiRuntime; + CfiCrossDso && !ImplicitCfiRuntime && LinkRuntimes; } bool SanitizerArgs::needsCfiDiagRt() const { return (Sanitizers.Mask & SanitizerKind::CFI & ~TrapSanitizers.Mask) && - CfiCrossDso && !ImplicitCfiRuntime; + CfiCrossDso && !ImplicitCfiRuntime && LinkRuntimes; } bool SanitizerArgs::requiresPIE() const { @@ -265,6 +265,10 @@ Args.hasFlag(options::OPT_fsanitize_minimal_runtime, options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime); + LinkRuntimes = + Args.hasFlag(options::OPT_fsanitize_link_runtime, + options::OPT_fno_sanitize_link_runtime, LinkRuntimes); + // The object size sanitizer should not be enabled at -O0. Arg *OptLevel = Args.getLastArg(options::OPT_O_Group); bool RemoveObjectSizeAtO0 = @@ -825,8 +829,10 @@ } // Parse -link-cxx-sanitizer flag. - LinkCXXRuntimes = - Args.hasArg(options::OPT_fsanitize_link_cxx_runtime) || D.CCCIsCXX(); + LinkCXXRuntimes = Args.hasArg(options::OPT_fsanitize_link_cxx_runtime, + options::OPT_fno_sanitize_link_cxx_runtime, + LinkCXXRuntimes) || + D.CCCIsCXX(); // Finally, initialize the set of available and recoverable sanitizers. Sanitizers.Mask |= Kinds; Index: clang/include/clang/Driver/SanitizerArgs.h =================================================================== --- clang/include/clang/Driver/SanitizerArgs.h +++ clang/include/clang/Driver/SanitizerArgs.h @@ -41,6 +41,7 @@ bool AsanInvalidPointerCmp = false; bool AsanInvalidPointerSub = false; std::string HwasanAbi; + bool LinkRuntimes = true; bool LinkCXXRuntimes = false; bool NeedPIE = false; bool SafeStackRuntime = false; @@ -58,24 +59,38 @@ bool needsSharedRt() const { return SharedRuntime; } - bool needsAsanRt() const { return Sanitizers.has(SanitizerKind::Address); } - bool needsHwasanRt() const { return Sanitizers.has(SanitizerKind::HWAddress); } - bool needsTsanRt() const { return Sanitizers.has(SanitizerKind::Thread); } - bool needsMsanRt() const { return Sanitizers.has(SanitizerKind::Memory); } - bool needsFuzzer() const { return Sanitizers.has(SanitizerKind::Fuzzer); } + bool needsAsanRt() const { + return Sanitizers.has(SanitizerKind::Address) && LinkRuntimes; + } + bool needsHwasanRt() const { + return Sanitizers.has(SanitizerKind::HWAddress) && LinkRuntimes; + } + bool needsTsanRt() const { + return Sanitizers.has(SanitizerKind::Thread) && LinkRuntimes; + } + bool needsMsanRt() const { + return Sanitizers.has(SanitizerKind::Memory) && LinkRuntimes; + } + bool needsFuzzer() const { + return Sanitizers.has(SanitizerKind::Fuzzer) && LinkRuntimes; + } bool needsLsanRt() const { return Sanitizers.has(SanitizerKind::Leak) && !Sanitizers.has(SanitizerKind::Address) && - !Sanitizers.has(SanitizerKind::HWAddress); + !Sanitizers.has(SanitizerKind::HWAddress) && LinkRuntimes; } bool needsUbsanRt() const; - bool requiresMinimalRuntime() const { return MinimalRuntime; } - bool needsDfsanRt() const { return Sanitizers.has(SanitizerKind::DataFlow); } - bool needsSafeStackRt() const { return SafeStackRuntime; } + bool requiresMinimalRuntime() const { return MinimalRuntime && LinkRuntimes; } + bool needsDfsanRt() const { + return Sanitizers.has(SanitizerKind::DataFlow) && LinkRuntimes; + } + bool needsSafeStackRt() const { return SafeStackRuntime && LinkRuntimes; } bool needsCfiRt() const; bool needsCfiDiagRt() const; - bool needsStatsRt() const { return Stats; } - bool needsScudoRt() const { return Sanitizers.has(SanitizerKind::Scudo); } + bool needsStatsRt() const { return Stats && LinkRuntimes; } + bool needsScudoRt() const { + return Sanitizers.has(SanitizerKind::Scudo) && LinkRuntimes; + } bool requiresPIE() const; bool needsUnwindTables() const; Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -1043,8 +1043,14 @@ Group<f_clang_Group>; def fno_sanitize_minimal_runtime : Flag<["-"], "fno-sanitize-minimal-runtime">, Group<f_clang_Group>; +def fsanitize_link_runtime : Flag<["-"], "fsanitize-link-runtime">, + Group<f_clang_Group>; +def fno_sanitize_link_runtime : Flag<["-"], "fno-sanitize-link-runtime">, + Group<f_clang_Group>; def fsanitize_link_cxx_runtime : Flag<["-"], "fsanitize-link-c++-runtime">, Group<f_clang_Group>; +def fno_sanitize_link_cxx_runtime : Flag<["-"], "fno-sanitize-link-c++-runtime">, + Group<f_clang_Group>; def fsanitize_cfi_cross_dso : Flag<["-"], "fsanitize-cfi-cross-dso">, Group<f_clang_Group>, HelpText<"Enable control flow integrity (CFI) checks for cross-DSO calls.">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits