Commit 1d571f3b by Arnaud Charlet

einfo.ads, einfo.adb: Remove Is_Psected flag, no longer used

	* einfo.ads, einfo.adb: Remove Is_Psected flag, no longer used
	(Has_Rep_Pragma): New function
	(Has_Attribute_Definition_Clause): New function
	(Record_Rep_Pragma): Moved here from sem_ch13.adb
	(Get_Rep_Pragma): Remove junk kludge for Stream_Convert pragma

	* sem_ch13.ads, sem_ch13.adb (Record_Rep_Pragma): Moved to einfo.adb

	* exp_prag.adb: (Expand_Pragma_Common_Object): New procedure
	(Expand_Pragma_Psect_Object): New procedure
	These procedures contain the revised and cleaned up processing for
	these two pragmas. This processing was formerly in Sem_Prag, but
	is more appropriately moved here. The cleanup involves making sure
	that the pragmas are properly attached to the tree, and that no
	nodes are improperly shared.

	* sem_prag.adb: Move expansion of Common_Object and Psect_Object
	pragmas to Exp_Prag, which is more appropriate.
	Attach these two pragmas to the Rep_Item chain Use Rep_Item chain to
	check for duplicates Remove use of Is_Psected flag, no longer needed.
	Use new Make_String_Literal function with string.

	* exp_attr.adb (Expand_Fpt_Attribute): The floating-point attributes
	that are functions return universal values, that have to be converted
	to the context type.
	Use new Make_String_Literal function with string.
	(Get_Stream_Convert_Pragma): New function, replaces the use of
	Get_Rep_Pragma, which had to be kludged to work in this case.

	* freeze.adb: Use new Has_Rep_Pragma function

	* exp_intr.adb, exp_ch3.adb, sem_attr.adb: Use new Make_String_Literal
	function with string.
	Use new Has_Rep_Pragma function.

	* tbuild.ads, tbuild.adb (Make_String_Literal): New function, takes
	string argument.

From-SVN: r90904
parent 1735e55d
...@@ -386,7 +386,6 @@ package body Einfo is ...@@ -386,7 +386,6 @@ package body Einfo is
-- Vax_Float Flag151 -- Vax_Float Flag151
-- Entry_Accepted Flag152 -- Entry_Accepted Flag152
-- Is_Psected Flag153
-- Has_Per_Object_Constraint Flag154 -- Has_Per_Object_Constraint Flag154
-- Has_Private_Declaration Flag155 -- Has_Private_Declaration Flag155
-- Referenced Flag156 -- Referenced Flag156
...@@ -421,7 +420,7 @@ package body Einfo is ...@@ -421,7 +420,7 @@ package body Einfo is
-- Has_Xref_Entry Flag182 -- Has_Xref_Entry Flag182
-- Must_Be_On_Byte_Boundary Flag183 -- Must_Be_On_Byte_Boundary Flag183
-- Note: there are no unused flags currently! -- (unused) Flag153
-------------------------------- --------------------------------
-- Attribute Access Functions -- -- Attribute Access Functions --
...@@ -1587,11 +1586,6 @@ package body Einfo is ...@@ -1587,11 +1586,6 @@ package body Einfo is
return Flag53 (Id); return Flag53 (Id);
end Is_Private_Descendant; end Is_Private_Descendant;
function Is_Psected (Id : E) return B is
begin
return Flag153 (Id);
end Is_Psected;
function Is_Public (Id : E) return B is function Is_Public (Id : E) return B is
begin begin
pragma Assert (Nkind (Id) in N_Entity); pragma Assert (Nkind (Id) in N_Entity);
...@@ -3547,11 +3541,6 @@ package body Einfo is ...@@ -3547,11 +3541,6 @@ package body Einfo is
Set_Flag53 (Id, V); Set_Flag53 (Id, V);
end Set_Is_Private_Descendant; end Set_Is_Private_Descendant;
procedure Set_Is_Psected (Id : E; V : B := True) is
begin
Set_Flag153 (Id, V);
end Set_Is_Psected;
procedure Set_Is_Public (Id : E; V : B := True) is procedure Set_Is_Public (Id : E; V : B := True) is
begin begin
pragma Assert (Nkind (Id) in N_Entity); pragma Assert (Nkind (Id) in N_Entity);
...@@ -4806,6 +4795,10 @@ package body Einfo is ...@@ -4806,6 +4795,10 @@ package body Einfo is
-- Scans the Discriminants to see whether any are Completely_Hidden -- Scans the Discriminants to see whether any are Completely_Hidden
-- (the mechanism for describing non-specified stored discriminants) -- (the mechanism for describing non-specified stored discriminants)
----------------------------------------
-- Has_Completely_Hidden_Discriminant --
----------------------------------------
function Has_Completely_Hidden_Discriminant (Id : E) return Boolean is function Has_Completely_Hidden_Discriminant (Id : E) return Boolean is
Ent : Entity_Id := Id; Ent : Entity_Id := Id;
...@@ -4813,7 +4806,6 @@ package body Einfo is ...@@ -4813,7 +4806,6 @@ package body Einfo is
pragma Assert (Ekind (Id) = E_Discriminant); pragma Assert (Ekind (Id) = E_Discriminant);
while Present (Ent) and then Ekind (Ent) = E_Discriminant loop while Present (Ent) and then Ekind (Ent) = E_Discriminant loop
if Is_Completely_Hidden (Ent) then if Is_Completely_Hidden (Ent) then
return True; return True;
end if; end if;
...@@ -4921,9 +4913,8 @@ package body Einfo is ...@@ -4921,9 +4913,8 @@ package body Einfo is
------------------------------------- -------------------------------------
function Get_Attribute_Definition_Clause function Get_Attribute_Definition_Clause
(E : Entity_Id; (E : Entity_Id;
Id : Attribute_Id) Id : Attribute_Id) return Node_Id
return Node_Id
is is
N : Node_Id; N : Node_Id;
...@@ -4947,40 +4938,16 @@ package body Einfo is ...@@ -4947,40 +4938,16 @@ package body Einfo is
-------------------- --------------------
function Get_Rep_Pragma (E : Entity_Id; Nam : Name_Id) return Node_Id is function Get_Rep_Pragma (E : Entity_Id; Nam : Name_Id) return Node_Id is
N : Node_Id; N : Node_Id;
Typ : Entity_Id;
begin begin
N := First_Rep_Item (E); N := First_Rep_Item (E);
while Present (N) loop while Present (N) loop
if Nkind (N) = N_Pragma and then Chars (N) = Nam then if Nkind (N) = N_Pragma and then Chars (N) = Nam then
return N;
if Nam = Name_Stream_Convert then
-- For tagged types this pragma is not inherited, so we
-- must verify that it is defined for the given type and
-- not an ancestor.
Typ := Entity (Expression
(First (Pragma_Argument_Associations (N))));
if not Is_Tagged_Type (E)
or else E = Typ
or else (Is_Private_Type (Typ)
and then E = Full_View (Typ))
then
return N;
else
Next_Rep_Item (N);
end if;
else
return N;
end if;
else
Next_Rep_Item (N);
end if; end if;
Next_Rep_Item (N);
end loop; end loop;
return Empty; return Empty;
...@@ -5010,6 +4977,18 @@ package body Einfo is ...@@ -5010,6 +4977,18 @@ package body Einfo is
return False; return False;
end Has_Attach_Handler; end Has_Attach_Handler;
-------------------------------------
-- Has_Attribute_Definition_Clause --
-------------------------------------
function Has_Attribute_Definition_Clause
(E : Entity_Id;
Id : Attribute_Id) return Boolean
is
begin
return Present (Get_Attribute_Definition_Clause (E, Id));
end Has_Attribute_Definition_Clause;
----------------- -----------------
-- Has_Entries -- -- Has_Entries --
----------------- -----------------
...@@ -5020,8 +4999,8 @@ package body Einfo is ...@@ -5020,8 +4999,8 @@ package body Einfo is
begin begin
pragma Assert (Is_Concurrent_Type (Id)); pragma Assert (Is_Concurrent_Type (Id));
Ent := First_Entity (Id);
Ent := First_Entity (Id);
while Present (Ent) loop while Present (Ent) loop
if Is_Entry (Ent) then if Is_Entry (Ent) then
Result := True; Result := True;
...@@ -5089,6 +5068,15 @@ package body Einfo is ...@@ -5089,6 +5068,15 @@ package body Einfo is
end loop; end loop;
end Has_Private_Ancestor; end Has_Private_Ancestor;
--------------------
-- Has_Rep_Pragma --
--------------------
function Has_Rep_Pragma (E : Entity_Id; Nam : Name_Id) return Boolean is
begin
return Present (Get_Rep_Pragma (E, Nam));
end Has_Rep_Pragma;
------------------------------ ------------------------------
-- Implementation_Base_Type -- -- Implementation_Base_Type --
------------------------------ ------------------------------
...@@ -5127,7 +5115,6 @@ package body Einfo is ...@@ -5127,7 +5115,6 @@ package body Einfo is
begin begin
Item := First_Rep_Item (Id); Item := First_Rep_Item (Id);
while Present (Item) loop while Present (Item) loop
if Nkind (Item) = N_Pragma if Nkind (Item) = N_Pragma
and then Get_Pragma_Id (Chars (Item)) = Pragma_Inline_Always and then Get_Pragma_Id (Chars (Item)) = Pragma_Inline_Always
...@@ -5206,9 +5193,10 @@ package body Einfo is ...@@ -5206,9 +5193,10 @@ package body Einfo is
else else
declare declare
C : Entity_Id := First_Component (Btype); C : Entity_Id;
begin begin
C := First_Component (Btype);
while Present (C) loop while Present (C) loop
if Is_By_Reference_Type (Etype (C)) if Is_By_Reference_Type (Etype (C))
or else Is_Volatile (Etype (C)) or else Is_Volatile (Etype (C))
...@@ -5376,9 +5364,10 @@ package body Einfo is ...@@ -5376,9 +5364,10 @@ package body Einfo is
else else
declare declare
C : E := First_Component (Btype); C : E;
begin begin
C := First_Component (Btype);
while Present (C) loop while Present (C) loop
if Is_Limited_Type (Etype (C)) then if Is_Limited_Type (Etype (C)) then
return True; return True;
...@@ -5464,9 +5453,10 @@ package body Einfo is ...@@ -5464,9 +5453,10 @@ package body Einfo is
else else
declare declare
C : Entity_Id := First_Component (Btype); C : Entity_Id;
begin begin
C := First_Component (Btype);
while Present (C) loop while Present (C) loop
if Is_Return_By_Reference_Type (Etype (C)) then if Is_Return_By_Reference_Type (Etype (C)) then
return True; return True;
...@@ -5529,7 +5519,6 @@ package body Einfo is ...@@ -5529,7 +5519,6 @@ package body Einfo is
begin begin
Comp_Id := Next_Entity (Id); Comp_Id := Next_Entity (Id);
while Present (Comp_Id) loop while Present (Comp_Id) loop
exit when Ekind (Comp_Id) = E_Component; exit when Ekind (Comp_Id) = E_Component;
Comp_Id := Next_Entity (Comp_Id); Comp_Id := Next_Entity (Comp_Id);
...@@ -5664,7 +5653,6 @@ package body Einfo is ...@@ -5664,7 +5653,6 @@ package body Einfo is
else else
N := 0; N := 0;
T := First_Index (Id); T := First_Index (Id);
while Present (T) loop while Present (T) loop
N := N + 1; N := N + 1;
T := Next (T); T := Next (T);
...@@ -5685,7 +5673,6 @@ package body Einfo is ...@@ -5685,7 +5673,6 @@ package body Einfo is
begin begin
N := 0; N := 0;
Discr := First_Discriminant (Id); Discr := First_Discriminant (Id);
while Present (Discr) loop while Present (Discr) loop
N := N + 1; N := N + 1;
Discr := Next_Discriminant (Discr); Discr := Next_Discriminant (Discr);
...@@ -5704,9 +5691,9 @@ package body Einfo is ...@@ -5704,9 +5691,9 @@ package body Einfo is
begin begin
pragma Assert (Is_Concurrent_Type (Id)); pragma Assert (Is_Concurrent_Type (Id));
N := 0; N := 0;
Ent := First_Entity (Id); Ent := First_Entity (Id);
while Present (Ent) loop while Present (Ent) loop
if Is_Entry (Ent) then if Is_Entry (Ent) then
N := N + 1; N := N + 1;
...@@ -5729,7 +5716,6 @@ package body Einfo is ...@@ -5729,7 +5716,6 @@ package body Einfo is
begin begin
N := 0; N := 0;
Formal := First_Formal (Id); Formal := First_Formal (Id);
while Present (Formal) loop while Present (Formal) loop
N := N + 1; N := N + 1;
Formal := Next_Formal (Formal); Formal := Next_Formal (Formal);
...@@ -5747,6 +5733,16 @@ package body Einfo is ...@@ -5747,6 +5733,16 @@ package body Einfo is
return Ekind (Id); return Ekind (Id);
end Parameter_Mode; end Parameter_Mode;
---------------------
-- Record_Rep_Item --
---------------------
procedure Record_Rep_Item (E : Entity_Id; N : Node_Id) is
begin
Set_Next_Rep_Item (N, First_Rep_Item (E));
Set_First_Rep_Item (E, N);
end Record_Rep_Item;
--------------- ---------------
-- Root_Type -- -- Root_Type --
--------------- ---------------
...@@ -5804,9 +5800,10 @@ package body Einfo is ...@@ -5804,9 +5800,10 @@ package body Einfo is
----------------- -----------------
function Scope_Depth (Id : E) return Uint is function Scope_Depth (Id : E) return Uint is
Scop : Entity_Id := Id; Scop : Entity_Id;
begin begin
Scop := Id;
while Is_Record_Type (Scop) loop while Is_Record_Type (Scop) loop
Scop := Scope (Scop); Scop := Scope (Scop);
end loop; end loop;
...@@ -6246,7 +6243,6 @@ package body Einfo is ...@@ -6246,7 +6243,6 @@ package body Einfo is
W ("Is_Preelaborated", Flag59 (Id)); W ("Is_Preelaborated", Flag59 (Id));
W ("Is_Private_Composite", Flag107 (Id)); W ("Is_Private_Composite", Flag107 (Id));
W ("Is_Private_Descendant", Flag53 (Id)); W ("Is_Private_Descendant", Flag53 (Id));
W ("Is_Psected", Flag153 (Id));
W ("Is_Public", Flag10 (Id)); W ("Is_Public", Flag10 (Id));
W ("Is_Pure", Flag44 (Id)); W ("Is_Pure", Flag44 (Id));
W ("Is_Remote_Call_Interface", Flag62 (Id)); W ("Is_Remote_Call_Interface", Flag62 (Id));
...@@ -6372,14 +6368,13 @@ package body Einfo is ...@@ -6372,14 +6368,13 @@ package body Einfo is
Index : E; Index : E;
begin begin
Write_Attribute (" Component Type ", Write_Attribute
Component_Type (Id)); (" Component Type ", Component_Type (Id));
Write_Eol; Write_Eol;
Write_Str (Prefix); Write_Str (Prefix);
Write_Str (" Indices "); Write_Str (" Indices ");
Index := First_Index (Id); Index := First_Index (Id);
while Present (Index) loop while Present (Index) loop
Write_Attribute (" ", Etype (Index)); Write_Attribute (" ", Etype (Index));
Index := Next_Index (Index); Index := Next_Index (Index);
......
...@@ -2191,10 +2191,6 @@ package Einfo is ...@@ -2191,10 +2191,6 @@ package Einfo is
-- Is_Protected_Type (synthesized) -- Is_Protected_Type (synthesized)
-- Applies to all entities, true for protected types and subtypes -- Applies to all entities, true for protected types and subtypes
-- Is_Psected (Flag153)
-- Present in entities for objects, true if a valid Psect_Object
-- pragma applies to the object. Used to detect duplicate pragmas.
-- Is_Public (Flag10) -- Is_Public (Flag10)
-- Present in all entities. Set to indicate that an entity defined in -- Present in all entities. Set to indicate that an entity defined in
-- one compilation unit can be referenced from other compilation units. -- one compilation unit can be referenced from other compilation units.
...@@ -4167,7 +4163,6 @@ package Einfo is ...@@ -4167,7 +4163,6 @@ package Einfo is
-- Has_Volatile_Components (Flag87) -- Has_Volatile_Components (Flag87)
-- Is_Atomic (Flag85) -- Is_Atomic (Flag85)
-- Is_Eliminated (Flag124) -- Is_Eliminated (Flag124)
-- Is_Psected (Flag153)
-- Is_True_Constant (Flag163) -- Is_True_Constant (Flag163)
-- Is_Volatile (Flag16) -- Is_Volatile (Flag16)
-- Never_Set_In_Source (Flag115) -- Never_Set_In_Source (Flag115)
...@@ -4746,7 +4741,6 @@ package Einfo is ...@@ -4746,7 +4741,6 @@ package Einfo is
-- Has_Volatile_Components (Flag87) -- Has_Volatile_Components (Flag87)
-- Is_Atomic (Flag85) -- Is_Atomic (Flag85)
-- Is_Eliminated (Flag124) -- Is_Eliminated (Flag124)
-- Is_Psected (Flag153)
-- Is_Shared_Passive (Flag60) -- Is_Shared_Passive (Flag60)
-- Is_True_Constant (Flag163) -- Is_True_Constant (Flag163)
-- Is_Volatile (Flag16) -- Is_Volatile (Flag16)
...@@ -5186,7 +5180,6 @@ package Einfo is ...@@ -5186,7 +5180,6 @@ package Einfo is
function Is_Preelaborated (Id : E) return B; function Is_Preelaborated (Id : E) return B;
function Is_Private_Composite (Id : E) return B; function Is_Private_Composite (Id : E) return B;
function Is_Private_Descendant (Id : E) return B; function Is_Private_Descendant (Id : E) return B;
function Is_Psected (Id : E) return B;
function Is_Public (Id : E) return B; function Is_Public (Id : E) return B;
function Is_Pure (Id : E) return B; function Is_Pure (Id : E) return B;
function Is_Remote_Call_Interface (Id : E) return B; function Is_Remote_Call_Interface (Id : E) return B;
...@@ -5662,7 +5655,6 @@ package Einfo is ...@@ -5662,7 +5655,6 @@ package Einfo is
procedure Set_Is_Preelaborated (Id : E; V : B := True); procedure Set_Is_Preelaborated (Id : E; V : B := True);
procedure Set_Is_Private_Composite (Id : E; V : B := True); procedure Set_Is_Private_Composite (Id : E; V : B := True);
procedure Set_Is_Private_Descendant (Id : E; V : B := True); procedure Set_Is_Private_Descendant (Id : E; V : B := True);
procedure Set_Is_Psected (Id : E; V : B := True);
procedure Set_Is_Public (Id : E; V : B := True); procedure Set_Is_Public (Id : E; V : B := True);
procedure Set_Is_Pure (Id : E; V : B := True); procedure Set_Is_Pure (Id : E; V : B := True);
procedure Set_Is_Remote_Call_Interface (Id : E; V : B := True); procedure Set_Is_Remote_Call_Interface (Id : E; V : B := True);
...@@ -5868,26 +5860,56 @@ package Einfo is ...@@ -5868,26 +5860,56 @@ package Einfo is
procedure Next_Stored_Discriminant (N : in out Node_Id) procedure Next_Stored_Discriminant (N : in out Node_Id)
renames Proc_Next_Stored_Discriminant; renames Proc_Next_Stored_Discriminant;
------------------------------- ----------------------------------------------
-- Miscellaneous Subprograms -- -- Subprograms for Accessing Rep Item Chain --
------------------------------- ----------------------------------------------
procedure Append_Entity (Id : Entity_Id; V : Entity_Id); -- The First_Rep_Item field of every entity points to a linked list
-- Add an entity to the list of entities declared in the scope V -- (linked through Next_Rep_Item) of representation pragmas and
-- attribute definition clauses that apply to the item. Note that
-- in the case of types, it is assumed that any such rep items for
-- a base type also apply to all subtypes. This is implemented by
-- having the chain for subtypes link onto the chain for the base
-- type, so that any new entries for the subtype are added at the
-- start of the chain.
function Get_Attribute_Definition_Clause
(E : Entity_Id;
Id : Attribute_Id) return Node_Id;
-- Searches the Rep_Item chain for a given entity E, for an instance
-- of an attribute definition clause with the given attibute Id Id. If
-- found, the value returned is the N_Attribute_Definition_Clause node,
-- otherwise Empty is returned.
function Get_Rep_Pragma (E : Entity_Id; Nam : Name_Id) return Node_Id; function Get_Rep_Pragma (E : Entity_Id; Nam : Name_Id) return Node_Id;
-- Searches the Rep_Item chain for the given entity E, for an instance -- Searches the Rep_Item chain for the given entity E, for an instance
-- of a representation pragma with the given name Nam. If found then -- of a representation pragma with the given name Nam. If found then
-- the value returned is the N_Pragma node, otherwise Empty is returned. -- the value returned is the N_Pragma node, otherwise Empty is returned.
function Get_Attribute_Definition_Clause function Has_Rep_Pragma (E : Entity_Id; Nam : Name_Id) return Boolean;
(E : Entity_Id; -- Searches the Rep_Item chain for the given entity E, for an instance
Id : Attribute_Id) -- of representation pragma with the given name Nam. If found then True
return Node_Id; -- is returned, otherwise False indicates that no matching entry was found.
function Has_Attribute_Definition_Clause
(E : Entity_Id;
Id : Attribute_Id) return Boolean;
-- Searches the Rep_Item chain for a given entity E, for an instance -- Searches the Rep_Item chain for a given entity E, for an instance
-- of an attribute definition clause with the given attibute Id Id. If -- of an attribute definition clause with the given attibute Id Id. If
-- found, the value returned is the N_Attribute_Definition_Clause node, -- found, True is returned, otherwise False indicates that no matching
-- otherwise Empty is returned. -- entry was found.
procedure Record_Rep_Item (E : Entity_Id; N : Node_Id);
-- N is the node for either a representation pragma or an attribute
-- definition clause that applies to entity E. This procedure links
-- the node N onto the Rep_Item chain for entity E.
-------------------------------
-- Miscellaneous Subprograms --
-------------------------------
procedure Append_Entity (Id : Entity_Id; V : Entity_Id);
-- Add an entity to the list of entities declared in the scope V
function Is_Entity_Name (N : Node_Id) return Boolean; function Is_Entity_Name (N : Node_Id) return Boolean;
-- Test if the node N is the name of an entity (i.e. is an identifier, -- Test if the node N is the name of an entity (i.e. is an identifier,
...@@ -6183,7 +6205,6 @@ package Einfo is ...@@ -6183,7 +6205,6 @@ package Einfo is
pragma Inline (Is_Private_Descendant); pragma Inline (Is_Private_Descendant);
pragma Inline (Is_Private_Type); pragma Inline (Is_Private_Type);
pragma Inline (Is_Protected_Type); pragma Inline (Is_Protected_Type);
pragma Inline (Is_Psected);
pragma Inline (Is_Public); pragma Inline (Is_Public);
pragma Inline (Is_Pure); pragma Inline (Is_Pure);
pragma Inline (Is_Real_Type); pragma Inline (Is_Real_Type);
...@@ -6499,7 +6520,6 @@ package Einfo is ...@@ -6499,7 +6520,6 @@ package Einfo is
pragma Inline (Set_Is_Preelaborated); pragma Inline (Set_Is_Preelaborated);
pragma Inline (Set_Is_Private_Composite); pragma Inline (Set_Is_Private_Composite);
pragma Inline (Set_Is_Private_Descendant); pragma Inline (Set_Is_Private_Descendant);
pragma Inline (Set_Is_Psected);
pragma Inline (Set_Is_Public); pragma Inline (Set_Is_Public);
pragma Inline (Set_Is_Pure); pragma Inline (Set_Is_Pure);
pragma Inline (Set_Is_Remote_Call_Interface); pragma Inline (Set_Is_Remote_Call_Interface);
......
...@@ -138,6 +138,11 @@ package body Exp_Attr is ...@@ -138,6 +138,11 @@ package body Exp_Attr is
-- defining it, is returned. In both cases, inheritance of representation -- defining it, is returned. In both cases, inheritance of representation
-- aspects is thus taken into account. -- aspects is thus taken into account.
function Get_Stream_Convert_Pragma (T : Entity_Id) return Node_Id;
-- Given a type, find a corresponding stream convert pragma that applies to
-- the implementation base type of this type (Typ). If found, return the
-- pragma node, otherwise return Empty if no pragma is found.
function Is_Constrained_Packed_Array (Typ : Entity_Id) return Boolean; function Is_Constrained_Packed_Array (Typ : Entity_Id) return Boolean;
-- Utility for array attributes, returns true on packed constrained -- Utility for array attributes, returns true on packed constrained
-- arrays, and on access to same. -- arrays, and on access to same.
...@@ -297,9 +302,11 @@ package body Exp_Attr is ...@@ -297,9 +302,11 @@ package body Exp_Attr is
-- The generated call is given the provided set of parameters, and then -- The generated call is given the provided set of parameters, and then
-- wrapped in a conversion which converts the result to the target type -- wrapped in a conversion which converts the result to the target type
-- We use the base type as the target because a range check may be
-- required.
Rewrite (N, Rewrite (N,
Unchecked_Convert_To (Etype (N), Unchecked_Convert_To (Base_Type (Etype (N)),
Make_Function_Call (Loc, Make_Function_Call (Loc,
Name => Fnm, Name => Fnm,
Parameter_Associations => Args))); Parameter_Associations => Args)));
...@@ -909,12 +916,9 @@ package body Exp_Attr is ...@@ -909,12 +916,9 @@ package body Exp_Attr is
if Pent = Standard_Standard if Pent = Standard_Standard
or else Pent = Standard_ASCII or else Pent = Standard_ASCII
then then
Name_Buffer (1 .. Verbose_Library_Version'Length) :=
Verbose_Library_Version;
Name_Len := Verbose_Library_Version'Length;
Rewrite (N, Rewrite (N,
Make_String_Literal (Loc, Make_String_Literal (Loc,
Strval => String_From_Name_Buffer)); Strval => Verbose_Library_Version));
-- All other cases -- All other cases
...@@ -1804,9 +1808,7 @@ package body Exp_Attr is ...@@ -1804,9 +1808,7 @@ package body Exp_Attr is
-- from which it is derived. The extra conversion is required -- from which it is derived. The extra conversion is required
-- for the derived case. -- for the derived case.
Prag := Prag := Get_Stream_Convert_Pragma (P_Type);
Get_Rep_Pragma
(Implementation_Base_Type (P_Type), Name_Stream_Convert);
if Present (Prag) then if Present (Prag) then
Arg2 := Next (First (Pragma_Argument_Associations (Prag))); Arg2 := Next (First (Pragma_Argument_Associations (Prag)));
...@@ -2380,9 +2382,7 @@ package body Exp_Attr is ...@@ -2380,9 +2382,7 @@ package body Exp_Attr is
-- it is derived to type strmtyp. The conversion to acttyp is -- it is derived to type strmtyp. The conversion to acttyp is
-- required for the derived case. -- required for the derived case.
Prag := Prag := Get_Stream_Convert_Pragma (P_Type);
Get_Rep_Pragma
(Implementation_Base_Type (P_Type), Name_Stream_Convert);
if Present (Prag) then if Present (Prag) then
Arg3 := Arg3 :=
...@@ -2795,9 +2795,7 @@ package body Exp_Attr is ...@@ -2795,9 +2795,7 @@ package body Exp_Attr is
-- where Itemx is the expression of the type conversion (i.e. -- where Itemx is the expression of the type conversion (i.e.
-- the actual object), and typex is the type of Itemx. -- the actual object), and typex is the type of Itemx.
Prag := Prag := Get_Stream_Convert_Pragma (P_Type);
Get_Rep_Pragma
(Implementation_Base_Type (P_Type), Name_Stream_Convert);
if Present (Prag) then if Present (Prag) then
Arg2 := Next (First (Pragma_Argument_Associations (Prag))); Arg2 := Next (First (Pragma_Argument_Associations (Prag)));
...@@ -4017,9 +4015,7 @@ package body Exp_Attr is ...@@ -4017,9 +4015,7 @@ package body Exp_Attr is
-- it is derived to type strmtyp. The conversion to acttyp is -- it is derived to type strmtyp. The conversion to acttyp is
-- required for the derived case. -- required for the derived case.
Prag := Prag := Get_Stream_Convert_Pragma (P_Type);
Get_Rep_Pragma
(Implementation_Base_Type (P_Type), Name_Stream_Convert);
if Present (Prag) then if Present (Prag) then
Arg3 := Arg3 :=
...@@ -4326,6 +4322,46 @@ package body Exp_Attr is ...@@ -4326,6 +4322,46 @@ package body Exp_Attr is
return Etype (Indx); return Etype (Indx);
end Get_Index_Subtype; end Get_Index_Subtype;
-------------------------------
-- Get_Stream_Convert_Pragma --
-------------------------------
function Get_Stream_Convert_Pragma (T : Entity_Id) return Node_Id is
Typ : Entity_Id;
N : Node_Id;
begin
-- Note: we cannot use Get_Rep_Pragma here because of the peculiarity
-- that a stream convert pragma for a tagged type is not inherited from
-- its parent. Probably what is wrong here is that it is basically
-- incorrect to consider a stream convert pragma to be a representation
-- pragma at all ???
N := First_Rep_Item (Implementation_Base_Type (T));
while Present (N) loop
if Nkind (N) = N_Pragma and then Chars (N) = Name_Stream_Convert then
-- For tagged types this pragma is not inherited, so we
-- must verify that it is defined for the given type and
-- not an ancestor.
Typ :=
Entity (Expression (First (Pragma_Argument_Associations (N))));
if not Is_Tagged_Type (T)
or else T = Typ
or else (Is_Private_Type (Typ) and then T = Full_View (Typ))
then
return N;
end if;
end if;
Next_Rep_Item (N);
end loop;
return Empty;
end Get_Stream_Convert_Pragma;
--------------------------------- ---------------------------------
-- Is_Constrained_Packed_Array -- -- Is_Constrained_Packed_Array --
--------------------------------- ---------------------------------
......
...@@ -57,7 +57,6 @@ with Sem_Res; use Sem_Res; ...@@ -57,7 +57,6 @@ with Sem_Res; use Sem_Res;
with Sem_Util; use Sem_Util; with Sem_Util; use Sem_Util;
with Sinfo; use Sinfo; with Sinfo; use Sinfo;
with Stand; use Stand; with Stand; use Stand;
with Stringt; use Stringt;
with Snames; use Snames; with Snames; use Snames;
with Tbuild; use Tbuild; with Tbuild; use Tbuild;
with Ttypes; use Ttypes; with Ttypes; use Ttypes;
...@@ -1118,15 +1117,10 @@ package body Exp_Ch3 is ...@@ -1118,15 +1117,10 @@ package body Exp_Ch3 is
-- This is just a workaround that must be improved later??? -- This is just a workaround that must be improved later???
if With_Default_Init then if With_Default_Init then
declare Append_To (Args,
S : String_Id; Make_String_Literal (Loc,
Null_String : Node_Id; Strval => ""));
begin
Start_String;
S := End_String;
Null_String := Make_String_Literal (Loc, Strval => S);
Append_To (Args, Null_String);
end;
else else
Decls := Build_Task_Image_Decls (Loc, Id_Ref, Enclos_Type); Decls := Build_Task_Image_Decls (Loc, Id_Ref, Enclos_Type);
Decl := Last (Decls); Decl := Last (Decls);
......
...@@ -110,21 +110,18 @@ package body Exp_Intr is ...@@ -110,21 +110,18 @@ package body Exp_Intr is
Loc : constant Source_Ptr := Sloc (N); Loc : constant Source_Ptr := Sloc (N);
P : Node_Id; P : Node_Id;
E : Entity_Id; E : Entity_Id;
S : String_Id;
begin begin
-- Climb up parents to see if we are in exception handler -- Climb up parents to see if we are in exception handler
P := Parent (N); P := Parent (N);
loop loop
-- Case of not in exception handler -- Case of not in exception handler, replace by null string
if No (P) then if No (P) then
Start_String;
S := End_String;
Rewrite (N, Rewrite (N,
Make_String_Literal (Loc, Make_String_Literal (Loc,
Strval => S)); Strval => ""));
exit; exit;
-- Case of in exception handler -- Case of in exception handler
......
...@@ -58,22 +58,31 @@ package body Exp_Prag is ...@@ -58,22 +58,31 @@ package body Exp_Prag is
function Arg1 (N : Node_Id) return Node_Id; function Arg1 (N : Node_Id) return Node_Id;
function Arg2 (N : Node_Id) return Node_Id; function Arg2 (N : Node_Id) return Node_Id;
-- Obtain specified Pragma_Argument_Association -- Obtain specified pragma argument expression
procedure Expand_Pragma_Abort_Defer (N : Node_Id); procedure Expand_Pragma_Abort_Defer (N : Node_Id);
procedure Expand_Pragma_Assert (N : Node_Id); procedure Expand_Pragma_Assert (N : Node_Id);
procedure Expand_Pragma_Common_Object (N : Node_Id);
procedure Expand_Pragma_Import (N : Node_Id); procedure Expand_Pragma_Import (N : Node_Id);
procedure Expand_Pragma_Import_Export_Exception (N : Node_Id); procedure Expand_Pragma_Import_Export_Exception (N : Node_Id);
procedure Expand_Pragma_Inspection_Point (N : Node_Id); procedure Expand_Pragma_Inspection_Point (N : Node_Id);
procedure Expand_Pragma_Interrupt_Priority (N : Node_Id); procedure Expand_Pragma_Interrupt_Priority (N : Node_Id);
procedure Expand_Pragma_Psect_Object (N : Node_Id);
---------- ----------
-- Arg1 -- -- Arg1 --
---------- ----------
function Arg1 (N : Node_Id) return Node_Id is function Arg1 (N : Node_Id) return Node_Id is
Arg : constant Node_Id := First (Pragma_Argument_Associations (N));
begin begin
return First (Pragma_Argument_Associations (N)); if Present (Arg)
and then Nkind (Arg) = N_Pragma_Argument_Association
then
return Expression (Arg);
else
return Arg;
end if;
end Arg1; end Arg1;
---------- ----------
...@@ -81,8 +90,23 @@ package body Exp_Prag is ...@@ -81,8 +90,23 @@ package body Exp_Prag is
---------- ----------
function Arg2 (N : Node_Id) return Node_Id is function Arg2 (N : Node_Id) return Node_Id is
Arg1 : constant Node_Id := First (Pragma_Argument_Associations (N));
begin begin
return Next (Arg1 (N)); if No (Arg1) then
return Empty;
else
declare
Arg : constant Node_Id := Next (Arg1);
begin
if Present (Arg)
and then Nkind (Arg) = N_Pragma_Argument_Association
then
return Expression (Arg);
else
return Arg;
end if;
end;
end if;
end Arg2; end Arg2;
--------------------- ---------------------
...@@ -105,6 +129,9 @@ package body Exp_Prag is ...@@ -105,6 +129,9 @@ package body Exp_Prag is
when Pragma_Assert => when Pragma_Assert =>
Expand_Pragma_Assert (N); Expand_Pragma_Assert (N);
when Pragma_Common_Object =>
Expand_Pragma_Common_Object (N);
when Pragma_Export_Exception => when Pragma_Export_Exception =>
Expand_Pragma_Import_Export_Exception (N); Expand_Pragma_Import_Export_Exception (N);
...@@ -120,6 +147,9 @@ package body Exp_Prag is ...@@ -120,6 +147,9 @@ package body Exp_Prag is
when Pragma_Interrupt_Priority => when Pragma_Interrupt_Priority =>
Expand_Pragma_Interrupt_Priority (N); Expand_Pragma_Interrupt_Priority (N);
when Pragma_Psect_Object =>
Expand_Pragma_Psect_Object (N);
-- All other pragmas need no expander action -- All other pragmas need no expander action
when others => null; when others => null;
...@@ -195,7 +225,7 @@ package body Exp_Prag is ...@@ -195,7 +225,7 @@ package body Exp_Prag is
procedure Expand_Pragma_Assert (N : Node_Id) is procedure Expand_Pragma_Assert (N : Node_Id) is
Loc : constant Source_Ptr := Sloc (N); Loc : constant Source_Ptr := Sloc (N);
Cond : constant Node_Id := Expression (Arg1 (N)); Cond : constant Node_Id := Arg1 (N);
Msg : String_Id; Msg : String_Id;
begin begin
...@@ -222,7 +252,7 @@ package body Exp_Prag is ...@@ -222,7 +252,7 @@ package body Exp_Prag is
-- First, we need to prepare the character literal -- First, we need to prepare the character literal
if Present (Arg2 (N)) then if Present (Arg2 (N)) then
Msg := Strval (Expr_Value_S (Expression (Arg2 (N)))); Msg := Strval (Expr_Value_S (Arg2 (N)));
else else
Build_Location_String (Loc); Build_Location_String (Loc);
Msg := String_From_Name_Buffer; Msg := String_From_Name_Buffer;
...@@ -265,6 +295,114 @@ package body Exp_Prag is ...@@ -265,6 +295,114 @@ package body Exp_Prag is
end if; end if;
end Expand_Pragma_Assert; end Expand_Pragma_Assert;
---------------------------------
-- Expand_Pragma_Common_Object --
---------------------------------
-- Add series of pragmas to replicate semantic effect in DEC Ada
-- pragma Linker_Section (internal_name, external_name);
-- pragma Machine_Attribute (internal_name, "overlaid");
-- pragma Machine_Attribute (internal_name, "global");
-- pragma Machine_Attribute (internal_name, "initialize");
-- For now we do nothing with the size attribute ???
-- Really this expansion would be much better in the back end. The
-- front end should not need to know about target dependent, back end
-- dependent semantics ???
procedure Expand_Pragma_Common_Object (N : Node_Id) is
Loc : constant Source_Ptr := Sloc (N);
Internal : constant Node_Id := Arg1 (N);
External : constant Node_Id := Arg2 (N);
Psect : Node_Id;
-- Psect value upper cased as string literal
Iloc : constant Source_Ptr := Sloc (Internal);
Eloc : constant Source_Ptr := Sloc (External);
Ploc : Source_Ptr;
begin
-- Acquire Psect value and fold to upper case
if Present (External) then
if Nkind (External) = N_String_Literal then
String_To_Name_Buffer (Strval (External));
else
Get_Name_String (Chars (External));
end if;
Set_All_Upper_Case;
Psect :=
Make_String_Literal (Eloc,
Strval => String_From_Name_Buffer);
else
Get_Name_String (Chars (Internal));
Set_All_Upper_Case;
Psect :=
Make_String_Literal (Iloc,
Strval => String_From_Name_Buffer);
end if;
Ploc := Sloc (Psect);
-- Insert pragmas
Insert_List_After_And_Analyze (N, New_List (
-- The Linker_Section pragma ensures the correct section
Make_Pragma (Loc,
Chars => Name_Linker_Section,
Pragma_Argument_Associations => New_List (
Make_Pragma_Argument_Association (Iloc,
Expression => New_Copy_Tree (Internal)),
Make_Pragma_Argument_Association (Ploc,
Expression => New_Copy_Tree (Psect)))),
-- Machine_Attribute "overlaid" ensures that this section
-- overlays any other sections of the same name.
Make_Pragma (Loc,
Chars => Name_Machine_Attribute,
Pragma_Argument_Associations => New_List (
Make_Pragma_Argument_Association (Iloc,
Expression => New_Copy_Tree (Internal)),
Make_Pragma_Argument_Association (Eloc,
Expression =>
Make_String_Literal (Sloc => Ploc,
Strval => "overlaid")))),
-- Machine_Attribute "global" ensures that section is visible
Make_Pragma (Loc,
Chars => Name_Machine_Attribute,
Pragma_Argument_Associations => New_List (
Make_Pragma_Argument_Association (Iloc,
Expression => New_Copy_Tree (Internal)),
Make_Pragma_Argument_Association (Eloc,
Expression =>
Make_String_Literal (Sloc => Ploc,
Strval => "global")))),
-- Machine_Attribute "initialize" ensures section is demand zeroed
Make_Pragma (Loc,
Chars => Name_Machine_Attribute,
Pragma_Argument_Associations => New_List (
Make_Pragma_Argument_Association (Iloc,
Expression => New_Copy_Tree (Internal)),
Make_Pragma_Argument_Association (Eloc,
Expression =>
Make_String_Literal (Sloc => Ploc,
Strval => "initialize"))))));
end Expand_Pragma_Common_Object;
-------------------------- --------------------------
-- Expand_Pragma_Import -- -- Expand_Pragma_Import --
-------------------------- --------------------------
...@@ -281,7 +419,7 @@ package body Exp_Prag is ...@@ -281,7 +419,7 @@ package body Exp_Prag is
-- seen (i.e. this elaboration cannot be deferred to the freeze point). -- seen (i.e. this elaboration cannot be deferred to the freeze point).
procedure Expand_Pragma_Import (N : Node_Id) is procedure Expand_Pragma_Import (N : Node_Id) is
Def_Id : constant Entity_Id := Entity (Expression (Arg2 (N))); Def_Id : constant Entity_Id := Entity (Arg2 (N));
Typ : Entity_Id; Typ : Entity_Id;
Init_Call : Node_Id; Init_Call : Node_Id;
...@@ -340,7 +478,7 @@ package body Exp_Prag is ...@@ -340,7 +478,7 @@ package body Exp_Prag is
end if; end if;
declare declare
Id : constant Entity_Id := Entity (Expression (Arg1 (N))); Id : constant Entity_Id := Entity (Arg1 (N));
Call : constant Node_Id := Register_Exception_Call (Id); Call : constant Node_Id := Register_Exception_Call (Id);
Loc : constant Source_Ptr := Sloc (N); Loc : constant Source_Ptr := Sloc (N);
...@@ -579,4 +717,16 @@ package body Exp_Prag is ...@@ -579,4 +717,16 @@ package body Exp_Prag is
end if; end if;
end Expand_Pragma_Interrupt_Priority; end Expand_Pragma_Interrupt_Priority;
--------------------------------
-- Expand_Pragma_Psect_Object --
--------------------------------
-- Convert to Common_Object, and expand the resulting pragma
procedure Expand_Pragma_Psect_Object (N : Node_Id) is
begin
Set_Chars (N, Name_Common_Object);
Expand_Pragma_Common_Object (N);
end Expand_Pragma_Psect_Object;
end Exp_Prag; end Exp_Prag;
...@@ -2235,17 +2235,17 @@ package body Freeze is ...@@ -2235,17 +2235,17 @@ package body Freeze is
-- inherited the indication from elsewhere (e.g. an address -- inherited the indication from elsewhere (e.g. an address
-- clause, which is not good enough in RM terms!) -- clause, which is not good enough in RM terms!)
if Present (Get_Rep_Pragma (E, Name_Atomic)) if Has_Rep_Pragma (E, Name_Atomic)
or else or else
Present (Get_Rep_Pragma (E, Name_Atomic_Components)) Has_Rep_Pragma (E, Name_Atomic_Components)
then then
Error_Msg_N Error_Msg_N
("stand alone atomic constant must be " & ("stand alone atomic constant must be " &
"imported ('R'M 'C.6(13))", E); "imported ('R'M 'C.6(13))", E);
elsif Present (Get_Rep_Pragma (E, Name_Volatile)) elsif Has_Rep_Pragma (E, Name_Volatile)
or else or else
Present (Get_Rep_Pragma (E, Name_Volatile_Components)) Has_Rep_Pragma (E, Name_Volatile_Components)
then then
Error_Msg_N Error_Msg_N
("stand alone volatile constant must be " & ("stand alone volatile constant must be " &
......
...@@ -1232,7 +1232,7 @@ package body Sem_Attr is ...@@ -1232,7 +1232,7 @@ package body Sem_Attr is
if Is_Limited_Type (P_Type) if Is_Limited_Type (P_Type)
and then Comes_From_Source (N) and then Comes_From_Source (N)
and then not Present (TSS (Btyp, Nam)) and then not Present (TSS (Btyp, Nam))
and then No (Get_Rep_Pragma (Btyp, Name_Stream_Convert)) and then not Has_Rep_Pragma (Btyp, Name_Stream_Convert)
then then
Error_Msg_Name_1 := Aname; Error_Msg_Name_1 := Aname;
Error_Msg_NE Error_Msg_NE
...@@ -3480,22 +3480,21 @@ package body Sem_Attr is ...@@ -3480,22 +3480,21 @@ package body Sem_Attr is
when Attribute_Target_Name => Target_Name : declare when Attribute_Target_Name => Target_Name : declare
TN : constant String := Sdefault.Target_Name.all; TN : constant String := Sdefault.Target_Name.all;
TL : Integer := TN'Last; TL : Natural;
begin begin
Check_Standard_Prefix; Check_Standard_Prefix;
Check_E0; Check_E0;
Start_String;
TL := TN'Last;
if TN (TL) = '/' or else TN (TL) = '\' then if TN (TL) = '/' or else TN (TL) = '\' then
TL := TL - 1; TL := TL - 1;
end if; end if;
Store_String_Chars (TN (TN'First .. TL));
Rewrite (N, Rewrite (N,
Make_String_Literal (Loc, Make_String_Literal (Loc,
Strval => End_String)); Strval => TN (TN'First .. TL)));
Analyze_And_Resolve (N, Standard_String); Analyze_And_Resolve (N, Standard_String);
end Target_Name; end Target_Name;
......
...@@ -3411,16 +3411,6 @@ package body Sem_Ch13 is ...@@ -3411,16 +3411,6 @@ package body Sem_Ch13 is
end if; end if;
end New_Stream_Procedure; end New_Stream_Procedure;
---------------------
-- Record_Rep_Item --
---------------------
procedure Record_Rep_Item (T : Entity_Id; N : Node_Id) is
begin
Set_Next_Rep_Item (N, First_Rep_Item (T));
Set_First_Rep_Item (T, N);
end Record_Rep_Item;
------------------------ ------------------------
-- Rep_Item_Too_Early -- -- Rep_Item_Too_Early --
------------------------ ------------------------
......
...@@ -90,11 +90,6 @@ package Sem_Ch13 is ...@@ -90,11 +90,6 @@ package Sem_Ch13 is
-- If the size is too small, and an error message is given, then both -- If the size is too small, and an error message is given, then both
-- Esize and RM_Size are reset to the allowed minimum value in T. -- Esize and RM_Size are reset to the allowed minimum value in T.
procedure Record_Rep_Item (T : Entity_Id; N : Node_Id);
-- N is the node for either a representation pragma or an attribute
-- definition clause that applies to type T. This procedure links
-- the node N onto the Rep_Item chain for the type T.
function Rep_Item_Too_Early (T : Entity_Id; N : Node_Id) return Boolean; function Rep_Item_Too_Early (T : Entity_Id; N : Node_Id) return Boolean;
-- Called at the start of processing a representation clause or a -- Called at the start of processing a representation clause or a
-- representation pragma. Used to check that the representation item -- representation pragma. Used to check that the representation item
......
...@@ -35,6 +35,7 @@ with Rident; use Rident; ...@@ -35,6 +35,7 @@ with Rident; use Rident;
with Sinfo; use Sinfo; with Sinfo; use Sinfo;
with Snames; use Snames; with Snames; use Snames;
with Stand; use Stand; with Stand; use Stand;
with Stringt; use Stringt;
with Uintp; use Uintp; with Uintp; use Uintp;
package body Tbuild is package body Tbuild is
...@@ -334,6 +335,22 @@ package body Tbuild is ...@@ -334,6 +335,22 @@ package body Tbuild is
UI_From_Int (RT_Exception_Code'Pos (Reason))); UI_From_Int (RT_Exception_Code'Pos (Reason)));
end Make_Raise_Storage_Error; end Make_Raise_Storage_Error;
-------------------------
-- Make_String_Literal --
-------------------------
function Make_String_Literal
(Sloc : Source_Ptr;
Strval : String) return Node_Id
is
begin
Start_String;
Store_String_Chars (Strval);
return
Make_String_Literal (Sloc,
Strval => End_String);
end Make_String_Literal;
--------------------------- ---------------------------
-- Make_Unsuppress_Block -- -- Make_Unsuppress_Block --
--------------------------- ---------------------------
......
...@@ -156,6 +156,12 @@ package Tbuild is ...@@ -156,6 +156,12 @@ package Tbuild is
-- A convenient form of Make_Raise_Storage_Error where the Reason -- A convenient form of Make_Raise_Storage_Error where the Reason
-- is given simply as an enumeration value, rather than a Uint code. -- is given simply as an enumeration value, rather than a Uint code.
function Make_String_Literal
(Sloc : Source_Ptr;
Strval : String) return Node_Id;
-- A convenient form of Make_String_Literal, where the string value
-- is given as a normal string instead of a String_Id value.
function Make_Unsuppress_Block function Make_Unsuppress_Block
(Loc : Source_Ptr; (Loc : Source_Ptr;
Check : Name_Id; Check : Name_Id;
......
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