1263320SdimPull in r198389 from upstream llvm trunk (by David Blaikie):
2263320Sdim
3263320Sdim  Revert "Reverting r193835 due to weirdness with Go..."
4263320Sdim
5263320Sdim  The cgo problem was that it wants dwarf2 which doesn't support direct
6263320Sdim  constant encoding of the location. So let's add support for dwarf2
7263320Sdim  encoding (using a location expression) of data member locations.
8263320Sdim
9263320Sdim  This reverts commit r198385.
10263320Sdim
11263320SdimIntroduced here: http://svn.freebsd.org/changeset/base/261991
12263320Sdim
13263320SdimIndex: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
14263320Sdim===================================================================
15263320Sdim--- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
16263320Sdim+++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
17263320Sdim@@ -1890,10 +1890,14 @@ void CompileUnit::constructMemberDIE(DIE &Buffer,
18263320Sdim       // This is not a bitfield.
19263320Sdim       OffsetInBytes = DT.getOffsetInBits() >> 3;
20263320Sdim 
21263320Sdim-    DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
22263320Sdim-    addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
23263320Sdim-    addUInt(MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
24263320Sdim-    addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
25263320Sdim+    if (DD->getDwarfVersion() <= 2) {
26263320Sdim+      DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
27263320Sdim+      addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
28263320Sdim+      addUInt(MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
29263320Sdim+      addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
30263320Sdim+    } else
31263320Sdim+      addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
32263320Sdim+              OffsetInBytes);
33263320Sdim   }
34263320Sdim 
35263320Sdim   if (DT.isProtected())
36263320SdimIndex: test/DebugInfo/X86/data_member_location.ll
37263320Sdim===================================================================
38263320Sdim--- test/DebugInfo/X86/data_member_location.ll
39263320Sdim+++ test/DebugInfo/X86/data_member_location.ll
40263320Sdim@@ -1,4 +1,5 @@
41263320Sdim ; RUN: llc -mtriple=x86_64-linux -O0 -o - -filetype=obj < %s | llvm-dwarfdump -debug-dump=info -| FileCheck %s
42263320Sdim+; RUN: llc -mtriple=x86_64-linux -dwarf-version=2 -O0 -o - -filetype=obj < %s | llvm-dwarfdump -debug-dump=info -| FileCheck -check-prefix=DWARF2 %s
43263320Sdim 
44263320Sdim ; Generated from Clang with the following source:
45263320Sdim ;
46263320Sdim@@ -11,12 +12,20 @@
47263320Sdim 
48263320Sdim ; CHECK: DW_AT_name {{.*}} "c"
49263320Sdim ; CHECK-NOT: DW_TAG
50263320Sdim-; CHECK: DW_AT_data_member_location {{.*}} (<0x02> 23 00 )
51263320Sdim+; CHECK: DW_AT_data_member_location {{.*}} (0x00)
52263320Sdim 
53263320Sdim ; CHECK: DW_AT_name {{.*}} "i"
54263320Sdim ; CHECK-NOT: DW_TAG
55263320Sdim-; CHECK: DW_AT_data_member_location {{.*}} (<0x02> 23 04 )
56263320Sdim+; CHECK: DW_AT_data_member_location {{.*}} (0x04)
57263320Sdim 
58263320Sdim+; DWARF2: DW_AT_name {{.*}} "c"
59263320Sdim+; DWARF2-NOT: DW_TAG
60263320Sdim+; DWARF2: DW_AT_data_member_location {{.*}} (<0x02> 23 00 )
61263320Sdim+
62263320Sdim+; DWARF2: DW_AT_name {{.*}} "i"
63263320Sdim+; DWARF2-NOT: DW_TAG
64263320Sdim+; DWARF2: DW_AT_data_member_location {{.*}} (<0x02> 23 04 )
65263320Sdim+
66263320Sdim %struct.foo = type { i8, i32 }
67263320Sdim 
68263320Sdim @f = global %struct.foo zeroinitializer, align 4
69263320SdimIndex: test/DebugInfo/X86/concrete_out_of_line.ll
70263320Sdim===================================================================
71263320Sdim--- test/DebugInfo/X86/concrete_out_of_line.ll
72263320Sdim+++ test/DebugInfo/X86/concrete_out_of_line.ll
73263320Sdim@@ -7,7 +7,7 @@
74263320Sdim ; first check that we have a TAG_subprogram at a given offset and it has
75263320Sdim ; AT_inline.
76263320Sdim 
77263320Sdim-; CHECK: 0x0000011e:   DW_TAG_subprogram [17]
78263320Sdim+; CHECK: 0x0000011c:   DW_TAG_subprogram [17]
79263320Sdim ; CHECK-NEXT:     DW_AT_specification
80263320Sdim ; CHECK-NEXT:     DW_AT_inline
81263320Sdim 
82263320Sdim@@ -14,8 +14,8 @@
83263320Sdim 
84263320Sdim ; and then that a TAG_subprogram refers to it with AT_abstract_origin.
85263320Sdim 
86263320Sdim-; CHECK: 0x0000015f:   DW_TAG_subprogram [19]
87263320Sdim-; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4]    (cu + 0x011e => {0x0000011e})
88263320Sdim+; CHECK: 0x0000015d:   DW_TAG_subprogram [19]
89263320Sdim+; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4]    (cu + 0x011c => {0x0000011c})
90263320Sdim 
91263320Sdim define i32 @_ZN17nsAutoRefCnt7ReleaseEv() {
92263320Sdim entry:
93263320SdimIndex: test/DebugInfo/X86/generate-odr-hash.ll
94263320Sdim===================================================================
95263320Sdim--- test/DebugInfo/X86/generate-odr-hash.ll
96263320Sdim+++ test/DebugInfo/X86/generate-odr-hash.ll
97263320Sdim@@ -1,8 +1,5 @@
98263320Sdim ; REQUIRES: object-emission
99263320Sdim 
100263320Sdim-; Fail while investigating problem with non-block representations of member offsets.
101263320Sdim-; XFAIL: *
102263320Sdim-
103263320Sdim ; RUN: llc %s -o %t -filetype=obj -O0 -generate-odr-hash -mtriple=x86_64-unknown-linux-gnu
104263320Sdim ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
105263320Sdim ;
106