Hello,

Please consider the following patch that adds linker flags required for
AddressSanitizer.
This is Linux-only, the Darwin patch is a bit trickier and will go
separately.
http://codereview.appspot.com/5416061/

Thanks,

--kcc
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp	(revision 145044)
+++ lib/Driver/Tools.cpp	(working copy)
@@ -1090,6 +1090,43 @@
     RelaxDefault);
 }
 
+/// Check if -faddress-sanitizer is given and -fno-address-sanitizer is not.
+static bool AsanIsEnabled(const ArgList &Args) {
+  return (Args.hasFlag(options::OPT_faddress_sanitizer,
+                       options::OPT_fno_address_sanitizer, false));
+}
+
+/// Get the path name of the AddressSanitizer run-time library.
+static std::string getPathToAsanLibrary(const ToolChain &TC) {
+  std::string res = TC.getDriver().Dir + "/../lib/clang/linux/";
+  switch(TC.getArch()) {
+    case llvm::Triple::x86:
+      res += "i386";
+      break;
+    case llvm::Triple::x86_64:
+      res += "x86_64";
+      break;
+    case llvm::Triple::arm:
+      res += "arm";
+      break;
+    default:
+      res += "arch_unsupported_by_address_sanitizer";
+  }
+  res += "/libclang_rt.asan.a";
+  return res;
+}
+
+/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
+static void addAsanLinkerFlagsForLinux(const ToolChain &TC, const ArgList &Args,
+                                       ArgStringList &CmdArgs) {
+  assert(AsanIsEnabled(Args));
+  CmdArgs.push_back(Args.MakeArgString(getPathToAsanLibrary(TC)));
+  CmdArgs.push_back("-lpthread");
+  CmdArgs.push_back("-ldl");
+  CmdArgs.push_back("-export-dynamic");
+  TC.AddCXXStdlibLibArgs(Args, CmdArgs);
+}
+
 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
                          const InputInfo &Output,
                          const InputInfoList &Inputs,
@@ -1696,8 +1733,7 @@
   if (getToolChain().SupportsProfiling())
     Args.AddLastArg(CmdArgs, options::OPT_pg);
 
-  if (Args.hasFlag(options::OPT_faddress_sanitizer,
-                   options::OPT_fno_address_sanitizer, false))
+  if (AsanIsEnabled(Args))
     CmdArgs.push_back("-faddress-sanitizer");
 
   // -flax-vector-conversions is default.
@@ -2459,6 +2495,10 @@
     }
   }
 
+  if (isa<LinkJobAction>(JA) && AsanIsEnabled(Args) &&
+      !Args.hasArg(options::OPT_shared))
+      addAsanLinkerFlagsForLinux(getToolChain(), Args, CmdArgs);
+
   const std::string customGCCName = D.getCCCGenericGCCName();
   const char *GCCName;
   if (!customGCCName.empty())
@@ -4418,6 +4458,9 @@
 
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
 
+  if (AsanIsEnabled(Args) && !Args.hasArg(options::OPT_shared))
+    addAsanLinkerFlagsForLinux(getToolChain(), Args, CmdArgs);
+
   if (D.CCCIsCXX && !Args.hasArg(options::OPT_nostdlib)) {
     bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
       !Args.hasArg(options::OPT_static);
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to