diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2015-10-29 03:36:45 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2015-10-29 03:36:45 +0000 |
commit | bb2e5e4c4af3a13b2d3f0aba277a025e74bc520f (patch) | |
tree | 5832b9922de97bd4953a34492a5aa5cf638c0838 /clang/lib/Driver/Tools.cpp | |
parent | b48f1fe4ee506ee204f5c49d564f006555ff1ba2 (diff) | |
download | llvm-bb2e5e4c4af3a13b2d3f0aba277a025e74bc520f.zip llvm-bb2e5e4c4af3a13b2d3f0aba277a025e74bc520f.tar.gz llvm-bb2e5e4c4af3a13b2d3f0aba277a025e74bc520f.tar.bz2 |
Driver: CrossWindows sanitizers link support
Add the required libraries to the linker invocation when building with
sanitizers.
llvm-svn: 251600
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 1b5d2ce..3e4cb31 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -9746,6 +9746,22 @@ void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA, } } + if (TC.getSanitizerArgs().needsAsanRt()) { + // TODO handle /MT[d] /MD[d] + if (Args.hasArg(options::OPT_shared)) { + CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk")); + } else { + for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"}) + CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib)); + // Make sure the dynamic runtime thunk is not optimized out at link time + // to ensure proper SEH handling. + CmdArgs.push_back(Args.MakeArgString("--undefined")); + CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86 + ? "___asan_seh_interceptor" + : "__asan_seh_interceptor")); + } + } + Exec = Args.MakeArgString(TC.GetLinkerPath()); C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); |