Hi!

While DW_AT_data_bit_offset has been introduced already in DWARF4, GDB only
gained support for it last November, so I think it is better to enable this
only for -gdwarf-5 for now and we can reconsider it in a year or two.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2017-01-12  Jakub Jelinek  <ja...@redhat.com>

        PR debug/71669
        * dwarf2out.c (add_data_member_location_attribute): For constant
        offset bitfield emit for -gdwarf-5 DW_AT_data_bit_offset attribute
        instead of DW_AT_data_member_location, DW_AT_bit_offset and
        DW_AT_byte_size attributes.

--- gcc/dwarf2out.c.jj  2017-01-11 19:05:15.000000000 +0100
+++ gcc/dwarf2out.c     2017-01-12 15:08:29.842773537 +0100
@@ -18272,6 +18272,23 @@ add_data_member_location_attribute (dw_d
 
   if (! loc_descr)
     {
+      /* While DW_AT_data_bit_offset has been added already in DWARF4,
+        e.g. GDB only added support to it in November 2016.  For DWARF5
+        we need newer debug info consumers anyway.  We might change this
+        to dwarf_version >= 4 once most consumers catched up.  */
+      if (dwarf_version >= 5
+         && TREE_CODE (decl) == FIELD_DECL
+         && DECL_BIT_FIELD_TYPE (decl))
+       {
+         tree off = bit_position (decl);
+         if (tree_fits_uhwi_p (off) && get_AT (die, DW_AT_bit_size))
+           {
+             remove_AT (die, DW_AT_byte_size);
+             remove_AT (die, DW_AT_bit_offset);
+             add_AT_unsigned (die, DW_AT_data_bit_offset, tree_to_uhwi (off));
+             return;
+           }
+       }
       if (dwarf_version > 2)
        {
          /* Don't need to output a location expression, just the constant. */

        Jakub

Reply via email to