aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/BackendUtil.cpp5
-rw-r--r--lib/Driver/SanitizerArgs.h6
-rw-r--r--lib/Driver/Tools.cpp7
-rw-r--r--lib/Frontend/CompilerInvocation.cpp2
4 files changed, 18 insertions, 2 deletions
diff --git a/lib/CodeGen/BackendUtil.cpp b/lib/CodeGen/BackendUtil.cpp
index ff593620fd..ea5bcb55f8 100644
--- a/lib/CodeGen/BackendUtil.cpp
+++ b/lib/CodeGen/BackendUtil.cpp
@@ -188,7 +188,10 @@ static void addAddressSanitizerPasses(const PassManagerBuilder &Builder,
static void addMemorySanitizerPass(const PassManagerBuilder &Builder,
PassManagerBase &PM) {
- PM.add(createMemorySanitizerPass());
+ const PassManagerBuilderWrapper &BuilderWrapper =
+ static_cast<const PassManagerBuilderWrapper&>(Builder);
+ const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
+ PM.add(createMemorySanitizerPass(CGOpts.MemorySanitizerTrackOrigins));
}
static void addThreadSanitizerPass(const PassManagerBuilder &Builder,
diff --git a/lib/Driver/SanitizerArgs.h b/lib/Driver/SanitizerArgs.h
index debdaebc00..30a35b3f52 100644
--- a/lib/Driver/SanitizerArgs.h
+++ b/lib/Driver/SanitizerArgs.h
@@ -40,9 +40,10 @@ class SanitizerArgs {
};
unsigned Kind;
std::string BlacklistFile;
+ bool MsanTrackOrigins;
public:
- SanitizerArgs() : Kind(0), BlacklistFile("") {}
+ SanitizerArgs() : Kind(0), BlacklistFile(""), MsanTrackOrigins(false) {}
/// Parses the sanitizer arguments from an argument list.
SanitizerArgs(const Driver &D, const ArgList &Args);
@@ -68,6 +69,9 @@ class SanitizerArgs {
BlacklistOpt += BlacklistFile;
CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
}
+
+ if (MsanTrackOrigins)
+ CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins"));
}
private:
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index b6da7dd64b..24bdb12cc9 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1492,6 +1492,13 @@ SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) {
D.Diag(diag::err_drv_no_such_file) << BLPath;
}
}
+
+ // Parse -f(no-)sanitize-memory-track-origins options.
+ if (Kind & Memory)
+ MsanTrackOrigins =
+ Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
+ options::OPT_fno_sanitize_memory_track_origins,
+ /* Default */false);
}
/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index bba48949b9..96e2a75a5f 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -403,6 +403,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir);
Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file);
Opts.SanitizerBlacklistFile = Args.getLastArgValue(OPT_fsanitize_blacklist);
+ Opts.MemorySanitizerTrackOrigins =
+ Args.hasArg(OPT_fsanitize_memory_track_origins);
Opts.SSPBufferSize =
Args.getLastArgIntValue(OPT_stack_protector_buffer_size, 8, Diags);
Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);