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"