mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-09 21:50:50 +00:00
Debug Info: Restore the pre-r240853 behavior for DWARF2 bitfields.
The DWARF2 specification of DW_AT_bit_offset is ambiguous for little-endian machines, but by restoring to the old behavior we match what debuggers expect and what other popular compilers generate. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267896 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9ed561fe46
commit
ee1e0438b6
@ -1407,30 +1407,16 @@ void DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) {
|
||||
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;
|
||||
uint64_t HiMark = (Offset + FieldSize) & AlignMask;
|
||||
uint64_t FieldOffset = (HiMark - FieldSize);
|
||||
Offset -= FieldOffset;
|
||||
|
||||
addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, DwarfBitOffset);
|
||||
// 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.
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user