OSDN Git Service

* exp_disp.adb (Make_Tags): Mark the imported view of dispatch tables.
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 May 2010 11:50:18 +0000 (11:50 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 May 2010 11:50:18 +0000 (11:50 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Make imported
constants really constant.
<E_Record_Subtype>: Strip the suffix for dispatch table entities.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159184 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/exp_disp.adb
gcc/ada/gcc-interface/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/lto5.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/lto5_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/lto5_pkg.ads [new file with mode: 0644]

index 3878ccd..68a9266 100644 (file)
@@ -1,5 +1,12 @@
 2010-05-08  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * exp_disp.adb (Make_Tags): Mark the imported view of dispatch tables.
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Make imported
+       constants really constant.
+       <E_Record_Subtype>: Strip the suffix for dispatch table entities.
+
+2010-05-08  Eric Botcazou  <ebotcazou@adacore.com>
+
        * gcc-interface/decl.c (make_aligning_type): Declare the type.
 
 2010-05-08  Eric Botcazou  <ebotcazou@adacore.com>
index 11ae6df..f21b8d2 100644 (file)
@@ -6241,7 +6241,7 @@ package body Exp_Disp is
 
       Tname            : constant Name_Id := Chars (Typ);
       AI_Tag_Comp      : Elmt_Id;
-      DT               : Node_Id;
+      DT               : Node_Id := Empty;
       DT_Ptr           : Node_Id;
       Predef_Prims_Ptr : Node_Id;
       Iface_DT         : Node_Id;
@@ -6562,6 +6562,14 @@ package body Exp_Disp is
          end;
       end if;
 
+      --  Mark entities of dispatch table. Required by the back end to
+      --  handle them properly.
+
+      if Present (DT) then
+         Set_Is_Dispatch_Table_Entity (DT);
+         Set_Is_Dispatch_Table_Entity (Etype (DT));
+      end if;
+
       Set_Ekind        (DT_Ptr, E_Constant);
       Set_Is_Tag       (DT_Ptr);
       Set_Related_Type (DT_Ptr, Typ);
index 6df79fb..fba552b 100644 (file)
@@ -560,7 +560,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
             && (((Nkind (Declaration_Node (gnat_entity))
                   == N_Object_Declaration)
                  && Present (Expression (Declaration_Node (gnat_entity))))
-                || Present (Renamed_Object (gnat_entity))));
+                || Present (Renamed_Object (gnat_entity))
+                || Is_Imported (gnat_entity)));
        bool inner_const_flag = const_flag;
        bool static_p = Is_Statically_Allocated (gnat_entity);
        bool mutable_p = false;
@@ -2975,6 +2976,20 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int 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 = strrchr (Name_Buffer, '_');
+             gcc_assert (p);
+             strcpy (p+1, "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.
index 08266b1..85dd6b9 100644 (file)
@@ -1,5 +1,10 @@
 2010-05-08  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * gnat.dg/lto5.adb: New test.
+       * gnat.dg/lto5_pkg.ad[sb]: New helper.
+
+2010-05-08  Eric Botcazou  <ebotcazou@adacore.com>
+
        * gnat.dg/lto4.ad[sb]: New test.
 
 2010-05-08  Eric Botcazou  <ebotcazou@adacore.com>
diff --git a/gcc/testsuite/gnat.dg/lto5.adb b/gcc/testsuite/gnat.dg/lto5.adb
new file mode 100644 (file)
index 0000000..c36aae8
--- /dev/null
@@ -0,0 +1,9 @@
+-- { dg-do run }
+-- { dg-options "-flto" }
+
+with Lto5_Pkg;
+
+procedure Lto5 is
+begin
+   null;
+end;
diff --git a/gcc/testsuite/gnat.dg/lto5_pkg.adb b/gcc/testsuite/gnat.dg/lto5_pkg.adb
new file mode 100644 (file)
index 0000000..b5bf68a
--- /dev/null
@@ -0,0 +1,6 @@
+package body Lto5_Pkg is
+   procedure d (a : t) is
+   begin
+      null;
+   end;
+end;
diff --git a/gcc/testsuite/gnat.dg/lto5_pkg.ads b/gcc/testsuite/gnat.dg/lto5_pkg.ads
new file mode 100644 (file)
index 0000000..34d3492
--- /dev/null
@@ -0,0 +1,6 @@
+pragma Eliminate (p, d);
+
+package Lto5_Pkg is
+   type t is tagged null record;
+   procedure d (a : t);
+end;