@@ -119,6 +119,10 @@ static SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A,
119119static int parseCoverageFeatures (const Driver &D, const llvm::opt::Arg *A,
120120 bool DiagnoseErrors);
121121
122+ static int parseOverflowPatternExclusionValues (const Driver &D,
123+ const llvm::opt::Arg *A,
124+ bool DiagnoseErrors);
125+
122126// / Parse -f(no-)?sanitize-metadata= flag values, diagnosing any invalid
123127// / components. Returns OR of members of \c BinaryMetadataFeature enumeration.
124128static int parseBinaryMetadataFeatures (const Driver &D, const llvm::opt::Arg *A,
@@ -788,6 +792,13 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
788792 << " fsanitize-trap=cfi" ;
789793 }
790794
795+ for (const auto *Arg :
796+ Args.filtered (options::OPT_fsanitize_overflow_pattern_exclusion_EQ)) {
797+ Arg->claim ();
798+ OverflowPatternExclusions |=
799+ parseOverflowPatternExclusionValues (D, Arg, DiagnoseErrors);
800+ }
801+
791802 // Parse -f(no-)?sanitize-coverage flags if coverage is supported by the
792803 // enabled sanitizers.
793804 for (const auto *Arg : Args) {
@@ -1245,6 +1256,10 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
12451256 addSpecialCaseListOpt (Args, CmdArgs,
12461257 " -fsanitize-system-ignorelist=" , SystemIgnorelistFiles);
12471258
1259+ if (OverflowPatternExclusions)
1260+ Args.AddAllArgs (CmdArgs,
1261+ options::OPT_fsanitize_overflow_pattern_exclusion_EQ);
1262+
12481263 if (MsanTrackOrigins)
12491264 CmdArgs.push_back (Args.MakeArgString (" -fsanitize-memory-track-origins=" +
12501265 Twine (MsanTrackOrigins)));
@@ -1433,6 +1448,28 @@ SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A,
14331448 return Kinds;
14341449}
14351450
1451+ static int parseOverflowPatternExclusionValues (const Driver &D,
1452+ const llvm::opt::Arg *A,
1453+ bool DiagnoseErrors) {
1454+ int Exclusions = 0 ;
1455+ for (int i = 0 , n = A->getNumValues (); i != n; ++i) {
1456+ const char *Value = A->getValue (i);
1457+ int E =
1458+ llvm::StringSwitch<int >(Value)
1459+ .Case (" none" , LangOptionsBase::None)
1460+ .Case (" all" , LangOptionsBase::All)
1461+ .Case (" add-overflow-test" , LangOptionsBase::AddOverflowTest)
1462+ .Case (" negated-unsigned-const" , LangOptionsBase::NegUnsignedConst)
1463+ .Case (" post-decr-while" , LangOptionsBase::PostDecrInWhile)
1464+ .Default (0 );
1465+ if (E == 0 )
1466+ D.Diag (clang::diag::err_drv_unsupported_option_argument)
1467+ << A->getSpelling () << Value;
1468+ Exclusions |= E;
1469+ }
1470+ return Exclusions;
1471+ }
1472+
14361473int parseCoverageFeatures (const Driver &D, const llvm::opt::Arg *A,
14371474 bool DiagnoseErrors) {
14381475 assert (A->getOption ().matches (options::OPT_fsanitize_coverage) ||
0 commit comments