diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2012-12-03 13:20:43 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2012-12-03 13:20:43 +0000 |
commit | 09ccf39c13cfca102deea2986f45cb908bc232fd (patch) | |
tree | 85794a5935beabec984510173331334464375438 /lib/Driver/Tools.cpp | |
parent | ad95481b2769ad61f23afc5e2c31f11c66090657 (diff) |
Add -fsanitize=memory.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169124 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Tools.cpp')
-rw-r--r-- | lib/Driver/Tools.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 16218e1fc5..92c96b25c9 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1524,6 +1524,9 @@ static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args, static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { if (!Args.hasArg(options::OPT_shared)) { + if (!Args.hasArg(options::OPT_pie)) + TC.getDriver().Diag(diag::err_drv_sanitizer_requires_pie) << + /* Thread */ 0; // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library // resource directory. SmallString<128> LibTsan(TC.getDriver().ResourceDir); @@ -1537,6 +1540,27 @@ static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args, } } +/// If MemorySanitizer is enabled, add appropriate linker flags (Linux). +/// This needs to be called before we add the C run-time (malloc, etc). +static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + if (!Args.hasArg(options::OPT_shared)) { + if (!Args.hasArg(options::OPT_pie)) + TC.getDriver().Diag(diag::err_drv_sanitizer_requires_pie) << + /* Memory */ 1; + // LibMsan is "libclang_rt.msan-<ArchName>.a" in the Linux library + // resource directory. + SmallString<128> LibMsan(TC.getDriver().ResourceDir); + llvm::sys::path::append(LibMsan, "lib", "linux", + (Twine("libclang_rt.msan-") + + TC.getArchName() + ".a")); + CmdArgs.push_back(Args.MakeArgString(LibMsan)); + CmdArgs.push_back("-lpthread"); + CmdArgs.push_back("-ldl"); + CmdArgs.push_back("-export-dynamic"); + } +} + /// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags /// (Linux). static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args, @@ -5443,6 +5467,8 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA, addAsanRTLinux(getToolChain(), Args, CmdArgs); if (Sanitize.needsTsanRt()) addTsanRTLinux(getToolChain(), Args, CmdArgs); + if (Sanitize.needsMsanRt()) + addMsanRTLinux(getToolChain(), Args, CmdArgs); if (D.CCCIsCXX && !Args.hasArg(options::OPT_nostdlib) && |