re PR debug/71669 (DW_AT_data_bit_offset is not emitted for dwarf4 and above)
authorJakub Jelinek <jakub@redhat.com>
Tue, 17 Jan 2017 17:42:06 +0000 (18:42 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 17 Jan 2017 17:42:06 +0000 (18:42 +0100)
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.

From-SVN: r244542

gcc/ChangeLog
gcc/dwarf2out.c

index d63b83fbd9b249af69f1869c49cca45ecb93c777..25e8f72872d36a60abcc8eef3d2fa9532987d8f1 100644 (file)
@@ -1,3 +1,11 @@
+2017-01-17  Jakub Jelinek  <jakub@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.
+
 2017-01-17  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/rs6000/rs6000.c (rs6000_emit_move): Also use a TOC reference
index d3b268ad037ea756141b6defa3dbe1ee7b1fc901..19f7f656572a02f48d98722bf768ce0860685e11 100644 (file)
@@ -18272,6 +18272,23 @@ add_data_member_location_attribute (dw_die_ref die,
 
   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. */