[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 13:12:09 PDT 2016


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=269826&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());
     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>




More information about the llvm-commits mailing list