diff mbox

[ping] Fix PR debug/66728

Message ID 8D9ED969-8205-45E2-A6FD-3040ECF97E81@comcast.net
State New
Headers show

Commit Message

Mike Stump Nov. 6, 2015, 1:34 a.m. UTC
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?

Comments

Richard Biener Nov. 6, 2015, 1:06 p.m. UTC | #1
On Fri, Nov 6, 2015 at 2:34 AM, Mike Stump <mikestump@comcast.net> wrote:
> 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?

Ok with a changelog entry and bootstrap/regtest.

Thanks,
Richard.

>
> 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);
>  }
>
Mike Stump Nov. 9, 2015, 6:45 p.m. UTC | #2
On Nov 6, 2015, at 5:06 AM, Richard Biener <richard.guenther@gmail.com> wrote:
>> 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?
> 
> Ok with a changelog entry and bootstrap/regtest.

Also committed to the release branch after waiting a few days to ensure no issue on trunk after the normal regression test and bootstrap.
diff mbox

Patch

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);
 }