| // 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 = {{.+}}> |