Skip to content

Commit

Permalink
[mlir][debuginfo] Add support for subroutine annotations
Browse files Browse the repository at this point in the history
LLVM already supports `DW_TAG_LLVM_annotation` entries for subroutines, but this hasn't been surfaced to the LLVM dialect.
I'm doing the minimal amount of work to support string-based annotations, which is useful for attaching metadata to
functions, which is useful for debuggers to offer features beyond basic DWARF.
As LLVM already supports this, this patch is not controversial.
  • Loading branch information
walter-erquinigo committed Oct 3, 2024
1 parent e7a43ca commit 9c3c671
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 15 deletions.
22 changes: 19 additions & 3 deletions mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
Original file line number Diff line number Diff line change
Expand Up @@ -586,19 +586,20 @@ def LLVM_DISubprogramAttr : LLVM_Attr<"DISubprogram", "di_subprogram",
OptionalParameter<"unsigned">:$scopeLine,
OptionalParameter<"DISubprogramFlags">:$subprogramFlags,
OptionalParameter<"DISubroutineTypeAttr">:$type,
OptionalArrayRefParameter<"DINodeAttr">:$retainedNodes
OptionalArrayRefParameter<"DINodeAttr">:$retainedNodes,
OptionalArrayRefParameter<"DINodeAttr">:$annotations
);
let builders = [
AttrBuilder<(ins
"DistinctAttr":$id, "DICompileUnitAttr":$compileUnit,
"DIScopeAttr":$scope, "StringAttr":$name, "StringAttr":$linkageName,
"DIFileAttr":$file, "unsigned":$line, "unsigned":$scopeLine,
"DISubprogramFlags":$subprogramFlags, "DISubroutineTypeAttr":$type,
"ArrayRef<DINodeAttr>":$retainedNodes
"ArrayRef<DINodeAttr>":$retainedNodes, "ArrayRef<DINodeAttr>":$annotations
), [{
return $_get($_ctxt, /*recId=*/nullptr, /*isRecSelf=*/false, id, compileUnit,
scope, name, linkageName, file, line, scopeLine,
subprogramFlags, type, retainedNodes);
subprogramFlags, type, retainedNodes, annotations);
}]>
];
let assemblyFormat = "`<` struct(params) `>`";
Expand Down Expand Up @@ -670,6 +671,21 @@ def LLVM_DIImportedEntityAttr : LLVM_Attr<"DIImportedEntity", "di_imported_entit
let assemblyFormat = "`<` struct(params) `>`";
}

//===----------------------------------------------------------------------===//
// DIStringAnnotationAttr
//===----------------------------------------------------------------------===//

def LLVM_DIStringAnnotationAttr : LLVM_Attr<"DIStringAnnotation",
"di_string_annotation",
/*traits=*/[], "DINodeAttr"> {
let parameters = (ins
"StringAttr":$name,
"StringAttr":$value
);

let assemblyFormat = "`<` struct(params) `>`";
}

//===----------------------------------------------------------------------===//
// DISubrangeAttr
//===----------------------------------------------------------------------===//
Expand Down
17 changes: 9 additions & 8 deletions mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ bool DINodeAttr::classof(Attribute attr) {
DIDerivedTypeAttr, DIFileAttr, DIGlobalVariableAttr,
DIImportedEntityAttr, DILabelAttr, DILexicalBlockAttr,
DILexicalBlockFileAttr, DILocalVariableAttr, DIModuleAttr,
DINamespaceAttr, DINullTypeAttr, DIStringTypeAttr,
DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr>(
attr);
DINamespaceAttr, DINullTypeAttr, DIStringAnnotationAttr,
DIStringTypeAttr, DISubprogramAttr, DISubrangeAttr,
DISubroutineTypeAttr>(attr);
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -221,15 +221,16 @@ DICompositeTypeAttr::getRecSelf(DistinctAttr recId) {
//===----------------------------------------------------------------------===//

DIRecursiveTypeAttrInterface DISubprogramAttr::withRecId(DistinctAttr recId) {
return DISubprogramAttr::get(
getContext(), recId, getIsRecSelf(), getId(), getCompileUnit(),
getScope(), getName(), getLinkageName(), getFile(), getLine(),
getScopeLine(), getSubprogramFlags(), getType(), getRetainedNodes());
return DISubprogramAttr::get(getContext(), recId, getIsRecSelf(), getId(),
getCompileUnit(), getScope(), getName(),
getLinkageName(), getFile(), getLine(),
getScopeLine(), getSubprogramFlags(), getType(),
getRetainedNodes(), getAnnotations());
}

DIRecursiveTypeAttrInterface DISubprogramAttr::getRecSelf(DistinctAttr recId) {
return DISubprogramAttr::get(recId.getContext(), recId, /*isRecSelf=*/true,
{}, {}, {}, {}, {}, 0, 0, {}, {}, {}, {});
{}, {}, {}, {}, {}, 0, 0, {}, {}, {}, {}, {});
}

//===----------------------------------------------------------------------===//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ static void addScopeToFunction(LLVM::LLVMFuncOp llvmFunc,
auto subprogramAttr = LLVM::DISubprogramAttr::get(
context, id, compileUnitAttr, fileAttr, funcName, funcName, fileAttr,
/*line=*/line, /*scopeline=*/col, subprogramFlags, subroutineTypeAttr,
/*retainedNodes=*/{});
/*retainedNodes=*/{}, /*annotations=*/{});
llvmFunc->setLoc(FusedLoc::get(context, {loc}, subprogramAttr));
}

Expand Down
25 changes: 22 additions & 3 deletions mlir/lib/Target/LLVMIR/DebugTranslation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,13 @@ DebugTranslation::getMDTupleOrNull(ArrayRef<DINodeAttr> elements) {
return nullptr;
SmallVector<llvm::Metadata *> llvmElements = llvm::to_vector(
llvm::map_range(elements, [&](DINodeAttr attr) -> llvm::Metadata * {
if (DIStringAnnotationAttr annAttr =
dyn_cast<DIStringAnnotationAttr>(attr)) {
llvm::Metadata *ops[2] = {
llvm::MDString::get(llvmCtx, annAttr.getName()),
llvm::MDString::get(llvmCtx, annAttr.getValue())};
return llvm::MDNode::get(llvmCtx, ops);
}
return translate(attr);
}));
return llvm::MDNode::get(llvmCtx, llvmElements);
Expand Down Expand Up @@ -332,7 +339,8 @@ llvm::DISubprogram *DebugTranslation::translateImpl(DISubprogramAttr attr) {
/*ThisAdjustment=*/0, llvm::DINode::FlagZero,
static_cast<llvm::DISubprogram::DISPFlags>(attr.getSubprogramFlags()),
compileUnit, /*TemplateParams=*/nullptr, /*Declaration=*/nullptr,
getMDTupleOrNull(attr.getRetainedNodes()));
getMDTupleOrNull(attr.getRetainedNodes()), nullptr,
getMDTupleOrNull(attr.getAnnotations()));
if (attr.getId())
distinctAttrToNode.try_emplace(attr.getId(), node);
return node;
Expand Down Expand Up @@ -361,6 +369,16 @@ DebugTranslation::translateImpl(DIImportedEntityAttr attr) {
getMDStringOrNull(attr.getName()), getMDTupleOrNull(attr.getElements()));
}

/*
llvm::DINodeArray *
DebugTranslation::translateImpl(DIStringAnnotationAttr attr) {
llvm::DINodeArray arr;
arr->push_back(llvm::MDString::get(llvmCtx, attr.getName()));
arr->push_back(llvm::MDString::get(llvmCtx, attr.getValue()));
return arr;
}
*/

llvm::DISubrange *DebugTranslation::translateImpl(DISubrangeAttr attr) {
auto getMetadataOrNull = [&](Attribute attr) -> llvm::Metadata * {
if (!attr)
Expand Down Expand Up @@ -426,8 +444,9 @@ llvm::DINode *DebugTranslation::translate(DINodeAttr attr) {
DIImportedEntityAttr, DILabelAttr, DILexicalBlockAttr,
DILexicalBlockFileAttr, DILocalVariableAttr, DIModuleAttr,
DINamespaceAttr, DINullTypeAttr, DIStringTypeAttr,
DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr>(
[&](auto attr) { return translateImpl(attr); });
DISubprogramAttr, DISubrangeAttr, DISubroutineTypeAttr
// DIStringAnnotationAttr
>([&](auto attr) { return translateImpl(attr); });

if (node && !node->isTemporary())
attrToNode.insert({attr, node});
Expand Down

0 comments on commit 9c3c671

Please sign in to comment.