On Fri, Dec 2, 2011 at 3:17 AM, Kostya Serebryany <[email protected]> wrote:
> Adding Daniel, as this is mostly about libraries.
> + // LibAsan is "../lib/clang/linux/ArchName/libclang_rt.asan.a
> s/linux/darwin/ (in comments)
> --kcc
Fixed.
Index: tools/clang/lib/Driver/Tools.cpp
===================================================================
--- tools/clang/lib/Driver/Tools.cpp (revision 145532)
+++ tools/clang/lib/Driver/Tools.cpp (working copy)
@@ -1121,6 +1121,38 @@
TC.AddCXXStdlibLibArgs(Args, CmdArgs);
}
+static void addAsanRTDarwin(const ToolChain &TC, const ArgList &Args,
+ ArgStringList &CmdArgs) {
+ // Add linker flags only if ASan is on.
+ if (!Args.hasFlag(options::OPT_faddress_sanitizer,
+ options::OPT_fno_address_sanitizer, false)) return;
+
+ if (!Args.hasArg(options::OPT_dynamiclib) &&
+ !Args.hasArg(options::OPT_bundle)) {
+ // Exe case: link with the runtime library.
+
+ // LibAsan is "../lib/clang/darwin/ArchName/libclang_rt.asan.a
+ llvm::SmallString<128> LibAsan =
+ llvm::sys::path::parent_path(StringRef(TC.getDriver().Dir));
+ llvm::sys::path::append(
+ LibAsan, "lib", "clang", "darwin", TC.getArchName());
+ llvm::sys::path::append(LibAsan, "libclang_rt.asan.a");
+ CmdArgs.push_back(Args.MakeArgString(LibAsan));
+ CmdArgs.push_back("-lpthread");
+ CmdArgs.push_back("-ldl");
+ CmdArgs.push_back("-framework");
+ CmdArgs.push_back("Foundation");
+ TC.AddCXXStdlibLibArgs(Args, CmdArgs);
+ } else {
+ // Dylib case: treat all undefined functions as dynamic_lookup.
+ // This is needed because after ASan instrumentation the dynamic library
+ // may have calls to ASan interface functions that exist only in the
+ // executable.
+ CmdArgs.push_back("-undefined");
+ CmdArgs.push_back("dynamic_lookup");
+ }
+}
+
void Clang::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
@@ -3576,6 +3608,9 @@
}
Args.AddAllArgs(CmdArgs, options::OPT_L);
+
+ // Call this before we add the C run-time.
+ addAsanRTDarwin(getToolChain(), Args, CmdArgs);
if (Args.hasArg(options::OPT_fopenmp))
// This is more complicated in gcc...
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits