From 2c84c56b2795cce9afa8ec0b6055aac1ea028331 Mon Sep 17 00:00:00 2001 From: Stephen Tozer Date: Tue, 11 Jun 2024 12:20:31 +0100 Subject: [PATCH 1/2] [MLIR][Flang][DebugInfo] Set debug info format in MLIR->IR translation MLIR's LLVM dialect does not internally support debug records, only converting to/from debug intrinsics. To smooth the transition from intrinsics to records, there is a step prior to IR->MLIR translation that switches the IR module to intrinsic-form; this patch adds the equivalent conversion to record-form at MLIR->IR translation, and also modifies the flang front end to use the WriteNewDbgInfoFormat flag when it is emitting LLVM IR. --- flang/lib/Frontend/FrontendActions.cpp | 7 +++++++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index b1b6391f1439c..585177b5c7647 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -50,6 +50,7 @@ #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/Bitcode/BitcodeWriterPass.h" #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" +#include "llvm/IR/DebugProgramInstruction.h" #include "llvm/IR/LLVMRemarkStreamer.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Verifier.h" @@ -81,6 +82,8 @@ using namespace Fortran::frontend; llvm::PassPluginLibraryInfo get##Ext##PluginInfo(); #include "llvm/Support/Extension.def" +extern llvm::cl::opt WriteNewDbgInfoFormat; + /// Save the given \c mlirModule to a temporary .mlir file, in a location /// decided by the -save-temps flag. No files are produced if the flag is not /// specified. @@ -1271,6 +1274,10 @@ void CodeGenAction::executeAction() { runOptimizationPipeline(ci.isOutputStreamNull() ? *os : ci.getOutputStream()); if (action == BackendActionTy::Backend_EmitLL) { + llvm::ScopedDbgInfoFormatSetter FormatSetter(*llvmModule, + WriteNewDbgInfoFormat); + if (WriteNewDbgInfoFormat) + llvmModule->removeDebugIntrinsicDeclarations(); llvmModule->print(ci.isOutputStreamNull() ? *os : ci.getOutputStream(), /*AssemblyAnnotationWriter=*/nullptr); return; diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 7b86b250c294b..a5c8c26483edf 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -64,6 +64,8 @@ using namespace mlir; using namespace mlir::LLVM; using namespace mlir::LLVM::detail; +extern llvm::cl::opt UseNewDbgInfoFormat; + #include "mlir/Dialect/LLVMIR/LLVMConversionEnumsToLLVM.inc" namespace { @@ -1789,6 +1791,7 @@ prepareLLVMModule(Operation *m, llvm::LLVMContext &llvmContext, StringRef name) { m->getContext()->getOrLoadDialect(); auto llvmModule = std::make_unique(name, llvmContext); + llvmModule->setNewDbgInfoFormatFlag(false); if (auto dataLayoutAttr = m->getDiscardableAttr(LLVM::LLVMDialect::getDataLayoutAttrName())) { llvmModule->setDataLayout(cast(dataLayoutAttr).getValue()); @@ -1867,6 +1870,8 @@ mlir::translateModuleToLLVMIR(Operation *module, llvm::LLVMContext &llvmContext, if (failed(translator.convertFunctions())) return nullptr; + translator.llvmModule->setIsNewDbgInfoFormat(UseNewDbgInfoFormat); + if (!disableVerification && llvm::verifyModule(*translator.llvmModule, &llvm::errs())) return nullptr; From 585fca5ff44ddecb2a50eb7e037355ab854bfc6b Mon Sep 17 00:00:00 2001 From: Stephen Tozer Date: Tue, 11 Jun 2024 13:10:03 +0100 Subject: [PATCH 2/2] Add comments for context --- flang/lib/Frontend/FrontendActions.cpp | 2 ++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 585177b5c7647..a4db944e8c0ab 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -1274,6 +1274,8 @@ void CodeGenAction::executeAction() { runOptimizationPipeline(ci.isOutputStreamNull() ? *os : ci.getOutputStream()); if (action == BackendActionTy::Backend_EmitLL) { + // When printing LLVM IR, we should convert the module to the debug info + // format that LLVM expects us to print. llvm::ScopedDbgInfoFormatSetter FormatSetter(*llvmModule, WriteNewDbgInfoFormat); if (WriteNewDbgInfoFormat) diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index a5c8c26483edf..e1a60f195fe89 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1791,6 +1791,8 @@ prepareLLVMModule(Operation *m, llvm::LLVMContext &llvmContext, StringRef name) { m->getContext()->getOrLoadDialect(); auto llvmModule = std::make_unique(name, llvmContext); + // ModuleTranslation can currently only construct modules in the old debug + // info format, so set the flag accordingly. llvmModule->setNewDbgInfoFormatFlag(false); if (auto dataLayoutAttr = m->getDiscardableAttr(LLVM::LLVMDialect::getDataLayoutAttrName())) { @@ -1870,6 +1872,9 @@ mlir::translateModuleToLLVMIR(Operation *module, llvm::LLVMContext &llvmContext, if (failed(translator.convertFunctions())) return nullptr; + // Once we've finished constructing elements in the module, we should convert + // it to use the debug info format desired by LLVM. + // See https://llvm.org/docs/RemoveDIsDebugInfo.html translator.llvmModule->setIsNewDbgInfoFormat(UseNewDbgInfoFormat); if (!disableVerification &&