diff options
author | Thurston Dang <thurston@google.com> | 2025-01-09 21:52:30 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-09 21:52:30 -0800 |
commit | 76fac9c01736b1254e42427f8e0910c0f1d01fba (patch) | |
tree | c19bc6ade2f42ae6d5c2648b1bf8f14a6999a6cc /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | 186bd8e4cd8d239be67172448c53e92be396359a (diff) | |
download | llvm-76fac9c01736b1254e42427f8e0910c0f1d01fba.zip llvm-76fac9c01736b1254e42427f8e0910c0f1d01fba.tar.gz llvm-76fac9c01736b1254e42427f8e0910c0f1d01fba.tar.bz2 |
[sanitizer] Parse weighted sanitizer args and -fsanitize-skip-hot-cutoff (#121619)
This adds a function to parse weighted sanitizer flags (e.g.,
`-fsanitize-blah=undefined=0.5,null=0.3`) and adds the plumbing to apply
that to a new flag, `-fsanitize-skip-hot-cutoff`.
`-fsanitize-skip-hot-cutoff` currently has no effect; future work will
use it to generalize ubsan-guard-checks (originally introduced in
5f9ed2ff8364ff3e4fac410472f421299dafa793).
---------
Co-authored-by: Vitaly Buka <vitalybuka@google.com>
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index d711df0..39bed84 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1453,6 +1453,18 @@ static SmallVector<StringRef, 4> serializeSanitizerKinds(SanitizerSet S) { return Values; } +static SanitizerMaskCutoffs +parseSanitizerWeightedKinds(StringRef FlagName, + const std::vector<std::string> &Sanitizers, + DiagnosticsEngine &Diags) { + SanitizerMaskCutoffs Cutoffs; + for (const auto &Sanitizer : Sanitizers) { + if (!parseSanitizerWeightedValue(Sanitizer, /*AllowGroups=*/false, Cutoffs)) + Diags.Report(diag::err_drv_invalid_value) << FlagName << Sanitizer; + } + return Cutoffs; +} + static void parseXRayInstrumentationBundle(StringRef FlagName, StringRef Bundle, ArgList &Args, DiagnosticsEngine &D, XRayInstrSet &S) { @@ -1813,6 +1825,11 @@ void CompilerInvocationBase::GenerateCodeGenArgs(const CodeGenOptions &Opts, serializeSanitizerKinds(Opts.SanitizeMergeHandlers)) GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer); + SmallVector<std::string, 4> Values; + serializeSanitizerMaskCutoffs(Opts.SanitizeSkipHotCutoffs, Values); + for (std::string Sanitizer : Values) + GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer); + if (!Opts.EmitVersionIdentMetadata) GenerateArg(Consumer, OPT_Qn); @@ -2293,6 +2310,11 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ), Diags, Opts.SanitizeMergeHandlers); + // Parse -fsanitize-skip-hot-cutoff= arguments. + Opts.SanitizeSkipHotCutoffs = parseSanitizerWeightedKinds( + "-fsanitize-skip-hot-cutoff=", + Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags); + Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true); if (!LangOpts->CUDAIsDevice) |