diff options
| author | Alexey Samsonov <vonosmas@gmail.com> | 2015-05-21 01:07:52 +0000 |
|---|---|---|
| committer | Alexey Samsonov <vonosmas@gmail.com> | 2015-05-21 01:07:52 +0000 |
| commit | de0aff3e9109ac9444b4408aa7619204344f54ed (patch) | |
| tree | b2fee66ceb3525cf5c60b66847ff25f645c5cf4f /clang/lib/Driver | |
| parent | 23f8716a69ce70cb1ccf33293970111f9043f638 (diff) | |
| download | bcm5719-llvm-de0aff3e9109ac9444b4408aa7619204344f54ed.tar.gz bcm5719-llvm-de0aff3e9109ac9444b4408aa7619204344f54ed.zip | |
[Driver] Improve unused-argument diagnostic for extra sanitizer features.
Don't print unused-argument warning for sanitizer-specific feature flag
if this sanitizer was eanbled, and later disabled in the command line.
For example, now:
clang -fsanitize=address -fsanitize-coverage=bb -fno-sanitize=address a.cc
doesn't print warning, but
clang -fsanitize-coverage=bb
does. Same holds for -fsanitize-address-field-padding= and
-fsanitize-memory-track-origins= flags.
Fixes PR23604.
llvm-svn: 237870
Diffstat (limited to 'clang/lib/Driver')
| -rw-r--r-- | clang/lib/Driver/SanitizerArgs.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 1c31b532ff2..72530b442f5 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -154,6 +154,11 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, SanitizerMask AllRemove = 0; // During the loop below, the accumulated set of // sanitizers disabled by the current sanitizer // argument or any argument after it. + SanitizerMask AllAddedKinds = 0; // Mask of all sanitizers ever enabled by + // -fsanitize= flags (directly or via group + // expansion), some of which may be disabled + // later. Used to carefully prune + // unused-argument diagnostics. SanitizerMask DiagnosedKinds = 0; // All Kinds we have diagnosed up to now. // Used to deduplicate diagnostics. SanitizerMask Kinds = 0; @@ -167,6 +172,7 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) { Arg->claim(); SanitizerMask Add = parseArgValues(D, Arg, true); + AllAddedKinds |= expandSanitizerGroups(Add); // Avoid diagnosing any sanitizer which is disabled later. Add &= ~AllRemove; @@ -330,7 +336,7 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, } // Parse -f[no-]sanitize-memory-track-origins[=level] options. - if (Kinds & Memory) { + if (AllAddedKinds & Memory) { if (Arg *A = Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ, options::OPT_fsanitize_memory_track_origins, @@ -352,7 +358,7 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, // Parse -f(no-)?sanitize-coverage flags if coverage is supported by the // enabled sanitizers. - if (Kinds & SupportsCoverage) { + if (AllAddedKinds & SupportsCoverage) { for (const auto *Arg : Args) { if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) { Arg->claim(); @@ -415,7 +421,7 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, << "-fsanitize-coverage=8bit-counters" << "-fsanitize-coverage=(func|bb|edge)"; - if (Kinds & Address) { + if (AllAddedKinds & Address) { AsanSharedRuntime = Args.hasArg(options::OPT_shared_libasan) || (TC.getTriple().getEnvironment() == llvm::Triple::Android); |

