From 8e315c6ce558a25f7cadab57bd8a14ff958ae517 Mon Sep 17 00:00:00 2001 From: Victor Kingi Date: Mon, 21 Aug 2023 14:21:27 +0000 Subject: [Flang][Driver] Add regex support for R_Group options Add regex handling for all variations of OPT_R_Joined, i.e. `-Rpass`, `-Rpass-analysis`, `-Rpass-missed`. Depends on D158174. That patch implements backend support for R_Group options. Reviewed By: awarzynski Differential Revision: https://reviews.llvm.org/D158436 --- flang/lib/Frontend/CompilerInvocation.cpp | 46 +++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 8 deletions(-) (limited to 'flang/lib/Frontend/CompilerInvocation.cpp') diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index f2a7ffd..56218cb 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -156,11 +156,12 @@ static bool parseDebugArgs(Fortran::frontend::CodeGenOptions &opts, // Generate an OptRemark object containing info on if the -Rgroup // specified is enabled or not. static CodeGenOptions::OptRemark -parseOptimizationRemark(llvm::opt::ArgList &args, +parseOptimizationRemark(clang::DiagnosticsEngine &diags, + llvm::opt::ArgList &args, llvm::opt::OptSpecifier optEq, llvm::StringRef remarkOptName) { assert((remarkOptName == "pass" || remarkOptName == "pass-missed" || remarkOptName == "pass-analysis") && - "Unknown group name provided."); + "Unsupported remark option name provided."); CodeGenOptions::OptRemark result; for (llvm::opt::Arg *a : args) { @@ -180,6 +181,17 @@ parseOptimizationRemark(llvm::opt::ArgList &args, result.Pattern = ""; result.Regex = nullptr; } + } else if (a->getOption().matches(optEq)) { + result.Kind = CodeGenOptions::RemarkKind::RK_WithPattern; + result.Pattern = a->getValue(); + result.Regex = std::make_shared(result.Pattern); + std::string regexError; + + if (!result.Regex->isValid(regexError)) { + diags.Report(clang::diag::err_drv_optimization_remark_pattern) + << regexError << a->getAsString(args); + return CodeGenOptions::OptRemark(); + } } } return result; @@ -240,15 +252,20 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts, // Create OptRemark that allows printing of all successful optimization // passes applied. - opts.OptimizationRemark = parseOptimizationRemark(args, "pass"); + opts.OptimizationRemark = + parseOptimizationRemark(diags, args, clang::driver::options::OPT_Rpass_EQ, + /*remarkOptName=*/"pass"); // Create OptRemark that allows all missed optimization passes to be printed. - opts.OptimizationRemarkMissed = parseOptimizationRemark(args, "pass-missed"); + opts.OptimizationRemarkMissed = parseOptimizationRemark( + diags, args, clang::driver::options::OPT_Rpass_missed_EQ, + /*remarkOptName=*/"pass-missed"); // Create OptRemark that allows all optimization decisions made by LLVM // to be printed. - opts.OptimizationRemarkAnalysis = - parseOptimizationRemark(args, "pass-analysis"); + opts.OptimizationRemarkAnalysis = parseOptimizationRemark( + diags, args, clang::driver::options::OPT_Rpass_analysis_EQ, + /*remarkOptName=*/"pass-analysis"); if (auto *a = args.getLastArg(clang::driver::options::OPT_save_temps_EQ)) opts.SaveTempsDir = a->getValue(); @@ -746,6 +763,9 @@ static bool parseDiagArgs(CompilerInvocation &res, llvm::opt::ArgList &args, res.getFrontendOpts().showColors = parseShowColorsArgs(args, /*defaultDiagColor=*/false); + // Honor color diagnostics. + res.getDiagnosticOpts().ShowColors = res.getFrontendOpts().showColors; + return diags.getNumErrors() == numErrorsBefore; } @@ -1010,8 +1030,18 @@ bool CompilerInvocation::createFromArgs( // Preserve all the remark options requested, i.e. -Rpass, -Rpass-missed or // -Rpass-analysis. This will be used later when processing and outputting the // remarks generated by LLVM in ExecuteCompilerInvocation.cpp. - for (auto *a : args.filtered(clang::driver::options::OPT_R_Group)) - res.getDiagnosticOpts().Remarks.push_back(a->getValue()); + for (auto *a : args.filtered(clang::driver::options::OPT_R_Group)) { + if (a->getOption().matches(clang::driver::options::OPT_R_value_Group)) + // This is -Rfoo=, where foo is the name of the diagnostic + // group. Add only the remark option name to the diagnostics. e.g. for + // -Rpass= we will add the string "pass". + res.getDiagnosticOpts().Remarks.push_back( + std::string(a->getOption().getName().drop_front(1).rtrim("=-"))); + else + // If no regex was provided, add the provided value, e.g. for -Rpass add + // the string "pass". + res.getDiagnosticOpts().Remarks.push_back(a->getValue()); + } success &= parseFrontendArgs(res.getFrontendOpts(), args, diags); parseTargetArgs(res.getTargetOpts(), args); -- cgit v1.1