Skip to content

Commit 89f2d50

Browse files
abidhgysit
andauthored
[mlir][debug] Support DIGenericSubrange. (llvm#113441)
`DIGenericSubrange` is used when the dimensions of the arrays are unknown at build time (e.g. assumed-rank arrays in Fortran). It has same `lowerBound`, `upperBound`, `count` and `stride` fields as in `DISubrange` and its translation looks quite similar as a result. --------- Co-authored-by: Tobias Gysi <[email protected]>
1 parent e67e03a commit 89f2d50

File tree

9 files changed

+135
-23
lines changed

9 files changed

+135
-23
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,22 @@ def LLVM_DICommonBlockAttr : LLVM_Attr<"DICommonBlock", "di_common_block",
721721
let assemblyFormat = "`<` struct(params) `>`";
722722
}
723723

724+
//===----------------------------------------------------------------------===//
725+
// DIGenericSubrangeAttr
726+
//===----------------------------------------------------------------------===//
727+
728+
def LLVM_DIGenericSubrangeAttr : LLVM_Attr<"DIGenericSubrange",
729+
"di_generic_subrange", /*traits=*/[],
730+
"DINodeAttr"> {
731+
let parameters = (ins
732+
OptionalParameter<"::mlir::Attribute">:$count,
733+
"::mlir::Attribute":$lowerBound,
734+
OptionalParameter<"::mlir::Attribute">:$upperBound,
735+
"::mlir::Attribute":$stride
736+
);
737+
let assemblyFormat = "`<` struct(params) `>`";
738+
}
739+
724740
//===----------------------------------------------------------------------===//
725741
// DISubroutineTypeAttr
726742
//===----------------------------------------------------------------------===//

mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ void LLVMDialect::registerAttributes() {
5656
//===----------------------------------------------------------------------===//
5757

5858
bool DINodeAttr::classof(Attribute attr) {
59-
return llvm::isa<DIBasicTypeAttr, DICommonBlockAttr, DICompileUnitAttr,
60-
DICompositeTypeAttr, DIDerivedTypeAttr, DIFileAttr,
61-
DIGlobalVariableAttr, DIImportedEntityAttr, DILabelAttr,
62-
DILexicalBlockAttr, DILexicalBlockFileAttr,
63-
DILocalVariableAttr, DIModuleAttr, DINamespaceAttr,
64-
DINullTypeAttr, DIAnnotationAttr, DIStringTypeAttr,
65-
DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr>(
59+
return llvm::isa<
60+
DIBasicTypeAttr, DICommonBlockAttr, DICompileUnitAttr,
61+
DICompositeTypeAttr, DIDerivedTypeAttr, DIFileAttr, DIGenericSubrangeAttr,
62+
DIGlobalVariableAttr, DIImportedEntityAttr, DILabelAttr,
63+
DILexicalBlockAttr, DILexicalBlockFileAttr, DILocalVariableAttr,
64+
DIModuleAttr, DINamespaceAttr, DINullTypeAttr, DIAnnotationAttr,
65+
DIStringTypeAttr, DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr>(
6666
attr);
6767
}
6868

mlir/lib/Target/LLVMIR/DebugImporter.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,35 @@ DICommonBlockAttr DebugImporter::translateImpl(llvm::DICommonBlock *node) {
309309
translate(node->getFile()), node->getLineNo());
310310
}
311311

312+
DIGenericSubrangeAttr
313+
DebugImporter::translateImpl(llvm::DIGenericSubrange *node) {
314+
auto getAttrOrNull =
315+
[&](llvm::DIGenericSubrange::BoundType data) -> Attribute {
316+
if (data.isNull())
317+
return nullptr;
318+
if (auto *expr = dyn_cast<llvm::DIExpression *>(data))
319+
return translateExpression(expr);
320+
if (auto *var = dyn_cast<llvm::DIVariable *>(data)) {
321+
if (auto *local = dyn_cast<llvm::DILocalVariable>(var))
322+
return translate(local);
323+
if (auto *global = dyn_cast<llvm::DIGlobalVariable>(var))
324+
return translate(global);
325+
return nullptr;
326+
}
327+
return nullptr;
328+
};
329+
Attribute count = getAttrOrNull(node->getCount());
330+
Attribute upperBound = getAttrOrNull(node->getUpperBound());
331+
Attribute lowerBound = getAttrOrNull(node->getLowerBound());
332+
Attribute stride = getAttrOrNull(node->getStride());
333+
// Either count or the upper bound needs to be present. Otherwise, the
334+
// metadata is invalid.
335+
if (!count && !upperBound)
336+
return {};
337+
return DIGenericSubrangeAttr::get(context, count, lowerBound, upperBound,
338+
stride);
339+
}
340+
312341
DISubroutineTypeAttr
313342
DebugImporter::translateImpl(llvm::DISubroutineType *node) {
314343
SmallVector<DITypeAttr> types;
@@ -378,6 +407,8 @@ DINodeAttr DebugImporter::translate(llvm::DINode *node) {
378407
return translateImpl(casted);
379408
if (auto *casted = dyn_cast<llvm::DISubrange>(node))
380409
return translateImpl(casted);
410+
if (auto *casted = dyn_cast<llvm::DIGenericSubrange>(node))
411+
return translateImpl(casted);
381412
if (auto *casted = dyn_cast<llvm::DISubroutineType>(node))
382413
return translateImpl(casted);
383414
return nullptr;

mlir/lib/Target/LLVMIR/DebugImporter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class DebugImporter {
7979
DIScopeAttr translateImpl(llvm::DIScope *node);
8080
DISubprogramAttr translateImpl(llvm::DISubprogram *node);
8181
DISubrangeAttr translateImpl(llvm::DISubrange *node);
82+
DIGenericSubrangeAttr translateImpl(llvm::DIGenericSubrange *node);
8283
DICommonBlockAttr translateImpl(llvm::DICommonBlock *node);
8384
DISubroutineTypeAttr translateImpl(llvm::DISubroutineType *node);
8485
DITypeAttr translateImpl(llvm::DIType *node);

mlir/lib/Target/LLVMIR/DebugTranslation.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,33 @@ llvm::DICommonBlock *DebugTranslation::translateImpl(DICommonBlockAttr attr) {
404404
translate(attr.getFile()), attr.getLine());
405405
}
406406

407+
llvm::DIGenericSubrange *
408+
DebugTranslation::translateImpl(DIGenericSubrangeAttr attr) {
409+
auto getMetadataOrNull = [&](Attribute attr) -> llvm::Metadata * {
410+
if (!attr)
411+
return nullptr;
412+
413+
llvm::Metadata *metadata =
414+
llvm::TypeSwitch<Attribute, llvm::Metadata *>(attr)
415+
.Case([&](LLVM::DIExpressionAttr expr) {
416+
return translateExpression(expr);
417+
})
418+
.Case([&](LLVM::DILocalVariableAttr local) {
419+
return translate(local);
420+
})
421+
.Case<>([&](LLVM::DIGlobalVariableAttr global) {
422+
return translate(global);
423+
})
424+
.Default([&](Attribute attr) { return nullptr; });
425+
return metadata;
426+
};
427+
return llvm::DIGenericSubrange::get(llvmCtx,
428+
getMetadataOrNull(attr.getCount()),
429+
getMetadataOrNull(attr.getLowerBound()),
430+
getMetadataOrNull(attr.getUpperBound()),
431+
getMetadataOrNull(attr.getStride()));
432+
}
433+
407434
llvm::DISubroutineType *
408435
DebugTranslation::translateImpl(DISubroutineTypeAttr attr) {
409436
// Concatenate the result and argument types into a single array.
@@ -437,11 +464,11 @@ llvm::DINode *DebugTranslation::translate(DINodeAttr attr) {
437464
node = TypeSwitch<DINodeAttr, llvm::DINode *>(attr)
438465
.Case<DIBasicTypeAttr, DICommonBlockAttr, DICompileUnitAttr,
439466
DICompositeTypeAttr, DIDerivedTypeAttr, DIFileAttr,
440-
DIGlobalVariableAttr, DIImportedEntityAttr, DILabelAttr,
441-
DILexicalBlockAttr, DILexicalBlockFileAttr,
442-
DILocalVariableAttr, DIModuleAttr, DINamespaceAttr,
443-
DINullTypeAttr, DIStringTypeAttr, DISubprogramAttr,
444-
DISubrangeAttr, DISubroutineTypeAttr>(
467+
DIGenericSubrangeAttr, DIGlobalVariableAttr,
468+
DIImportedEntityAttr, DILabelAttr, DILexicalBlockAttr,
469+
DILexicalBlockFileAttr, DILocalVariableAttr, DIModuleAttr,
470+
DINamespaceAttr, DINullTypeAttr, DIStringTypeAttr,
471+
DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr>(
445472
[&](auto attr) { return translateImpl(attr); });
446473

447474
if (node && !node->isTemporary())

mlir/lib/Target/LLVMIR/DebugTranslation.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class DebugTranslation {
8787
llvm::DINamespace *translateImpl(DINamespaceAttr attr);
8888
llvm::DIScope *translateImpl(DIScopeAttr attr);
8989
llvm::DISubprogram *translateImpl(DISubprogramAttr attr);
90+
llvm::DIGenericSubrange *translateImpl(DIGenericSubrangeAttr attr);
9091
llvm::DISubrange *translateImpl(DISubrangeAttr attr);
9192
llvm::DICommonBlock *translateImpl(DICommonBlockAttr attr);
9293
llvm::DISubroutineType *translateImpl(DISubroutineTypeAttr attr);

mlir/test/Dialect/LLVMIR/debuginfo.mlir

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,17 @@
8080
flags = "TypePassByReference|NonTrivial"
8181
>
8282

83-
// CHECK-DAG: #[[SPTYPE0:.*]] = #llvm.di_subroutine_type<callingConvention = DW_CC_normal, types = #[[NULL]], #[[INT0]], #[[PTR0]], #[[PTR1]], #[[PTR2]], #[[COMP0:.*]], #[[COMP1:.*]], #[[COMP2:.*]]>
83+
// CHECK-DAG: #[[COMP3:.+]] = #llvm.di_composite_type<{{.*}}, name = "expr_elements2"{{.*}}elements = #llvm.di_generic_subrange<count = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(16), DW_OP_deref]>, 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(32), DW_OP_deref]>>>
84+
#exp1 = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(16), DW_OP_deref]>
85+
#exp2 = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(24), DW_OP_deref]>
86+
#exp3 = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(32), DW_OP_deref]>
87+
#comp3 = #llvm.di_composite_type<tag = DW_TAG_array_type,
88+
name = "expr_elements2", baseType = #int0, elements =
89+
#llvm.di_generic_subrange<count = #exp1, lowerBound = #exp2, stride = #exp3>>
90+
91+
// CHECK-DAG: #[[SPTYPE0:.*]] = #llvm.di_subroutine_type<callingConvention = DW_CC_normal, types = #[[NULL]], #[[INT0]], #[[PTR0]], #[[PTR1]], #[[PTR2]], #[[COMP0:.*]], #[[COMP1:.*]], #[[COMP2:.*]], #[[COMP3:.*]]>
8492
#spType0 = #llvm.di_subroutine_type<
85-
callingConvention = DW_CC_normal, types = #null, #int0, #ptr0, #ptr1, #ptr2, #comp0, #comp1, #comp2
93+
callingConvention = DW_CC_normal, types = #null, #int0, #ptr0, #ptr1, #ptr2, #comp0, #comp1, #comp2, #comp3
8694
>
8795

8896
// CHECK-DAG: #[[SPTYPE1:.*]] = #llvm.di_subroutine_type<types = #[[INT1]], #[[INT1]]>

mlir/test/Target/LLVMIR/Import/debug-info.ll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ define void @derived_type() !dbg !3 {
169169
; CHECK-DAG: #[[COMP4:.+]] = #llvm.di_composite_type<{{.*}}, flags = Vector, elements = #llvm.di_subrange<lowerBound = 0 : i64, upperBound = 4 : i64, stride = 1 : i64>>
170170
; CHECK-DAG: #[[COMP5:.+]] = #llvm.di_composite_type<{{.*}}, name = "var_elements"{{.*}}elements = #llvm.di_subrange<count = #[[VAR]], stride = #[[GV]]>>
171171
; CHECK-DAG: #[[COMP6:.+]] = #llvm.di_composite_type<{{.*}}, name = "expr_elements"{{.*}}elements = #llvm.di_subrange<count = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(16), DW_OP_deref]>>>
172-
; CHECK-DAG: #llvm.di_subroutine_type<types = #[[COMP1]], #[[COMP2]], #[[COMP3]], #[[COMP4]], #[[COMP5]], #[[COMP6]]>
172+
; CHECK-DAG: #[[COMP7:.+]] = #llvm.di_composite_type<{{.*}}, name = "expr_elements2"{{.*}}elements = #llvm.di_generic_subrange<count = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(16), DW_OP_deref]>, 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(32), DW_OP_deref]>>>
173+
; CHECK-DAG: #llvm.di_subroutine_type<types = #[[COMP1]], #[[COMP2]], #[[COMP3]], #[[COMP4]], #[[COMP5]], #[[COMP6]], #[[COMP7]]>
173174

174175
@gv = external global i64
175176

@@ -184,7 +185,7 @@ define void @composite_type() !dbg !3 {
184185
!2 = !DIFile(filename: "debug-info.ll", directory: "/")
185186
!3 = distinct !DISubprogram(name: "composite_type", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, type: !4)
186187
!4 = !DISubroutineType(types: !5)
187-
!5 = !{!7, !8, !9, !10, !18, !22}
188+
!5 = !{!7, !8, !9, !10, !18, !22, !24}
188189
!6 = !DIBasicType(name: "int")
189190
!7 = !DICompositeType(tag: DW_TAG_array_type, name: "array1", line: 10, size: 128, align: 32, baseType: !6)
190191
!8 = !DICompositeType(tag: DW_TAG_array_type, name: "array2", file: !2, scope: !2, baseType: !6)
@@ -203,6 +204,12 @@ define void @composite_type() !dbg !3 {
203204
!21 = !{!19}
204205
!22 = !DICompositeType(tag: DW_TAG_array_type, name: "expr_elements", flags: DIFlagVector, elements: !21, baseType: !6)
205206
!23 = !DIGlobalVariable(name: "gv", scope: !1, file: !2, line: 3, type: !6, isLocal: false, isDefinition: false)
207+
!24 = !DICompositeType(tag: DW_TAG_array_type, name: "expr_elements2", elements: !29, baseType: !6)
208+
!25 = !DIGenericSubrange(count: !26, lowerBound: !27, stride: !28)
209+
!26 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 16, DW_OP_deref)
210+
!27 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 24, DW_OP_deref)
211+
!28 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 32, DW_OP_deref)
212+
!29 = !{!25}
206213

207214

208215
; // -----

mlir/test/Target/LLVMIR/llvmir-debug.mlir

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -591,35 +591,48 @@ llvm.func @fn_with_composite() {
591591

592592
// -----
593593

594-
// Test that Subrange works with expression and variables.
594+
// Test that Subrange/generic_subrange works with expression and variables.
595595

596596
#bt = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int">
597597
#file = #llvm.di_file<"debug-info.ll" in "/">
598598
#cu = #llvm.di_compile_unit<id = distinct[1]<>,
599599
sourceLanguage = DW_LANG_Fortran95, file = #file, isOptimized = false,
600600
emissionKind = Full>
601+
#exp1 = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(16),
602+
DW_OP_deref]>
601603
#comp_ty1 = #llvm.di_composite_type<tag = DW_TAG_array_type,
602604
name = "expr_elements", baseType = #bt, flags = Vector,
603-
elements = #llvm.di_subrange<count = #llvm.di_expression<
604-
[DW_OP_push_object_address, DW_OP_plus_uconst(16), DW_OP_deref]>>>
605-
#srty = #llvm.di_subroutine_type<types = #bt, #comp_ty1>
605+
elements = #llvm.di_subrange<count = #exp1>>
606+
#exp2 = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(24),
607+
DW_OP_deref]>
608+
#exp3 = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(32),
609+
DW_OP_deref]>
610+
#comp_ty2 = #llvm.di_composite_type<tag = DW_TAG_array_type,
611+
name = "expr_elements2", baseType = #bt, elements =
612+
#llvm.di_generic_subrange<count = #exp1, lowerBound = #exp2, stride = #exp3>>
613+
#srty = #llvm.di_subroutine_type<types = #bt, #comp_ty1, #comp_ty2>
606614
#sp = #llvm.di_subprogram<compileUnit = #cu, scope = #file, name = "subranges",
607615
file = #file, subprogramFlags = Definition, type = #srty>
608616
#lvar = #llvm.di_local_variable<scope = #sp, name = "size">
609617
#gv = #llvm.di_global_variable<scope = #cu, name = "gv", file = #file,
610618
line = 3, type = #bt>
611619
#gve = #llvm.di_global_variable_expression<var = #gv, expr = <>>
612-
#comp_ty2 = #llvm.di_composite_type<tag = DW_TAG_array_type,
620+
#comp_ty3 = #llvm.di_composite_type<tag = DW_TAG_array_type,
613621
name = "var_elements", baseType = #bt, flags = Vector,
614622
elements = #llvm.di_subrange<count = #lvar, stride = #gv>>
615-
#lvar2 = #llvm.di_local_variable<scope = #sp, name = "var", type = #comp_ty2>
623+
#comp_ty4 = #llvm.di_composite_type<tag = DW_TAG_array_type,
624+
name = "var_elements2", baseType = #bt, elements =
625+
#llvm.di_generic_subrange<count = #lvar, lowerBound = #gv, stride = #gv>>
626+
#lvar2 = #llvm.di_local_variable<scope = #sp, name = "var", type = #comp_ty3>
627+
#lvar3 = #llvm.di_local_variable<scope = #sp, name = "var1", type = #comp_ty4>
616628
#loc1 = loc("test.f90": 1:1)
617629
#loc2 = loc(fused<#sp>[#loc1])
618630

619631
llvm.mlir.global external @gv() {dbg_exprs = [#gve]} : i64
620632

621633
llvm.func @subranges(%arg: !llvm.ptr) {
622634
llvm.intr.dbg.declare #lvar2 = %arg : !llvm.ptr
635+
llvm.intr.dbg.declare #lvar3 = %arg : !llvm.ptr
623636
llvm.return
624637
} loc(#loc2)
625638

@@ -628,11 +641,19 @@ llvm.func @subranges(%arg: !llvm.ptr) {
628641
// CHECK: !DICompositeType(tag: DW_TAG_array_type, name: "expr_elements"{{.*}}elements: ![[ELEMENTS1:[0-9]+]])
629642
// CHECK: ![[ELEMENTS1]] = !{![[ELEMENT1:[0-9]+]]}
630643
// CHECK: ![[ELEMENT1]] = !DISubrange(count: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 16, DW_OP_deref))
644+
// CHECK: !DICompositeType(tag: DW_TAG_array_type, name: "expr_elements2"{{.*}}elements: ![[GSR_ELEMS:[0-9]+]])
645+
// CHECK: ![[GSR_ELEMS]] = !{![[GSR_ELEM:[0-9]+]]}
646+
// CHECK: ![[GSR_ELEM]] = !DIGenericSubrange(count: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 16, DW_OP_deref)
647+
// CHECK-SAME: lowerBound: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 24, DW_OP_deref)
648+
// CHECK-SAME: stride: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 32, DW_OP_deref)
631649

632650
// CHECK: !DICompositeType(tag: DW_TAG_array_type, name: "var_elements"{{.*}}elements: ![[ELEMENTS2:[0-9]+]])
633651
// CHECK: ![[ELEMENTS2]] = !{![[ELEMENT2:[0-9]+]]}
634-
// CHECK: ![[ELEMENT2]] = !DISubrange(count: ![[LV:[0-9]+]], stride: ![[GV:[0-9]+]])
652+
// CHECK: ![[ELEMENT2]] = !DISubrange(count: ![[LV:[0-9]+]], stride: ![[GV]])
635653
// CHECK: ![[LV]] = !DILocalVariable(name: "size"{{.*}})
654+
// CHECK: !DICompositeType(tag: DW_TAG_array_type, name: "var_elements2", baseType: !{{.*}}, elements: ![[GSR_ELEMS2:[0-9]+]])
655+
// CHECK: ![[GSR_ELEMS2]] = !{![[GSR_ELEM2:[0-9]+]]}
656+
// CHECK: ![[GSR_ELEM2]] = !DIGenericSubrange(count: ![[LV]], lowerBound: ![[GV]], stride: ![[GV]])
636657

637658
// -----
638659

0 commit comments

Comments
 (0)