Skip to content

Commit 1e16cc7

Browse files
committed
[mlir][debug] Add retainedNodes field in DISubprogramAttr.
As discussed in the comments, this commit adds retainedNodes field in the DISubprogramAttr. To remove the cyclic dependency, the scope field has been removed from DIImportedEntity as it can be inferred depending on the contained of the entities.
1 parent 9db38e2 commit 1e16cc7

File tree

11 files changed

+88
-66
lines changed

11 files changed

+88
-66
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,8 @@ MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDISubprogramAttrGet(
316316
MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
317317
MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
318318
MlirAttribute file, unsigned int line, unsigned int scopeLine,
319-
uint64_t subprogramFlags, MlirAttribute type);
319+
uint64_t subprogramFlags, MlirAttribute type, intptr_t nNodes,
320+
MlirAttribute const *nodes);
320321

321322
/// Gets the scope from this DISubprogramAttr.
322323
MLIR_CAPI_EXPORTED MlirAttribute
@@ -353,6 +354,12 @@ MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIModuleAttrGet(
353354
MlirAttribute name, MlirAttribute configMacros, MlirAttribute includePath,
354355
MlirAttribute apinotes, unsigned int line, bool isDecl);
355356

357+
/// Creates a LLVM DIImportedEntityAttr attribute.
358+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIImportedEntityAttrGet(
359+
MlirContext ctx, unsigned int tag, MlirAttribute entity, MlirAttribute file,
360+
unsigned int line, MlirAttribute name, intptr_t nNodes,
361+
MlirAttribute const *elements);
362+
356363
/// Gets the scope of this DIModuleAttr.
357364
MLIR_CAPI_EXPORTED MlirAttribute
358365
mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule);

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -565,19 +565,21 @@ def LLVM_DISubprogramAttr : LLVM_Attr<"DISubprogram", "di_subprogram",
565565
OptionalParameter<"unsigned">:$line,
566566
OptionalParameter<"unsigned">:$scopeLine,
567567
OptionalParameter<"DISubprogramFlags">:$subprogramFlags,
568-
OptionalParameter<"DISubroutineTypeAttr">:$type
568+
OptionalParameter<"DISubroutineTypeAttr">:$type,
569+
OptionalArrayRefParameter<"DINodeAttr">:$retainedNodes
569570
);
570571
let builders = [
571572
AttrBuilderWithInferredContext<(ins
572573
"DistinctAttr":$id, "DICompileUnitAttr":$compileUnit,
573574
"DIScopeAttr":$scope, "StringRef":$name, "StringRef":$linkageName,
574575
"DIFileAttr":$file, "unsigned":$line, "unsigned":$scopeLine,
575-
"DISubprogramFlags":$subprogramFlags, "DISubroutineTypeAttr":$type
576+
"DISubprogramFlags":$subprogramFlags, "DISubroutineTypeAttr":$type,
577+
"ArrayRef<DINodeAttr>":$retainedNodes
576578
), [{
577579
MLIRContext *ctx = file.getContext();
578580
return $_get(ctx, id, compileUnit, scope, StringAttr::get(ctx, name),
579581
StringAttr::get(ctx, linkageName), file, line,
580-
scopeLine, subprogramFlags, type);
582+
scopeLine, subprogramFlags, type, retainedNodes);
581583
}]>
582584
];
583585

