From f76475c026acbc30ef42834b3956bfa7bd61052b Mon Sep 17 00:00:00 2001 From: Christian Ulmann Date: Fri, 19 Apr 2024 17:12:22 +0200 Subject: [MLIR][LLVM] Add vector exception to composite type element ignore mode (#89385) This commit fixes a bug in the DICompositeType element ignore mode. It seems that vectors require the presence of elements, as they otherwise do not pass the verifier. --- mlir/lib/Target/LLVMIR/DebugImporter.cpp | 5 ++++- .../Import/ignore-composite-type-elements.ll | 24 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/mlir/lib/Target/LLVMIR/DebugImporter.cpp b/mlir/lib/Target/LLVMIR/DebugImporter.cpp index b4c0115..1ab55b0 100644 --- a/mlir/lib/Target/LLVMIR/DebugImporter.cpp +++ b/mlir/lib/Target/LLVMIR/DebugImporter.cpp @@ -71,7 +71,10 @@ DICompileUnitAttr DebugImporter::translateImpl(llvm::DICompileUnit *node) { DICompositeTypeAttr DebugImporter::translateImpl(llvm::DICompositeType *node) { std::optional flags = symbolizeDIFlags(node->getFlags()); SmallVector elements; - if (!dropDICompositeTypeElements) { + + // A vector always requires an element. + bool isVectorType = flags && bitEnumContainsAll(*flags, DIFlags::Vector); + if (isVectorType || !dropDICompositeTypeElements) { for (llvm::DINode *element : node->getElements()) { assert(element && "expected a non-null element type"); elements.push_back(translate(element)); diff --git a/mlir/test/Target/LLVMIR/Import/ignore-composite-type-elements.ll b/mlir/test/Target/LLVMIR/Import/ignore-composite-type-elements.ll index a249f22..d92d070 100644 --- a/mlir/test/Target/LLVMIR/Import/ignore-composite-type-elements.ll +++ b/mlir/test/Target/LLVMIR/Import/ignore-composite-type-elements.ll @@ -1,4 +1,4 @@ -; RUN: mlir-translate -import-llvm -mlir-print-debuginfo -split-input-file -drop-di-composite-type-elements %s | FileCheck %s +; RUN: mlir-translate -import-llvm -mlir-print-debuginfo -split-input-file -drop-di-composite-type-elements -split-input-file %s | FileCheck %s ; Verifies that the according flag avoids the conversion of the elements of the ; DICompositeType. @@ -23,3 +23,25 @@ define void @composite_type() !dbg !3 { !7 = !{!9} !8 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !6, flags: DIFlagArtificial | DIFlagObjectPointer) !9 = !DIDerivedType(tag: DW_TAG_member, name: "call_field", file: !2, baseType: !8) + +; // ----- + +; CHECK: #{{.+}} = #llvm.di_composite_type + +define void @composite_type() !dbg !3 { + ret void +} + +!llvm.dbg.cu = !{!1} +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"Debug Info Version", i32 3} +!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) +!2 = !DIFile(filename: "debug-info.ll", directory: "/") +!3 = distinct !DISubprogram(name: "composite_type", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, type: !4) +!4 = !DISubroutineType(types: !5) +!5 = !{!7} +!6 = !DIBasicType(name: "int") +!7 = !DICompositeType(tag: DW_TAG_array_type, name: "vector", flags: DIFlagVector, elements: !8, baseType: !6) +!8 = !{!9} +!9 = !DISubrange(count: 4) -- cgit v1.1