From: Adrian Prantl Date: Sat, 27 Jun 2015 21:55:00 +0000 (+0000) Subject: Revert "Debug Info: One more bitfield bugfix. While yesterday's r240853 fixed" X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1e7ecc8e573f816a6f14a89e157e2def6902bc63;p=oota-llvm.git Revert "Debug Info: One more bitfield bugfix. While yesterday's r240853 fixed" This reverts commit 240890. Breaking the gdb buildbot. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240893 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index ca9951eda42..98a224787d5 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1361,29 +1361,24 @@ void DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) { // | ... |b1|b2|b3|b4| // +-----------+-----*-----+-----*-----+-- // | | |<-- Size ->| | - // |<---- Offset --->| | |<--->| - // | | | | \_ DW_AT_bit_offset (little endian) - // | |<--->| | - // |<--big-e.->| \_ StartBitOffset = DW_AT_bit_offset (big endian) - // | ^ | = DW_AT_data_bit_offset (biendian) - // | OffsetInBytes | - // | v | - // |<----little-endian---->| + // |<---- Offset --->| |<--->| + // | | | \_ DW_AT_bit_offset (little endian) + // | |<--->| + // |<--------->| \_ StartBitOffset = DW_AT_bit_offset (big endian) + // \ = DW_AT_data_bit_offset (biendian) + // \_ OffsetInBytes uint64_t Offset = DT->getOffsetInBits(); uint64_t Align = DT->getAlignInBits() ? DT->getAlignInBits() : FieldSize; uint64_t AlignMask = ~(Align - 1); // The bits from the start of the storage unit to the start of the field. uint64_t StartBitOffset = Offset - (Offset & AlignMask); - // OffsetInBytes is the byte offset of the field's aligned storage unit - // inside the struct. - uint64_t DwarfBitOffset; - if (Asm->getDataLayout().isLittleEndian()) { - DwarfBitOffset = OffsetToAlignment(Offset + Size, Align); - OffsetInBytes = ((Offset + Size) & AlignMask) / 8; - } else { - DwarfBitOffset = StartBitOffset; - OffsetInBytes = (Offset - StartBitOffset) / 8; - } + // The endian-dependent DWARF 2 offset. + uint64_t DwarfBitOffset = Asm->getDataLayout().isLittleEndian() + ? OffsetToAlignment(Offset + Size, Align) + : StartBitOffset; + + // The byte offset of the field's aligned storage unit inside the struct. + OffsetInBytes = (Offset - StartBitOffset) / 8; addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, DwarfBitOffset); } else // This is not a bitfield. diff --git a/test/DebugInfo/ARM/bitfield.ll b/test/DebugInfo/ARM/bitfield.ll index 8f9d95d364e..9b41e4e4f7b 100644 --- a/test/DebugInfo/ARM/bitfield.ll +++ b/test/DebugInfo/ARM/bitfield.ll @@ -14,7 +14,7 @@ ; CHECK: DW_AT_byte_size {{.*}} (0x04) ; CHECK: DW_AT_bit_size {{.*}} (0x1c) ; CHECK: DW_AT_bit_offset {{.*}} (0x18) -; CHECK: DW_AT_data_member_location {{.*}}04 +; CHECK: DW_AT_data_member_location {{.*}}00 target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" target triple = "thumbv7-apple-ios"