blob: c1db92af072f4f522b971d551d1ee4496030eda0 [file] [log] [blame] [edit]
// RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s
module {
// Module globals
fir.global @_QMtestmodEvar_b : i32 {
%c20_i32 = arith.constant 20 : i32
fir.has_value %c20_i32 : i32
}
fir.global @_QMtestmodEvar_c : i32 {
%c30_i32 = arith.constant 30 : i32
fir.has_value %c30_i32 : i32
}
fir.global @_QMtestmod2Evar_y : f32 {
%cst = arith.constant 2.000000e+00 : f32
fir.has_value %cst : f32
}
func.func @_QQmain() attributes {fir.bindc_name = "TEST_USE"} {
// USE testmod, ONLY: var_b, var_d => var_c
fir.use_stmt "testmod" only_symbols[[@_QMtestmodEvar_b]] renames[[#fir.use_rename<"var_d", @_QMtestmodEvar_c>]]
// USE testmod2, var_z => var_y (no ONLY)
fir.use_stmt "testmod2" renames[[#fir.use_rename<"var_z", @_QMtestmod2Evar_y>]]
%0 = fir.address_of(@_QMtestmodEvar_b) : !fir.ref<i32>
%1 = fircg.ext_declare %0 {uniq_name = "_QMtestmodEvar_b"} : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc_b)
%2 = fir.address_of(@_QMtestmodEvar_c) : !fir.ref<i32>
%3 = fircg.ext_declare %2 {uniq_name = "_QMtestmodEvar_c"} : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc_c)
%4 = fir.address_of(@_QMtestmod2Evar_y) : !fir.ref<f32>
%5 = fircg.ext_declare %4 {uniq_name = "_QMtestmod2Evar_y"} : (!fir.ref<f32>) -> !fir.ref<f32> loc(#loc_y)
return
} loc(#loc_main)
}
#loc_b = loc("test.f90":4:26)
#loc_c = loc("test.f90":4:38)
#loc_y = loc("test.f90":8:24)
#loc_main = loc("test.f90":11:1)
// CHECK-DAG: #[[MOD_TESTMOD:.+]] = #llvm.di_module<{{.*}}name = "testmod"{{.*}}>
// CHECK-DAG: #[[MOD_TESTMOD2:.+]] = #llvm.di_module<{{.*}}name = "testmod2"{{.*}}>
// CHECK-DAG: #[[GVAR_B:.+]] = #llvm.di_global_variable<scope = #[[MOD_TESTMOD]], name = "var_b", linkageName = "_QMtestmodEvar_b"
// CHECK-DAG: #[[GVAR_C:.+]] = #llvm.di_global_variable<scope = #[[MOD_TESTMOD]], name = "var_c", linkageName = "_QMtestmodEvar_c"
// CHECK-DAG: #[[GVAR_Y:.+]] = #llvm.di_global_variable<scope = #[[MOD_TESTMOD2]], name = "var_y", linkageName = "_QMtestmod2Evar_y"
// DISubprogram placeholder (for recursive reference)
// CHECK-DAG: #[[SP_REC:.+]] = #llvm.di_subprogram<recId = distinct[[[RECID:[0-9]+]]]<>, isRecSelf = true{{.*}}name = "TEST_USE"
// 1. Imported declaration without rename (var_b) - has entity but NO name attribute
// CHECK-DAG: #llvm.di_imported_entity<tag = DW_TAG_imported_declaration, scope = #[[SP_REC]], entity = #[[GVAR_B]],{{.*}}>
// 2. Imported declaration with rename (var_d => var_c) - has both entity and name
// CHECK-DAG: #llvm.di_imported_entity<tag = DW_TAG_imported_declaration, scope = #[[SP_REC]], entity = #[[GVAR_C]],{{.*}}name = "var_d">
// 3. Imported declaration with rename (var_z => var_y) - for module import element
// CHECK-DAG: #[[IMPORT_Z:.+]] = #llvm.di_imported_entity<tag = DW_TAG_imported_declaration, scope = #[[SP_REC]], entity = #[[GVAR_Y]],{{.*}}name = "var_z">
// 4. Imported module (testmod2) with renamed element in its elements field
// CHECK-DAG: #llvm.di_imported_entity<tag = DW_TAG_imported_module, scope = #[[SP_REC]], entity = #[[MOD_TESTMOD2]]{{.*}}elements = #[[IMPORT_Z]]
// Verify final DISubprogram has retainedNodes (non-empty)
// We don't check the exact order since retainedNodes comes from an unordered collection
// CHECK-DAG: #llvm.di_subprogram<recId = distinct[[[RECID]]]<>{{.*}}name = "TEST_USE"{{.*}}retainedNodes = {{.+}}>