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