https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71668

            Bug ID: 71668
           Summary: certain bitfields get negative DW_AT_bit_offset
           Product: gcc
           Version: 5.3.0
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: richlowe at richlowe dot net
  Target Milestone: ---

Created attachment 38770
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=38770&action=edit
test case source

The DWARF for certain structures, at least when using -gdwarf-2, seems to emit
with a signed, negative, bitoffset.  I'm not sure whether that's valid, but
it's causing some of our tools to choke and since it seems to happen in such a
narrow range of circumstances it seems to be, at the least, suspicious.  The
DWARF standards seem to have little to say on the matter.

It appears to happen when a bitfield structure is between 33 and 39 bits in
size, and at no other time I've been able to determine (a large source tree
contains only a single instance of the problem, from which this test case was
reduced).  Perhaps something is off-by-one on the number of bytes somewhere?

My apologies if this behaviour is correct.

I'm attaching a test file, the following diff shows the dwarfdump between a
good and bad sized version of the bitfield:

--- good.dwarf  2016-06-26 18:40:52.582216186 +0100
+++ bad.dwarf   2016-06-26 18:41:09.862679856 +0100
@@ -23,8 +23,8 @@
                         DW_AT_decl_line             0x00000004
                         DW_AT_type                  <0x00000050>
                         DW_AT_byte_size             0x00000004
-                        DW_AT_bit_size              0x00000008
-                        DW_AT_bit_offset            0x00000018
+                        DW_AT_bit_size              0x00000007
+                        DW_AT_bit_offset            0x00000019
                         DW_AT_data_member_location  DW_OP_plus_uconst 0
 < 2><0x0000003e>      DW_TAG_member
                         DW_AT_name                  "csts_cfs"
@@ -33,8 +33,8 @@
                         DW_AT_type                  <0x00000050>
                         DW_AT_byte_size             0x00000004
                         DW_AT_bit_size              0x00000020
-                        DW_AT_bit_offset            0x00000000
-                        DW_AT_data_member_location  DW_OP_plus_uconst 1
+                        DW_AT_bit_offset            0xfffffffffffffff9
+                        DW_AT_data_member_location  DW_OP_plus_uconst 0
 < 1><0x00000050>    DW_TAG_base_type
                       DW_AT_byte_size             0x00000004
                       DW_AT_encoding              DW_ATE_unsigned

Reply via email to