[flang-commits] [flang] 2f33b01 - [flang] Ensure lowering diagnostic handler does not outlive lowering (#151608)
via flang-commits
flang-commits at lists.llvm.org
Fri Aug 1 09:27:39 PDT 2025
Author: Razvan Lupusoru
Date: 2025-08-01T09:27:36-07:00
New Revision: 2f33b01651b1041682bab363e556ff1a396262fc
URL: https://github.com/llvm/llvm-project/commit/2f33b01651b1041682bab363e556ff1a396262fc
DIFF: https://github.com/llvm/llvm-project/commit/2f33b01651b1041682bab363e556ff1a396262fc.diff
LOG: [flang] Ensure lowering diagnostic handler does not outlive lowering (#151608)
When the LoweringBridge is created, it registers an MLIR Diagnostics
handler with the MLIRContext. However, it never deregisters it once
lowering is finished.
This fixes this particular scenario. It also makes it so that the
Diagnostics handler is optional.
Added:
Modified:
flang/include/flang/Lower/Bridge.h
flang/include/flang/Lower/LoweringOptions.def
flang/lib/Lower/Bridge.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Lower/Bridge.h b/flang/include/flang/Lower/Bridge.h
index a8c2bcfda31c1..3710e74bf38d9 100644
--- a/flang/include/flang/Lower/Bridge.h
+++ b/flang/include/flang/Lower/Bridge.h
@@ -76,6 +76,7 @@ class LoweringBridge {
loweringOptions, envDefaults, languageFeatures,
targetMachine, targetOptions, codeGenOptions);
}
+ ~LoweringBridge();
//===--------------------------------------------------------------------===//
// Getters
@@ -174,6 +175,7 @@ class LoweringBridge {
const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults;
const Fortran::common::LanguageFeatureControl &languageFeatures;
std::set<std::string> tempNames;
+ std::optional<mlir::DiagnosticEngine::HandlerID> diagHandlerID;
};
} // namespace lower
diff --git a/flang/include/flang/Lower/LoweringOptions.def b/flang/include/flang/Lower/LoweringOptions.def
index 8135704971aa4..39f197d8d35c8 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 1adfb96ab9a98..75048c141365e 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<mlir::UnknownLoc>(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<mlir::UnknownLoc>(diag.getLocation()))
+ os << diag.getLocation() << ": ";
+ os << diag << '\n';
+ os.flush();
+ return mlir::success();
+ });
+ }
auto getPathLocation = [&semanticsContext, &context]() -> mlir::Location {
std::optional<std::string> 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) {
More information about the flang-commits
mailing list