This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] DWARF: make signedness explicit for enumerator const values
- From: Pierre-Marie de Rodat <derodat at adacore dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: Mark Wielaard <mark at klomp dot org>, Eric Botcazou <ebotcazou at adacore dot com>, gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 2 Jan 2017 18:24:43 +0100
- Subject: Re: [PATCH] DWARF: make signedness explicit for enumerator const values
- Authentication-results: sourceware.org; auth=none
- References: <20161013161201.10521-1-derodat@adacore.com> <1478781484.14569.131.camel@klomp.org> <4650aad8-9d49-3924-ffb2-77c42e19e870@adacore.com> <1479125116.14569.234.camel@klomp.org> <3aafd2e8-720a-8cb9-21f6-a718966c7e38@adacore.com> <21ef1b1d-ca1e-4881-c51a-e48ee046ea68@adacore.com> <1481288408.14558.20.camel@klomp.org> <fc54343b-506d-0add-f495-2cba1db0deae@adacore.com> <CADzB+2=R04pM8k4K40v+82xJ6wfi6fdLaFd7C0Ceey=GTbRJMA@mail.gmail.com>
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 <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