[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:28:39 PDT 2017


Ah, right right - all the different side tables & paths... thanks for the
reminders!

On Wed, Mar 22, 2017 at 10:24 AM Adrian Prantl <aprantl at apple.com> wrote:

> On Mar 22, 2017, at 10:22 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> On Wed, Mar 22, 2017 at 10:18 AM Adrian Prantl <aprantl at apple.com> wrote:
>
>
> > On Mar 22, 2017, at 10:17 AM, Adrian Prantl <aprantl at apple.com> wrote:
> >
> >
> >> On Mar 22, 2017, at 10:12 AM, David Blaikie <dblaikie at gmail.com> wrote:
> >>
> >> 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?
> >
> > In my understanding this situation is impossible, because the only way
> we get an FI expression is if it was in the MMI side table and the code for
> adding additional FI entries to a DbgVariable already has a similar
> assertion.
> >
> >  void addMMIEntry(const DbgVariable &V) {
> >    assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");
> >    assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");
> >    assert(V.Var == Var && "conflicting variable");
> >    assert(V.IA == IA && "conflicting inlined-at location");
> >
> >    assert(!FrameIndexExprs.empty() && "Expected an MMI entry");
> >    assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");
> >
> >    FrameIndexExprs.append(V.FrameIndexExprs.begin(),
> V.FrameIndexExprs.end());
> >    assert(all_of(FrameIndexExprs,
> >                  [](FrameIndexExpr &FIE) {
> >                    return FIE.Expr && FIE.Expr->isFragment();
> >                                                 ^^^^^^^^^^^^
> >                  }) &&
> >           "conflicting locations for variable");
> >  }
>
>
> Ah, cool/fair enough.
>
>
> That said, there is probably no verifier check that prevents you from
> describing the same variable in two allocas using two llvm.dbg.declares.
>
>
> *nod* Perhaps.
>
> (& that assert might fail too in other cases - I was imagining two
> non-fragment (ie: they describe the whole variabel) dbg.values - for some
> reason it might be advantageous to put the variable in different parts of
> the stack (or perhaps the same part, but with a gap in lifetime - eg: to
> store some other stuff due to stack reuse) at different times/portions of
> the function)
>
>
> dbg.values won't make it into the MMI side table — only dbg.declares are
> stashed away there, and they don't have a concept of lifetime (at the
> moment).
>
> -- adrian
>
>
>
>
> >
> > -- adrian
> >
> >>
> >> 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/ae2571ae/attachment.html>


More information about the llvm-commits mailing list