From ef62e9eabc4ad0a4586e2ab3af6021da84114ff8 Mon Sep 17 00:00:00 2001 From: Morris Hafner Date: Fri, 31 Oct 2025 14:07:45 +0800 Subject: [PATCH] [CIR] Add MLIR diagnostic handler ahead of verification This enables clang to print out diagnostics that point to both the C++ source in the error and the incorrect CIR in the notes. --- clang/lib/CIR/FrontendAction/CIRGenAction.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp index 67bb5657d4001..ae244d785631b 100644 --- a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp +++ b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp @@ -95,6 +95,18 @@ class CIRGenConsumer : public clang::ASTConsumer { void HandleTranslationUnit(ASTContext &C) override { Gen->HandleTranslationUnit(C); + mlir::ModuleOp MlirModule = Gen->getModule(); + mlir::MLIRContext &MlirCtx = Gen->getMLIRContext(); + + SourceManager &ClangSourceMgr = C.getSourceManager(); + FileID MainFileID = ClangSourceMgr.getMainFileID(); + std::unique_ptr FileBuf = + llvm::MemoryBuffer::getMemBuffer( + ClangSourceMgr.getBufferOrFake(MainFileID)); + llvm::SourceMgr MlirSourceMgr; + MlirSourceMgr.AddNewSourceBuffer(std::move(FileBuf), llvm::SMLoc()); + mlir::SourceMgrDiagnosticHandler DiagnosticHandler(MlirSourceMgr, &MlirCtx); + if (!FEOptions.ClangIRDisableCIRVerifier) { if (!Gen->verifyModule()) { CI.getDiagnostics().Report( @@ -105,9 +117,6 @@ class CIRGenConsumer : public clang::ASTConsumer { } } - mlir::ModuleOp MlirModule = Gen->getModule(); - mlir::MLIRContext &MlirCtx = Gen->getMLIRContext(); - if (!FEOptions.ClangIRDisablePasses) { // Setup and run CIR pipeline. if (runCIRToCIRPasses(MlirModule, MlirCtx, C,