Emit user subtypes with -fgnat-encodings=minimal
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 23 Jun 2020 15:37:17 +0000 (17:37 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 23 Jun 2020 16:35:45 +0000 (18:35 +0200)
This changes the compiler to emit debug info for user-defined subtypes
with -fgnat-encodings=minimal, as they might be needed by the debugger.

gcc/ada/ChangeLog:
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: Set
debug type to the base type and only if the subtype is artificial.

gcc/ada/gcc-interface/decl.c

index 33d59d556a2bb8b2cecc2c8823471b745697c063..589154ba392703641a1d8dc2ba33ef7aea846996 100644 (file)
@@ -3507,18 +3507,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
 
              gnu_type = make_node (RECORD_TYPE);
              TYPE_NAME (gnu_type) = gnu_entity_name;
-             if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
-               {
-                 /* Use the ultimate base record type as the debug type.
-                    Subtypes and derived types bring no useful
-                    information.  */
-                 Entity_Id gnat_debug_type = gnat_entity;
-                 while (Etype (gnat_debug_type) != gnat_debug_type)
-                   gnat_debug_type = Etype (gnat_debug_type);
-                 tree gnu_debug_type
-                   = TYPE_MAIN_VARIANT (gnat_to_gnu_type (gnat_debug_type));
-                 SET_TYPE_DEBUG_TYPE (gnu_type, gnu_debug_type);
-               }
              TYPE_PACKED (gnu_type) = TYPE_PACKED (gnu_base_type);
              TYPE_REVERSE_STORAGE_ORDER (gnu_type)
                = Reverse_Storage_Order (gnat_entity);
@@ -3580,6 +3568,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
                                         true, debug_info_p,
                                         NULL, gnat_entity);
                }
+
+             /* Or else, if the subtype is artificial and encodings are not
+                used, use the base record type as the debug type.  */
+             else if (debug_info_p
+                      && artificial_p
+                      && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
+               SET_TYPE_DEBUG_TYPE (gnu_type, gnu_unpad_base_type);
            }
 
          /* Otherwise, go down all the components in the new type and make