Add DW_AT_const_value as unsigned or int depending on type and value used.

As the comment in the code already indicated DWARF2 does provide
DW_FORM_sdata/DW_FORM_udata to represent signed/unsigned data.
Enumeration constants wider than HOST_WIDE_INT are already handled
separately. Those constant values that do fit a HOST_WIDE_INT can
be encoded as signed or unsigned depending on type and value for
more efficient encoding.

	* dwarf2out.c (gen_enumeration_type_die): Add DW_AT_const_value
	as unsigned or int depending on type and value used.

From-SVN: r209424
This commit is contained in:
Mark Wielaard 2014-04-15 17:18:20 +00:00 committed by Mark Wielaard
parent 8d3c076f3d
commit 25dce5c6fb
2 changed files with 20 additions and 14 deletions

View File

@ -1,3 +1,8 @@
2014-03-21 Mark Wielaard <mjw@redhat.com>
* dwarf2out.c (gen_enumeration_type_die): Add DW_AT_const_value
as unsigned or int depending on type and value used.
2014-04-15 Richard Biener <rguenther@suse.de> 2014-04-15 Richard Biener <rguenther@suse.de>
PR rtl-optimization/56965 PR rtl-optimization/56965

View File

@ -17361,22 +17361,23 @@ gen_enumeration_type_die (tree type, dw_die_ref context_die)
if (simple_type_size_in_bits (TREE_TYPE (value)) if (simple_type_size_in_bits (TREE_TYPE (value))
<= HOST_BITS_PER_WIDE_INT || tree_fits_shwi_p (value)) <= HOST_BITS_PER_WIDE_INT || tree_fits_shwi_p (value))
/* DWARF2 does not provide a way of indicating whether or {
not enumeration constants are signed or unsigned. GDB /* For constant forms created by add_AT_unsigned DWARF
always assumes the values are signed, so we output all consumers (GDB, elfutils, etc.) always zero extend
values as if they were signed. That means that the value. Only when the actual value is negative
enumeration constants with very large unsigned values do we need to use add_AT_int to generate a constant
will appear to have negative values in the debugger. form that can represent negative values. */
HOST_WIDE_INT val = TREE_INT_CST_LOW (value);
TODO: the above comment is wrong, DWARF2 does provide if (TYPE_UNSIGNED (TREE_TYPE (value)) || val >= 0)
DW_FORM_sdata/DW_FORM_udata to represent signed/unsigned data. add_AT_unsigned (enum_die, DW_AT_const_value,
This should be re-worked to use correct signed/unsigned (unsigned HOST_WIDE_INT) val);
int/double tags for all cases, instead of always treating as else
signed. */ add_AT_int (enum_die, DW_AT_const_value, val);
add_AT_int (enum_die, DW_AT_const_value, TREE_INT_CST_LOW (value)); }
else else
/* Enumeration constants may be wider than HOST_WIDE_INT. Handle /* Enumeration constants may be wider than HOST_WIDE_INT. Handle
that here. */ that here. TODO: This should be re-worked to use correct
signed/unsigned double tags for all cases. */
add_AT_double (enum_die, DW_AT_const_value, add_AT_double (enum_die, DW_AT_const_value,
TREE_INT_CST_HIGH (value), TREE_INT_CST_LOW (value)); TREE_INT_CST_HIGH (value), TREE_INT_CST_LOW (value));
} }