Skip to content

Commit 4f320e6

Browse files
abidhgysit
andauthored
[MLIR] Translate DIStringType. (#94480)
This PR handle translation of DIStringType. Mostly mechanical changes to translate DIStringType to/from DIStringTypeAttr. The 'stringLength' field is 'DIVariable' in DIStringType. As there was no `DIVariableAttr` previously, it has been added to ease the translation. --------- Co-authored-by: Tobias Gysi <[email protected]>
1 parent ac40463 commit 4f320e6

File tree

13 files changed

+166
-13
lines changed

13 files changed

+166
-13
lines changed

mlir/include/mlir-c/Dialect/LLVM.h

+6
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,12 @@ MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIDerivedTypeAttrGet(
251251
MlirAttribute baseType, uint64_t sizeInBits, uint32_t alignInBits,
252252
uint64_t offsetInBits, int64_t dwarfAddressSpace, MlirAttribute extraData);
253253

254+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIStringTypeAttrGet(
255+
MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
256+
uint32_t alignInBits, MlirAttribute stringLength,
257+
MlirAttribute stringLengthExp, MlirAttribute stringLocationExp,
258+
MlirLLVMTypeEncoding encoding);
259+
254260
/// Constant to represent std::nullopt for dwarfAddressSpace to omit the field.
255261
#define MLIR_CAPI_DWARF_ADDRESS_SPACE_NULL -1
256262

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

+19
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,25 @@ def LLVM_DILabelAttr : LLVM_Attr<"DILabel", "di_label",
676676
let assemblyFormat = "`<` struct(params) `>`";
677677
}
678678

679+
//===----------------------------------------------------------------------===//
680+
// DIStringTypeAttr
681+
//===----------------------------------------------------------------------===//
682+
683+
def LLVM_DIStringTypeAttr : LLVM_Attr<"DIStringType", "di_string_type",
684+
/*traits=*/[], "DITypeAttr"> {
685+
let parameters = (ins
686+
LLVM_DITagParameter:$tag,
687+
"StringAttr":$name,
688+
OptionalParameter<"uint64_t">:$sizeInBits,
689+
OptionalParameter<"uint32_t">:$alignInBits,
690+
OptionalParameter<"DIVariableAttr">:$stringLength,
691+
OptionalParameter<"DIExpressionAttr">:$stringLengthExp,
692+
OptionalParameter<"DIExpressionAttr">:$stringLocationExp,
693+
LLVM_DIEncodingParameter:$encoding
694+
);
695+
let assemblyFormat = "`<` struct(params) `>`";
696+
}
697+
679698
//===----------------------------------------------------------------------===//
680699
// MemoryEffectsAttr
681700
//===----------------------------------------------------------------------===//

mlir/include/mlir/Dialect/LLVMIR/LLVMAttrs.h

+9
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ class DITypeAttr : public DINodeAttr {
6060
static bool classof(Attribute attr);
6161
};
6262

63+
/// This class represents a LLVM attribute that describes a debug info variable.
64+
class DIVariableAttr : public DINodeAttr {
65+
public:
66+
using DINodeAttr::DINodeAttr;
67+
68+
/// Support LLVM type casting.
69+
static bool classof(Attribute attr);
70+
};
71+
6372
/// Base class for LLVM attributes participating in the TBAA graph.
6473
class TBAANodeAttr : public Attribute {
6574
public:

mlir/lib/CAPI/Dialect/LLVM.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,18 @@ MlirAttribute mlirLLVMDIDerivedTypeAttrGet(
195195
addressSpace, cast<DINodeAttr>(unwrap(extraData))));
196196
}
197197

