aboutsummaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2014-04-15 17:18:20 +0000
committerMark Wielaard <mark@gcc.gnu.org>2014-04-15 17:18:20 +0000
commit25dce5c6fb72b00a31245938fb69fd198e1fe31f (patch)
treeab4a9c02e9c772a47ed327a4916a64ef0d051155 /gcc/dwarf2out.c
parent8d3c076f3ddc11df418af3ac54d28a4a2d19ef3b (diff)
downloadgcc-25dce5c6fb72b00a31245938fb69fd198e1fe31f.zip
gcc-25dce5c6fb72b00a31245938fb69fd198e1fe31f.tar.gz
gcc-25dce5c6fb72b00a31245938fb69fd198e1fe31f.tar.bz2
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
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r--gcc/dwarf2out.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 721f761..0cdb3dc 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -17361,22 +17361,23 @@ gen_enumeration_type_die (tree type, dw_die_ref context_die)
if (simple_type_size_in_bits (TREE_TYPE (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
- always assumes the values are signed, so we output all
- values as if they were signed. That means that
- enumeration constants with very large unsigned values
- will appear to have negative values in the debugger.
-
- TODO: the above comment is wrong, DWARF2 does provide
- DW_FORM_sdata/DW_FORM_udata to represent signed/unsigned data.
- This should be re-worked to use correct signed/unsigned
- int/double tags for all cases, instead of always treating as
- signed. */
- add_AT_int (enum_die, DW_AT_const_value, TREE_INT_CST_LOW (value));
+ {
+ /* For constant forms created by add_AT_unsigned DWARF
+ consumers (GDB, elfutils, etc.) always zero extend
+ the value. Only when the actual value is negative
+ do we need to use add_AT_int to generate a constant
+ form that can represent negative values. */
+ HOST_WIDE_INT val = TREE_INT_CST_LOW (value);
+ if (TYPE_UNSIGNED (TREE_TYPE (value)) || val >= 0)
+ add_AT_unsigned (enum_die, DW_AT_const_value,
+ (unsigned HOST_WIDE_INT) val);
+ else
+ add_AT_int (enum_die, DW_AT_const_value, val);
+ }
else
/* 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,
TREE_INT_CST_HIGH (value), TREE_INT_CST_LOW (value));
}