diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td index 2da45eba77655b..dc711232aa9be8 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td @@ -586,7 +586,8 @@ 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 @@ -594,11 +595,11 @@ def LLVM_DISubprogramAttr : LLVM_Attr<"DISubprogram", "di_subprogram", "DIScopeAttr":$scope, "StringAttr":$name, "StringAttr":$linkageName, "DIFileAttr":$file, "unsigned":$line, "unsigned":$scopeLine, "DISubprogramFlags":$subprogramFlags, "DISubroutineTypeAttr":$type, - "ArrayRef":$retainedNodes + "ArrayRef":$retainedNodes, "ArrayRef":$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) `>`"; @@ -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 //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp index bd2164e640e7b8..a4304ef6668e5e 100644 --- a/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp +++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp @@ -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); } //===----------------------------------------------------------------------===// @@ -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, {}, {}, {}, {}, {}); } //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp b/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp index 2cfaffa7c8efce..59a4f8e9023582 100644 --- a/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp +++ b/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp @@ -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)); } diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp index 8ca3beca6b66f7..709f1bb3dd0bcd 100644 --- a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp @@ -102,6 +102,13 @@ DebugTranslation::getMDTupleOrNull(ArrayRef elements) { return nullptr; SmallVector llvmElements = llvm::to_vector( llvm::map_range(elements, [&](DINodeAttr attr) -> llvm::Metadata * { + if (DIStringAnnotationAttr annAttr = + dyn_cast(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); @@ -332,7 +339,8 @@ llvm::DISubprogram *DebugTranslation::translateImpl(DISubprogramAttr attr) { /*ThisAdjustment=*/0, llvm::DINode::FlagZero, static_cast(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;