decl.c (gnat_to_gnu_entity): Do not get the expression of a dispatch table that is...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 12 Jun 2018 10:19:40 +0000 (10:19 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 12 Jun 2018 10:19:40 +0000 (10:19 +0000)
* 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.

From-SVN: r261483

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c

index 70d7cd64e08fa6c429f8e3197e9168d89f440001..8349f0f8ac60e5dfd728d0e6a576f0dc5f6085f7 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2018-06-12  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (warn_on_field_placement): Use specific wording
index ddc48d9b8cb2c708410d7f9d727cf734430e0fed..2eb156b94d09e2edf12266c3f0c22447b5ac0c25 100644 (file)
@@ -603,13 +603,18 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
       /* 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_entity, tree gnu_expr, bool definition)
              break;
            }
 
-         /* 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.  */