198+
MlirAttribute mlirLLVMDIStringTypeAttrGet(
199+
MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
200+
uint32_t alignInBits, MlirAttribute stringLength,
201+
MlirAttribute stringLengthExp, MlirAttribute stringLocationExp,
202+
MlirLLVMTypeEncoding encoding) {
203+
return wrap(DIStringTypeAttr::get(
204+
unwrap(ctx), tag, cast<StringAttr>(unwrap(name)), sizeInBits, alignInBits,
205+
cast<DIVariableAttr>(unwrap(stringLength)),
206+
cast<DIExpressionAttr>(unwrap(stringLengthExp)),
207+
cast<DIExpressionAttr>(unwrap(stringLocationExp)), encoding));
208+
}
209+
198210
MlirAttribute
199211
mlirLLVMDIDerivedTypeAttrGetBaseType(MlirAttribute diDerivedType) {
200212
return wrap(cast<DIDerivedTypeAttr>(unwrap(diDerivedType)).getBaseType());

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

+12-3
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ bool DINodeAttr::classof(Attribute attr) {
6060
DIDerivedTypeAttr, DIFileAttr, DIGlobalVariableAttr,
6161
DILabelAttr, DILexicalBlockAttr, DILexicalBlockFileAttr,
6262
DILocalVariableAttr, DIModuleAttr, DINamespaceAttr,
63-
DINullTypeAttr, DISubprogramAttr, DISubrangeAttr,
64-
DISubroutineTypeAttr>(attr);
63+
DINullTypeAttr, DIStringTypeAttr, DISubprogramAttr,
64+
DISubrangeAttr, DISubroutineTypeAttr>(attr);
6565
}
6666

6767
//===----------------------------------------------------------------------===//
@@ -82,13 +82,22 @@ bool DILocalScopeAttr::classof(Attribute attr) {
8282
DISubprogramAttr>(attr);
8383
}
8484

85+
//===----------------------------------------------------------------------===//
86+
// DIVariableAttr
87+
//===----------------------------------------------------------------------===//
88+
89+
bool DIVariableAttr::classof(Attribute attr) {
90+
return llvm::isa<DILocalVariableAttr, DIGlobalVariableAttr>(attr);
91+
}
92+
8593
//===----------------------------------------------------------------------===//
8694
// DITypeAttr
8795
//===----------------------------------------------------------------------===//
8896

8997
bool DITypeAttr::classof(Attribute attr) {
9098
return llvm::isa<DINullTypeAttr, DIBasicTypeAttr, DICompositeTypeAttr,
91-
DIDerivedTypeAttr, DISubroutineTypeAttr>(attr);
99+
DIDerivedTypeAttr, DIStringTypeAttr, DISubroutineTypeAttr>(
100+
attr);
92101
}
93102

94103
//===----------------------------------------------------------------------===//

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -3031,12 +3031,12 @@ struct LLVMOpAsmDialectInterface : public OpAsmDialectInterface {
30313031
DIDerivedTypeAttr, DIFileAttr, DIGlobalVariableAttr,
30323032
DIGlobalVariableExpressionAttr, DILabelAttr, DILexicalBlockAttr,
30333033
DILexicalBlockFileAttr, DILocalVariableAttr, DIModuleAttr,
3034-
DINamespaceAttr, DINullTypeAttr, DISubprogramAttr,
3035-
DISubroutineTypeAttr, LoopAnnotationAttr, LoopVectorizeAttr,
3036-
LoopInterleaveAttr, LoopUnrollAttr, LoopUnrollAndJamAttr,
3037-
LoopLICMAttr, LoopDistributeAttr, LoopPipelineAttr,
3038-
LoopPeeledAttr, LoopUnswitchAttr, TBAARootAttr, TBAATagAttr,
3039-
TBAATypeDescriptorAttr>([&](auto attr) {
3034+
DINamespaceAttr, DINullTypeAttr, DIStringTypeAttr,
3035+
DISubprogramAttr, DISubroutineTypeAttr, LoopAnnotationAttr,
3036+
LoopVectorizeAttr, LoopInterleaveAttr, LoopUnrollAttr,
3037+
LoopUnrollAndJamAttr, LoopLICMAttr, LoopDistributeAttr,
3038+
LoopPipelineAttr, LoopPeeledAttr, LoopUnswitchAttr, TBAARootAttr,
3039+
TBAATagAttr, TBAATypeDescriptorAttr>([&](auto attr) {
30403040
os << decltype(attr)::getMnemonic();
30413041
return AliasResult::OverridableAlias;
30423042
})

mlir/lib/Target/LLVMIR/DebugImporter.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,15 @@ DIDerivedTypeAttr DebugImporter::translateImpl(llvm::DIDerivedType *node) {
113113
node->getOffsetInBits(), node->getDWARFAddressSpace(), extraData);
114114
}
115115

116+
DIStringTypeAttr DebugImporter::translateImpl(llvm::DIStringType *node) {
117+
return DIStringTypeAttr::get(
118+
context, node->getTag(), getStringAttrOrNull(node->getRawName()),
119+
node->getSizeInBits(), node->getAlignInBits(),
120+
translate(node->getStringLength()),
121+
translateExpression(node->getStringLengthExp()),
122+
translateExpression(node->getStringLocationExp()), node->getEncoding());
123+
}
124+
116125
DIFileAttr DebugImporter::translateImpl(llvm::DIFile *node) {
117126
return DIFileAttr::get(context, node->getFilename(), node->getDirectory());
118127
}
@@ -174,6 +183,10 @@ DILocalVariableAttr DebugImporter::translateImpl(llvm::DILocalVariable *node) {
174183
node->getAlignInBits(), translate(node->getType()));
175184
}
176185

186+
DIVariableAttr DebugImporter::translateImpl(llvm::DIVariable *node) {
187+
return cast<DIVariableAttr>(translate(static_cast<llvm::DINode *>(node)));
188+
}
189+
177190
DIScopeAttr DebugImporter::translateImpl(llvm::DIScope *node) {
178191
return cast<DIScopeAttr>(translate(static_cast<llvm::DINode *>(node)));
179192
}
@@ -295,6 +308,8 @@ DINodeAttr DebugImporter::translate(llvm::DINode *node) {
295308
return translateImpl(casted);
296309
if (auto *casted = dyn_cast<llvm::DIDerivedType>(node))
297310
return translateImpl(casted);
311+
if (auto *casted = dyn_cast<llvm::DIStringType>(node))
312+
return translateImpl(casted);
298313
if (auto *casted = dyn_cast<llvm::DIFile>(node))
299314
return translateImpl(casted);
300315
if (auto *casted = dyn_cast<llvm::DIGlobalVariable>(node))

mlir/lib/Target/LLVMIR/DebugImporter.h

+2
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,14 @@ class DebugImporter {
6363
DICompileUnitAttr translateImpl(llvm::DICompileUnit *node);
6464
DICompositeTypeAttr translateImpl(llvm::DICompositeType *node);
6565
DIDerivedTypeAttr translateImpl(llvm::DIDerivedType *node);
66+
DIStringTypeAttr translateImpl(llvm::DIStringType *node);
6667
DIFileAttr translateImpl(llvm::DIFile *node);
6768
DILabelAttr translateImpl(llvm::DILabel *node);
6869
DILexicalBlockAttr translateImpl(llvm::DILexicalBlock *node);
6970
DILexicalBlockFileAttr translateImpl(llvm::DILexicalBlockFile *node);
7071
DIGlobalVariableAttr translateImpl(llvm::DIGlobalVariable *node);
7172
DILocalVariableAttr translateImpl(llvm::DILocalVariable *node);
73+
DIVariableAttr translateImpl(llvm::DIVariable *node);
7274
DIModuleAttr translateImpl(llvm::DIModule *node);
7375
DINamespaceAttr translateImpl(llvm::DINamespace *node);
7476
DIScopeAttr translateImpl(llvm::DIScope *node);

mlir/lib/Target/LLVMIR/DebugTranslation.cpp

+15-2
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,15 @@ llvm::DIDerivedType *DebugTranslation::translateImpl(DIDerivedTypeAttr attr) {
182182
/*Flags=*/llvm::DINode::FlagZero, translate(attr.getExtraData()));
183183
}
184184

185+
llvm::DIStringType *DebugTranslation::translateImpl(DIStringTypeAttr attr) {
186+
return llvm::DIStringType::get(
187+
llvmCtx, attr.getTag(), getMDStringOrNull(attr.getName()),
188+
translate(attr.getStringLength()),
189+
getExpressionAttrOrNull(attr.getStringLengthExp()),
190+
getExpressionAttrOrNull(attr.getStringLocationExp()),
191+
attr.getSizeInBits(), attr.getAlignInBits(), attr.getEncoding());
192+
}
193+
185194
llvm::DIFile *DebugTranslation::translateImpl(DIFileAttr attr) {
186195
return llvm::DIFile::get(llvmCtx, getMDStringOrNull(attr.getName()),
187196
getMDStringOrNull(attr.getDirectory()));
@@ -210,6 +219,10 @@ llvm::DILocalScope *DebugTranslation::translateImpl(DILocalScopeAttr attr) {
210219
return cast<llvm::DILocalScope>(translate(DINodeAttr(attr)));
211220
}
212221

222+
llvm::DIVariable *DebugTranslation::translateImpl(DIVariableAttr attr) {
223+
return cast<llvm::DIVariable>(translate(DINodeAttr(attr)));
224+
}
225+
213226
llvm::DILocalVariable *
214227
DebugTranslation::translateImpl(DILocalVariableAttr attr) {
215228
return llvm::DILocalVariable::get(
@@ -377,8 +390,8 @@ llvm::DINode *DebugTranslation::translate(DINodeAttr attr) {
377390
DIDerivedTypeAttr, DIFileAttr, DIGlobalVariableAttr,
378391
DILabelAttr, DILexicalBlockAttr, DILexicalBlockFileAttr,
379392
DILocalVariableAttr, DIModuleAttr, DINamespaceAttr,
380-
DINullTypeAttr, DISubprogramAttr, DISubrangeAttr,
381-
DISubroutineTypeAttr>(
393+
DINullTypeAttr, DIStringTypeAttr, DISubprogramAttr,
394+
DISubrangeAttr, DISubroutineTypeAttr>(
382395
[&](auto attr) { return translateImpl(attr); });
383396

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

mlir/lib/Target/LLVMIR/DebugTranslation.h

+2
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,15 @@ class DebugTranslation {
7373
llvm::DICompileUnit *translateImpl(DICompileUnitAttr attr);
7474
llvm::DICompositeType *translateImpl(DICompositeTypeAttr attr);
7575
llvm::DIDerivedType *translateImpl(DIDerivedTypeAttr attr);
76+
llvm::DIStringType *translateImpl(DIStringTypeAttr attr);
7677
llvm::DIFile *translateImpl(DIFileAttr attr);
7778
llvm::DILabel *translateImpl(DILabelAttr attr);
7879
llvm::DILexicalBlock *translateImpl(DILexicalBlockAttr attr);
7980
llvm::DILexicalBlockFile *translateImpl(DILexicalBlockFileAttr attr);
8081
llvm::DILocalScope *translateImpl(DILocalScopeAttr attr);
8182
llvm::DILocalVariable *translateImpl(DILocalVariableAttr attr);
8283
llvm::DIGlobalVariable *translateImpl(DIGlobalVariableAttr attr);
84+
llvm::DIVariable *translateImpl(DIVariableAttr attr);
8385
llvm::DIModule *translateImpl(DIModuleAttr attr);
8486
llvm::DINamespace *translateImpl(DINamespaceAttr attr);
8587
llvm::DIScope *translateImpl(DIScopeAttr attr);

mlir/test/CAPI/llvm.c

+9-2
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,9 @@ static void testDebugInfoAttributes(MlirContext ctx) {
293293
mlirLLVMDILexicalBlockFileAttrGet(ctx, compile_unit, file, 3));
294294

295295
// CHECK: #llvm.di_local_variable<{{.*}}>
296-
mlirAttributeDump(mlirLLVMDILocalVariableAttrGet(ctx, compile_unit, foo, file,
297-
1, 0, 8, di_type));
296+
MlirAttribute local_var = mlirLLVMDILocalVariableAttrGet(
297+
ctx, compile_unit, foo, file, 1, 0, 8, di_type);
298+
mlirAttributeDump(local_var);
298299
// CHECK: #llvm.di_derived_type<{{.*}}>
299300
// CHECK-NOT: dwarfAddressSpace
300301
mlirAttributeDump(mlirLLVMDIDerivedTypeAttrGet(
@@ -337,6 +338,12 @@ static void testDebugInfoAttributes(MlirContext ctx) {
337338
// CHECK: #llvm.di_expression<[(1)]>
338339
mlirAttributeDump(expression);
339340

341+
MlirAttribute string_type =
342+
mlirLLVMDIStringTypeAttrGet(ctx, 0x0, foo, 16, 0, local_var, expression,
343+
expression, MlirLLVMTypeEncodingSigned);
344+
// CHECK: #llvm.di_string_type<{{.*}}>
345+
mlirAttributeDump(string_type);
346+
340347
// CHECK: #llvm.di_composite_type<{{.*}}>
341348
mlirAttributeDump(mlirLLVMDICompositeTypeAttrGet(
342349
ctx, 0, id, foo, file, 1, compile_unit, di_type, 0, 64, 8, 1, &di_type,

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

+32
Original file line numberDiff line numberDiff line change
@@ -761,3 +761,35 @@ define void @class_field(ptr %arg1) !dbg !18 {
761761
!11 = !{!6, !7, !8} ; C -> A, B, C
762762

763763
!18 = distinct !DISubprogram(name: "SP", scope: !3, file: !2, spFlags: DISPFlagDefinition, unit: !1)
764+
765+
; // -----
766+
767+
; Verify the string type is handled correctly
768+
769+
define void @string_type(ptr %arg1) {
770+
call void @llvm.dbg.value(metadata ptr %arg1, metadata !4, metadata !DIExpression()), !dbg !10
771+
call void @llvm.dbg.value(metadata ptr %arg1, metadata !9, metadata !DIExpression()), !dbg !10
772+
ret void
773+
}
774+
775+
!llvm.dbg.cu = !{!1}
776+
!llvm.module.flags = !{!0}
777+
!0 = !{i32 2, !"Debug Info Version", i32 3}
778+
!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)
779+
!2 = !DIFile(filename: "debug-info.ll", directory: "/")
780+
!3 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
781+
!4 = !DILocalVariable(scope: !5, name: "string_size", file: !2, type: !3);
782+
!5 = distinct !DISubprogram(name: "test", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)
783+
!6 = !DIStringType(name: "character(*)", stringLength: !4, size: 32, align: 8, stringLengthExpression: !8, stringLocationExpression: !7)
784+
!7 = !DIExpression(DW_OP_push_object_address, DW_OP_deref)
785+
!8 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 8)
786+
!9 = !DILocalVariable(scope: !5, name: "str", file: !2, type: !6);
787+
!10 = !DILocation(line: 1, column: 2, scope: !5)
788+
789+
; CHECK: #[[VAR:.+]] = #llvm.di_local_variable<{{.*}}name = "string_size"{{.*}}>
790+
; CHECK: #llvm.di_string_type<tag = DW_TAG_string_type, name = "character(*)"
791+
; CHECK-SAME: sizeInBits = 32
792+
; CHECK-SAME: alignInBits = 8
793+
; CHECK-SAME: stringLength = #[[VAR]]
794+
; CHECK-SAME: stringLengthExp = <[DW_OP_push_object_address, DW_OP_plus_uconst(8)]>
795+
; CHECK-SAME: stringLocationExp = <[DW_OP_push_object_address, DW_OP_deref]>>

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

+27
Original file line numberDiff line numberDiff line change
@@ -564,3 +564,30 @@ llvm.func @subranges(%arg: !llvm.ptr) {
564564
// CHECK: ![[ELEMENTS2]] = !{![[ELEMENT2:[0-9]+]]}
565565
// CHECK: ![[ELEMENT2]] = !DISubrange(count: ![[LV:[0-9]+]], stride: ![[GV:[0-9]+]])
566566
// CHECK: ![[LV]] = !DILocalVariable(name: "size"{{.*}})
567+
568+
// -----
569+
570+
#bt = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int", sizeInBits = 32>
571+
#file = #llvm.di_file<"debug-info.ll" in "/">
572+
#cu = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C,
573+
file = #file, isOptimized = false, emissionKind = Full>
574+
#sp = #llvm.di_subprogram<compileUnit = #cu, scope = #file, name = "test",
575+
file = #file, subprogramFlags = Definition>
576+
#var = #llvm.di_local_variable<scope = #sp, name = "string_size", type = #bt>
577+
#ty = #llvm.di_string_type<tag = DW_TAG_string_type, name = "character(*)",
578+
sizeInBits = 32, alignInBits = 8, stringLength = #var,
579+
stringLengthExp = <[DW_OP_push_object_address, DW_OP_plus_uconst(8)]>,
580+
stringLocationExp = <[DW_OP_push_object_address, DW_OP_deref]>>
581+
#var1 = #llvm.di_local_variable<scope = #sp, name = "str", type = #ty>
582+
583+
llvm.func @string_ty(%arg0: !llvm.ptr) {
584+
llvm.intr.dbg.value #var1 = %arg0 : !llvm.ptr
585+
llvm.intr.dbg.value #var = %arg0 : !llvm.ptr
586+
llvm.return
587+
} loc(#loc2)
588+
589+
#loc1 = loc("test.f90":1:1)
590+
#loc2 = loc(fused<#sp>[#loc1])
591+
592+
// CHECK-DAG: !DIStringType(name: "character(*)", stringLength: ![[VAR:[0-9]+]], stringLengthExpression: !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 8), stringLocationExpression: !DIExpression(DW_OP_push_object_address, DW_OP_deref), size: 32, align: 8)
593+
// CHECK-DAG: ![[VAR]] = !DILocalVariable(name: "string_size"{{.*}})

0 commit comments

Comments
 (0)