aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorVictor Kingi <victor.kingi@arm.com>2023-08-21 14:21:27 +0000
committerVictor Kingi <victor.kingi@arm.com>2023-08-31 11:15:58 +0000
commit8e315c6ce558a25f7cadab57bd8a14ff958ae517 (patch)
tree513a05490506b75546092d14019970532f037814 /flang/lib/Frontend/CompilerInvocation.cpp
parenta84b09f894cbfa16399ea626fe48aa8d4651ba86 (diff)
downloadllvm-8e315c6ce558a25f7cadab57bd8a14ff958ae517.zip
llvm-8e315c6ce558a25f7cadab57bd8a14ff958ae517.tar.gz
llvm-8e315c6ce558a25f7cadab57bd8a14ff958ae517.tar.bz2
[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
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--flang/lib/Frontend/CompilerInvocation.cpp46
1 files changed, 38 insertions, 8 deletions
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<llvm::Regex>(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);