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