re PR debug/66728 (CONST_WIDE_INT causes corrupted DWARF debug info)
authorMike Stump <mikestump@comcast.net>
Fri, 6 Nov 2015 20:16:06 +0000 (20:16 +0000)
committerMike Stump <mrs@gcc.gnu.org>
Fri, 6 Nov 2015 20:16:06 +0000 (20:16 +0000)
PR debug/66728
* dwarf2out.c (get_full_len): Return a value based upon the actual
precision needed for the value.
(add_const_value_attribute): Use a maximal wide-int for
CONST_WIDE_INTs, not VOIDmode.
(output_die): Don't ever output NULL with printf.

* rtl.h (get_precision of rtx_mode_t): Ensure we never process
BLKmode nor VOIDmode values.

From-SVN: r229885

gcc/ChangeLog
gcc/dwarf2out.c
gcc/rtl.h

index 7b922364abce1a070035563c1159109c750c52da..6756e356cf95b961dc74211b96491d4980ceb43b 100644 (file)
@@ -1,3 +1,15 @@
+2015-11-06  Mike Stump  <mikestump@comcast.net>
+
+       PR debug/66728
+       * dwarf2out.c (get_full_len): Return a value based upon the actual
+       precision needed for the value.
+       (add_const_value_attribute): Use a maximal wide-int for
+       CONST_WIDE_INTs, not VOIDmode.
+       (output_die): Don't ever output NULL with printf.
+
+       * rtl.h (get_precision of rtx_mode_t): Ensure we never process
+       BLKmode nor VOIDmode values.
+
 2015-11-06  David Malcolm  <dmalcolm@redhat.com>
 
        * diagnostic-color.c (color_dict): Eliminate "caret"; add "range1"
index 9ce3f0921fcf683df4ef36ffb8df3172a1779ef7..48c22082b440f8aaa824b2670049141cdb169e9c 100644 (file)
@@ -368,12 +368,14 @@ dump_struct_debug (tree type, enum debug_info_usage usage,
 #endif
 
 /* Get the number of HOST_WIDE_INTs needed to represent the precision
-   of the number.  */
+   of the number.  Some constants have a large uniform precision, so
+   we get the precision needed for the actual value of the number.  */
 
 static unsigned int
 get_full_len (const wide_int &op)
 {
-  return ((op.get_precision () + HOST_BITS_PER_WIDE_INT - 1)
+  int prec = wi::min_precision (op, UNSIGNED);
+  return ((prec + HOST_BITS_PER_WIDE_INT - 1)
          / HOST_BITS_PER_WIDE_INT);
 }
 
@@ -9010,14 +9012,14 @@ output_die (dw_die_ref die)
                {
                  dw2_asm_output_data (l, a->dw_attr_val.v.val_wide->elt (i),
                                       "%s", name);
-                 name = NULL;
+                 name = "";
                }
            else
              for (i = 0; i < len; ++i)
                {
                  dw2_asm_output_data (l, a->dw_attr_val.v.val_wide->elt (i),
                                       "%s", name);
-                 name = NULL;
+                 name = "";
                }
          }
          break;
@@ -15593,8 +15595,13 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
       return true;
 
     case CONST_WIDE_INT:
-      add_AT_wide (die, DW_AT_const_value,
-                  std::make_pair (rtl, GET_MODE (rtl)));
+      {
+       wide_int w1 = std::make_pair (rtl, MAX_MODE_INT);
+       unsigned int prec = MIN (wi::min_precision (w1, UNSIGNED),
+                                (unsigned int)CONST_WIDE_INT_NUNITS (rtl) * HOST_BITS_PER_WIDE_INT);
+       wide_int w = wi::zext (w1, prec);
+       add_AT_wide (die, DW_AT_const_value, w);
+      }
       return true;
 
     case CONST_DOUBLE:
index fe081ed308538957fdfbb5739eef01e1578630c3..194ed9ba9591bbae16ed06ed407420299349532f 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2086,6 +2086,7 @@ namespace wi
 inline unsigned int
 wi::int_traits <rtx_mode_t>::get_precision (const rtx_mode_t &x)
 {
+  gcc_checking_assert (x.second != BLKmode && x.second != VOIDmode);
   return GET_MODE_PRECISION (x.second);
 }