diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td @@ -470,6 +470,26 @@ let assemblyFormat = "`<` struct(params) `>`"; } +//===----------------------------------------------------------------------===// +// DIModuleAttr +//===----------------------------------------------------------------------===// + +def LLVM_DIModuleAttr : LLVM_Attr<"DIModule", "di_module", + /*traits=*/[], "DIScopeAttr"> { + let parameters = (ins + OptionalParameter<"DIFileAttr">:$file, + OptionalParameter<"DIScopeAttr">:$scope, + OptionalParameter<"StringAttr">:$name, + OptionalParameter<"StringAttr">:$configMacros, + OptionalParameter<"StringAttr">:$includePath, + OptionalParameter<"StringAttr">:$apinotes, + OptionalParameter<"unsigned">:$line, + OptionalParameter<"bool">:$isDecl + ); + + let assemblyFormat = "`<` struct(params) `>`"; +} + //===----------------------------------------------------------------------===// // DINamespaceAttr //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp --- a/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp +++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp @@ -45,9 +45,9 @@ return llvm::isa( - attr); + DILocalVariableAttr, DIModuleAttr, DINamespaceAttr, + DINullTypeAttr, DISubprogramAttr, DISubrangeAttr, + DISubroutineTypeAttr>(attr); } //===----------------------------------------------------------------------===// @@ -56,7 +56,7 @@ bool DIScopeAttr::classof(Attribute attr) { return llvm::isa(attr); + DILocalScopeAttr, DIModuleAttr, DINamespaceAttr>(attr); } //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp --- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp +++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp @@ -2819,12 +2819,12 @@ .Case([&](auto attr) { os << decltype(attr)::getMnemonic(); return AliasResult::OverridableAlias; diff --git a/mlir/lib/Target/LLVMIR/DebugImporter.h b/mlir/lib/Target/LLVMIR/DebugImporter.h --- a/mlir/lib/Target/LLVMIR/DebugImporter.h +++ b/mlir/lib/Target/LLVMIR/DebugImporter.h @@ -62,9 +62,10 @@ DILexicalBlockAttr translateImpl(llvm::DILexicalBlock *node); DILexicalBlockFileAttr translateImpl(llvm::DILexicalBlockFile *node); DILocalVariableAttr translateImpl(llvm::DILocalVariable *node); + DIModuleAttr translateImpl(llvm::DIModule *node); + DINamespaceAttr translateImpl(llvm::DINamespace *node); DIScopeAttr translateImpl(llvm::DIScope *node); DISubprogramAttr translateImpl(llvm::DISubprogram *node); - DINamespaceAttr translateImpl(llvm::DINamespace *node); DISubrangeAttr translateImpl(llvm::DISubrange *node); DISubroutineTypeAttr translateImpl(llvm::DISubroutineType *node); DITypeAttr translateImpl(llvm::DIType *node); diff --git a/mlir/lib/Target/LLVMIR/DebugImporter.cpp b/mlir/lib/Target/LLVMIR/DebugImporter.cpp --- a/mlir/lib/Target/LLVMIR/DebugImporter.cpp +++ b/mlir/lib/Target/LLVMIR/DebugImporter.cpp @@ -118,6 +118,16 @@ return cast(translate(static_cast(node))); } +DIModuleAttr DebugImporter::translateImpl(llvm::DIModule *node) { + return DIModuleAttr::get( + context, translate(node->getFile()), translate(node->getScope()), + getStringAttrOrNull(node->getRawName()), + getStringAttrOrNull(node->getRawConfigurationMacros()), + getStringAttrOrNull(node->getRawIncludePath()), + getStringAttrOrNull(node->getRawAPINotesFile()), node->getLineNo(), + node->getIsDecl()); +} + DINamespaceAttr DebugImporter::translateImpl(llvm::DINamespace *node) { return DINamespaceAttr::get(context, getStringAttrOrNull(node->getRawName()), translate(node->getScope()), @@ -214,10 +224,12 @@ return translateImpl(casted); if (auto *casted = dyn_cast(node)) return translateImpl(casted); - if (auto *casted = dyn_cast(node)) + if (auto *casted = dyn_cast(node)) return translateImpl(casted); if (auto *casted = dyn_cast(node)) return translateImpl(casted); + if (auto *casted = dyn_cast(node)) + return translateImpl(casted); if (auto *casted = dyn_cast(node)) return translateImpl(casted); if (auto *casted = dyn_cast(node)) diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.h b/mlir/lib/Target/LLVMIR/DebugTranslation.h --- a/mlir/lib/Target/LLVMIR/DebugTranslation.h +++ b/mlir/lib/Target/LLVMIR/DebugTranslation.h @@ -72,9 +72,10 @@ llvm::DILexicalBlockFile *translateImpl(DILexicalBlockFileAttr attr); llvm::DILocalScope *translateImpl(DILocalScopeAttr attr); llvm::DILocalVariable *translateImpl(DILocalVariableAttr attr); + llvm::DIModule *translateImpl(DIModuleAttr attr); + llvm::DINamespace *translateImpl(DINamespaceAttr attr); llvm::DIScope *translateImpl(DIScopeAttr attr); llvm::DISubprogram *translateImpl(DISubprogramAttr attr); - llvm::DINamespace *translateImpl(DINamespaceAttr attr); llvm::DISubrange *translateImpl(DISubrangeAttr attr); llvm::DISubroutineType *translateImpl(DISubroutineTypeAttr attr); llvm::DIType *translateImpl(DITypeAttr attr); diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp --- a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp @@ -221,6 +221,15 @@ translate(attr.getCompileUnit())); } +llvm::DIModule *DebugTranslation::translateImpl(DIModuleAttr attr) { + return llvm::DIModule::get( + llvmCtx, translate(attr.getFile()), translate(attr.getScope()), + getMDStringOrNull(attr.getName()), + getMDStringOrNull(attr.getConfigMacros()), + getMDStringOrNull(attr.getIncludePath()), + getMDStringOrNull(attr.getApinotes()), attr.getLine(), attr.getIsDecl()); +} + llvm::DINamespace *DebugTranslation::translateImpl(DINamespaceAttr attr) { return llvm::DINamespace::get(llvmCtx, translate(attr.getScope()), getMDStringOrNull(attr.getName()), @@ -266,9 +275,9 @@ TypeSwitch(attr) .Case( + DILexicalBlockFileAttr, DILocalVariableAttr, DIModuleAttr, + DINamespaceAttr, DINullTypeAttr, DISubprogramAttr, + DISubrangeAttr, DISubroutineTypeAttr>( [&](auto attr) { return translateImpl(attr); }); attrToNode.insert({attr, node}); return node; diff --git a/mlir/test/Dialect/LLVMIR/debuginfo.mlir b/mlir/test/Dialect/LLVMIR/debuginfo.mlir --- a/mlir/test/Dialect/LLVMIR/debuginfo.mlir +++ b/mlir/test/Dialect/LLVMIR/debuginfo.mlir @@ -102,10 +102,17 @@ file = #file, subprogramFlags = "Definition", type = #spType1 > -// CHECK-DAG: #[[SP2:.*]] = #llvm.di_subprogram +// CHECK-DAG: #[[MODULE:.*]] = #llvm.di_module +#module = #llvm.di_module< + file = #file, scope = #file, name = "module", + configMacros = "bar", includePath = "/", + apinotes = "/", line = 42, isDecl = true +> + +// CHECK-DAG: #[[SP2:.*]] = #llvm.di_subprogram #sp2 = #llvm.di_subprogram< // Omit the optional linkageName parameter. - compileUnit = #cu, scope = #file, name = "value", + compileUnit = #cu, scope = #module, name = "value", file = #file, subprogramFlags = "Definition", type = #spType2 > diff --git a/mlir/test/Target/LLVMIR/Import/debug-info.ll b/mlir/test/Target/LLVMIR/Import/debug-info.ll --- a/mlir/test/Target/LLVMIR/Import/debug-info.ll +++ b/mlir/test/Target/LLVMIR/Import/debug-info.ll @@ -464,3 +464,24 @@ !1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) !2 = !DIFile(filename: "debug-info.ll", directory: "/") !8 = distinct !DISubprogram(scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1); + +; // ----- + +; CHECK: #[[MODULE:.+]] = #llvm.di_module< +; CHECK-SAME: file = #{{.*}}, scope = #{{.*}}, name = "module", +; CHECK-SAME: configMacros = "bar", includePath = "/", +; CHECK-SAME: apinotes = "/", line = 42, isDecl = true +; CHECK-SAME: > +; CHECK: #[[SUBPROGRAM:.+]] = #llvm.di_subprogram #variableAddr = #llvm.di_local_variable #noNameVariable = #llvm.di_local_variable - +#module = #llvm.di_module< + file = #file, scope = #file, name = "module", + configMacros = "bar", includePath = "/", + apinotes = "/", line = 42, isDecl = true +> #spType1 = #llvm.di_subroutine_type #sp1 = #llvm.di_subprogram< - compileUnit = #cu, scope = #file, name = "empty_types", + compileUnit = #cu, scope = #module, name = "empty_types", file = #file, subprogramFlags = "Definition", type = #spType1 > @@ -153,7 +157,8 @@ // CHECK: ![[CALLEE_ARGS]] = !{![[ARG_TYPE:.*]], ![[ARG_TYPE:.*]]} // CHECK: ![[INLINE_LOC]] = !DILocation(line: 28, column: 5, -// CHECK: ![[EMPTY_TYPES_LOC]] = distinct !DISubprogram(name: "empty_types", scope: ![[CU_FILE_LOC]], file: ![[CU_FILE_LOC]], type: ![[EMPTY_TYPES_TYPE:.*]], spFlags: DISPFlagDefinition +// CHECK: ![[EMPTY_TYPES_LOC]] = distinct !DISubprogram(name: "empty_types", scope: ![[MODULE:.*]], file: ![[CU_FILE_LOC]], type: ![[EMPTY_TYPES_TYPE:.*]], spFlags: DISPFlagDefinition +// CHECK: ![[MODULE]] = !DIModule(scope: ![[CU_FILE_LOC]], name: "module", configMacros: "bar", includePath: "/", apinotes: "/", file: ![[CU_FILE_LOC]], line: 42, isDecl: true) // CHECK: ![[EMPTY_TYPES_TYPE]] = !DISubroutineType(cc: DW_CC_normal, types: ![[EMPTY_TYPES_ARGS:.*]]) // CHECK: ![[EMPTY_TYPES_ARGS]] = !{}