<div dir="ltr">Actual flag name is -fsanitize-link-c++-runtime. Sorry for wrong commit message.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Aug 8, 2014 at 3:47 PM, Alexey Samsonov <span dir="ltr"><<a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: samsonov<br>
Date: Fri Aug  8 17:47:17 2014<br>
New Revision: 215252<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=215252&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=215252&view=rev</a><br>
Log:<br>
Add -link-cxx-sanitizer driver flag.<br>
<br>
Summary:<br>
This flag can be used to force linking of CXX-specific parts<br>
of sanitizer runtimes into the final executable. It gives more precise<br>
control than --driver-mode=g++ and comes handy when user links several<br>
object files with sanitized C++ code into an executable, but wants<br>
to provide libstdc++ himself, instead of relying on Clang dirver's<br>
behavior.<br>
<br>
Test Plan: clang regression test suite<br>
<br>
Reviewers: chandlerc, rsmith<br>
<br>
Reviewed By: rsmith<br>
<br>
Subscribers: cfe-commits<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D4824" target="_blank">http://reviews.llvm.org/D4824</a><br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Driver/Options.td<br>
    cfe/trunk/include/clang/Driver/SanitizerArgs.h<br>
    cfe/trunk/lib/Driver/SanitizerArgs.cpp<br>
    cfe/trunk/lib/Driver/Tools.cpp<br>
    cfe/trunk/test/Driver/sanitizer-ld.c<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=215252&r1=215251&r2=215252&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=215252&r1=215251&r2=215252&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Fri Aug  8 17:47:17 2014<br>
@@ -535,6 +535,8 @@ def fsanitize_undefined_trap_on_error :<br>
                                         Group<f_clang_Group>, Flags<[CC1Option]>;<br>
 def fno_sanitize_undefined_trap_on_error : Flag<["-"], "fno-sanitize-undefined-trap-on-error">,<br>
                                            Group<f_clang_Group>;<br>
+def fsanitize_link_cxx_runtime : Flag<["-"], "fsanitize-link-c++-runtime">,<br>
+                                 Group<f_clang_Group>;<br>
 def funsafe_math_optimizations : Flag<["-"], "funsafe-math-optimizations">,<br>
   Group<f_Group>;<br>
 def fno_unsafe_math_optimizations : Flag<["-"], "fno-unsafe-math-optimizations">,<br>
<br>
Modified: cfe/trunk/include/clang/Driver/SanitizerArgs.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=215252&r1=215251&r2=215252&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?rev=215252&r1=215251&r2=215252&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Driver/SanitizerArgs.h (original)<br>
+++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Fri Aug  8 17:47:17 2014<br>
@@ -52,9 +52,9 @@ class SanitizerArgs {<br>
   bool AsanZeroBaseShadow;<br>
   bool UbsanTrapOnError;<br>
   bool AsanSharedRuntime;<br>
+  bool LinkCXXRuntimes;<br>
<br>
  public:<br>
-  SanitizerArgs();<br>
   /// Parses the sanitizer arguments from an argument list.<br>
   SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args);<br>
<br>
@@ -77,6 +77,7 @@ class SanitizerArgs {<br>
     return (Kind & HasZeroBaseShadow) || AsanZeroBaseShadow;<br>
   }<br>
   bool needsUnwindTables() const { return Kind & NeedsUnwindTables; }<br>
+  bool linkCXXRuntimes() const { return LinkCXXRuntimes; }<br>
   void addArgs(const llvm::opt::ArgList &Args,<br>
                llvm::opt::ArgStringList &CmdArgs) const;<br>
<br>
<br>
Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=215252&r1=215251&r2=215252&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=215252&r1=215251&r2=215252&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original)<br>
+++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Fri Aug  8 17:47:17 2014<br>
@@ -28,10 +28,7 @@ void SanitizerArgs::clear() {<br>
   AsanZeroBaseShadow = false;<br>
   UbsanTrapOnError = false;<br>
   AsanSharedRuntime = false;<br>
-}<br>
-<br>
-SanitizerArgs::SanitizerArgs() {<br>
-  clear();<br>
+  LinkCXXRuntimes = false;<br>
 }<br>
<br>
 SanitizerArgs::SanitizerArgs(const ToolChain &TC,<br>
@@ -168,6 +165,10 @@ SanitizerArgs::SanitizerArgs(const ToolC<br>
     AsanZeroBaseShadow =<br>
         (TC.getTriple().getEnvironment() == llvm::Triple::Android);<br>
   }<br>
+<br>
+  // Parse -link-cxx-sanitizer flag.<br>
+  LinkCXXRuntimes =<br>
+      Args.hasArg(options::OPT_fsanitize_link_cxx_runtime) || D.CCCIsCXX();<br>
 }<br>
<br>
 void SanitizerArgs::addArgs(const llvm::opt::ArgList &Args,<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=215252&r1=215251&r2=215252&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=215252&r1=215251&r2=215252&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Fri Aug  8 17:47:17 2014<br>
@@ -2273,13 +2273,13 @@ static void addDfsanRT(const ToolChain &<br>
 static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,<br>
                                  ArgStringList &CmdArgs) {<br>
   const SanitizerArgs &Sanitize = TC.getSanitizerArgs();<br>
-  const Driver &D = TC.getDriver();<br>
   if (Sanitize.needsUbsanRt())<br>
-    addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),<br>
-                    Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||<br>
-                    Sanitize.needsMsanRt() || Sanitize.needsLsanRt());<br>
+    addUbsanRT(TC, Args, CmdArgs, Sanitize.linkCXXRuntimes(),<br>
+               Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||<br>
+                   Sanitize.needsMsanRt() || Sanitize.needsLsanRt());<br>
   if (Sanitize.needsAsanRt())<br>
-    addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), D.CCCIsCXX());<br>
+    addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(),<br>
+              Sanitize.linkCXXRuntimes());<br>
   if (Sanitize.needsTsanRt())<br>
     addTsanRT(TC, Args, CmdArgs);<br>
   if (Sanitize.needsMsanRt())<br>
<br>
Modified: cfe/trunk/test/Driver/sanitizer-ld.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=215252&r1=215251&r2=215252&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=215252&r1=215251&r2=215252&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Driver/sanitizer-ld.c (original)<br>
+++ cfe/trunk/test/Driver/sanitizer-ld.c Fri Aug  8 17:47:17 2014<br>
@@ -195,6 +195,14 @@<br>
 // CHECK-UBSAN-LINUX: "-lpthread"<br>
 // CHECK-UBSAN-LINUX-NOT: "-lstdc++"<br>
<br>
+// RUN: %clang -fsanitize=undefined -fsanitize-link-c++-runtime %s -### -o %t.o 2>&1 \<br>
+// RUN:     -target i386-unknown-linux \<br>
+// RUN:     --sysroot=%S/Inputs/basic_linux_tree \<br>
+// RUN:   | FileCheck --check-prefix=CHECK-UBSAN-LINUX-LINK-CXX %s<br>
+// CHECK-UBSAN-LINUX-LINK-CXX-NOT: "-lstdc++"<br>
+// CHECK-UBSAN-LINUX-LINK-CXX: "-whole-archive" "{{.*}}libclang_rt.ubsan_cxx-i386.a" "-no-whole-archive"<br>
+// CHECK-UBSAN-LINUX-LINK-CXX-NOT: "-lstdc++"<br>
+<br>
 // RUN: %clangxx -fsanitize=undefined %s -### -o %t.o 2>&1 \<br>
 // RUN:     -target i386-unknown-linux \<br>
 // RUN:     -resource-dir=%S/Inputs/resource_dir \<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div>
</div>