Commit 25dce5c6 by Mark Wielaard Committed by Mark Wielaard

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
parent 8d3c076f
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
......
...@@ -17361,22 +17361,23 @@ gen_enumeration_type_die (tree type, dw_die_ref context_die) ...@@ -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));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment