[llvm] r269827 - Debug Info: Don't emit bitfields in the DWARF4 format when tuning for GDB.

Adrian Prantl via llvm-commits llvm-commits at lists.llvm.org
Tue May 17 14:13:51 PDT 2016


> On May 17, 2016, at 1:55 PM, Adrian Prantl via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
>> 
>> On May 17, 2016, at 1:54 PM, Robinson, Paul <paul.robinson at sony.com> wrote:
>> 
>> 
>> 
>>> -----Original Message-----
>>> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf
>>> Of Adrian Prantl via llvm-commits
>>> Sent: Tuesday, May 17, 2016 1:12 PM
>>> To: llvm-commits at lists.llvm.org
>>> Subject: [llvm] r269827 - Debug Info: Don't emit bitfields in the DWARF4
>>> format when tuning for GDB.
>>> 
>>> Author: adrian
>>> Date: Tue May 17 15:12:08 2016
>>> New Revision: 269827
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=269827&view=rev
>>> Log:
>>> Debug Info: Don't emit bitfields in the DWARF4 format when tuning for GDB.
>>> As discovered in PR27758, GDB does not fully support the DWARF 4 format.
>>> This patch ensures we always emit bitfields in the DWARF 2 when tuning for
>>> GDB.
>>> 
>>> Modified:
>>>   llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>>   llvm/trunk/test/DebugInfo/ARM/big-endian-bitfield.ll
>>>   llvm/trunk/test/DebugInfo/X86/bitfields-dwarf4.ll
>>> 
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>> URL: http://llvm.org/viewvc/llvm-
>>> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=269827&r1=2698
>>> 26&r2=269827&view=diff
>>> ==========================================================================
>>> ====
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Tue May 17 15:12:08
>>> 2016
>>> @@ -1390,10 +1390,14 @@ void DwarfUnit::constructMemberDIE(DIE &
>>>    uint64_t Size = DT->getSizeInBits();
>>>    uint64_t FieldSize = getBaseTypeSize(DD, DT);
>>>    uint64_t OffsetInBytes;
>>> +
>>> +    // GDB does not fully support the DWARF 4 representation for
>>> bitfields.
>>> +    bool EmitDWARF2Bitfields = (DD->getDwarfVersion() < 4) || (DD-
>>>> tuneForGDB());
>> 
>> Up to now, all tuneForXXX() queries have been in the DwarfDebug ctor
>> and a flag like EmitDWARF2Bitfields would have been a DwarfDebug bool.
>> The idea was that tuning should unpack into other flags, and we would
>> not have a proliferating set of tuning checks all over everywhere.
>> Would you mind making EmitDWARF2Bitfields work this way?
> 
> Will do so right away.
r269840.
-- adrian


>> 
>> Probably I should have made the tuneForXXX() methods private, to
>> reinforce the principle.
> 
> Sounds like a good idea to do this (as soon as I landed my change).
> 
> -- adrian
> 
>> Thanks,
>> --paulr
>> 
>>>    bool IsBitfield = FieldSize && Size != FieldSize;
>>> +
>>>    if (IsBitfield) {
>>>      // Handle bitfield, assume bytes are 8 bits.
>>> -      if (DD->getDwarfVersion() < 4)
>>> +      if (EmitDWARF2Bitfields)
>>>        addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
>>>      addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
>>> 
>>> @@ -1405,9 +1409,7 @@ void DwarfUnit::constructMemberDIE(DIE &
>>>      // The byte offset of the field's aligned storage unit inside the
>>> struct.
>>>      OffsetInBytes = (Offset - StartBitOffset) / 8;
>>> 
>>> -      if (DD->getDwarfVersion() >= 4)
>>> -        addUInt(MemberDie, dwarf::DW_AT_data_bit_offset, None, Offset);
>>> -      else {
>>> +      if (EmitDWARF2Bitfields) {
>>>        uint64_t HiMark = (Offset + FieldSize) & AlignMask;
>>>        uint64_t FieldOffset = (HiMark - FieldSize);
>>>        Offset -= FieldOffset;
>>> @@ -1418,17 +1420,20 @@ void DwarfUnit::constructMemberDIE(DIE &
>>> 
>>>        addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
>>>        OffsetInBytes = FieldOffset >> 3;
>>> +      } else {
>>> +        addUInt(MemberDie, dwarf::DW_AT_data_bit_offset, None, Offset);
>>>      }
>>> -    } else
>>> +    } else {
>>>      // This is not a bitfield.
>>>      OffsetInBytes = DT->getOffsetInBits() / 8;
>>> +    }
>>> 
>>>    if (DD->getDwarfVersion() <= 2) {
>>>      DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc;
>>>      addUInt(*MemLocationDie, dwarf::DW_FORM_data1,
>>> dwarf::DW_OP_plus_uconst);
>>>      addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
>>>      addBlock(MemberDie, dwarf::DW_AT_data_member_location,
>>> MemLocationDie);
>>> -    } else if (!IsBitfield || DD->getDwarfVersion() < 4)
>>> +    } else if (!IsBitfield || EmitDWARF2Bitfields)
>>>      addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
>>>              OffsetInBytes);
>>>  }
>>> 
>>> Modified: llvm/trunk/test/DebugInfo/ARM/big-endian-bitfield.ll
>>> URL: http://llvm.org/viewvc/llvm-
>>> project/llvm/trunk/test/DebugInfo/ARM/big-endian-
>>> bitfield.ll?rev=269827&r1=269826&r2=269827&view=diff
>>> ==========================================================================
>>> ====
>>> --- llvm/trunk/test/DebugInfo/ARM/big-endian-bitfield.ll (original)
>>> +++ llvm/trunk/test/DebugInfo/ARM/big-endian-bitfield.ll Tue May 17
>>> 15:12:08 2016
>>> @@ -1,4 +1,4 @@
>>> -; RUN: llc -O0 -filetype=obj -mtriple=armeb-none-linux %s -o - \
>>> +; RUN: llc -O0 -filetype=obj -mtriple=armeb-none-freebsd -debugger-
>>> tune=lldb %s -o - \
>>> ; RUN: | llvm-dwarfdump --debug-dump=info - | FileCheck %s
>>> ; Generated from:
>>> ;   struct S {
>>> 
>>> Modified: llvm/trunk/test/DebugInfo/X86/bitfields-dwarf4.ll
>>> URL: http://llvm.org/viewvc/llvm-
>>> project/llvm/trunk/test/DebugInfo/X86/bitfields-
>>> dwarf4.ll?rev=269827&r1=269826&r2=269827&view=diff
>>> ==========================================================================
>>> ====
>>> --- llvm/trunk/test/DebugInfo/X86/bitfields-dwarf4.ll (original)
>>> +++ llvm/trunk/test/DebugInfo/X86/bitfields-dwarf4.ll Tue May 17 15:12:08
>>> 2016
>>> @@ -1,5 +1,8 @@
>>> ; RUN: llc -mtriple x86_64-apple-macosx -O0 -filetype=obj -o - %s \
>>> ; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck %s
>>> +; RUN: llc -mtriple x86_64-gnu-linux -O0 -filetype=obj -o - %s \
>>> +; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck %s --check-
>>> prefix=LINUX
>>> +; LINUX-NOT: DW_AT_data_bit_offset
>>> ;
>>> ; Generated from:
>>> ;   #include <stdint.h>
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list