Index: lib/CodeGen/AsmPrinter/DwarfUnit.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1407,30 +1407,16 @@ if (DD->getDwarfVersion() >= 4) addUInt(MemberDie, dwarf::DW_AT_data_bit_offset, None, Offset); else { - // - // The DWARF 2 DW_AT_bit_offset is counting the bits between the most - // significant bit of the aligned storage unit containing the bit field - // to - // the most significan bit of the bit field. - // - // Struct Align Align Align - // v v v v - // +-----------+-----*-----+-----*-----+-- - // | ... |b1|b2|b3|b4| - // +-----------+-----*-----+-----*-----+-- - // | | |<-- Size ->| | - // |<---- Offset --->| |<--->| - // | | | \_ DW_AT_bit_offset (little endian) - // | |<--->| - // |<--------->| \_ StartBitOffset = DW_AT_bit_offset (big endian) - // \ = DW_AT_data_bit_offset (biendian) - // \_ OffsetInBytes - // The endian-dependent DWARF 2 offset. - uint64_t DwarfBitOffset = Asm->getDataLayout().isLittleEndian() - ? OffsetToAlignment(Offset + Size, Align) - : StartBitOffset; - - addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, DwarfBitOffset); + uint64_t HiMark = (Offset + FieldSize) & AlignMask; + uint64_t FieldOffset = (HiMark - FieldSize); + Offset -= FieldOffset; + + // Maybe we need to work from the other end. + if (Asm->getDataLayout().isLittleEndian()) + Offset = FieldSize - (Offset + Size); + + addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset); + OffsetInBytes = FieldOffset >> 3; } } else // This is not a bitfield. Index: test/DebugInfo/ARM/bitfield.ll =================================================================== --- test/DebugInfo/ARM/bitfield.ll +++ test/DebugInfo/ARM/bitfield.ll @@ -13,7 +13,7 @@ ; CHECK: DW_AT_name {{.*}} "reserved" ; CHECK: DW_AT_byte_size {{.*}} (0x04) ; CHECK: DW_AT_bit_size {{.*}} (0x1c) -; CHECK: DW_AT_bit_offset {{.*}} (0x18) +; CHECK: DW_AT_bit_offset {{.*}} (0xfffffffffffffff8) ; 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"