diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/BackendUtil.cpp | 5 | ||||
-rw-r--r-- | lib/Driver/SanitizerArgs.h | 6 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 7 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 2 |
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); |