[llvm] r191939 - DebugInfo: Fix ordering of members after r191928

NAKAMURA Takumi geek4civic at gmail.com
Fri Oct 4 03:28:40 PDT 2013


I wonder a certain version of bbmaster tends to dislike longer (>=1024
bytes) commit message.

2013/10/4 Craig Topper <craig.topper at gmail.com>:
> I'm not sure exactly why, but it sort of seems like the buildbots managed to
> skip this commit. When I submitted r191940, I got lots of buildbot failures
> on DW_AT_specification.ll. When I looked at the previous builds on the bots
> it looks like your revision was skipped over.
>
> One of the failures
> http://lab.llvm.org:8011/builders/llvm-s390x-linux1/builds/1845
>
>
> On Thu, Oct 3, 2013 at 6:39 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>
>> Author: dblaikie
>> Date: Thu Oct  3 20:39:59 2013
>> New Revision: 191939
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=191939&view=rev
>> Log:
>> DebugInfo: Fix ordering of members after r191928
>>
>> In the case (shown in the attached test) where a member function
>> definition was emitted into debug info the following could occur:
>>
>> 1) build the debug info for the member function definition
>> 2) in (1), build the debug info for the member function declaration
>> 3) construct and add the member function declaration DIE
>> 4) add it to its context
>> 5) build its context (the type it is a member of)
>> 6) construct the members and add them to the type
>> 7) except don't add member functions because "getOrCreateSubprogram"
>> adds the function to its parent anyway
>> 8) except we're only partway through building this subprogram
>> declaration so it hasn't been added yet - but we returned the partially
>> constructed DIE (since it's already in the MDNode->DIE mapping to avoid
>> infinitely recursing trying to create the member function DIE)
>> 9) once the type is constructed, add the member function to it
>> 10) now the members are out of order (the member function being defined
>> is listed as the last member, even though it was declared as the first)
>>
>> To avoid this, construct the context of the subprogram DIE before we
>> query to see if it exists. That way we never end up creating it before
>> creating its context and ending up in this situation.
>>
>> Alternatively, the type construction that visits/builds all the members
>> could call something like getOrCreateSubprogram, but that doesn't ever
>> do the "add to context" step. Then the type building code would always
>> be responsible for adding members (and the subprogram "addToContextDIE"
>> would no-op because the context building would have added the subprogram
>> declaration to the type/context DIE already).
>>
>> (the test cases updated were overly-sensitive to offsets or abbreviation
>> numbers. We don't have a nice way to make these tests more robust as yet
>> - multiline FileCheck matches would be required)
>>
>> Added:
>>     llvm/trunk/test/DebugInfo/member-order.ll
>> Modified:
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>>     llvm/trunk/test/DebugInfo/X86/DW_AT_specification.ll
>>     llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll
>>     llvm/trunk/test/DebugInfo/X86/pr11300.ll
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=191939&r1=191938&r2=191939&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Thu Oct  3
>> 20:39:59 2013
>> @@ -1311,6 +1311,13 @@ DIE *CompileUnit::getOrCreateNameSpace(D
>>
>>  /// getOrCreateSubprogramDIE - Create new DIE using SP.
>>  DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
>> +  // Construct the context before querying for the existence of the DIE
>> in case
>> +  // such construction creates the DIE (as is the case for member
>> function
>> +  // declarations).
>> +  DIE *ContextDIE = getOrCreateContextDIE(SP.getContext());
>> +  if (!ContextDIE)
>> +    ContextDIE = CUDie.get();
>> +
>>    DIE *SPDie = DD->getSPDIE(SP);
>>    if (SPDie)
>>      return SPDie;
>> @@ -1327,7 +1334,7 @@ DIE *CompileUnit::getOrCreateSubprogramD
>>    }
>>
>>    // Add to context owner.
>> -  addToContextOwner(SPDie, SP.getContext());
>> +  ContextDIE->addChild(SPDie);
>>
>>    // Add function template parameters.
>>    addTemplateParams(*SPDie, SP.getTemplateParams());
>>
>> Modified: llvm/trunk/test/DebugInfo/X86/DW_AT_specification.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/DW_AT_specification.ll?rev=191939&r1=191938&r2=191939&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/X86/DW_AT_specification.ll (original)
>> +++ llvm/trunk/test/DebugInfo/X86/DW_AT_specification.ll Thu Oct  3
>> 20:39:59 2013
>> @@ -3,8 +3,8 @@
>>
>>  ; test that the DW_AT_specification is a back edge in the file.
>>
>> -; CHECK: 0x0000003a: DW_TAG_subprogram [5] *
>> -; CHECK: DW_AT_specification [DW_FORM_ref4]      (cu + 0x003a =>
>> {0x0000003a})
>> +; CHECK: 0x0000[[OFFSET:[0-9a-f]*]]: DW_TAG_subprogram [5] *
>> +; CHECK: DW_AT_specification [DW_FORM_ref4]      (cu + 0x[[OFFSET]] =>
>> {0x0000[[OFFSET]]})
>>
>>
>>  @_ZZN3foo3barEvE1x = constant i32 0, align 4
>>
>> Modified: llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll?rev=191939&r1=191938&r2=191939&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll (original)
>> +++ llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll Thu Oct  3
>> 20:39:59 2013
>> @@ -7,14 +7,14 @@
>>  ; first check that we have a TAG_subprogram at a given offset and it has
>>  ; AT_inline.
>>
>> -; CHECK: 0x0000011e:   DW_TAG_subprogram [18]
>> +; CHECK: 0x0000011e:   DW_TAG_subprogram [17]
>>  ; CHECK-NEXT:     DW_AT_specification
>>  ; CHECK-NEXT:     DW_AT_inline
>>
>>
>>  ; and then that a TAG_subprogram refers to it with AT_abstract_origin.
>>
>> -; CHECK: 0x0000015f:   DW_TAG_subprogram [20]
>> +; CHECK: 0x0000015f:   DW_TAG_subprogram [19]
>>  ; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4]    (cu + 0x011e =>
>> {0x0000011e})
>>
>>  define i32 @_ZN17nsAutoRefCnt7ReleaseEv() {
>>
>> Modified: llvm/trunk/test/DebugInfo/X86/pr11300.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/pr11300.ll?rev=191939&r1=191938&r2=191939&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/X86/pr11300.ll (original)
>> +++ llvm/trunk/test/DebugInfo/X86/pr11300.ll Thu Oct  3 20:39:59 2013
>> @@ -3,7 +3,7 @@
>>
>>  ; test that the DW_AT_specification is a back edge in the file.
>>
>> -; CHECK: [[BACK:0x[0-9a-f]*]]:     DW_TAG_subprogram [5]
>> +; CHECK: [[BACK:0x[0-9a-f]*]]:     DW_TAG_subprogram [6]
>>  ; CHECK:                 DW_AT_specification [DW_FORM_ref4]      (cu +
>> {{.*}} => {[[BACK]]})
>>
>>  %struct.foo = type { i8 }
>>
>> Added: llvm/trunk/test/DebugInfo/member-order.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/member-order.ll?rev=191939&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/member-order.ll (added)
>> +++ llvm/trunk/test/DebugInfo/member-order.ll Thu Oct  3 20:39:59 2013
>> @@ -0,0 +1,65 @@
>> +; REQUIRES: object-emission
>> +
>> +; RUN: llc -filetype=obj -O0 < %s | llvm-dwarfdump -debug-dump=info - |
>> FileCheck %s
>> +
>> +; generated by clang from:
>> +; struct foo {
>> +;   void f1();
>> +;   void f2();
>> +; };
>> +;
>> +; void foo::f1() {
>> +; }
>> +
>> +; CHECK: DW_TAG_structure_type
>> +; CHECK-NEXT: DW_AT_name {{.*}} "foo"
>> +; CHECK-NOT: NULL
>> +; CHECK: DW_TAG_subprogram
>> +; CHECK-NOT: NULL
>> +; CHECK: DW_AT_name {{.*}} "f1"
>> +; CHECK: DW_TAG_subprogram
>> +; CHECK-NOT: NULL
>> +; CHECK: DW_AT_name {{.*}} "f2"
>> +
>> +
>> +%struct.foo = type { i8 }
>> +
>> +; Function Attrs: nounwind uwtable
>> +define void @_ZN3foo2f1Ev(%struct.foo* %this) #0 align 2 {
>> +entry:
>> +  %this.addr = alloca %struct.foo*, align 8
>> +  store %struct.foo* %this, %struct.foo** %this.addr, align 8
>> +  call void @llvm.dbg.declare(metadata !{%struct.foo** %this.addr},
>> metadata !16), !dbg !18
>> +  %this1 = load %struct.foo** %this.addr
>> +  ret void, !dbg !19
>> +}
>> +
>> +; Function Attrs: nounwind readnone
>> +declare void @llvm.dbg.declare(metadata, metadata) #1
>> +
>> +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false"
>> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
>> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
>> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
>> "use-soft-float"="false" }
>> +attributes #1 = { nounwind readnone }
>> +
>> +!llvm.dbg.cu = !{!0}
>> +!llvm.module.flags = !{!15}
>> +
>> +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version
>> 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata
>> !13, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ]
>> [/tmp/dbginfo/member-order.cpp] [DW_LANG_C_plus_plus]
>> +!1 = metadata !{metadata !"member-order.cpp", metadata !"/tmp/dbginfo"}
>> +!2 = metadata !{i32 0}
>> +!3 = metadata !{metadata !4}
>> +!4 = metadata !{i32 786451, metadata !1, null, metadata !"foo", i32 1,
>> i64 8, i64 8, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata
>> !"_ZTS3foo"} ; [ DW_TAG_structure_type ] [foo] [line 1, size 8, align 8,
>> offset 0] [def] [from ]
>> +!5 = metadata !{metadata !6, metadata !11}
>> +!6 = metadata !{i32 786478, metadata !1, metadata !4, metadata !"f1",
>> metadata !"f1", metadata !"_ZN3foo2f1Ev", i32 2, metadata !7, i1 false, i1
>> false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata
>> !10, i32 2} ; [ DW_TAG_subprogram ] [line 2] [f1]
>> +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64
>> 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [
>> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
>> +!8 = metadata !{null, metadata !9}
>> +!9 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64
>> 64, i64 0, i32 1088, metadata !"_ZTS3foo"} ; [ DW_TAG_pointer_type ] [line
>> 0, size 64, align 64, offset 0] [artificial] [from _ZTS3foo]
>> +!10 = metadata !{i32 786468}
>> +!11 = metadata !{i32 786478, metadata !1, metadata !4, metadata !"f2",
>> metadata !"f2", metadata !"_ZN3foo2f2Ev", i32 3, metadata !7, i1 false, i1
>> false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata
>> !12, i32 3} ; [ DW_TAG_subprogram ] [line 3] [f2]
>> +!12 = metadata !{i32 786468}
>> +!13 = metadata !{metadata !14}
>> +!14 = metadata !{i32 786478, metadata !1, null, metadata !"f1", metadata
>> !"f1", metadata !"_ZN3foo2f1Ev", i32 6, metadata !7, i1 false, i1 true, i32
>> 0, i32 0, null, i32 256, i1 false, void (%struct.foo*)* @_ZN3foo2f1Ev, null,
>> metadata !6, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [f1]
>> +!15 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
>> +!16 = metadata !{i32 786689, metadata !14, metadata !"this", null, i32
>> 16777216, metadata !17, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this]
>> [line 0]
>> +!17 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64
>> 64, i64 0, i32 0, metadata !"_ZTS3foo"} ; [ DW_TAG_pointer_type ] [line 0,
>> size 64, align 64, offset 0] [from _ZTS3foo]
>> +!18 = metadata !{i32 0, i32 0, metadata !14, null}
>> +!19 = metadata !{i32 7, i32 0, metadata !14, null}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
>
> --
> ~Craig
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



More information about the llvm-commits mailing list