diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index 407ecc8e327b4..4cdf75f469a8d 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -284,6 +284,10 @@ DebugTypeGenerator::convertType(mlir::Type Ty, mlir::LLVM::DIFileAttr fileAttr, return convertPointerLikeType(heapTy.getElementType(), fileAttr, scope, loc, /*genAllocated=*/true, /*genAssociated=*/false); + if (auto ptrTy = mlir::dyn_cast_or_null(elTy)) + return convertPointerLikeType(ptrTy.getElementType(), fileAttr, scope, + loc, /*genAllocated=*/false, + /*genAssociated=*/true); return genPlaceholderType(context); } else { // FIXME: These types are currently unhandled. We are generating a diff --git a/flang/test/Integration/debug-ptr-type.f90 b/flang/test/Integration/debug-ptr-type.f90 new file mode 100644 index 0000000000000..bff7bcb862b5c --- /dev/null +++ b/flang/test/Integration/debug-ptr-type.f90 @@ -0,0 +1,48 @@ +! RUN: %flang_fc1 -emit-llvm -debug-info-kind=standalone %s -o - | FileCheck %s + +subroutine ff(n, m) + implicit none + integer i, j, m, n + real(4), pointer :: par(:, :) + integer, pointer :: psc + integer, pointer :: par2(:) + character(len=16), pointer :: pstr + real(4), target :: ar(4, 5) + integer, target :: sc + integer, target, allocatable :: ar2(:) + character(len=:), target, allocatable :: str + + str = 'Hello' + pstr => str + allocate(ar2(4)) + par2 => ar2 + do i=1,5 + do j=1,4 + ar(j,i) = 0.1 + par2(j) = j + end do + end do + sc = 3 + psc => sc + par => ar + + print *, sc + print *, ar + print *, ar2 + print *, str + print *, psc + print *, par + print *, par2 + print *, pstr +end subroutine ff + + +! CHECK-DAG: ![[INT_TY:[0-9]+]] = !DIBasicType(name: "integer"{{.*}}) +! CHECK-DAG: ![[ELEMS1:[0-9]+]] = !{!{{[0-9]+}}} +! CHECK-DAG: !DILocalVariable(name: "par"{{.*}}type: ![[ARR_TY1:[0-9]+]]) +! CHECK-DAG: ![[ARR_TY1]] = !DICompositeType(tag: DW_TAG_array_type{{.*}}elements: ![[ELEMS2:[0-9]+]], dataLocation: !DIExpression(DW_OP_push_object_address, DW_OP_deref), associated: !DIExpression(DW_OP_push_object_address, DW_OP_deref, DW_OP_lit0, DW_OP_ne)) +! CHECK-DAG: ![[ELEMS2]] = !{!{{[0-9]+}}, !{{[0-9]+}}} +! CHECK-DAG: !DILocalVariable(name: "par2"{{.*}}type: ![[ARR_TY2:[0-9]+]]) +! CHECK-DAG: ![[ARR_TY2]] = !DICompositeType(tag: DW_TAG_array_type{{.*}}, elements: ![[ELEMS1]], dataLocation: !DIExpression(DW_OP_push_object_address, DW_OP_deref), associated: !DIExpression(DW_OP_push_object_address, DW_OP_deref, DW_OP_lit0, DW_OP_ne)) +! CHECK-DAG: !DILocalVariable(name: "psc"{{.*}}type: ![[PTR_TY:[0-9]+]]) +! CHECK-DAG: ![[PTR_TY]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[INT_TY]]{{.*}}) diff --git a/flang/test/Transforms/debug-ptr-type.fir b/flang/test/Transforms/debug-ptr-type.fir new file mode 100644 index 0000000000000..3f6c895ddaf8e --- /dev/null +++ b/flang/test/Transforms/debug-ptr-type.fir @@ -0,0 +1,40 @@ +// RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s + +module attributes {dlti.dl_spec = #dlti.dl_spec<>} { + fir.global @_QMhelperEpar : !fir.box>> { + %0 = fir.zero_bits !fir.ptr> + %c0 = arith.constant 0 : index + %1 = fir.shape %c0, %c0 : (index, index) -> !fir.shape<2> + %2 = fir.embox %0(%1) : (!fir.ptr>, !fir.shape<2>) -> !fir.box>> + fir.has_value %2 : !fir.box>> + } loc(#loc1) + fir.global @_QMhelperEpar2 : !fir.box>> { + %0 = fir.zero_bits !fir.ptr> + %c0 = arith.constant 0 : index + %1 = fir.shape %c0 : (index) -> !fir.shape<1> + %2 = fir.embox %0(%1) : (!fir.ptr>, !fir.shape<1>) -> !fir.box>> + fir.has_value %2 : !fir.box>> + } loc(#loc2) + fir.global @_QMhelperEpsc : !fir.box> { + %0 = fir.zero_bits !fir.ptr + %1 = fir.embox %0 : (!fir.ptr) -> !fir.box> + fir.has_value %1 : !fir.box> + } loc(#loc3) + fir.global @_QMmEpstr : !fir.box>> { + %0 = fir.zero_bits !fir.ptr> + %1 = fir.embox %0 : (!fir.ptr>) -> !fir.box>> + fir.has_value %1 : !fir.box>> + } loc(#loc4) +} +#loc1 = loc("test.f90":5:1) +#loc2 = loc("test.f90":6:1) +#loc3 = loc("test.f90":7:1) +#loc4 = loc("test.f90":8:1) + +// CHECK-DAG: #[[INT_TY:.*]] = #llvm.di_basic_type +// CHECK-DAG: #[[ARR1_TY:.*]] = #llvm.di_composite_type, #llvm.di_subrange, dataLocation = {{.*}}, associated = <[DW_OP_push_object_address, DW_OP_deref, DW_OP_lit0, DW_OP_ne]>> +// CHECK-DAG: #[[ARR2_TY:.*]] = #llvm.di_composite_type, dataLocation = {{.*}}, associated = <[DW_OP_push_object_address, DW_OP_deref, DW_OP_lit0, DW_OP_ne]>> +// CHECK-DAG: #[[PTR_TY:.*]] = #llvm.di_derived_type +// CHECK-DAG: #llvm.di_global_variable<{{.*}}name = "par"{{.*}}type = #[[ARR1_TY]]{{.*}}> +// CHECK-DAG: #llvm.di_global_variable<{{.*}}name = "par2"{{.*}}type = #[[ARR2_TY]]{{.*}}> +// CHECK-DAG: #llvm.di_global_variable<{{.*}}name = "psc"{{.*}}type = #[[PTR_TY]]{{.*}}>