@@ -627,8 +629,7 @@ def LLVM_DIImportedEntityAttr : LLVM_Attr<"DIImportedEntity", "di_imported_entit
627629
/*traits=*/[], "DINodeAttr"> {
628630
let parameters = (ins
629631
LLVM_DITagParameter:$tag,
630-
OptionalParameter<"DIScopeAttr">:$scope,
631-
OptionalParameter<"DINodeAttr">:$entity,
632+
"DINodeAttr":$entity,
632633
OptionalParameter<"DIFileAttr">:$file,
633634
OptionalParameter<"unsigned">:$line,
634635
OptionalParameter<"StringAttr">:$name,

mlir/lib/CAPI/Dialect/LLVM.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,14 +293,19 @@ MlirAttribute mlirLLVMDISubprogramAttrGet(
293293
MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
294294
MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
295295
MlirAttribute file, unsigned int line, unsigned int scopeLine,
296-
uint64_t subprogramFlags, MlirAttribute type) {
296+
uint64_t subprogramFlags, MlirAttribute type, intptr_t nNodes,
297+
MlirAttribute const *nodes) {
298+
SmallVector<Attribute> nodesStorage;
299+
nodesStorage.reserve(nNodes);
297300
return wrap(DISubprogramAttr::get(
298301
unwrap(ctx), cast<DistinctAttr>(unwrap(id)),
299302
cast<DICompileUnitAttr>(unwrap(compileUnit)),
300303
cast<DIScopeAttr>(unwrap(scope)), cast<StringAttr>(unwrap(name)),
301304
cast<StringAttr>(unwrap(linkageName)), cast<DIFileAttr>(unwrap(file)),
302305
line, scopeLine, DISubprogramFlags(subprogramFlags),
303-
cast<DISubroutineTypeAttr>(unwrap(type))));
306+
cast<DISubroutineTypeAttr>(unwrap(type)),
307+
llvm::map_to_vector(unwrapList(nNodes, nodes, nodesStorage),
308+
[](Attribute a) { return cast<DINodeAttr>(a); })));
304309
}
305310

306311
MlirAttribute mlirLLVMDISubprogramAttrGetScope(MlirAttribute diSubprogram) {
@@ -345,3 +350,16 @@ MlirAttribute mlirLLVMDIModuleAttrGet(MlirContext ctx, MlirAttribute file,
345350
MlirAttribute mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule) {
346351
return wrap(cast<DIModuleAttr>(unwrap(diModule)).getScope());
347352
}
353+
354+
MlirAttribute mlirLLVMDIImportedEntityAttrGet(
355+
MlirContext ctx, unsigned int tag, MlirAttribute entity, MlirAttribute file,
356+
unsigned int line, MlirAttribute name, intptr_t nElements,
357+
MlirAttribute const *elements) {
358+
SmallVector<Attribute> elementsStorage;
359+
elementsStorage.reserve(nElements);
360+
return wrap(DIImportedEntityAttr::get(
361+
unwrap(ctx), tag, cast<DINodeAttr>(unwrap(entity)),
362+
cast<DIFileAttr>(unwrap(file)), line, cast<StringAttr>(unwrap(name)),
363+
llvm::map_to_vector(unwrapList(nElements, elements, elementsStorage),
364+
[](Attribute a) { return cast<DINodeAttr>(a); })));
365+
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ void LLVMDialect::registerAttributes() {
5858
bool DINodeAttr::classof(Attribute attr) {
5959
return llvm::isa<DIBasicTypeAttr, DICompileUnitAttr, DICompositeTypeAttr,
6060
DIDerivedTypeAttr, DIFileAttr, DIGlobalVariableAttr,
61-
DILabelAttr, DILexicalBlockAttr, DILexicalBlockFileAttr,
62-
DILocalVariableAttr, DIModuleAttr, DINamespaceAttr,
63-
DINullTypeAttr, DIStringTypeAttr, DISubprogramAttr,
64-
DISubrangeAttr, DISubroutineTypeAttr>(attr);
61+
DIImportedEntityAttr, DILabelAttr, DILexicalBlockAttr,
62+
DILexicalBlockFileAttr, DILocalVariableAttr, DIModuleAttr,
63+
DINamespaceAttr, DINullTypeAttr, DIStringTypeAttr,
64+
DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr>(
65+
attr);
6566
}
6667

6768
//===----------------------------------------------------------------------===//

mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ static void addScopeToFunction(LLVM::LLVMFuncOp llvmFunc,
7979
context, id, compileUnitAttr, fileAttr, funcNameAttr, funcNameAttr,
8080
fileAttr,
8181
/*line=*/line,
82-
/*scopeline=*/col, subprogramFlags, subroutineTypeAttr);
82+
/*scopeline=*/col, subprogramFlags, subroutineTypeAttr, {});
8383
llvmFunc->setLoc(FusedLoc::get(context, {loc}, subprogramAttr));
8484
}
8585

mlir/lib/Target/LLVMIR/DebugImporter.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,10 @@ Location DebugImporter::translateFuncLocation(llvm::Function *func) {
4040
// Add a fused location to link the subprogram information.
4141
StringAttr funcName = StringAttr::get(context, subprogram->getName());
4242
StringAttr fileName = StringAttr::get(context, subprogram->getFilename());
43-
auto loc = FusedLocWith<DISubprogramAttr>::get(
43+
return FusedLocWith<DISubprogramAttr>::get(
4444
{NameLoc::get(funcName),
4545
FileLineColLoc::get(fileName, subprogram->getLine(), /*column=*/0)},
4646
translate(subprogram), context);
47-
if (subprogram->getRetainedNodes().empty())
48-
return loc;
49-
llvm::SmallVector<mlir::Attribute> entities;
50-
for (auto node : subprogram->getRetainedNodes())
51-
entities.push_back(translate(node));
52-
53-
auto entitiesAttr = mlir::ArrayAttr::get(context, entities);
54-
return FusedLocWith<mlir::ArrayAttr>::get(loc, entitiesAttr, context);
5547
}
5648

5749
//===----------------------------------------------------------------------===//
@@ -226,8 +218,8 @@ DebugImporter::translateImpl(llvm::DIImportedEntity *node) {
226218
}
227219

228220
return DIImportedEntityAttr::get(
229-
context, node->getTag(), translate(node->getScope()),
230-
translate(node->getEntity()), translate(node->getFile()), node->getLine(),
221+
context, node->getTag(), translate(node->getEntity()),
222+
translate(node->getFile()), node->getLine(),
231223
getStringAttrOrNull(node->getRawName()), elements);
232224
}
233225

@@ -246,11 +238,18 @@ DISubprogramAttr DebugImporter::translateImpl(llvm::DISubprogram *node) {
246238
DISubroutineTypeAttr type = translate(node->getType());
247239
if (node->getType() && !type)
248240
return nullptr;
241+
242+
SmallVector<DINodeAttr> retainedNodes;
243+
244+
for (auto node : node->getRetainedNodes())
245+
retainedNodes.push_back(translate(node));
246+
249247
return DISubprogramAttr::get(context, id, translate(node->getUnit()), scope,
250248
getStringAttrOrNull(node->getRawName()),
251249
getStringAttrOrNull(node->getRawLinkageName()),
252250
translate(node->getFile()), node->getLine(),
253-
node->getScopeLine(), *subprogramFlags, type);
251+
node->getScopeLine(), *subprogramFlags, type,
252+
retainedNodes);
254253
}
255254

