From 76fac9c01736b1254e42427f8e0910c0f1d01fba Mon Sep 17 00:00:00 2001 From: Thurston Dang Date: Thu, 9 Jan 2025 21:52:30 -0800 Subject: [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 --- clang/lib/Frontend/CompilerInvocation.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'clang/lib/Frontend/CompilerInvocation.cpp') 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 serializeSanitizerKinds(SanitizerSet S) { return Values; } +static SanitizerMaskCutoffs +parseSanitizerWeightedKinds(StringRef FlagName, + const std::vector &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 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) -- cgit v1.1