[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 13:54:53 PDT 2016



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

Probably I should have made the tuneForXXX() methods private, to
reinforce the principle.
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


More information about the llvm-commits mailing list