256255
DISubrangeAttr DebugImporter::translateImpl(llvm::DISubrange *node) {

mlir/lib/Target/LLVMIR/DebugTranslation.cpp

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -67,25 +67,7 @@ void DebugTranslation::translate(LLVMFuncOp func, llvm::Function &llvmFunc) {
6767
func.getLoc()->findInstanceOf<FusedLocWith<LLVM::DISubprogramAttr>>();
6868
if (!spLoc)
6969
return;
70-
llvm::DISubprogram *sp = translate(spLoc.getMetadata());
71-
llvmFunc.setSubprogram(sp);
72-
73-
// Look for any entities that are imported in this function.
74-
auto entityLoc =
75-
func.getLoc()->findInstanceOf<FusedLocWith<mlir::ArrayAttr>>();
76-
if (!entityLoc)
77-
return;
78-
79-
SmallVector<llvm::Metadata *> imported;
80-
if (mlir::ArrayAttr arrayAttr = entityLoc.getMetadata()) {
81-
for (mlir::Attribute attr : arrayAttr.getValue()) {
82-
if (auto ent = dyn_cast_if_present<LLVM::DIImportedEntityAttr>(attr)) {
83-
llvm::DINode *node = translate(ent);
84-
imported.push_back(node);
85-
}
86-
}
87-
}
88-
sp->replaceRetainedNodes(llvm::MDTuple::get(llvmFunc.getContext(), imported));
70+
llvmFunc.setSubprogram(translate(spLoc.getMetadata()));
8971
}
9072

9173
//===----------------------------------------------------------------------===//
@@ -324,6 +306,18 @@ llvm::DISubprogram *DebugTranslation::translateImpl(DISubprogramAttr attr) {
324306
static_cast<llvm::DISubprogram::DISPFlags>(attr.getSubprogramFlags()),
325307
compileUnit);
326308

309+
SmallVector<llvm::Metadata *> retainedNodes;
310+
311+
for (auto nodeAttr : attr.getRetainedNodes()) {
312+
if (DIImportedEntityAttr importedAttr =
313+
dyn_cast<DIImportedEntityAttr>(nodeAttr)) {
314+
llvm::DINode *dn = translate(importedAttr, node);
315+
retainedNodes.push_back(dn);
316+
}
317+
}
318+
if (!retainedNodes.empty())
319+
node->replaceRetainedNodes(llvm::MDTuple::get(llvmCtx, retainedNodes));
320+
327321
if (attr.getId())
328322
distinctAttrToNode.try_emplace(attr.getId(), node);
329323
return node;
@@ -344,15 +338,15 @@ llvm::DINamespace *DebugTranslation::translateImpl(DINamespaceAttr attr) {
344338
attr.getExportSymbols());
345339
}
346340

