diff options
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 369295d..fcb73bc 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -108,6 +108,20 @@ using namespace options; using namespace llvm::opt; //===----------------------------------------------------------------------===// +// Helpers. +//===----------------------------------------------------------------------===// + +// Parse misexpect tolerance argument value. +// Valid option values are integers in the range [0, 100) +inline Expected<Optional<uint64_t>> parseToleranceOption(StringRef Arg) { + int64_t Val; + if (Arg.getAsInteger(10, Val)) + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Not an integer: %s", Arg.data()); + return Val; +} + +//===----------------------------------------------------------------------===// // Initialization. //===----------------------------------------------------------------------===// @@ -1547,6 +1561,9 @@ void CompilerInvocation::GenerateCodeGenArgs( : "auto", SA); + GenerateArg(Args, OPT_fdiagnostics_misexpect_tolerance_EQ, + Twine(*Opts.DiagnosticsMisExpectTolerance), SA); + for (StringRef Sanitizer : serializeSanitizerKinds(Opts.SanitizeRecover)) GenerateArg(Args, OPT_fsanitize_recover_EQ, Sanitizer, SA); @@ -1959,6 +1976,23 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, } } + if (auto *arg = + Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) { + auto ResultOrErr = parseToleranceOption(arg->getValue()); + + if (!ResultOrErr) { + Diags.Report(diag::err_drv_invalid_diagnotics_misexpect_tolerance) + << "-fdiagnostics-misexpect-tolerance="; + } else { + Opts.DiagnosticsMisExpectTolerance = *ResultOrErr; + if ((!Opts.DiagnosticsMisExpectTolerance.hasValue() || + Opts.DiagnosticsMisExpectTolerance.getValue() > 0) && + !UsingProfile) + Diags.Report(diag::warn_drv_diagnostics_misexpect_requires_pgo) + << "-fdiagnostics-misexpect-tolerance="; + } + } + // If the user requested to use a sample profile for PGO, then the // backend will need to track source location information so the profile // can be incorporated into the IR. @@ -4432,6 +4466,13 @@ bool CompilerInvocation::CreateFromArgsImpl( if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC) LangOpts.ObjCExceptions = 1; + for (auto Warning : Res.getDiagnosticOpts().Warnings) { + if (Warning == "misexpect" && + !Diags.isIgnored(diag::warn_profile_data_misexpect, SourceLocation())) { + Res.getCodeGenOpts().MisExpect = true; + } + } + if (LangOpts.CUDA) { // During CUDA device-side compilation, the aux triple is the // triple used for host compilation. |