Skip to content
This repository was archived by the owner on Oct 11, 2025. It is now read-only.

Commit 7a6eb9d

Browse files
authored
[MLIR][LLVM] Make DISubprogramAttr cyclic (#106571)
This commit implements LLVM_DIRecursiveTypeAttrInterface for the DISubprogramAttr to ensure cyclic subprograms can be imported properly. In the process multiple shortcuts around the recently introduced DIImportedEntityAttr can be removed.
1 parent 2fd9e83 commit 7a6eb9d

File tree

2 files changed

+41
-24
lines changed

2 files changed

+41
-24
lines changed

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -234,10 +234,13 @@ MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIBasicTypeAttrGet(
234234
MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
235235
MlirLLVMTypeEncoding encoding);
236236

237+
/// Creates a self-referencing LLVM DICompositeType attribute.
238+
MlirAttribute mlirLLVMDICompositeTypeAttrGetRecSelf(MlirAttribute recId);
239+
237240
/// Creates a LLVM DICompositeType attribute.
238241
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompositeTypeAttrGet(
239-
MlirContext ctx, unsigned int tag, MlirAttribute recId, MlirAttribute name,
240-
MlirAttribute file, uint32_t line, MlirAttribute scope,
242+
MlirContext ctx, MlirAttribute recId, bool isRecSelf, unsigned int tag,
243+
MlirAttribute name, MlirAttribute file, uint32_t line, MlirAttribute scope,
241244
MlirAttribute baseType, int64_t flags, uint64_t sizeInBits,
242245
uint64_t alignInBits, intptr_t nElements, MlirAttribute const *elements,
243246
MlirAttribute dataLocation, MlirAttribute rank, MlirAttribute allocated,
@@ -311,13 +314,16 @@ MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILocalVariableAttrGet(
311314
MlirAttribute diFile, unsigned int line, unsigned int arg,
312315
unsigned int alignInBits, MlirAttribute diType, int64_t flags);
313316

317+
/// Creates a self-referencing LLVM DISubprogramAttr attribute.
318+
MlirAttribute mlirLLVMDISubprogramAttrGetRecSelf(MlirAttribute recId);
319+
314320
/// Creates a LLVM DISubprogramAttr attribute.
315321
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDISubprogramAttrGet(
316-
MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
317-
MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
318-
MlirAttribute file, unsigned int line, unsigned int scopeLine,
319-
uint64_t subprogramFlags, MlirAttribute type, intptr_t nRetainedNodes,
320-
MlirAttribute const *retainedNodes);
322+
MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id,
323+
MlirAttribute compileUnit, MlirAttribute scope, MlirAttribute name,
324+
MlirAttribute linkageName, MlirAttribute file, unsigned int line,
325+
unsigned int scopeLine, uint64_t subprogramFlags, MlirAttribute type,
326+
intptr_t nRetainedNodes, MlirAttribute const *retainedNodes);
321327

322328
/// Gets the scope from this DISubprogramAttr.
323329
MLIR_CAPI_EXPORTED MlirAttribute
@@ -356,9 +362,9 @@ MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIModuleAttrGet(
356362

357363
/// Creates a LLVM DIImportedEntityAttr attribute.
358364
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIImportedEntityAttrGet(
359-
MlirContext ctx, unsigned int tag, MlirAttribute entity, MlirAttribute file,
360-
unsigned int line, MlirAttribute name, intptr_t nElements,
361-
MlirAttribute const *elements);
365+
MlirContext ctx, unsigned int tag, MlirAttribute scope,
366+
MlirAttribute entity, MlirAttribute file, unsigned int line,
367+
MlirAttribute name, intptr_t nElements, MlirAttribute const *elements);
362368

363369
/// Gets the scope of this DIModuleAttr.
364370
MLIR_CAPI_EXPORTED MlirAttribute

mlir/lib/CAPI/Dialect/LLVM.cpp

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,14 @@ MlirAttribute mlirLLVMDIBasicTypeAttrGet(MlirContext ctx, unsigned int tag,
159159
unwrap(ctx), tag, cast<StringAttr>(unwrap(name)), sizeInBits, encoding));
160160
}
161161

