From: Alexey Samsonov Date: Fri, 8 Aug 2014 22:47:17 +0000 (+0000) Subject: Add -link-cxx-sanitizer driver flag. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=63fd633d2a5b0ee6b8be18d70033e7e2b988f0bf;p=clang Add -link-cxx-sanitizer driver flag. Summary: This flag can be used to force linking of CXX-specific parts of sanitizer runtimes into the final executable. It gives more precise control than --driver-mode=g++ and comes handy when user links several object files with sanitized C++ code into an executable, but wants to provide libstdc++ himself, instead of relying on Clang dirver's behavior. Test Plan: clang regression test suite Reviewers: chandlerc, rsmith Reviewed By: rsmith Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D4824 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215252 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 1dafcebf05..82e6fafa23 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -535,6 +535,8 @@ def fsanitize_undefined_trap_on_error : Flag<["-"], "fsanitize-undefined-trap-on Group, Flags<[CC1Option]>; def fno_sanitize_undefined_trap_on_error : Flag<["-"], "fno-sanitize-undefined-trap-on-error">, Group; +def fsanitize_link_cxx_runtime : Flag<["-"], "fsanitize-link-c++-runtime">, + Group; def funsafe_math_optimizations : Flag<["-"], "funsafe-math-optimizations">, Group; def fno_unsafe_math_optimizations : Flag<["-"], "fno-unsafe-math-optimizations">, diff --git a/include/clang/Driver/SanitizerArgs.h b/include/clang/Driver/SanitizerArgs.h index c79c4714f4..c25687c701 100644 --- a/include/clang/Driver/SanitizerArgs.h +++ b/include/clang/Driver/SanitizerArgs.h @@ -52,9 +52,9 @@ class SanitizerArgs { bool AsanZeroBaseShadow; bool UbsanTrapOnError; bool AsanSharedRuntime; + bool LinkCXXRuntimes; public: - SanitizerArgs(); /// Parses the sanitizer arguments from an argument list. SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args); @@ -77,6 +77,7 @@ class SanitizerArgs { return (Kind & HasZeroBaseShadow) || AsanZeroBaseShadow; } bool needsUnwindTables() const { return Kind & NeedsUnwindTables; } + bool linkCXXRuntimes() const { return LinkCXXRuntimes; } void addArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; diff --git a/lib/Driver/SanitizerArgs.cpp b/lib/Driver/SanitizerArgs.cpp index b64f027576..c192034236 100644 --- a/lib/Driver/SanitizerArgs.cpp +++ b/lib/Driver/SanitizerArgs.cpp @@ -28,10 +28,7 @@ void SanitizerArgs::clear() { AsanZeroBaseShadow = false; UbsanTrapOnError = false; AsanSharedRuntime = false; -} - -SanitizerArgs::SanitizerArgs() { - clear(); + LinkCXXRuntimes = false; } SanitizerArgs::SanitizerArgs(const ToolChain &TC, @@ -168,6 +165,10 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, AsanZeroBaseShadow = (TC.getTriple().getEnvironment() == llvm::Triple::Android); } + + // Parse -link-cxx-sanitizer flag. + LinkCXXRuntimes = + Args.hasArg(options::OPT_fsanitize_link_cxx_runtime) || D.CCCIsCXX(); } void SanitizerArgs::addArgs(const llvm::opt::ArgList &Args, diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 860454a22b..65760b49ba 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2273,13 +2273,13 @@ static void addDfsanRT(const ToolChain &TC, const ArgList &Args, static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { const SanitizerArgs &Sanitize = TC.getSanitizerArgs(); - const Driver &D = TC.getDriver(); if (Sanitize.needsUbsanRt()) - addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(), - Sanitize.needsAsanRt() || Sanitize.needsTsanRt() || - Sanitize.needsMsanRt() || Sanitize.needsLsanRt()); + addUbsanRT(TC, Args, CmdArgs, Sanitize.linkCXXRuntimes(), + Sanitize.needsAsanRt() || Sanitize.needsTsanRt() || + Sanitize.needsMsanRt() || Sanitize.needsLsanRt()); if (Sanitize.needsAsanRt()) - addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), D.CCCIsCXX()); + addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), + Sanitize.linkCXXRuntimes()); if (Sanitize.needsTsanRt()) addTsanRT(TC, Args, CmdArgs); if (Sanitize.needsMsanRt()) diff --git a/test/Driver/sanitizer-ld.c b/test/Driver/sanitizer-ld.c index 786262c68b..10f0b3060d 100644 --- a/test/Driver/sanitizer-ld.c +++ b/test/Driver/sanitizer-ld.c @@ -195,6 +195,14 @@ // CHECK-UBSAN-LINUX: "-lpthread" // CHECK-UBSAN-LINUX-NOT: "-lstdc++" +// RUN: %clang -fsanitize=undefined -fsanitize-link-c++-runtime %s -### -o %t.o 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-UBSAN-LINUX-LINK-CXX %s +// CHECK-UBSAN-LINUX-LINK-CXX-NOT: "-lstdc++" +// CHECK-UBSAN-LINUX-LINK-CXX: "-whole-archive" "{{.*}}libclang_rt.ubsan_cxx-i386.a" "-no-whole-archive" +// CHECK-UBSAN-LINUX-LINK-CXX-NOT: "-lstdc++" + // RUN: %clangxx -fsanitize=undefined %s -### -o %t.o 2>&1 \ // RUN: -target i386-unknown-linux \ // RUN: -resource-dir=%S/Inputs/resource_dir \