Skip to content

Commit 50d837e

Browse files
authored
[MLIR] Improve translation of DISubrange. (#93689)
The DISubrange can take integer, dwarf expressions or variables. The current translation only handled integers. This PR adds handling of dwarf expressions and variables.
1 parent c631131 commit 50d837e

File tree

5 files changed

+103
-22
lines changed

5 files changed

+103
-22
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -625,10 +625,10 @@ def LLVM_DINamespaceAttr : LLVM_Attr<"DINamespace", "di_namespace",
625625
def LLVM_DISubrangeAttr : LLVM_Attr<"DISubrange", "di_subrange", /*traits=*/[],
626626
"DINodeAttr"> {
627627
let parameters = (ins
628-
OptionalParameter<"IntegerAttr">:$count,
629-
OptionalParameter<"IntegerAttr">:$lowerBound,
630-
OptionalParameter<"IntegerAttr">:$upperBound,
631-
OptionalParameter<"IntegerAttr">:$stride
628+
OptionalParameter<"::mlir::Attribute">:$count,
629+
OptionalParameter<"::mlir::Attribute">:$lowerBound,
630+
OptionalParameter<"::mlir::Attribute">:$upperBound,
631+
OptionalParameter<"::mlir::Attribute">:$stride
632632
);
633633
let assemblyFormat = "`<` struct(params) `>`";
634634
}

mlir/lib/Target/LLVMIR/DebugImporter.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,21 +217,32 @@ DISubprogramAttr DebugImporter::translateImpl(llvm::DISubprogram *node) {
217217
}
218218

219219
DISubrangeAttr DebugImporter::translateImpl(llvm::DISubrange *node) {
220-
auto getIntegerAttrOrNull = [&](llvm::DISubrange::BoundType data) {
221-
if (auto *constInt = llvm::dyn_cast_or_null<llvm::ConstantInt *>(data))
220+
auto getAttrOrNull = [&](llvm::DISubrange::BoundType data) -> Attribute {
221+
if (data.isNull())
222+
return nullptr;
223+
if (auto *constInt = dyn_cast<llvm::ConstantInt *>(data))
222224
return IntegerAttr::get(IntegerType::get(context, 64),
223225
constInt->getSExtValue());
224-
return IntegerAttr();
226+
if (auto *expr = dyn_cast<llvm::DIExpression *>(data))
227+
return translateExpression(expr);
228+
if (auto *var = dyn_cast<llvm::DIVariable *>(data)) {
229+
if (auto *local = dyn_cast<llvm::DILocalVariable>(var))
230+
return translate(local);
231+
if (auto *global = dyn_cast<llvm::DIGlobalVariable>(var))
232+
return translate(global);
233+
return nullptr;
234+
}
235+
return nullptr;
225236
};
226-
IntegerAttr count = getIntegerAttrOrNull(node->getCount());
227-
IntegerAttr upperBound = getIntegerAttrOrNull(node->getUpperBound());
237+
Attribute count = getAttrOrNull(node->getCount());
238+
Attribute upperBound = getAttrOrNull(node->getUpperBound());
228239
// Either count or the upper bound needs to be present. Otherwise, the
229240
// metadata is invalid. The conversion might fail due to unsupported DI nodes.
230241
if (!count && !upperBound)
231242
return {};
232-
return DISubrangeAttr::get(
233-
context, count, getIntegerAttrOrNull(node->getLowerBound()), upperBound,
234-
getIntegerAttrOrNull(node->getStride()));
243+
return DISubrangeAttr::get(context, count,
244+
getAttrOrNull(node->getLowerBound()), upperBound,
245+
getAttrOrNull(node->getStride()));
235246
}
236247

237248
DISubroutineTypeAttr

mlir/lib/Target/LLVMIR/DebugTranslation.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,27 @@ llvm::DINamespace *DebugTranslation::translateImpl(DINamespaceAttr attr) {
314314
}
315315

316316
llvm::DISubrange *DebugTranslation::translateImpl(DISubrangeAttr attr) {
317-
auto getMetadataOrNull = [&](IntegerAttr attr) -> llvm::Metadata * {
317+
auto getMetadataOrNull = [&](Attribute attr) -> llvm::Metadata * {
318318
if (!attr)
319319
return nullptr;
320-
return llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
321-
llvm::Type::getInt64Ty(llvmCtx), attr.getInt()));
320+
321+
llvm::Metadata *metadata =
322+
llvm::TypeSwitch<Attribute, llvm::Metadata *>(attr)
323+
.Case([&](IntegerAttr intAttr) {
324+
return llvm::ConstantAsMetadata::get(llvm::ConstantInt::getSigned(
325+
llvm::Type::getInt64Ty(llvmCtx), intAttr.getInt()));
326+
})
327+
.Case([&](LLVM::DIExpressionAttr expr) {
328+
return translateExpression(expr);
329+
})
330+
.Case([&](LLVM::DILocalVariableAttr local) {
331+
return translate(local);
332+
})
333+
.Case<>([&](LLVM::DIGlobalVariableAttr global) {
334+
return translate(global);
335+
})
336+
.Default([&](Attribute attr) { return nullptr; });
337+
return metadata;
322338
};
323339
return llvm::DISubrange::get(llvmCtx, getMetadataOrNull(attr.getCount()),
324340
getMetadataOrNull(attr.getLowerBound()),

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,17 @@ define void @derived_type() !dbg !3 {
161161

162162
; CHECK-DAG: #[[INT:.+]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int">
163163
; CHECK-DAG: #[[FILE:.+]] = #llvm.di_file<"debug-info.ll" in "/">
164+
; CHECK-DAG: #[[VAR:.+]] = #llvm.di_local_variable<{{.*}}name = "size">
165+
; CHECK-DAG: #[[GV:.+]] = #llvm.di_global_variable<{{.*}}name = "gv"{{.*}}>
164166
; CHECK-DAG: #[[COMP1:.+]] = #llvm.di_composite_type<tag = DW_TAG_array_type, name = "array1", line = 10, baseType = #[[INT]], sizeInBits = 128, alignInBits = 32>
165167
; CHECK-DAG: #[[COMP2:.+]] = #llvm.di_composite_type<{{.*}}, file = #[[FILE]], scope = #[[FILE]], baseType = #[[INT]]>
166168
; CHECK-DAG: #[[COMP3:.+]] = #llvm.di_composite_type<{{.*}}, flags = Vector, elements = #llvm.di_subrange<count = 4 : i64>>
167169
; CHECK-DAG: #[[COMP4:.+]] = #llvm.di_composite_type<{{.*}}, flags = Vector, elements = #llvm.di_subrange<lowerBound = 0 : i64, upperBound = 4 : i64, stride = 1 : i64>>
168-
; CHECK-DAG: #[[COMP5:.+]] = #llvm.di_composite_type<{{.*}}, flags = Vector>
169-
; CHECK-DAG: #llvm.di_subroutine_type<types = #[[COMP1]], #[[COMP2]], #[[COMP3]], #[[COMP4]], #[[COMP5]]>
170+
; CHECK-DAG: #[[COMP5:.+]] = #llvm.di_composite_type<{{.*}}, name = "var_elements"{{.*}}elements = #llvm.di_subrange<count = #[[VAR]], stride = #[[GV]]>>
171+
; 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]]>
173+
174+
@gv = external global i64
170175

171176
define void @composite_type() !dbg !3 {
172177
ret void
@@ -179,7 +184,7 @@ define void @composite_type() !dbg !3 {
179184
!2 = !DIFile(filename: "debug-info.ll", directory: "/")
180185
!3 = distinct !DISubprogram(name: "composite_type", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, type: !4)
181186
!4 = !DISubroutineType(types: !5)
182-
!5 = !{!7, !8, !9, !10, !18}
187+
!5 = !{!7, !8, !9, !10, !18, !22}
183188
!6 = !DIBasicType(name: "int")
184189
!7 = !DICompositeType(tag: DW_TAG_array_type, name: "array1", line: 10, size: 128, align: 32, baseType: !6)
185190
!8 = !DICompositeType(tag: DW_TAG_array_type, name: "array2", file: !2, scope: !2, baseType: !6)
@@ -189,12 +194,16 @@ define void @composite_type() !dbg !3 {
189194
!12 = !DISubrange(lowerBound: 0, upperBound: 4, stride: 1)
190195
!13 = !{!11}
191196
!14 = !{!12}
192-
193-
; Verifies that unsupported subrange nodes are skipped.
194-
!15 = !DISubrange(count: !16)
197+
!15 = !DISubrange(count: !16, stride: !23)
195198
!16 = !DILocalVariable(scope: !3, name: "size")
196199
!17 = !{!15}
197-
!18 = !DICompositeType(tag: DW_TAG_array_type, name: "unsupported_elements", flags: DIFlagVector, elements: !17, baseType: !6)
200+
!18 = !DICompositeType(tag: DW_TAG_array_type, name: "var_elements", flags: DIFlagVector, elements: !17, baseType: !6)
201+
!19 = !DISubrange(count: !20)
202+
!20 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 16, DW_OP_deref)
203+
!21 = !{!19}
204+
!22 = !DICompositeType(tag: DW_TAG_array_type, name: "expr_elements", flags: DIFlagVector, elements: !21, baseType: !6)
205+
!23 = !DIGlobalVariable(name: "gv", scope: !1, file: !2, line: 3, type: !6, isLocal: false, isDefinition: false)
206+
198207

199208
; // -----
200209

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,3 +519,48 @@ llvm.func @fn_with_composite() {
519519
// CHECK-SAME: associated: !DIExpression(DW_OP_lit0, DW_OP_eq)
520520
// CHECK-SAME: allocated: !DIExpression(DW_OP_lit0, DW_OP_ne)
521521
// CHECK-SAME: rank: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 16, DW_OP_deref)
522+
523+
// -----
524+
525+
// Test that Subrange works with expression and variables.
526+
527+
#bt = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int">
528+
#file = #llvm.di_file<"debug-info.ll" in "/">
529+
#cu = #llvm.di_compile_unit<id = distinct[1]<>,
530+
sourceLanguage = DW_LANG_Fortran95, file = #file, isOptimized = false,
531+
emissionKind = Full>
532+
#comp_ty1 = #llvm.di_composite_type<tag = DW_TAG_array_type,
533+
name = "expr_elements", baseType = #bt, flags = Vector,
534+
elements = #llvm.di_subrange<count = #llvm.di_expression<
535+
[DW_OP_push_object_address, DW_OP_plus_uconst(16), DW_OP_deref]>>>
536+
#srty = #llvm.di_subroutine_type<types = #bt, #comp_ty1>
537+
#sp = #llvm.di_subprogram<compileUnit = #cu, scope = #file, name = "subranges",
538+
file = #file, subprogramFlags = Definition, type = #srty>
539+
#lvar = #llvm.di_local_variable<scope = #sp, name = "size">
540+
#gv = #llvm.di_global_variable<scope = #cu, name = "gv", file = #file,
541+
line = 3, type = #bt>
542+
#gve = #llvm.di_global_variable_expression<var = #gv, expr = <>>
543+
#comp_ty2 = #llvm.di_composite_type<tag = DW_TAG_array_type,
544+
name = "var_elements", baseType = #bt, flags = Vector,
545+
elements = #llvm.di_subrange<count = #lvar, stride = #gv>>
546+
#lvar2 = #llvm.di_local_variable<scope = #sp, name = "var", type = #comp_ty2>
547+
#loc1 = loc("test.f90": 1:1)
548+
#loc2 = loc(fused<#sp>[#loc1])
549+
550+
llvm.mlir.global external @gv() {dbg_expr = #gve} : i64
551+
552+
llvm.func @subranges(%arg: !llvm.ptr) {
553+
llvm.intr.dbg.declare #lvar2 = %arg : !llvm.ptr
554+
llvm.return
555+
} loc(#loc2)
556+
557+
// CHECK-LABEL: define void @subranges
558+
// CHECK: ![[GV:[0-9]+]] = {{.*}}!DIGlobalVariable(name: "gv"{{.*}})
559+
// CHECK: !DICompositeType(tag: DW_TAG_array_type, name: "expr_elements"{{.*}}elements: ![[ELEMENTS1:[0-9]+]])
560+
// CHECK: ![[ELEMENTS1]] = !{![[ELEMENT1:[0-9]+]]}
561+
// CHECK: ![[ELEMENT1]] = !DISubrange(count: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 16, DW_OP_deref))
562+
563+
// CHECK: !DICompositeType(tag: DW_TAG_array_type, name: "var_elements"{{.*}}elements: ![[ELEMENTS2:[0-9]+]])
564+
// CHECK: ![[ELEMENTS2]] = !{![[ELEMENT2:[0-9]+]]}
565+
// CHECK: ![[ELEMENT2]] = !DISubrange(count: ![[LV:[0-9]+]], stride: ![[GV:[0-9]+]])
566+
// CHECK: ![[LV]] = !DILocalVariable(name: "size"{{.*}})

0 commit comments

Comments
 (0)