[ping] Fix PR debug/66728

Mike Stump mikestump@comcast.net
Fri Nov 6 01:35:00 GMT 2015


On Nov 5, 2015, at 4:32 AM, Richard Biener <richard.guenther@gmail.com> wrote:
> No idea on location lists but maybe this means we should just use the
> maximum supported integer mode for CONST_WIDE_INTs?

Ah, yeah, that sounds like a fine idea.  Below is that version.  I snuck in one more change, as it was annoying me, and it is a regression from gcc-4.8.  It has this effect:

@@ -55,7 +55,7 @@ test:
        .long   0x72    # DW_AT_type
        .byte   0x10
        .quad   0       # DW_AT_const_value
-       .quad   0x8000000000000000      # (null)
+       .quad   0x8000000000000000      # 
        .byte   0       # end of children of DIE 0x2d
        .uleb128 0x4    # (DIE (0x6b) DW_TAG_base_type)
        .byte   0x10    # DW_AT_byte_size

This version has the added benefit of reducing all wide_ints to be so shortened.  We do this by changing get_full_len, which changes the world.

If there are no substantial reasons to not check it in now, I’d like to proceed and get it checked in.  People can refine it further in tree if they want.  Any objections?


Index: dwarf2out.c
===================================================================
--- dwarf2out.c	(revision 229720)
+++ dwarf2out.c	(working copy)
@@ -368,12 +368,14 @@
 #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,7 +9012,7 @@
 		{
 		  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)
@@ -9017,7 +9019,7 @@
 		{
 		  dw2_asm_output_data (l, a->dw_attr_val.v.val_wide->elt (i),
 				       "%s", name);
-		  name = NULL;
+		  name = "";
 		}
 	  }
 	  break;
@@ -15593,8 +15595,13 @@
       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: rtl.h
===================================================================
--- rtl.h	(revision 229720)
+++ rtl.h	(working copy)
@@ -2086,6 +2086,7 @@
 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);
 }
 



More information about the Gcc-patches mailing list