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
>From 9b31876c85248817a62d78e1fb7133f610b6555f Mon Sep 17 00:00:00 2001 From: Pierre-Marie de Rodat <dero...@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