diff --git a/flang/lib/Optimizer/Transforms/AddDebugFoundation.cpp b/flang/lib/Optimizer/Transforms/AddDebugFoundation.cpp index 16b8db7ec8c64..7a6f58066722d 100644 --- a/flang/lib/Optimizer/Transforms/AddDebugFoundation.cpp +++ b/flang/lib/Optimizer/Transforms/AddDebugFoundation.cpp @@ -97,16 +97,18 @@ void AddDebugFoundationPass::runOnOperation() { // Only definitions need a distinct identifier and a compilation unit. mlir::DistinctAttr id; mlir::LLVM::DICompileUnitAttr compilationUnit; + auto subprogramFlags = mlir::LLVM::DISubprogramFlags::Optimized; if (!funcOp.isExternal()) { id = mlir::DistinctAttr::create(mlir::UnitAttr::get(context)); compilationUnit = cuAttr; + subprogramFlags = + subprogramFlags | mlir::LLVM::DISubprogramFlags::Definition; } - mlir::LLVM::DISubprogramAttr spAttr = mlir::LLVM::DISubprogramAttr::get( + auto spAttr = mlir::LLVM::DISubprogramAttr::get( context, id, compilationUnit, fileAttr, funcName, funcName, funcFileAttr, /*line=*/1, - /*scopeline=*/1, mlir::LLVM::DISubprogramFlags::Definition, - subTypeAttr); + /*scopeline=*/1, subprogramFlags, subTypeAttr); funcOp->setLoc(builder.getFusedLoc({funcOp->getLoc()}, spAttr)); }); } diff --git a/flang/test/Transforms/debug-line-table.fir b/flang/test/Transforms/debug-line-table.fir index f091d97ce89ea..8e66fc1ab3988 100644 --- a/flang/test/Transforms/debug-line-table.fir +++ b/flang/test/Transforms/debug-line-table.fir @@ -24,7 +24,7 @@ module attributes { fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.dat // CHECK: #[[DECL_LOC:.*]] = loc("./simple.f90":10:1) // CHECK: #di_compile_unit = #llvm.di_compile_unit, sourceLanguage = DW_LANG_Fortran95, file = #di_file, producer = "Flang", isOptimized = false, emissionKind = LineTablesOnly> // CHECK: #di_subroutine_type = #llvm.di_subroutine_type -// CHECK: #[[SB_SUBPROGRAM:.*]] = #llvm.di_subprogram, compileUnit = #di_compile_unit, scope = #di_file, name = "[[SB_NAME]]", linkageName = "[[SB_NAME]]", file = #di_file, line = 1, scopeLine = 1, subprogramFlags = Definition, type = #di_subroutine_type> -// CHECK: #[[DECL_SUBPROGRAM:.*]] = #llvm.di_subprogram +// CHECK: #[[SB_SUBPROGRAM:.*]] = #llvm.di_subprogram, compileUnit = #di_compile_unit, scope = #di_file, name = "[[SB_NAME]]", linkageName = "[[SB_NAME]]", file = #di_file, line = 1, scopeLine = 1, subprogramFlags = "Definition|Optimized", type = #di_subroutine_type> +// CHECK: #[[DECL_SUBPROGRAM:.*]] = #llvm.di_subprogram // CHECK: #[[FUSED_SB_LOC]] = loc(fused<#[[SB_SUBPROGRAM]]>[#[[SB_LOC]]]) // CHECK: #[[FUSED_DECL_LOC]] = loc(fused<#[[DECL_SUBPROGRAM]]>[#[[DECL_LOC]]]) diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp b/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp index de6fb1b16977a..2960cc6220d9f 100644 --- a/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp +++ b/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp @@ -67,18 +67,19 @@ static void addScopeToFunction(LLVM::LLVMFuncOp llvmFunc, StringAttr funcNameAttr = llvmFunc.getNameAttr(); // Only definitions need a distinct identifier and a compilation unit. - mlir::DistinctAttr id; - if (!llvmFunc.isExternal()) + DistinctAttr id; + auto subprogramFlags = LLVM::DISubprogramFlags::Optimized; + if (!llvmFunc.isExternal()) { id = mlir::DistinctAttr::create(mlir::UnitAttr::get(context)); - else + subprogramFlags = subprogramFlags | LLVM::DISubprogramFlags::Definition; + } else { compileUnitAttr = {}; - mlir::LLVM::DISubprogramAttr subprogramAttr = LLVM::DISubprogramAttr::get( + } + auto subprogramAttr = LLVM::DISubprogramAttr::get( context, id, compileUnitAttr, fileAttr, funcNameAttr, funcNameAttr, fileAttr, /*line=*/line, - /*scopeline=*/col, - LLVM::DISubprogramFlags::Definition | LLVM::DISubprogramFlags::Optimized, - subroutineTypeAttr); + /*scopeline=*/col, subprogramFlags, subroutineTypeAttr); llvmFunc->setLoc(FusedLoc::get(context, {loc}, subprogramAttr)); } diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index ce46a194ea7d9..7c23a7d3e9af4 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1073,9 +1073,6 @@ LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) { branchMapping.clear(); llvm::Function *llvmFunc = lookupFunction(func.getName()); - // Translate the debug information for this function. - debugTranslation->translate(func, *llvmFunc); - // Add function arguments to the value remapping table. for (auto [mlirArg, llvmArg] : llvm::zip(func.getArguments(), llvmFunc->args())) @@ -1256,6 +1253,9 @@ LogicalResult ModuleTranslation::convertFunctionSignatures() { if (auto alignment = function.getAlignment()) llvmFunc->setAlignment(llvm::MaybeAlign(*alignment)); + + // Translate the debug information for this function. + debugTranslation->translate(function, *llvmFunc); } return success(); diff --git a/mlir/test/Target/LLVMIR/llvmir-debug.mlir b/mlir/test/Target/LLVMIR/llvmir-debug.mlir index 476ed165887c0..cfd5239515c9c 100644 --- a/mlir/test/Target/LLVMIR/llvmir-debug.mlir +++ b/mlir/test/Target/LLVMIR/llvmir-debug.mlir @@ -169,6 +169,20 @@ llvm.func @empty_types() { // ----- +#di_file = #llvm.di_file<"foo.mlir" in "/test/"> +#di_subprogram = #llvm.di_subprogram< + scope = #di_file, name = "func_decl_with_subprogram", file = #di_file, subprogramFlags = "Optimized" +> + +// CHECK-LABEL: declare !dbg +// CHECK-SAME: ![[SUBPROGRAM:.*]] i32 @func_decl_with_subprogram( +llvm.func @func_decl_with_subprogram() -> (i32) loc(fused<#di_subprogram>["foo.mlir":2:1]) + +// CHECK: ![[SUBPROGRAM]] = !DISubprogram(name: "func_decl_with_subprogram", scope: ![[FILE:.*]], file: ![[FILE]], spFlags: DISPFlagOptimized) +// CHECK: ![[FILE]] = !DIFile(filename: "foo.mlir", directory: "/test/") + +// ----- + #di_basic_type = #llvm.di_basic_type #di_file = #llvm.di_file<"foo.mlir" in "/test/"> #di_compile_unit = #llvm.di_compile_unit<