347-
llvm::DIImportedEntity *
348-
DebugTranslation::translateImpl(DIImportedEntityAttr attr) {
341+
llvm::DIImportedEntity *DebugTranslation::translate(DIImportedEntityAttr attr,
342+
llvm::DIScope *scope) {
349343
SmallVector<llvm::Metadata *> elements;
350344
for (DINodeAttr member : attr.getElements())
351345
elements.push_back(translate(member));
352346

353347
return llvm::DIImportedEntity::get(
354-
llvmCtx, attr.getTag(), translate(attr.getScope()),
355-
translate(attr.getEntity()), translate(attr.getFile()), attr.getLine(),
348+
llvmCtx, attr.getTag(), scope, translate(attr.getEntity()),
349+
translate(attr.getFile()), attr.getLine(),
356350
getMDStringOrNull(attr.getName()), llvm::MDNode::get(llvmCtx, elements));
357351
}
358352

@@ -418,10 +412,10 @@ llvm::DINode *DebugTranslation::translate(DINodeAttr attr) {
418412
node = TypeSwitch<DINodeAttr, llvm::DINode *>(attr)
419413
.Case<DIBasicTypeAttr, DICompileUnitAttr, DICompositeTypeAttr,
420414
DIDerivedTypeAttr, DIFileAttr, DIGlobalVariableAttr,
421-
DIImportedEntityAttr, DILabelAttr, DILexicalBlockAttr,
422-
DILexicalBlockFileAttr, DILocalVariableAttr, DIModuleAttr,
423-
DINamespaceAttr, DINullTypeAttr, DIStringTypeAttr,
424-
DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr>(
415+
DILabelAttr, DILexicalBlockAttr, DILexicalBlockFileAttr,
416+
DILocalVariableAttr, DIModuleAttr, DINamespaceAttr,
417+
DINullTypeAttr, DIStringTypeAttr, DISubprogramAttr,
418+
DISubrangeAttr, DISubroutineTypeAttr>(
425419
[&](auto attr) { return translateImpl(attr); });
426420

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

mlir/lib/Target/LLVMIR/DebugTranslation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ class DebugTranslation {
8484
llvm::DIVariable *translateImpl(DIVariableAttr attr);
8585
llvm::DIModule *translateImpl(DIModuleAttr attr);
8686
llvm::DINamespace *translateImpl(DINamespaceAttr attr);
87-
llvm::DIImportedEntity *translateImpl(DIImportedEntityAttr attr);
8887
llvm::DIScope *translateImpl(DIScopeAttr attr);
8988
llvm::DISubprogram *translateImpl(DISubprogramAttr attr);
9089
llvm::DISubrange *translateImpl(DISubrangeAttr attr);
9190
llvm::DISubroutineType *translateImpl(DISubroutineTypeAttr attr);
9291
llvm::DIType *translateImpl(DITypeAttr attr);
92+
llvm::DIImportedEntity *translate(DIImportedEntityAttr attr, llvm::DIScope *);
9393

9494
/// Attributes that support self recursion need to implement an additional
9595
/// method to hook into `translateRecursive`.

mlir/test/CAPI/llvm.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,9 +312,15 @@ static void testDebugInfoAttributes(MlirContext ctx) {
312312
// CHECK: #llvm.di_subroutine_type<{{.*}}>
313313
mlirAttributeDump(subroutine_type);
314314

315-
MlirAttribute di_subprogram =
316-
mlirLLVMDISubprogramAttrGet(ctx, id, compile_unit, compile_unit, foo, bar,
317-
file, 1, 2, 0, subroutine_type);
315+
MlirAttribute di_imported_entity = mlirLLVMDIImportedEntityAttrGet(
316+
ctx, 0, di_module, file, 1, foo, 1, &local_var);
317+
318+
mlirAttributeDump(di_imported_entity);
319+
// CHECK: #llvm.di_imported_entity<{{.*}}>
320+
321+
MlirAttribute di_subprogram = mlirLLVMDISubprogramAttrGet(
322+
ctx, id, compile_unit, compile_unit, foo, bar, file, 1, 2, 0,
323+
subroutine_type, 1, &di_imported_entity);
318324
// CHECK: #llvm.di_subprogram<{{.*}}>
319325
mlirAttributeDump(di_subprogram);
320326

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -816,5 +816,4 @@ define void @imp_fn() !dbg !12 {
816816
!17 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !12, entity: !8, file: !3, line: 1, elements: !15)
817817

818818
; CHECK-DAG: #[[M:.+]] = #llvm.di_module<{{.*}}name = "mod1"{{.*}}>
819-
; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<{{.*}}name = "imp_fn"{{.*}}>
820-
; CHECK-DAG: llvm.di_imported_entity{{.*}}tag = DW_TAG_imported_module, scope = #[[SP]], entity = #[[M]]
819+
; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<{{.*}}name = "imp_fn"{{.*}}retainedNodes = #llvm.di_imported_entity<tag = DW_TAG_imported_module, entity = #[[M]]{{.*}}>>

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ llvm.func @fn_with_gl() {
371371

372372
llvm.func @imp_fn() {
373373
llvm.return
374-
} loc(#loc3)
374+
} loc(#loc2)
375375
#file = #llvm.di_file<"test.f90" in "">
376376
#SP_TY = #llvm.di_subroutine_type<callingConvention = DW_CC_program>
377377
#CU = #llvm.di_compile_unit<id = distinct[0]<>,
@@ -380,15 +380,12 @@ llvm.func @imp_fn() {
380380
#MOD = #llvm.di_module<file = #file, scope = #CU, name = "mod1">
381381
#MOD1 = #llvm.di_module<file = #file, scope = #CU, name = "mod2">
382382
#SP = #llvm.di_subprogram<id = distinct[1]<>, compileUnit = #CU, scope = #file,
383-
name = "imp_fn", file = #file, subprogramFlags = Definition, type = #SP_TY>
384-
#ENT1 = #llvm.di_imported_entity<tag = DW_TAG_imported_module, scope = #SP,
385-
entity = #MOD1, file = #file>
386-
#ENT2 = #llvm.di_imported_entity<tag = DW_TAG_imported_module, scope = #SP,
387-
entity = #MOD, file = #file>
383+
name = "imp_fn", file = #file, subprogramFlags = Definition, type = #SP_TY,
384+
retainedNodes = #llvm.di_imported_entity<tag = DW_TAG_imported_module,
385+
entity = #MOD1, file = #file, line = 1>, #llvm.di_imported_entity<tag
386+
= DW_TAG_imported_module, entity = #MOD, file = #file, line = 1>>
388387
#loc1 = loc("test.f90":12:14)
389388
#loc2 = loc(fused<#SP>[#loc1])
390-
#loc3 = loc(fused<[#ENT1, #ENT2]>[#loc2])
391-
392389

393390
// CHECK-DAG: ![[SP:[0-9]+]] = {{.*}}!DISubprogram(name: "imp_fn"{{.*}}retainedNodes: ![[NODES:[0-9]+]])
394391
// CHECK-DAG: ![[NODES]] = !{![[NODE2:[0-9]+]], ![[NODE1:[0-9]+]]}

0 commit comments

Comments
 (0)