Commit 901ad63f by Eric Botcazou Committed by Eric Botcazou

exp_disp.adb (Make_Tags): Mark the imported view of dispatch tables.

	* 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.

From-SVN: r159184
parent 9c026b87
2010-05-08 Eric Botcazou <ebotcazou@adacore.com> 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. * gcc-interface/decl.c (make_aligning_type): Declare the type.
2010-05-08 Eric Botcazou <ebotcazou@adacore.com> 2010-05-08 Eric Botcazou <ebotcazou@adacore.com>
......
...@@ -6241,7 +6241,7 @@ package body Exp_Disp is ...@@ -6241,7 +6241,7 @@ package body Exp_Disp is
Tname : constant Name_Id := Chars (Typ); Tname : constant Name_Id := Chars (Typ);
AI_Tag_Comp : Elmt_Id; AI_Tag_Comp : Elmt_Id;
DT : Node_Id; DT : Node_Id := Empty;
DT_Ptr : Node_Id; DT_Ptr : Node_Id;
Predef_Prims_Ptr : Node_Id; Predef_Prims_Ptr : Node_Id;
Iface_DT : Node_Id; Iface_DT : Node_Id;
...@@ -6562,6 +6562,14 @@ package body Exp_Disp is ...@@ -6562,6 +6562,14 @@ package body Exp_Disp is
end; end;
end if; 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_Ekind (DT_Ptr, E_Constant);
Set_Is_Tag (DT_Ptr); Set_Is_Tag (DT_Ptr);
Set_Related_Type (DT_Ptr, Typ); Set_Related_Type (DT_Ptr, Typ);
......
...@@ -560,7 +560,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -560,7 +560,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
&& (((Nkind (Declaration_Node (gnat_entity)) && (((Nkind (Declaration_Node (gnat_entity))
== N_Object_Declaration) == N_Object_Declaration)
&& Present (Expression (Declaration_Node (gnat_entity)))) && 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 inner_const_flag = const_flag;
bool static_p = Is_Statically_Allocated (gnat_entity); bool static_p = Is_Statically_Allocated (gnat_entity);
bool mutable_p = false; bool mutable_p = false;
...@@ -2975,6 +2976,20 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -2975,6 +2976,20 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
break; 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 /* When the subtype has discriminants and these discriminants affect
the initial shape it has inherited, factor them in. But for an the initial shape it has inherited, factor them in. But for an
Unchecked_Union (it must be an Itype), just return the type. Unchecked_Union (it must be an Itype), just return the type.
......
2010-05-08 Eric Botcazou <ebotcazou@adacore.com> 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. * gnat.dg/lto4.ad[sb]: New test.
2010-05-08 Eric Botcazou <ebotcazou@adacore.com> 2010-05-08 Eric Botcazou <ebotcazou@adacore.com>
......
-- { dg-do run }
-- { dg-options "-flto" }
with Lto5_Pkg;
procedure Lto5 is
begin
null;
end;
package body Lto5_Pkg is
procedure d (a : t) is
begin
null;
end;
end;
pragma Eliminate (p, d);
package Lto5_Pkg is
type t is tagged null record;
procedure d (a : t);
end;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment