Tested on x86_64-suse-linux, applied on the mainline.

2017-09-09  Pierre-Marie de Rodat  <dero...@adacore.com>

        * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>: Don't
        generate debug info for inner record types if -fgnat-encodings=minimal
        (gnat_to_gnu_entity) <E_Record_Subtype>: Use the ultimate base record
        type as the debug type.


2017-09-09  Pierre-Marie de Rodat  <dero...@adacore.com>

        * gnat.dg/debug14.adb: New test.

-- 
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 251936)
+++ gcc-interface/decl.c	(working copy)
@@ -3308,10 +3308,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	      = build_subst_list (gnat_entity, gnat_parent_type, definition);
 
 	    /* Set the layout of the type to match that of the parent type,
-	       doing required substitutions.  */
-	    copy_and_substitute_in_layout (gnat_entity, gnat_parent_type,
-					   gnu_type, gnu_parent_type,
-					   gnu_subst_list, debug_info_p);
+	       doing required substitutions.  If we are in minimal GNAT
+	       encodings mode, we don't need debug info for the inner record
+	       types, as they will be part of the embedding variant record's
+	       debug info.  */
+	    copy_and_substitute_in_layout
+	      (gnat_entity, gnat_parent_type, gnu_type, gnu_parent_type,
+	       gnu_subst_list,
+	       debug_info_p && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL);
 	  }
 	else
 	  {
@@ -3439,7 +3443,17 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	      gnu_type = make_node (RECORD_TYPE);
 	      TYPE_NAME (gnu_type) = gnu_entity_name;
 	      if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
-		SET_TYPE_DEBUG_TYPE (gnu_type, gnu_base_type);
+		{
+		  /* 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);
-- { dg-do compile }
-- { dg-options "-g -fgnat-encodings=minimal" }

procedure Debug14 is

  type Db_Kind_T is (Raw, Relational, Object);

  type Db_Model_T (Kind : Db_Kind_T) is
    record

      case Kind is

        when Raw =>
          Fs_Type : Integer;

        when Relational | Object =>
          Vendor_Id : Integer;

          case Kind is
            when Relational =>
              N_Tables : Integer;

            when others =>
              null;
          end case;

      end case;

    end record;

  type Raw_Db_T is new Db_Model_T (Kind => Raw);
  type Raw_Db_P is access Raw_Db_T;

  Db : Raw_Db_P := new Raw_Db_T;

begin
  null;
end;

Reply via email to