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