From: Adrian Prantl Date: Wed, 22 Mar 2017 16:50:16 +0000 (+0000) Subject: Fix PR32298 by adding an early exit to getFrameIndexExprs(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=79ea811c417b33292505fe292ed8f59e2373cd44;p=llvm Fix PR32298 by adding an early exit to getFrameIndexExprs(). Also add an assertion for the case that there are multiple FI expressions with a DW_OP_LLVM_fragment; which should violate internal constraints in DbgVariable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298518 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 15e5be2e65d..344528d5cfb 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -199,6 +199,12 @@ const DIType *DbgVariable::getType() const { } ArrayRef DbgVariable::getFrameIndexExprs() const { + if (FrameIndexExprs.size() == 1) + return FrameIndexExprs; + + assert(all_of(FrameIndexExprs, + [](const FrameIndexExpr &A) { return A.Expr->isFragment(); }) && + "multiple FI expressions without DW_OP_LLVM_fragment"); std::sort(FrameIndexExprs.begin(), FrameIndexExprs.end(), [](const FrameIndexExpr &A, const FrameIndexExpr &B) -> bool { return A.Expr->getFragmentInfo()->OffsetInBits < diff --git a/test/DebugInfo/X86/single-fi.ll b/test/DebugInfo/X86/single-fi.ll new file mode 100644 index 00000000000..6941bff4dde --- /dev/null +++ b/test/DebugInfo/X86/single-fi.ll @@ -0,0 +1,40 @@ +; RUN: %llc_dwarf -march=x86-64 -o - %s -filetype=obj \ +; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck %s +; A single FI location. This used to trigger an assertion in debug libstdc++. +; CHECK: DW_TAG_formal_parameter +; fbreg -8 +; CHECK-NEXT: DW_AT_location {{.*}} (<0x2> 91 78 ) +; CHECK-NEXT: DW_AT_name {{.*}} "dipsy" +define void @tinkywinky(i8* %dipsy) !dbg !6 { +entry: + %dipsy.addr = alloca i8* + store i8* %dipsy, i8** %dipsy.addr + call void @llvm.dbg.declare(metadata i8** %dipsy.addr, metadata !12, metadata +!13), !dbg !14 + ret void, !dbg !15 +} + +declare void @llvm.dbg.declare(metadata, metadata, metadata) + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} +!llvm.ident = !{!5} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 5.0.0 (trunk 297917) (llvm/trunk 297929)", isOptimized: false, +runtimeVersion: 0, emissionKind: FullDebug, enums: !2) +!1 = !DIFile(filename: "teletubbies.c", directory: "/home/davide/work/llvm/build-clang/bin") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{!"clang version 5.0.0 (trunk 297917) (llvm/trunk 297929)"} +!6 = distinct !DISubprogram(name: "tinkywinky", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, flags: +DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) +!7 = !DISubroutineType(types: !8) +!8 = !{null, !9} +!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64) +!10 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !11) +!11 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char) +!12 = !DILocalVariable(name: "dipsy", arg: 1, scope: !6, file: !1, line: 1, type: !9) +!13 = !DIExpression() +!14 = !DILocation(line: 1, column: 29, scope: !6) +!15 = !DILocation(line: 1, column: 37, scope: !6)