|
@@ -14,6 +14,7 @@
|
|
|
#include "clang/Driver/Driver.h"
|
|
|
#include "clang/Driver/DriverDiagnostic.h"
|
|
|
#include "clang/Driver/Options.h"
|
|
|
+#include "clang/Driver/SanitizerArgs.h"
|
|
|
#include "llvm/Option/ArgList.h"
|
|
|
#include "llvm/Support/FileSystem.h"
|
|
|
#include "llvm/Support/Path.h"
|
|
@@ -95,7 +96,7 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
|
const char *LinkingOutput) const {
|
|
|
const ToolChain &TC = getToolChain();
|
|
|
const Driver &D = TC.getDriver();
|
|
|
- // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
|
|
|
+ const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
|
|
|
|
|
|
ArgStringList CmdArgs;
|
|
|
|
|
@@ -187,8 +188,6 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
|
TC.AddFilePathLibArgs(Args, CmdArgs);
|
|
|
AddLinkerInputs(TC, Inputs, Args, CmdArgs, JA);
|
|
|
|
|
|
- // TODO: Add ASan stuff here
|
|
|
-
|
|
|
// TODO: Add profile stuff here
|
|
|
|
|
|
if (TC.ShouldLinkCXXStdlib(Args)) {
|
|
@@ -231,6 +230,24 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
|
if (Args.hasArg(options::OPT_pthread))
|
|
|
CmdArgs.push_back("-lpthread");
|
|
|
|
|
|
+ if (Sanitize.needsAsanRt()) {
|
|
|
+ // MinGW always links against a shared MSVCRT.
|
|
|
+ CmdArgs.push_back(
|
|
|
+ TC.getCompilerRTArgString(Args, "asan_dynamic", true));
|
|
|
+ CmdArgs.push_back(
|
|
|
+ TC.getCompilerRTArgString(Args, "asan_dynamic_runtime_thunk"));
|
|
|
+ CmdArgs.push_back(Args.MakeArgString("--require-defined"));
|
|
|
+ CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
|
|
|
+ ? "___asan_seh_interceptor"
|
|
|
+ : "__asan_seh_interceptor"));
|
|
|
+ // Make sure the linker consider all object files from the dynamic
|
|
|
+ // runtime thunk.
|
|
|
+ CmdArgs.push_back(Args.MakeArgString("--whole-archive"));
|
|
|
+ CmdArgs.push_back(Args.MakeArgString(
|
|
|
+ TC.getCompilerRT(Args, "asan_dynamic_runtime_thunk")));
|
|
|
+ CmdArgs.push_back(Args.MakeArgString("--no-whole-archive"));
|
|
|
+ }
|
|
|
+
|
|
|
if (!HasWindowsApp) {
|
|
|
// Add system libraries. If linking to libwindowsapp.a, that import
|
|
|
// library replaces all these and we shouldn't accidentally try to
|
|
@@ -407,6 +424,12 @@ toolchains::MinGW::GetExceptionModel(const ArgList &Args) const {
|
|
|
return llvm::ExceptionHandling::DwarfCFI;
|
|
|
}
|
|
|
|
|
|
+SanitizerMask toolchains::MinGW::getSupportedSanitizers() const {
|
|
|
+ SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
|
|
+ Res |= SanitizerKind::Address;
|
|
|
+ return Res;
|
|
|
+}
|
|
|
+
|
|
|
void toolchains::MinGW::AddCudaIncludeArgs(const ArgList &DriverArgs,
|
|
|
ArgStringList &CC1Args) const {
|
|
|
CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args);
|