diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index 8019c399f3779..7c8ee099ee3e9 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -438,6 +438,7 @@ mlir::LLVM::DITypeAttr DebugTypeGenerator::convertRecordType( context, llvm::dwarf::DW_TAG_member, mlir::StringAttr::get(context, fieldName), elemTy, byteSize * 8, byteAlign * 8, offset * 8, /*optional
=*/std::nullopt, + /*flags=*/mlir::LLVM::DIFlags::Zero, /*extra data=*/nullptr); elements.push_back(tyAttr); offset += llvm::alignTo(byteSize, byteAlign); @@ -480,6 +481,7 @@ mlir::LLVM::DITypeAttr DebugTypeGenerator::convertTupleType( context, llvm::dwarf::DW_TAG_member, mlir::StringAttr::get(context, ""), elemTy, byteSize * 8, byteAlign * 8, offset * 8, /*optional
=*/std::nullopt, + /*flags=*/mlir::LLVM::DIFlags::Zero, /*extra data=*/nullptr); elements.push_back(tyAttr); offset += llvm::alignTo(byteSize, byteAlign); @@ -673,7 +675,8 @@ mlir::LLVM::DITypeAttr DebugTypeGenerator::convertPointerLikeType( context, llvm::dwarf::DW_TAG_pointer_type, mlir::StringAttr::get(context, ""), elTyAttr, /*sizeInBits=*/ptrSize * 8, /*alignInBits=*/0, /*offset=*/0, - /*optional
=*/std::nullopt, /*extra data=*/nullptr); + /*optional
=*/std::nullopt, + /*flags=*/mlir::LLVM::DIFlags::Zero, /*extra data=*/nullptr); } static mlir::StringAttr getBasicTypeName(mlir::MLIRContext *context, @@ -742,7 +745,8 @@ DebugTypeGenerator::convertType(mlir::Type Ty, mlir::LLVM::DIFileAttr fileAttr, context, llvm::dwarf::DW_TAG_pointer_type, mlir::StringAttr::get(context, ""), subroutineTy, /*sizeInBits=*/ptrSize * 8, /*alignInBits=*/0, /*offset=*/0, - /*optional
=*/std::nullopt, /*extra data=*/nullptr); + /*optional
=*/std::nullopt, + /*flags=*/mlir::LLVM::DIFlags::Zero, /*extra data=*/nullptr); } else if (auto refTy = mlir::dyn_cast_if_present(Ty)) { auto elTy = refTy.getEleTy(); return convertPointerLikeType(elTy, fileAttr, scope, declOp, diff --git a/mlir/include/mlir-c/Dialect/LLVM.h b/mlir/include/mlir-c/Dialect/LLVM.h index f2aaa32d1da29..7381519881e03 100644 --- a/mlir/include/mlir-c/Dialect/LLVM.h +++ b/mlir/include/mlir-c/Dialect/LLVM.h @@ -296,7 +296,8 @@ MLIR_CAPI_EXPORTED MlirStringRef mlirLLVMDICompositeTypeAttrGetName(void); MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIDerivedTypeAttrGet( MlirContext ctx, unsigned int tag, MlirAttribute name, MlirAttribute baseType, uint64_t sizeInBits, uint32_t alignInBits, - uint64_t offsetInBits, int64_t dwarfAddressSpace, MlirAttribute extraData); + uint64_t offsetInBits, int64_t dwarfAddressSpace, int64_t flags, + MlirAttribute extraData); MLIR_CAPI_EXPORTED MlirStringRef mlirLLVMDIDerivedTypeAttrGetName(void); diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td index ef16cec7c9e71..f21a03976dd86 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td @@ -520,6 +520,7 @@ def LLVM_DIDerivedTypeAttr : LLVM_Attr<"DIDerivedType", "di_derived_type", OptionalParameter<"uint32_t">:$alignInBits, OptionalParameter<"uint64_t">:$offsetInBits, OptionalParameter<"std::optional">:$dwarfAddressSpace, + OptionalParameter<"DIFlags", "DIFlags::Zero">:$flags, OptionalParameter<"DINodeAttr">:$extraData ); let assemblyFormat = "`<` struct(params) `>`"; diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td index e7b202cd4f63b..8593b1389e7a9 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td @@ -199,6 +199,8 @@ def DIDerivedTypeAttr : DialectAttribute<(attr VarInt:$alignInBits, VarInt:$offsetInBits, OptionalInt<"unsigned">:$dwarfAddressSpace, + EnumClassFlag<"DIFlags", "getFlags()">:$_rawflags, + LocalVar<"DIFlags", "(DIFlags)_rawflags">:$flags, OptionalAttribute<"DINodeAttr">:$extraData )>; diff --git a/mlir/lib/CAPI/Dialect/LLVM.cpp b/mlir/lib/CAPI/Dialect/LLVM.cpp index 31084f1609e90..e6f58d010bda5 100644 --- a/mlir/lib/CAPI/Dialect/LLVM.cpp +++ b/mlir/lib/CAPI/Dialect/LLVM.cpp @@ -250,17 +250,19 @@ MlirStringRef mlirLLVMDICompositeTypeAttrGetName(void) { return wrap(DICompositeTypeAttr::name); } -MlirAttribute mlirLLVMDIDerivedTypeAttrGet( - MlirContext ctx, unsigned int tag, MlirAttribute name, - MlirAttribute baseType, uint64_t sizeInBits, uint32_t alignInBits, - uint64_t offsetInBits, int64_t dwarfAddressSpace, MlirAttribute extraData) { +MlirAttribute +mlirLLVMDIDerivedTypeAttrGet(MlirContext ctx, unsigned int tag, + MlirAttribute name, MlirAttribute baseType, + uint64_t sizeInBits, uint32_t alignInBits, + uint64_t offsetInBits, int64_t dwarfAddressSpace, + int64_t flags, MlirAttribute extraData) { std::optional addressSpace = std::nullopt; if (dwarfAddressSpace >= 0) addressSpace = (unsigned)dwarfAddressSpace; return wrap(DIDerivedTypeAttr::get( unwrap(ctx), tag, cast(unwrap(name)), cast(unwrap(baseType)), sizeInBits, alignInBits, offsetInBits, - addressSpace, cast(unwrap(extraData)))); + addressSpace, DIFlags(flags), cast(unwrap(extraData)))); } MlirStringRef mlirLLVMDIDerivedTypeAttrGetName(void) { diff --git a/mlir/lib/Target/LLVMIR/DebugImporter.cpp b/mlir/lib/Target/LLVMIR/DebugImporter.cpp index db39c70c87531..a505da74abff4 100644 --- a/mlir/lib/Target/LLVMIR/DebugImporter.cpp +++ b/mlir/lib/Target/LLVMIR/DebugImporter.cpp @@ -104,7 +104,8 @@ DIDerivedTypeAttr DebugImporter::translateImpl(llvm::DIDerivedType *node) { return DIDerivedTypeAttr::get( context, node->getTag(), getStringAttrOrNull(node->getRawName()), baseType, node->getSizeInBits(), node->getAlignInBits(), - node->getOffsetInBits(), node->getDWARFAddressSpace(), extraData); + node->getOffsetInBits(), node->getDWARFAddressSpace(), + symbolizeDIFlags(node->getFlags()).value_or(DIFlags::Zero), extraData); } DIStringTypeAttr DebugImporter::translateImpl(llvm::DIStringType *node) { diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp index 627bcf4bee504..64fcb58629125 100644 --- a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp @@ -203,7 +203,8 @@ llvm::DIDerivedType *DebugTranslation::translateImpl(DIDerivedTypeAttr attr) { /*Scope=*/nullptr, translate(attr.getBaseType()), attr.getSizeInBits(), attr.getAlignInBits(), attr.getOffsetInBits(), attr.getDwarfAddressSpace(), /*PtrAuthData=*/std::nullopt, - /*Flags=*/llvm::DINode::FlagZero, translate(attr.getExtraData())); + /*Flags=*/static_cast(attr.getFlags()), + translate(attr.getExtraData())); } llvm::DIStringType *DebugTranslation::translateImpl(DIStringTypeAttr attr) { diff --git a/mlir/test/CAPI/llvm.c b/mlir/test/CAPI/llvm.c index f5fbb4645cd5d..f3c4cbe036d7c 100644 --- a/mlir/test/CAPI/llvm.c +++ b/mlir/test/CAPI/llvm.c @@ -303,12 +303,12 @@ static void testDebugInfoAttributes(MlirContext ctx) { // CHECK: #llvm.di_derived_type<{{.*}}> // CHECK-NOT: dwarfAddressSpace mlirAttributeDump(mlirLLVMDIDerivedTypeAttrGet( - ctx, 0, bar, di_type, 64, 8, 0, MLIR_CAPI_DWARF_ADDRESS_SPACE_NULL, + ctx, 0, bar, di_type, 64, 8, 0, MLIR_CAPI_DWARF_ADDRESS_SPACE_NULL, 0, di_type)); // CHECK: #llvm.di_derived_type<{{.*}} dwarfAddressSpace = 3{{.*}}> - mlirAttributeDump( - mlirLLVMDIDerivedTypeAttrGet(ctx, 0, bar, di_type, 64, 8, 0, 3, di_type)); + mlirAttributeDump(mlirLLVMDIDerivedTypeAttrGet(ctx, 0, bar, di_type, 64, 8, 0, + 3, 0, di_type)); MlirAttribute subroutine_type = mlirLLVMDISubroutineTypeAttrGet(ctx, 0x0, 1, &di_type); diff --git a/mlir/test/Dialect/LLVMIR/debuginfo.mlir b/mlir/test/Dialect/LLVMIR/debuginfo.mlir index 545715f73f449..f6f52b3fcc001 100644 --- a/mlir/test/Dialect/LLVMIR/debuginfo.mlir +++ b/mlir/test/Dialect/LLVMIR/debuginfo.mlir @@ -44,6 +44,16 @@ dwarfAddressSpace = 3, extraData = #int1 > +// CHECK-DAG: #[[PTR3:.*]] = #llvm.di_derived_type +#ptr3 = #llvm.di_derived_type< + tag = DW_TAG_pointer_type, flags = "Artificial|ObjectPointer" +> + +// CHECK-DAG: #[[PTR4:.*]] = #llvm.di_derived_type +#ptr4 = #llvm.di_derived_type< + tag = DW_TAG_pointer_type, flags = "Zero" +> + // CHECK-DAG: #[[COMP0:.*]] = #llvm.di_composite_type #comp0 = #llvm.di_composite_type< tag = DW_TAG_array_type, name = "array0", @@ -89,9 +99,9 @@ name = "expr_elements2", baseType = #int0, elements = #llvm.di_generic_subrange> -// CHECK-DAG: #[[SPTYPE0:.*]] = #llvm.di_subroutine_type +// CHECK-DAG: #[[SPTYPE0:.*]] = #llvm.di_subroutine_type #spType0 = #llvm.di_subroutine_type< - callingConvention = DW_CC_normal, types = #null, #int0, #ptr0, #ptr1, #ptr2, #comp0, #comp1, #comp2, #comp3 + callingConvention = DW_CC_normal, types = #null, #int0, #ptr0, #ptr1, #ptr2, #ptr3, #ptr4, #comp0, #comp1, #comp2, #comp3 > // CHECK-DAG: #[[SPTYPE1:.*]] = #llvm.di_subroutine_type diff --git a/mlir/test/Target/LLVMIR/Import/debug-info.ll b/mlir/test/Target/LLVMIR/Import/debug-info.ll index 61376b8f648ec..8a0c0c78e2018 100644 --- a/mlir/test/Target/LLVMIR/Import/debug-info.ll +++ b/mlir/test/Target/LLVMIR/Import/debug-info.ll @@ -316,7 +316,7 @@ define void @class_method() { ; Verify the cyclic subprogram is handled correctly. ; CHECK-DAG: #[[SP_SELF:.+]] = #llvm.di_subprogram ; CHECK-DAG: #[[COMP:.+]] = #llvm.di_composite_type -; CHECK-DAG: #[[COMP_PTR:.+]] = #llvm.di_derived_type +; CHECK-DAG: #[[COMP_PTR:.+]] = #llvm.di_derived_type ; CHECK-DAG: #[[SP_TYPE:.+]] = #llvm.di_subroutine_type ; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram ; CHECK-DAG: #[[LOC]] = loc(fused<#[[SP]]> @@ -338,10 +338,10 @@ define void @class_method() { ; Verify the cyclic composite type is handled correctly. ; CHECK-DAG: #[[COMP_SELF:.+]] = #llvm.di_composite_type -; CHECK-DAG: #[[COMP_PTR_INNER:.+]] = #llvm.di_derived_type +; CHECK-DAG: #[[COMP_PTR_INNER:.+]] = #llvm.di_derived_type ; CHECK-DAG: #[[FIELD:.+]] = #llvm.di_derived_type ; CHECK-DAG: #[[COMP:.+]] = #llvm.di_composite_type -; CHECK-DAG: #[[COMP_PTR_OUTER:.+]] = #llvm.di_derived_type +; CHECK-DAG: #[[COMP_PTR_OUTER:.+]] = #llvm.di_derived_type ; CHECK-DAG: #[[VAR0:.+]] = #llvm.di_local_variable ; CHECK: @class_field diff --git a/mlir/test/Target/LLVMIR/llvmir-debug.mlir b/mlir/test/Target/LLVMIR/llvmir-debug.mlir index 38ae63d1908e9..331760baae0dc 100644 --- a/mlir/test/Target/LLVMIR/llvmir-debug.mlir +++ b/mlir/test/Target/LLVMIR/llvmir-debug.mlir @@ -40,6 +40,10 @@ llvm.func @func_no_debug() { sizeInBits = 64, alignInBits = 32, offsetInBits = 8, dwarfAddressSpace = 3 > +#flags = #llvm.di_derived_type< + tag = DW_TAG_pointer_type, baseType = #si32, + sizeInBits = 64, flags = "Artificial|ObjectPointer" +> #cu = #llvm.di_compile_unit< id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #file, producer = "MLIR", isOptimized = true, emissionKind = Full, @@ -56,7 +60,7 @@ llvm.func @func_no_debug() { elements = #llvm.di_subrange > #null = #llvm.di_null_type -#spType0 = #llvm.di_subroutine_type +#spType0 = #llvm.di_subroutine_type #toplevel_namespace = #llvm.di_namespace< name = "toplevel", exportSymbols = true > @@ -147,12 +151,13 @@ llvm.func @empty_types() { // CHECK: ![[NESTED_NAMESPACE]] = !DINamespace(name: "nested", scope: ![[TOPLEVEL_NAMESPACE:.*]]) // CHECK: ![[TOPLEVEL_NAMESPACE]] = !DINamespace(name: "toplevel", scope: null, exportSymbols: true) // CHECK: ![[FUNC_TYPE]] = !DISubroutineType(cc: DW_CC_normal, types: ![[FUNC_ARGS:.*]]) -// CHECK: ![[FUNC_ARGS]] = !{null, ![[ARG_TYPE:.*]], ![[PTR_TYPE:.*]], ![[NAMED_TYPE:.*]], ![[PTR_WITH_ADDR_SPACE:.*]], ![[COMPOSITE_TYPE:.*]], ![[VECTOR_TYPE:.*]]} +// CHECK: ![[FUNC_ARGS]] = !{null, ![[ARG_TYPE:.*]], ![[PTR_TYPE:.*]], ![[NAMED_TYPE:.*]], ![[PTR_WITH_ADDR_SPACE:.*]], ![[FLAGS:.*]], ![[COMPOSITE_TYPE:.*]], ![[VECTOR_TYPE:.*]]} // CHECK: ![[ARG_TYPE]] = !DIBasicType(name: "si64") // CHECK: ![[PTR_TYPE]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[BASE_TYPE:.*]], size: 64, align: 32, offset: 8, extraData: ![[BASE_TYPE]]) // CHECK: ![[BASE_TYPE]] = !DIBasicType(name: "si32", size: 32, encoding: DW_ATE_signed) // CHECK: ![[NAMED_TYPE]] = !DIDerivedType(tag: DW_TAG_pointer_type, name: "named", baseType: ![[BASE_TYPE:.*]]) // CHECK: ![[PTR_WITH_ADDR_SPACE]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[BASE_TYPE:.*]], size: 64, align: 32, offset: 8, dwarfAddressSpace: 3) +// CHECK: ![[FLAGS]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[BASE_TYPE:.*]], size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) // CHECK: ![[COMPOSITE_TYPE]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "composite", file: ![[CU_FILE_LOC]], line: 42, size: 64, align: 32, elements: ![[COMPOSITE_ELEMENTS:.*]]) // CHECK: ![[COMPOSITE_ELEMENTS]] = !{![[COMPOSITE_ELEMENT:.*]]} // CHECK: ![[COMPOSITE_ELEMENT]] = !DISubrange(count: 4)