From 4d37ae07cf4c41c195538f667b6e9bdbe0213958 Mon Sep 17 00:00:00 2001 From: Abid Qadeer Date: Thu, 9 May 2024 15:30:10 +0100 Subject: [PATCH] [mlir][flang] Improve handling of fortran module variables. Currently, only those global variables which are at compile unit scope are added to the 'Globals' list of the compile unit. This does not work for module variables of fortran where hierarchy can be variable -> module -> compile unit. To fix this, if a variable scope points to a module, we walk one level up and see if module is in the compile unit scope. This was initially part of #91582 which adds debug information for fortran module variables. Kiran pointed out that MLIR changes should go in separate PRs. --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 10 +++++++-- mlir/test/Target/LLVMIR/llvmir-debug.mlir | 23 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 669b95a9c6a5be..717a32e4f980f6 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1029,11 +1029,17 @@ LogicalResult ModuleTranslation::convertGlobals() { debugTranslation->translateGlobalVariableExpression(op.getDbgExpr()); llvm::DIGlobalVariable *diGlobalVar = diGlobalExpr->getVariable(); var->addDebugInfo(diGlobalExpr); + // For fortran, the scope hierarchy can be + // variable -> module -> compile unit + // If a variable scope points to Module then we get its parent scope so + // that globals get added to the compile unit. + llvm::DIScope *scope = diGlobalVar->getScope(); + if (llvm::DIModule *mod = dyn_cast_if_present(scope)) + scope = mod->getScope(); // Get the compile unit (scope) of the the global variable. if (llvm::DICompileUnit *compileUnit = - dyn_cast_if_present( - diGlobalVar->getScope())) { + dyn_cast_if_present(scope)) { // Update the compile unit with this incoming global variable expression // during the finalizing step later. allGVars[compileUnit].push_back(diGlobalExpr); diff --git a/mlir/test/Target/LLVMIR/llvmir-debug.mlir b/mlir/test/Target/LLVMIR/llvmir-debug.mlir index 1f0fc969364ac8..b561ac5968ccc2 100644 --- a/mlir/test/Target/LLVMIR/llvmir-debug.mlir +++ b/mlir/test/Target/LLVMIR/llvmir-debug.mlir @@ -311,6 +311,29 @@ llvm.mlir.global external @global_with_expr_2() {addr_space = 0 : i32, dbg_expr // ----- +// CHECK: @module_global_1 = external global i64, !dbg {{.*}} +// CHECK: @module_global_2 = external global i64, !dbg {{.*}} +// CHECK: !llvm.module.flags = !{{{.*}}} +// CHECK: !llvm.dbg.cu = !{{{.*}}} +// CHECK-DAG: ![[FILE:.*]] = !DIFile(filename: "test.f90", directory: "existence") +// CHECK-DAG: ![[TYPE:.*]] = !DIBasicType(name: "integer", size: 64, encoding: DW_ATE_signed) +// CHECK-DAG: ![[SCOPE:.*]] = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: ![[FILE]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: ![[GVALS:.*]]) +// CHECK-DAG: ![[SCOPE1:.*]] = !DIModule(scope: ![[SCOPE]], name: "module2", file: ![[FILE]], line: 120) +// CHECK-DAG: ![[GVAR0:.*]] = distinct !DIGlobalVariable(name: "module_global_1", linkageName: "module_global_1", scope: ![[SCOPE1]], file: ![[FILE]], line: 121, type: ![[TYPE]], isLocal: false, isDefinition: true) +// CHECK-DAG: ![[GVAR1:.*]] = distinct !DIGlobalVariable(name: "module_global_2", linkageName: "module_global_2", scope: ![[SCOPE1]], file: ![[FILE]], line: 122, type: ![[TYPE]], isLocal: false, isDefinition: true) +// CHECK-DAG: ![[GEXPR0:.*]] = !DIGlobalVariableExpression(var: ![[GVAR0]], expr: !DIExpression()) +// CHECK-DAG: ![[GEXPR1:.*]] = !DIGlobalVariableExpression(var: ![[GVAR1]], expr: !DIExpression()) +// CHECK-DAG: ![[GVALS]] = !{![[GEXPR0]], ![[GEXPR1]]} + +#di_file = #llvm.di_file<"test.f90" in "existence"> +#di_compile_unit = #llvm.di_compile_unit, sourceLanguage = DW_LANG_Fortran95, file = #di_file, producer = "MLIR", isOptimized = true, emissionKind = Full> +#di_basic_type = #llvm.di_basic_type +#di_module = #llvm.di_module +llvm.mlir.global external @module_global_1() {dbg_expr = #llvm.di_global_variable_expression, expr = <>>} : i64 +llvm.mlir.global external @module_global_2() {dbg_expr = #llvm.di_global_variable_expression, expr = <>>} : i64 + +// ----- + // Nameless and scopeless global constant. // CHECK-LABEL: @.str.1 = external constant [10 x i8]