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

login
register
mail settings
Submitter Mark Wielaard
Date March 23, 2014, 11:17 a.m.
Message ID <1395573430-21207-1-git-send-email-mjw@redhat.com>
Download mbox | patch
Permalink /patch/332880/
State New
Headers show

Comments

Mark Wielaard - March 23, 2014, 11:17 a.m.
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.
---
 gcc/ChangeLog   |    5 +++++
 gcc/dwarf2out.c |   21 ++++++++-------------
 2 files changed, 13 insertions(+), 13 deletions(-)

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8a31187..f3b4f2d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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-03-20  Mark Wielaard  <mjw@redhat.com>
 
 	* dwarf2out.c (add_bound_info): If HOST_WIDE_INT is big enough,
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 9f8b3b0..af97408 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -17364,19 +17364,14 @@  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));
+	    {
+	      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.  */