<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Filipe,<div class=""><br class=""></div><div class="">You say that, but the darwin driver’s behavior is different from the FreeBSD or GNUTools behavior. This patch provides the GNUTools & FreeBSD behavior via the Darwin driver.</div><div class=""><br class=""></div><div class="">-Chris</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Aug 30, 2016, at 12:26 PM, Filipe Cabecinhas <<a href="mailto:filcab+llvm.phabricator@gmail.com" class="">filcab+llvm.phabricator@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">I don't think so. "No default libs" should mean "no default libs", not "some default libs". Maybe you're using an alternate sanitizer lib or something, hence usage of that flag.<div class=""><br class=""></div><div class="">Thank you,</div><div class=""><br class=""></div><div class=""> Filipe<span class=""></span><br class=""><br class="">On Tuesday, 30 August 2016, Chris Bieneman via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">beanz created this revision.<br class="">
beanz added reviewers: zaks.anna, kubabrecka, bogner.<br class="">
beanz added a subscriber: cfe-commits.<br class="">
<br class="">
The -nodefaultlibs and -nostdlib flags suppress all the runtime libraries that the driver puts on the link line. This feels wrong. If a user specifies "-fsanitize=<blah>" I think it is expected that the sanitizer library would be included on the link line.<br class="">
<br class="">
<a href="https://reviews.llvm.org/D24048" target="_blank" class="">https://reviews.llvm.org/<wbr class="">D24048</a><br class="">
<br class="">
Files:<br class="">
  lib/Driver/ToolChains.cpp<br class="">
  lib/Driver/ToolChains.h<br class="">
  lib/Driver/Tools.cpp<br class="">
<br class="">
Index: lib/Driver/Tools.cpp<br class="">
==============================<wbr class="">==============================<wbr class="">=======<br class="">
--- lib/Driver/Tools.cpp<br class="">
+++ lib/Driver/Tools.cpp<br class="">
@@ -8032,6 +8032,8 @@<br class="">
<br class="">
     // Let the tool chain choose which runtime library to link.<br class="">
     getMachOToolChain().<wbr class="">AddLinkRuntimeLibArgs(Args, CmdArgs);<br class="">
+  } else {<br class="">
+    getMachOToolChain().<wbr class="">AddLinkSanitizerLibArgs(Args, CmdArgs);<br class="">
   }<br class="">
<br class="">
   if (!Args.hasArg(options::OPT_<wbr class="">nostdlib, options::OPT_nostartfiles)) {<br class="">
Index: lib/Driver/ToolChains.h<br class="">
==============================<wbr class="">==============================<wbr class="">=======<br class="">
--- lib/Driver/ToolChains.h<br class="">
+++ lib/Driver/ToolChains.h<br class="">
@@ -282,6 +282,10 @@<br class="">
   virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,<br class="">
                                      llvm::opt::ArgStringList &CmdArgs) const;<br class="">
<br class="">
+  virtual void<br class="">
+  AddLinkSanitizerLibArgs(const llvm::opt::ArgList &Args,<br class="">
+                          llvm::opt::ArgStringList &CmdArgs) const {}<br class="">
+<br class="">
   virtual void addStartObjectFileArgs(const llvm::opt::ArgList &Args,<br class="">
                                       llvm::opt::ArgStringList &CmdArgs) const {<br class="">
   }<br class="">
@@ -571,6 +575,10 @@<br class="">
<br class="">
   RuntimeLibType GetRuntimeLibType(const llvm::opt::ArgList &Args) const override;<br class="">
<br class="">
+  void<br class="">
+  AddLinkSanitizerLibArgs(const llvm::opt::ArgList &Args,<br class="">
+                          llvm::opt::ArgStringList &CmdArgs) const override;<br class="">
+<br class="">
   void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,<br class="">
                              llvm::opt::ArgStringList &CmdArgs) const override;<br class="">
<br class="">
Index: lib/Driver/ToolChains.cpp<br class="">
==============================<wbr class="">==============================<wbr class="">=======<br class="">
--- lib/Driver/ToolChains.cpp<br class="">
+++ lib/Driver/ToolChains.cpp<br class="">
@@ -425,22 +425,7 @@<br class="">
     return;<br class="">
   }<br class="">
<br class="">
-  const SanitizerArgs &Sanitize = getSanitizerArgs();<br class="">
-  if (Sanitize.needsAsanRt())<br class="">
-    AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");<br class="">
-  if (Sanitize.needsUbsanRt())<br class="">
-    AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");<br class="">
-  if (Sanitize.needsTsanRt())<br class="">
-    AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");<br class="">
-  if (Sanitize.needsStatsRt()) {<br class="">
-    StringRef OS = isTargetMacOS() ? "osx" : "iossim";<br class="">
-    AddLinkRuntimeLib(Args, CmdArgs,<br class="">
-                      (Twine("libclang_rt.stats_<wbr class="">client_") + OS + ".a").str(),<br class="">
-                      /*AlwaysLink=*/true);<br class="">
-    AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");<br class="">
-  }<br class="">
-  if (Sanitize.needsEsanRt())<br class="">
-    AddLinkSanitizerLibArgs(Args, CmdArgs, "esan");<br class="">
+  AddLinkSanitizerLibArgs(Args, CmdArgs);<br class="">
<br class="">
   // Otherwise link libSystem, then the dynamic runtime library, and finally any<br class="">
   // target specific static runtime library.<br class="">
@@ -495,6 +480,26 @@<br class="">
   }<br class="">
 }<br class="">
<br class="">
+void DarwinClang::<wbr class="">AddLinkSanitizerLibArgs(<br class="">
+    const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const {<br class="">
+  const SanitizerArgs &Sanitize = getSanitizerArgs();<br class="">
+  if (Sanitize.needsAsanRt())<br class="">
+    AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");<br class="">
+  if (Sanitize.needsUbsanRt())<br class="">
+    AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");<br class="">
+  if (Sanitize.needsTsanRt())<br class="">
+    AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");<br class="">
+  if (Sanitize.needsStatsRt()) {<br class="">
+    StringRef OS = isTargetMacOS() ? "osx" : "iossim";<br class="">
+    AddLinkRuntimeLib(Args, CmdArgs,<br class="">
+                      (Twine("libclang_rt.stats_<wbr class="">client_") + OS + ".a").str(),<br class="">
+                      /*AlwaysLink=*/true);<br class="">
+    AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");<br class="">
+  }<br class="">
+  if (Sanitize.needsEsanRt())<br class="">
+    AddLinkSanitizerLibArgs(Args, CmdArgs, "esan");<br class="">
+}<br class="">
+<br class="">
 void Darwin::AddDeploymentTarget(<wbr class="">DerivedArgList &Args) const {<br class="">
   const OptTable &Opts = getDriver().getOpts();<br class="">
<br class="">
<br class="">
<br class="">
</blockquote></div>
</div></blockquote></div><br class=""></div></body></html>