[Ada] Fix missing resolution data for secondary dispatch table with LTO

Message ID 7080761.FJBPJFtf4a@polaris
State New
Headers show
  • [Ada] Fix missing resolution data for secondary dispatch table with LTO
Related show

Commit Message

Eric Botcazou June 12, 2018, 10:20 a.m.
Dispatch tables are implemented the same way as in the C++ front-end, i.e. by 
importing and then exporting them to break the inherent circularity.  There 
was a glitch in gigi that was preventing the two views from being merged in 
the case of secondary dispatch tables in LTO mode.

Fixed thusly, tested on x86-64/Linux, applied on mainline, 8 and 7 branches.

2018-06-12  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Constant>: Do not get
	the expression of a dispatch table that is not being defined.
	<E_Record_Subtype>: Remove obsolete kludge.


Index: gcc-interface/decl.c
--- gcc-interface/decl.c	(revision 261480)
+++ gcc-interface/decl.c	(working copy)
@@ -603,13 +603,18 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
       /* If we have a constant that we are not defining, get the expression it
 	 was defined to represent.  This is necessary to avoid generating dumb
 	 elaboration code in simple cases, but we may throw it away later if it
-	 is not a constant.  But do not retrieve it if it is an allocator since
+	 is not a constant.  But do not do it for dispatch tables because they
+	 are only referenced indirectly and we need to have a consistent view
+	 of the exported and of the imported declarations of the tables from
+	 external units for them to be properly merged in LTO mode.  Moreover
+	 simply do not retrieve the expression it if it is an allocator since
 	 the designated type might still be dummy at this point.  Note that we
 	 invoke gnat_to_gnu_external and not gnat_to_gnu because the expression
 	 may contain N_Expression_With_Actions nodes and thus declarations of
 	 objects from other units that we need to discard.  */
       if (!definition
 	  && !No_Initialization (Declaration_Node (gnat_entity))
+	  && !Is_Dispatch_Table_Entity (gnat_entity)
 	  && Present (gnat_temp = Expression (Declaration_Node (gnat_entity)))
 	  && Nkind (gnat_temp) != N_Allocator
 	  && (!type_annotate_only || Compile_Time_Known_Value (gnat_temp)))
@@ -3406,20 +3411,6 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
-	  /* If this is a record subtype associated with a dispatch table,
-	     strip the suffix.  This is necessary to make sure 2 different
-	     subtypes associated with the imported and exported views of a
-	     dispatch table are properly merged in LTO mode.  */
-	  if (Is_Dispatch_Table_Entity (gnat_entity))
-	    {
-	      char *p;
-	      Get_Encoded_Name (gnat_entity);
-	      p = strchr (Name_Buffer, '_');
-	      gcc_assert (p);
-	      strcpy (p+2, "dtS");
-	      gnu_entity_name = get_identifier (Name_Buffer);
-	    }
 	  /* When the subtype has discriminants and these discriminants affect
 	     the initial shape it has inherited, factor them in.  But for an
 	     Unchecked_Union (it must be an Itype), just return the type.  */