diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index 029d3776bcc0b8..7c4382079fd6d4 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -116,8 +116,8 @@ mlir::LLVM::DITypeAttr DebugTypeGenerator::convertBoxedSequenceType( unsigned offset = dimsOffset; const unsigned indexSize = dimsSize / 3; for ([[maybe_unused]] auto _ : seqTy.getShape()) { - // For each dimension, find the offset of count and lower bound in the - // descriptor and generate the dwarf expression to extract it. + // For each dimension, find the offset of count, lower bound and stride in + // the descriptor and generate the dwarf expression to extract it. // FIXME: If `indexSize` happens to be bigger than address size on the // system then we may have to change 'DW_OP_deref' here. addOp(llvm::dwarf::DW_OP_push_object_address, {}); @@ -139,10 +139,18 @@ mlir::LLVM::DITypeAttr DebugTypeGenerator::convertBoxedSequenceType( mlir::LLVM::DIExpressionAttr::get(context, ops); ops.clear(); + addOp(llvm::dwarf::DW_OP_push_object_address, {}); + addOp(llvm::dwarf::DW_OP_plus_uconst, + {offset + (indexSize * kDimStridePos)}); + addOp(llvm::dwarf::DW_OP_deref, {}); + // stride[i] = *(base_addr + offset + (indexSize * kDimStridePos)) + mlir::LLVM::DIExpressionAttr strideAttr = + mlir::LLVM::DIExpressionAttr::get(context, ops); + ops.clear(); + offset += dimsSize; mlir::LLVM::DISubrangeAttr subrangeTy = mlir::LLVM::DISubrangeAttr::get( - context, countAttr, lowerAttr, /*upperBound=*/nullptr, - /*stride=*/nullptr); + context, countAttr, lowerAttr, /*upperBound=*/nullptr, strideAttr); elements.push_back(subrangeTy); } return mlir::LLVM::DICompositeTypeAttr::get( diff --git a/flang/test/Integration/debug-assumed-shape-array.f90 b/flang/test/Integration/debug-assumed-shape-array.f90 index a23ffa13cf0ac6..9a439e20d19816 100644 --- a/flang/test/Integration/debug-assumed-shape-array.f90 +++ b/flang/test/Integration/debug-assumed-shape-array.f90 @@ -8,6 +8,6 @@ end subroutine ff ! CHECK-DAG: !DICompositeType(tag: DW_TAG_array_type{{.*}}elements: ![[ELEMS:[0-9]+]], dataLocation: !DIExpression(DW_OP_push_object_address, DW_OP_deref)) ! CHECK-DAG: ![[ELEMS]] = !{![[ELEM1:[0-9]+]], ![[ELEM2:[0-9]+]]} -! CHECK-DAG: ![[ELEM1]] = !DISubrange(count: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 32, DW_OP_deref), lowerBound: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 24, DW_OP_deref)) -! CHECK-DAG: ![[ELEM2]] = !DISubrange(count: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 56, DW_OP_deref), lowerBound: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 48, DW_OP_deref)) +! CHECK-DAG: ![[ELEM1]] = !DISubrange(count: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 32, DW_OP_deref), lowerBound: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 24, DW_OP_deref), stride: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 40, DW_OP_deref)) +! CHECK-DAG: ![[ELEM2]] = !DISubrange(count: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 56, DW_OP_deref), lowerBound: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 48, DW_OP_deref), stride: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 64, DW_OP_deref)) diff --git a/flang/test/Transforms/debug-assumed-shape-array.fir b/flang/test/Transforms/debug-assumed-shape-array.fir index 0a9b84ad253aab..d1e64297acea7d 100644 --- a/flang/test/Transforms/debug-assumed-shape-array.fir +++ b/flang/test/Transforms/debug-assumed-shape-array.fir @@ -11,6 +11,6 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry : #loc2 = loc("test1.f90":3:16) // CHECK: #llvm.di_composite_type, lowerBound = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(24), DW_OP_deref]>>, -// CHECK-SAME: #llvm.di_subrange, lowerBound = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(48), DW_OP_deref]>> +// CHECK-SAME: elements = #llvm.di_subrange, lowerBound = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(24), DW_OP_deref]>, stride = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(40), DW_OP_deref]>>, +// CHECK-SAME: #llvm.di_subrange, lowerBound = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(48), DW_OP_deref]>, stride = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(64), DW_OP_deref]>> // CHECK-SAME: dataLocation = <[DW_OP_push_object_address, DW_OP_deref]>>