diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-03-20 14:58:36 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-03-20 14:58:36 +0000 |
commit | 2bfcaabdec0cac95ed118958e759652e3cc55cde (patch) | |
tree | 7577a5a609f8845c883cb7337c44feb7ecdbdb74 /clang/lib | |
parent | d8de5b68681a06a45aace49892f45a015f5ee2ba (diff) | |
download | bcm5719-llvm-2bfcaabdec0cac95ed118958e759652e3cc55cde.tar.gz bcm5719-llvm-2bfcaabdec0cac95ed118958e759652e3cc55cde.zip |
[msan] -fsanitize-memory-track-origins=[level] flag and docs.
This change turns -fsanitize-memory-track-origins into
-fsanitize-memory-track-origins=[level] flag (keeping the old one for
compatibility). Possible levels are 0 (off), 1 (default) and 2 (incredibly
detailed). See docs (part of this patch) for more info.
llvm-svn: 204346
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Driver/SanitizerArgs.cpp | 33 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 4 |
2 files changed, 27 insertions, 10 deletions
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index a4b32df9e37..d66f3b4a013 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -11,6 +11,7 @@ #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Options.h" #include "clang/Driver/ToolChain.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" @@ -23,7 +24,7 @@ using namespace llvm::opt; void SanitizerArgs::clear() { Kind = 0; BlacklistFile = ""; - MsanTrackOrigins = false; + MsanTrackOrigins = 0; AsanZeroBaseShadow = false; UbsanTrapOnError = false; } @@ -146,12 +147,27 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, BlacklistFile = BLPath; } - // Parse -f(no-)sanitize-memory-track-origins options. - if (NeedsMsan) - MsanTrackOrigins = - Args.hasFlag(options::OPT_fsanitize_memory_track_origins, - options::OPT_fno_sanitize_memory_track_origins, - /* Default */false); + // Parse -f[no-]sanitize-memory-track-origins[=level] options. + if (NeedsMsan) { + if (Arg *A = + Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ, + options::OPT_fsanitize_memory_track_origins, + options::OPT_fno_sanitize_memory_track_origins)) { + if (A->getOption().matches(options::OPT_fsanitize_memory_track_origins)) { + MsanTrackOrigins = 1; + } else if (A->getOption().matches( + options::OPT_fno_sanitize_memory_track_origins)) { + MsanTrackOrigins = 0; + } else { + StringRef S = A->getValue(); + if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 || + MsanTrackOrigins > 2) { + D.Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << S; + } + } + } + } + if (NeedsAsan) AsanZeroBaseShadow = (TC.getTriple().getEnvironment() == llvm::Triple::Android); @@ -175,7 +191,8 @@ void SanitizerArgs::addArgs(const llvm::opt::ArgList &Args, } if (MsanTrackOrigins) - CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins")); + CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins=" + + llvm::utostr(MsanTrackOrigins))); // Workaround for PR16386. if (needsMsanRt()) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 79d81511c37..f31c8c09336 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -451,9 +451,9 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file); Opts.SanitizerBlacklistFile = Args.getLastArgValue(OPT_fsanitize_blacklist); Opts.SanitizeMemoryTrackOrigins = - Args.hasArg(OPT_fsanitize_memory_track_origins); + getLastArgIntValue(Args, OPT_fsanitize_memory_track_origins_EQ, 0, Diags); Opts.SanitizeUndefinedTrapOnError = - Args.hasArg(OPT_fsanitize_undefined_trap_on_error); + Args.hasArg(OPT_fsanitize_undefined_trap_on_error); Opts.SSPBufferSize = getLastArgIntValue(Args, OPT_stack_protector_buffer_size, 8, Diags); Opts.StackRealignment = Args.hasArg(OPT_mstackrealign); |