| // RUN: fir-opt --add-debug-info --mlir-print-debuginfo --mlir-print-local-scope %s | FileCheck %s | |
| module { | |
| func.func @_QPhost(%arg0: !fir.ref<i32> {fir.bindc_name = "a"}, %arg1: !fir.ref<i32> {fir.bindc_name = "a_d", cuf.data_attr = #cuf.cuda<device>}) { | |
| %0 = fir.undefined !fir.dscope | |
| %1 = fircg.ext_declare %arg0 dummy_scope %0 arg 1 uniq_name("_QFhostEa") : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32> loc(#loc1) | |
| %2 = fircg.ext_declare %arg1 dummy_scope %0 arg 2 uniq_name("_QFhostEa_d") data_attr(#cuf.cuda<device>) : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32> loc(#loc2) | |
| return | |
| } loc(#loc3) | |
| func.func @_QPhostlocals() { | |
| %0 = fir.alloca i32 {uniq_name = "_QFhostlocalsEd"} | |
| %1 = fircg.ext_declare %0 uniq_name("_QFhostlocalsEd") data_attr(#cuf.cuda<device>) : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc4) | |
| %2 = fir.alloca i32 {uniq_name = "_QFhostlocalsEc"} | |
| %3 = fircg.ext_declare %2 uniq_name("_QFhostlocalsEc") data_attr(#cuf.cuda<constant>) : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc5) | |
| %4 = fir.alloca i32 {uniq_name = "_QFhostlocalsEm"} | |
| %5 = fircg.ext_declare %4 uniq_name("_QFhostlocalsEm") data_attr(#cuf.cuda<managed>) : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc6) | |
| %6 = fir.alloca i32 {uniq_name = "_QFhostlocalsEp"} | |
| %7 = fircg.ext_declare %6 uniq_name("_QFhostlocalsEp") data_attr(#cuf.cuda<pinned>) : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc7) | |
| %8 = fir.alloca i32 {uniq_name = "_QFhostlocalsEu"} | |
| %9 = fircg.ext_declare %8 uniq_name("_QFhostlocalsEu") data_attr(#cuf.cuda<unified>) : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc8) | |
| return | |
| } loc(#loc9) | |
| func.func @_QPkernel(%arg0: !fir.ref<i32> {fir.bindc_name = "k_d", cuf.data_attr = #cuf.cuda<device>}) attributes {cuf.proc_attr = #cuf.cuda_proc<global>} { | |
| %0 = fir.undefined !fir.dscope | |
| %1 = fircg.ext_declare %arg0 dummy_scope %0 arg 1 uniq_name("_QFkernelEk_d") data_attr(#cuf.cuda<device>) : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32> loc(#loc10) | |
| %2 = fir.alloca i32 {uniq_name = "_QFkernelEs"} | |
| %3 = fircg.ext_declare %2 uniq_name("_QFkernelEs") data_attr(#cuf.cuda<shared>) : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc11) | |
| return | |
| } loc(#loc12) | |
| func.func @_QPhostdevice(%arg0: !fir.ref<i32> {fir.bindc_name = "x"}) attributes {cuf.proc_attr = #cuf.cuda_proc<host_device>} { | |
| %0 = fir.undefined !fir.dscope | |
| %1 = fircg.ext_declare %arg0 dummy_scope %0 arg 1 uniq_name("_QFhostdeviceEx") : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32> loc(#loc13) | |
| %2 = fir.alloca i32 {uniq_name = "_QFhostdeviceEd"} | |
| %3 = fircg.ext_declare %2 uniq_name("_QFhostdeviceEd") data_attr(#cuf.cuda<device>) : (!fir.ref<i32>) -> !fir.ref<i32> loc(#loc14) | |
| return | |
| } loc(#loc15) | |
| func.func @_QPsave() { | |
| %0 = fir.address_of(@_QFsaveEs_d) : !fir.ref<!fir.box<!fir.heap<i32>>> | |
| %1 = fircg.ext_declare %0 uniq_name("_QFsaveEs_d") data_attr(#cuf.cuda<device>) : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> !fir.ref<!fir.box<!fir.heap<i32>>> loc(#loc16) | |
| return | |
| } loc(#loc17) | |
| fir.global internal @_QFsaveEs_d {data_attr = #cuf.cuda<device>} : !fir.box<!fir.heap<i32>> { | |
| %0 = fir.zero_bits !fir.heap<i32> | |
| %1 = fir.embox %0 allocator_idx(2) : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>> | |
| fir.has_value %1 : !fir.box<!fir.heap<i32>> | |
| } loc(#loc18) | |
| } | |
| #loc1 = loc("test.cuf":3:1) | |
| #loc2 = loc("test.cuf":4:1) | |
| #loc3 = loc("test.cuf":2:1) | |
| #loc4 = loc("test.cuf":9:1) | |
| #loc5 = loc("test.cuf":10:1) | |
| #loc6 = loc("test.cuf":11:1) | |
| #loc7 = loc("test.cuf":12:1) | |
| #loc8 = loc("test.cuf":13:1) | |
| #loc9 = loc("test.cuf":8:1) | |
| #loc10 = loc("test.cuf":18:1) | |
| #loc11 = loc("test.cuf":19:1) | |
| #loc12 = loc("test.cuf":17:1) | |
| #loc13 = loc("test.cuf":24:1) | |
| #loc14 = loc("test.cuf":25:1) | |
| #loc15 = loc("test.cuf":23:1) | |
| #loc16 = loc("test.cuf":30:1) | |
| #loc17 = loc("test.cuf":29:1) | |
| #loc18 = loc("test.cuf":30:1) | |
| // A variable that gets debug info ends up with a fused loc carrying | |
| // #llvm.di_local_variable, while a filtered one keeps its plain source loc. | |
| // CHECK-LABEL: func.func @_QPhost | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostEa"){{.*}}loc(fused<#llvm.di_local_variable< | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostEa_d"){{.*}}loc("test.cuf":4:1) | |
| // CHECK-LABEL: func.func @_QPhostlocals | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostlocalsEd"){{.*}}loc("test.cuf":9:1) | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostlocalsEc"){{.*}}loc("test.cuf":10:1) | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostlocalsEm"){{.*}}loc(fused<#llvm.di_local_variable< | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostlocalsEp"){{.*}}loc(fused<#llvm.di_local_variable< | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostlocalsEu"){{.*}}loc(fused<#llvm.di_local_variable< | |
| // CHECK-LABEL: func.func @_QPkernel | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFkernelEk_d"){{.*}}loc(fused<#llvm.di_local_variable< | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFkernelEs"){{.*}}loc(fused<#llvm.di_local_variable< | |
| // CHECK-LABEL: func.func @_QPhostdevice | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostdeviceEx"){{.*}}loc(fused<#llvm.di_local_variable< | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFhostdeviceEd"){{.*}}loc("test.cuf":25:1) | |
| // A device variable with SAVE is lowered to a global, leave it unfiltered. | |
| // CHECK-LABEL: func.func @_QPsave | |
| // CHECK: ext_declare{{.*}}uniq_name("_QFsaveEs_d"){{.*}}loc("test.cuf":30:1) | |
| // CHECK: fir.global internal @_QFsaveEs_d | |
| // CHECK: } loc(fused<[#llvm.di_global_variable_expression< |