re PR debug/66728 (CONST_WIDE_INT causes corrupted DWARF debug info)

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
This commit is contained in:
Mike Stump 2015-11-06 20:16:06 +00:00 committed by Mike Stump
parent 8a64515099
commit a881fb0c2c
3 changed files with 26 additions and 6 deletions

View 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"

View 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:

View File

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