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

Robinson, Paul via llvm-commits llvm-commits at lists.llvm.org
Tue May 17 16:00:22 PDT 2016



> -----Original Message-----
> From: aprantl at apple.com [mailto:aprantl at apple.com]
> Sent: Tuesday, May 17, 2016 2:14 PM
> To: Adrian Prantl
> Cc: Robinson, Paul; llvm-commits at lists.llvm.org
> Subject: Re: [llvm] r269827 - Debug Info: Don't emit bitfields in the
> DWARF4 format when tuning for GDB.
> 
> 
> > 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).
Done in r269859.
--paulr

> >
> > -- 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