162+
MlirAttribute mlirLLVMDICompositeTypeAttrGetRecSelf(MlirAttribute recId) {
163+
return wrap(
164+
DICompositeTypeAttr::getRecSelf(cast<DistinctAttr>(unwrap(recId))));
165+
}
166+
162167
MlirAttribute mlirLLVMDICompositeTypeAttrGet(
163-
MlirContext ctx, unsigned int tag, MlirAttribute recId, MlirAttribute name,
164-
MlirAttribute file, uint32_t line, MlirAttribute scope,
168+
MlirContext ctx, MlirAttribute recId, bool isRecSelf, unsigned int tag,
169+
MlirAttribute name, MlirAttribute file, uint32_t line, MlirAttribute scope,
165170
MlirAttribute baseType, int64_t flags, uint64_t sizeInBits,
166171
uint64_t alignInBits, intptr_t nElements, MlirAttribute const *elements,
167172
MlirAttribute dataLocation, MlirAttribute rank, MlirAttribute allocated,
@@ -170,7 +175,7 @@ MlirAttribute mlirLLVMDICompositeTypeAttrGet(
170175
elementsStorage.reserve(nElements);
171176

172177
return wrap(DICompositeTypeAttr::get(
173-
unwrap(ctx), tag, cast<DistinctAttr>(unwrap(recId)),
178+
unwrap(ctx), cast<DistinctAttr>(unwrap(recId)), isRecSelf, tag,
174179
cast<StringAttr>(unwrap(name)), cast<DIFileAttr>(unwrap(file)), line,
175180
cast<DIScopeAttr>(unwrap(scope)), cast<DITypeAttr>(unwrap(baseType)),
176181
DIFlags(flags), sizeInBits, alignInBits,
@@ -289,16 +294,21 @@ MlirAttribute mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx,
289294
[](Attribute a) { return cast<DITypeAttr>(a); })));
290295
}
291296

297+
MlirAttribute mlirLLVMDISubprogramAttrGetRecSelf(MlirAttribute recId) {
298+
return wrap(DISubprogramAttr::getRecSelf(cast<DistinctAttr>(unwrap(recId))));
299+
}
300+
292301
MlirAttribute mlirLLVMDISubprogramAttrGet(
293-
MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
294-
MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
295-
MlirAttribute file, unsigned int line, unsigned int scopeLine,
296-
uint64_t subprogramFlags, MlirAttribute type, intptr_t nRetainedNodes,
297-
MlirAttribute const *retainedNodes) {
302+
MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id,
303+
MlirAttribute compileUnit, MlirAttribute scope, MlirAttribute name,
304+
MlirAttribute linkageName, MlirAttribute file, unsigned int line,
305+
unsigned int scopeLine, uint64_t subprogramFlags, MlirAttribute type,
306+
intptr_t nRetainedNodes, MlirAttribute const *retainedNodes) {
298307
SmallVector<Attribute> nodesStorage;
299308
nodesStorage.reserve(nRetainedNodes);
300309
return wrap(DISubprogramAttr::get(
301-
unwrap(ctx), cast<DistinctAttr>(unwrap(id)),
310+
unwrap(ctx), cast<DistinctAttr>(unwrap(recId)), isRecSelf,
311+
cast<DistinctAttr>(unwrap(id)),
302312
cast<DICompileUnitAttr>(unwrap(compileUnit)),
303313
cast<DIScopeAttr>(unwrap(scope)), cast<StringAttr>(unwrap(name)),
304314
cast<StringAttr>(unwrap(linkageName)), cast<DIFileAttr>(unwrap(file)),
@@ -353,14 +363,15 @@ MlirAttribute mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule) {
353363
}
354364

355365
MlirAttribute mlirLLVMDIImportedEntityAttrGet(
356-
MlirContext ctx, unsigned int tag, MlirAttribute entity, MlirAttribute file,
357-
unsigned int line, MlirAttribute name, intptr_t nElements,
358-
MlirAttribute const *elements) {
366+
MlirContext ctx, unsigned int tag, MlirAttribute scope,
367+
MlirAttribute entity, MlirAttribute file, unsigned int line,
368+
MlirAttribute name, intptr_t nElements, MlirAttribute const *elements) {
359369
SmallVector<Attribute> elementsStorage;
360370
elementsStorage.reserve(nElements);
361371
return wrap(DIImportedEntityAttr::get(
362-
unwrap(ctx), tag, cast<DINodeAttr>(unwrap(entity)),
363-
cast<DIFileAttr>(unwrap(file)), line, cast<StringAttr>(unwrap(name)),
372+
unwrap(ctx), tag, cast<DIScopeAttr>(unwrap(scope)),
373+
cast<DINodeAttr>(unwrap(entity)), cast<DIFileAttr>(unwrap(file)), line,
374+
cast<StringAttr>(unwrap(name)),
364375
llvm::map_to_vector(unwrapList(nElements, elements, elementsStorage),
365376
[](Attribute a) { return cast<DINodeAttr>(a); })));
366377
}

0 commit comments

Comments
 (0)