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

Adrian Prantl via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 22 10:18:40 PDT 2017


> 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");
>  }

That said, there is probably no verifier check that prevents you from describing the same variable in two allocas using two llvm.dbg.declares.

> 
> -- 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
> 



More information about the llvm-commits mailing list