diff --git a/flang/include/flang/Lower/Bridge.h b/flang/include/flang/Lower/Bridge.h index a8c2bcfda31c..3710e74bf38d 100644 --- a/flang/include/flang/Lower/Bridge.h +++ b/flang/include/flang/Lower/Bridge.h @@ -76,6 +76,7 @@ public: loweringOptions, envDefaults, languageFeatures, targetMachine, targetOptions, codeGenOptions); } + ~LoweringBridge(); //===--------------------------------------------------------------------===// // Getters @@ -174,6 +175,7 @@ private: const std::vector &envDefaults; const Fortran::common::LanguageFeatureControl &languageFeatures; std::set tempNames; + std::optional diagHandlerID; }; } // namespace lower diff --git a/flang/include/flang/Lower/LoweringOptions.def b/flang/include/flang/Lower/LoweringOptions.def index 8135704971aa..39f197d8d35c 100644 --- a/flang/include/flang/Lower/LoweringOptions.def +++ b/flang/include/flang/Lower/LoweringOptions.def @@ -74,5 +74,10 @@ ENUM_LOWERINGOPT(SkipExternalRttiDefinition, unsigned, 1, 0) /// If false, lower to the complex dialect of MLIR. /// On by default. ENUM_LOWERINGOPT(ComplexDivisionToRuntime, unsigned, 1, 1) + +/// When true, it registers MLIRDiagnosticsHandler for the duration +/// of the lowering pipeline. +ENUM_LOWERINGOPT(RegisterMLIRDiagnosticsHandler, unsigned, 1, 1) + #undef LOWERINGOPT #undef ENUM_LOWERINGOPT diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 1adfb96ab9a9..75048c141365 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -6707,27 +6707,30 @@ Fortran::lower::LoweringBridge::LoweringBridge( loweringOptions{loweringOptions}, envDefaults{envDefaults}, languageFeatures{languageFeatures} { // Register the diagnostic handler. - context.getDiagEngine().registerHandler([](mlir::Diagnostic &diag) { - llvm::raw_ostream &os = llvm::errs(); - switch (diag.getSeverity()) { - case mlir::DiagnosticSeverity::Error: - os << "error: "; - break; - case mlir::DiagnosticSeverity::Remark: - os << "info: "; - break; - case mlir::DiagnosticSeverity::Warning: - os << "warning: "; - break; - default: - break; - } - if (!mlir::isa(diag.getLocation())) - os << diag.getLocation() << ": "; - os << diag << '\n'; - os.flush(); - return mlir::success(); - }); + if (loweringOptions.getRegisterMLIRDiagnosticsHandler()) { + diagHandlerID = + context.getDiagEngine().registerHandler([](mlir::Diagnostic &diag) { + llvm::raw_ostream &os = llvm::errs(); + switch (diag.getSeverity()) { + case mlir::DiagnosticSeverity::Error: + os << "error: "; + break; + case mlir::DiagnosticSeverity::Remark: + os << "info: "; + break; + case mlir::DiagnosticSeverity::Warning: + os << "warning: "; + break; + default: + break; + } + if (!mlir::isa(diag.getLocation())) + os << diag.getLocation() << ": "; + os << diag << '\n'; + os.flush(); + return mlir::success(); + }); + } auto getPathLocation = [&semanticsContext, &context]() -> mlir::Location { std::optional path; @@ -6769,6 +6772,11 @@ Fortran::lower::LoweringBridge::LoweringBridge( fir::setCommandline(*module, *cgOpts.RecordCommandLine); } +Fortran::lower::LoweringBridge::~LoweringBridge() { + if (diagHandlerID) + context.getDiagEngine().eraseHandler(*diagHandlerID); +} + void Fortran::lower::genCleanUpInRegionIfAny( mlir::Location loc, fir::FirOpBuilder &builder, mlir::Region ®ion, Fortran::lower::StatementContext &context) {