On Fri, Nov 6, 2015 at 2:34 AM, Mike Stump <mikest...@comcast.net> wrote:
> On Nov 5, 2015, at 4:32 AM, Richard Biener <richard.guent...@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);
>  }
>

Reply via email to