mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
8d3c076f3d
commit
25dce5c6fb
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue