diff mbox

DWARF: make signedness explicit for enumerator const values

Message ID 389ade79-ed46-f339-5268-41074da5dc14@adacore.com
State New
Headers show

Commit Message

Pierre-Marie de Rodat Jan. 2, 2017, 5:24 p.m. UTC
On 12/09/2016 03:06 PM, Jason Merrill wrote:
> I think it's fine guarded by !dwarf_strict; most consumers should

> happily ignore it if they don't know what to do with it.


Thank you for your feedback! This ultimate patch is much smaller. :-) 
Still bootstrapped and tested successfuly on x86_64-linux (GCC+GDB).

-- 
Pierre-Marie de Rodat

Comments

Jakub Jelinek Jan. 2, 2017, 5:29 p.m. UTC | #1
On Mon, Jan 02, 2017 at 06:24:43PM +0100, Pierre-Marie de Rodat wrote:
> --- a/gcc/dwarf2out.c

> +++ b/gcc/dwarf2out.c

> @@ -20930,6 +20930,11 @@ gen_enumeration_type_die (tree type, dw_die_ref context_die)

>  	  if (ENUM_IS_OPAQUE (type))

>  	    add_AT_flag (type_die, DW_AT_declaration, 1);

>  	}

> +      if (!dwarf_strict)

> +	add_AT_unsigned (type_die, DW_AT_encoding,

> +			 (TYPE_UNSIGNED (type))


Just a formatting nit, TYPE_UNSIGNED (type) doesn't need to be wrapped in
()s.  No need to repost.

> +			 ? DW_ATE_unsigned

> +			 : DW_ATE_signed);

>      }

>    else if (! TYPE_SIZE (type))

>      return type_die;


	Jakub
Pierre-Marie de Rodat Jan. 3, 2017, 8:55 a.m. UTC | #2
On 01/02/2017 06:29 PM, Jakub Jelinek wrote:
> Just a formatting nit, TYPE_UNSIGNED (type) doesn't need to be wrapped in

> ()s.  No need to repost.


Done and committed as r244015. Thank you!

-- 
Pierre-Marie de Rodat
diff mbox

Patch

From 9b31876c85248817a62d78e1fb7133f610b6555f Mon Sep 17 00:00:00 2001
From: Pierre-Marie de Rodat <derodat@adacore.com>
Date: Mon, 19 Dec 2016 16:01:52 +0100
Subject: [PATCH] DWARF: add DW_AT_encoding attributes for
 DW_TAG_enumeration_type DIEs

Currently, the DWARF description does not specify the signedness of the
representation of enumeration types.  This is a problem in some
contexts where DWARF consumers need to determine if value X is greater
than value Y.

For instance in Ada:

    type Enum_Type is ( A, B, C, D);
    for Enum_Type use (-1, 0, 1, 2);

    type Rec_Type (E : Enum_Type) is record
       when A .. B => null;
       when others => B : Booleann;
    end record;

The above can be described in DWARF the following way:

    DW_TAG_enumeration_type(Enum_Type)
    | DW_AT_byte_size: 1
      DW_TAG_enumerator(A)
      | DW_AT_const_value: -1
      DW_TAG_enumerator(B)
      | DW_AT_const_value: 0
      DW_TAG_enumerator(C)
      | DW_AT_const_value: 1
      DW_TAG_enumerator(D)
      | DW_AT_const_value: 2

    DW_TAG_structure_type(Rec_Type)
      DW_TAG_member(E)
      | DW_AT_type: <Enum_Type>
      DW_TAG_variant_part
      | DW_AT_discr: <E>
        DW_TAG_variant
        | DW_AT_discr_list: DW_DSC_range 0x7f 0
        DW_TAG_variant
        | DW_TAG_member(b)

DWARF consumers need to know that enumerators (A, B, C and D) are signed
in order to determine the set of E values for which Rec_Type has a B
field.  In practice, they need to know how to interpret the 0x7f LEB128
number above (-1, not 127).

When in non-strict DWARF mode, this patch adds a DW_AT_encoding
attribute to generated DW_TAG_enumeration_type DIEs to make this
signedness explicit.

gcc/

	* dwarf2out.c (gen_enumeration_type_die): When
	-gno-strict-dwarf, add a DW_AT_encoding attribute.
---
 gcc/dwarf2out.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 8dc85237288..7080ea5f12d 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -20930,6 +20930,11 @@  gen_enumeration_type_die (tree type, dw_die_ref context_die)
 	  if (ENUM_IS_OPAQUE (type))
 	    add_AT_flag (type_die, DW_AT_declaration, 1);
 	}
+      if (!dwarf_strict)
+	add_AT_unsigned (type_die, DW_AT_encoding,
+			 (TYPE_UNSIGNED (type))
+			 ? DW_ATE_unsigned
+			 : DW_ATE_signed);
     }
   else if (! TYPE_SIZE (type))
     return type_die;
-- 
2.11.0