[llvm] r298518 - Fix PR32298 by adding an early exit to getFrameIndexExprs().

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 22 10:12:35 PDT 2017


Does this meet the bar for "if the verifier accepts it LLVM should do
something sensible with it" - seems like this might not be checked by the
verifier? I guess this would only happen if the IR described a whole (not
fragmented) variable as being in two different parts of the stack at
different portions of the function. I doubt current Clang/LLVM produce
anything like that, but it's conceivable and certainly possible to
artificially construct such a case, I would think?

On Wed, Mar 22, 2017 at 10:02 AM Adrian Prantl via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: adrian
> Date: Wed Mar 22 11:50:16 2017
> New Revision: 298518
>
> URL: http://llvm.org/viewvc/llvm-project?rev=298518&view=rev
> Log:
> 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.
>
> Added:
>     llvm/trunk/test/DebugInfo/X86/single-fi.ll
> Modified:
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=298518&r1=298517&r2=298518&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Mar 22 11:50:16
> 2017
> @@ -199,6 +199,12 @@ const DIType *DbgVariable::getType() con
>  }
>
>  ArrayRef<DbgVariable::FrameIndexExpr> 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 <
>
> Added: llvm/trunk/test/DebugInfo/X86/single-fi.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/single-fi.ll?rev=298518&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/single-fi.ll (added)
> +++ llvm/trunk/test/DebugInfo/X86/single-fi.ll Wed Mar 22 11:50:16 2017
> @@ -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)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170322/dc5b36e3/attachment.html>


More information about the llvm-commits mailing list