DWARF: add DW_AT_encoding attributes for DW_TAG_enumeration_type DIEs
authorPierre-Marie de Rodat <derodat@adacore.com>
Tue, 3 Jan 2017 08:54:57 +0000 (08:54 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 3 Jan 2017 08:54:57 +0000 (08:54 +0000)
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.

From-SVN: r244015

gcc/ChangeLog
gcc/dwarf2out.c

index af5185a7e652f7a56b66a6e314f90b56dec0c046..2182cff225d9dc6cd81f255fe7254c561ad864f9 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-03  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+       * dwarf2out.c (gen_enumeration_type_die): When
+       -gno-strict-dwarf, add a DW_AT_encoding attribute.
+
 2017-01-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/78965
index edb71692033dedde10991ab554d34dfedd157474..15b9a30a3072f2393a657f9429ee96b55a2794ec 100644 (file)
@@ -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;