Commit 9af094a1 by Ed Schonberg Committed by Arnaud Charlet

sinfo.ads, sinfo.adb: New attribute Next_Implicit_With...

2009-04-29  Ed Schonberg  <schonberg@adacore.com>

	* sinfo.ads, sinfo.adb: New attribute Next_Implicit_With, to chain
	with_clauses generated for the same unit through rtsfind, and that
	appear in the context of different units.

	* rtsfind.adb: New attribute First_Implicit_With, component of the
	Unit_Record that stores information about a unit loaded through rtsfind.

From-SVN: r146951
parent 1923a3f9
2009-04-29 Ed Schonberg <schonberg@adacore.com>
* sinfo.ads, sinfo.adb: New attribute Next_Implicit_With, to chain
with_clauses generated for the same unit through rtsfind, and that
appear in the context of different units.
* rtsfind.adb: New attribute First_Implicit_With, component of the
Unit_Record that stores information about a unit loaded through rtsfind.
2009-04-29 Gary Dismukes <dismukes@adacore.com> 2009-04-29 Gary Dismukes <dismukes@adacore.com>
* exp_ch3.adb (Stream_Operation_OK): Return True for limited interfaces * exp_ch3.adb (Stream_Operation_OK): Return True for limited interfaces
......
...@@ -79,16 +79,18 @@ package body Rtsfind is ...@@ -79,16 +79,18 @@ package body Rtsfind is
-- the latter case it is critical to make a call to Set_RTU_Loaded to -- the latter case it is critical to make a call to Set_RTU_Loaded to
-- ensure that the entry in this table reflects the load. -- ensure that the entry in this table reflects the load.
-- Withed is True if an implicit with_clause has been added from some unit -- A unit retrieved through rtsfind may end up in the context of several
-- other than the main unit to this unit. Withed_By_Main is the same, -- other units, in addition to the main unit. These additional with_clauses
-- except from the main unit. -- are needed to generate a proper traversal order for Inspector. To
-- minimize somewhat the redundancy created by numerous calls to rtsfind
-- from different units, we keep track of the list of implicit with_clauses
-- already created for the current loaded unit.
type RT_Unit_Table_Record is record type RT_Unit_Table_Record is record
Entity : Entity_Id; Entity : Entity_Id;
Uname : Unit_Name_Type; Uname : Unit_Name_Type;
Unum : Unit_Number_Type; First_Implicit_With : Node_Id;
Withed : Boolean; Unum : Unit_Number_Type;
Withed_By_Main : Boolean;
end record; end record;
RT_Unit_Table : array (RTU_Id) of RT_Unit_Table_Record; RT_Unit_Table : array (RTU_Id) of RT_Unit_Table_Record;
...@@ -118,12 +120,12 @@ package body Rtsfind is ...@@ -118,12 +120,12 @@ package body Rtsfind is
-- When a unit is implicitly loaded as a result of a call to RTE, it is -- When a unit is implicitly loaded as a result of a call to RTE, it is
-- necessary to create one or two implicit with_clauses. We add such -- necessary to create one or two implicit with_clauses. We add such
-- with_clauses to the extended main unit if needed, and also to whatever -- with_clauses to the extended main unit if needed, and also to whatever
-- unit first needs them, which is not necessarily the main unit. The -- unit needs them, which is not necessarily the main unit. The former
-- former ensures that the object is correctly loaded by the binder. The -- ensures that the object is correctly loaded by the binder. The latter
-- latter is necessary for SofCheck Inspector. -- is necessary for SofCheck Inspector.
-- The flags Withed and Withed_By_Main in the unit table record are used to -- The field First_Implicit_With in the unit table record are used to
-- avoid duplicates. -- avoid creating duplicate with_clauses.
----------------------- -----------------------
-- Local Subprograms -- -- Local Subprograms --
...@@ -668,9 +670,8 @@ package body Rtsfind is ...@@ -668,9 +670,8 @@ package body Rtsfind is
-- Otherwise we need to load the unit, First build unit name -- Otherwise we need to load the unit, First build unit name
-- from the enumeration literal name in type RTU_Id. -- from the enumeration literal name in type RTU_Id.
U.Uname := Get_Unit_Name (U_Id); U.Uname := Get_Unit_Name (U_Id);
U.Withed := False; U. First_Implicit_With := Empty;
U.Withed_By_Main := False;
-- Now do the load call, note that setting Error_Node to Empty is -- Now do the load call, note that setting Error_Node to Empty is
-- a signal to Load_Unit that we will regard a failure to find the -- a signal to Load_Unit that we will regard a failure to find the
...@@ -798,9 +799,6 @@ package body Rtsfind is ...@@ -798,9 +799,6 @@ package body Rtsfind is
-------------------- --------------------
procedure Maybe_Add_With (U : in out RT_Unit_Table_Record) is procedure Maybe_Add_With (U : in out RT_Unit_Table_Record) is
Is_Main : constant Boolean :=
In_Extended_Main_Code_Unit (Cunit_Entity (Current_Sem_Unit));
begin begin
-- We do not need to generate a with_clause for a call issued from -- We do not need to generate a with_clause for a call issued from
-- RTE_Component_Available. However, for Inspector, we need these -- RTE_Component_Available. However, for Inspector, we need these
...@@ -818,42 +816,37 @@ package body Rtsfind is ...@@ -818,42 +816,37 @@ package body Rtsfind is
return; return;
end if; end if;
-- If the current unit is the main one, add the with_clause unless it's -- Add the with_clause, if not already in the context of the
-- already been done. -- current compilation unit.
if Is_Main then declare
if U.Withed_By_Main then LibUnit : constant Node_Id := Unit (Cunit (U.Unum));
return; Clause : Node_Id;
else Withn : Node_Id;
U.Withed_By_Main := True;
end if;
-- If the current unit is not the main one, add the with_clause unless begin
-- it's already been done for some non-main unit. Clause := U.First_Implicit_With;
while Present (Clause) loop
if Parent (Clause) = Cunit (Current_Sem_Unit) then
return;
end if;
else Clause := Next_Implicit_With (Clause);
if U.Withed then end loop;
return;
else
U.Withed := True;
end if;
end if;
-- Here if we've decided to add the with_clause Withn :=
Make_With_Clause (Standard_Location,
Name =>
Make_Unit_Name
(U, Defining_Unit_Name (Specification (LibUnit))));
declare Set_Library_Unit (Withn, Cunit (U.Unum));
LibUnit : constant Node_Id := Unit (Cunit (U.Unum)); Set_Corresponding_Spec (Withn, U.Entity);
Withn : constant Node_Id := Set_First_Name (Withn, True);
Make_With_Clause (Standard_Location, Set_Implicit_With (Withn, True);
Name => Set_Next_Implicit_With (Withn, U.First_Implicit_With);
Make_Unit_Name
(U, Defining_Unit_Name (Specification (LibUnit))));
begin U.First_Implicit_With := Withn;
Set_Library_Unit (Withn, Cunit (U.Unum));
Set_Corresponding_Spec (Withn, U.Entity);
Set_First_Name (Withn, True);
Set_Implicit_With (Withn, True);
Mark_Rewrite_Insertion (Withn); Mark_Rewrite_Insertion (Withn);
Append (Withn, Context_Items (Cunit (Current_Sem_Unit))); Append (Withn, Context_Items (Cunit (Current_Sem_Unit)));
...@@ -1342,14 +1335,14 @@ package body Rtsfind is ...@@ -1342,14 +1335,14 @@ package body Rtsfind is
-- The RT_Unit_Table entry that may need updating -- The RT_Unit_Table entry that may need updating
begin begin
-- If entry is not set, set it now -- If entry is not set, set it now, and indicate that it
-- was loaded through an explicit context clause..
if No (U.Entity) then if No (U.Entity) then
U := (Entity => E, U := (Entity => E,
Uname => Get_Unit_Name (U_Id), Uname => Get_Unit_Name (U_Id),
Unum => Unum, Unum => Unum,
Withed => False, First_Implicit_With => Empty);
Withed_By_Main => False);
end if; end if;
return; return;
......
...@@ -1979,6 +1979,14 @@ package body Sinfo is ...@@ -1979,6 +1979,14 @@ package body Sinfo is
return Node2 (N); return Node2 (N);
end Next_Entity; end Next_Entity;
function Next_Implicit_With
(N : Node_Id) return Node_Id is
begin
pragma Assert (False
or else NT (N).Nkind = N_With_Clause);
return Node3 (N);
end Next_Implicit_With;
function Next_Named_Actual function Next_Named_Actual
(N : Node_Id) return Node_Id is (N : Node_Id) return Node_Id is
begin begin
...@@ -4759,6 +4767,14 @@ package body Sinfo is ...@@ -4759,6 +4767,14 @@ package body Sinfo is
Set_Node2 (N, Val); -- semantic field, no parent set Set_Node2 (N, Val); -- semantic field, no parent set
end Set_Next_Entity; end Set_Next_Entity;
procedure Set_Next_Implicit_With
(N : Node_Id; Val : Node_Id) is
begin
pragma Assert (False
or else NT (N).Nkind = N_With_Clause);
Set_Node3 (N, Val); -- semantic field, no parent set
end Set_Next_Implicit_With;
procedure Set_Next_Named_Actual procedure Set_Next_Named_Actual
(N : Node_Id; Val : Node_Id) is (N : Node_Id; Val : Node_Id) is
begin begin
......
...@@ -1364,6 +1364,16 @@ package Sinfo is ...@@ -1364,6 +1364,16 @@ package Sinfo is
-- scope are chained, and this field is used as the forward pointer for -- scope are chained, and this field is used as the forward pointer for
-- this list. See Einfo for further details. -- this list. See Einfo for further details.
-- Next_Implicit_With (Node3-Sem)
-- Present in N_With_Clause. Part of a chain of with_clauses generated
-- in rtsfind to indicate implicit dependencies on predefined units. Used
-- to prevent multiple with_clauses for the same unit in a given context.
-- A postorder traversal of the tree whose nodes are units and whose
-- links are with_clauses defines the order in which Inspector must
-- examine a compiled unit and its full context. This ordering ensures
-- that any subprogram call is examined after the subprogram declartion
-- has been seen.
-- Next_Named_Actual (Node4-Sem) -- Next_Named_Actual (Node4-Sem)
-- Present in parameter association node. Set during semantic analysis to -- Present in parameter association node. Set during semantic analysis to
-- point to the next named parameter, where parameters are ordered by -- point to the next named parameter, where parameters are ordered by
...@@ -5450,6 +5460,7 @@ package Sinfo is ...@@ -5450,6 +5460,7 @@ package Sinfo is
-- N_With_Clause -- N_With_Clause
-- Sloc points to first token of library unit name -- Sloc points to first token of library unit name
-- Name (Node2) -- Name (Node2)
-- Next_Implicit_With (Node3-Sem)
-- Library_Unit (Node4-Sem) -- Library_Unit (Node4-Sem)
-- Corresponding_Spec (Node5-Sem) -- Corresponding_Spec (Node5-Sem)
-- First_Name (Flag5) (set to True if first name or only one name) -- First_Name (Flag5) (set to True if first name or only one name)
...@@ -8062,6 +8073,9 @@ package Sinfo is ...@@ -8062,6 +8073,9 @@ package Sinfo is
function Next_Entity function Next_Entity
(N : Node_Id) return Node_Id; -- Node2 (N : Node_Id) return Node_Id; -- Node2
function Next_Implicit_With
(N : Node_Id) return Node_Id; -- Node3
function Next_Named_Actual function Next_Named_Actual
(N : Node_Id) return Node_Id; -- Node4 (N : Node_Id) return Node_Id; -- Node4
...@@ -8947,6 +8961,9 @@ package Sinfo is ...@@ -8947,6 +8961,9 @@ package Sinfo is
procedure Set_Next_Entity procedure Set_Next_Entity
(N : Node_Id; Val : Node_Id); -- Node2 (N : Node_Id; Val : Node_Id); -- Node2
procedure Set_Next_Implicit_With
(N : Node_Id; Val : Node_Id); -- Node3
procedure Set_Next_Named_Actual procedure Set_Next_Named_Actual
(N : Node_Id; Val : Node_Id); -- Node4 (N : Node_Id; Val : Node_Id); -- Node4
...@@ -11064,6 +11081,7 @@ package Sinfo is ...@@ -11064,6 +11081,7 @@ package Sinfo is
pragma Inline (Name); pragma Inline (Name);
pragma Inline (Names); pragma Inline (Names);
pragma Inline (Next_Entity); pragma Inline (Next_Entity);
pragma Inline (Next_Implicit_With);
pragma Inline (Next_Named_Actual); pragma Inline (Next_Named_Actual);
pragma Inline (Next_Pragma); pragma Inline (Next_Pragma);
pragma Inline (Next_Rep_Item); pragma Inline (Next_Rep_Item);
...@@ -11356,6 +11374,7 @@ package Sinfo is ...@@ -11356,6 +11374,7 @@ package Sinfo is
pragma Inline (Set_Name); pragma Inline (Set_Name);
pragma Inline (Set_Names); pragma Inline (Set_Names);
pragma Inline (Set_Next_Entity); pragma Inline (Set_Next_Entity);
pragma Inline (Set_Next_Implicit_With);
pragma Inline (Set_Next_Named_Actual); pragma Inline (Set_Next_Named_Actual);
pragma Inline (Set_Next_Pragma); pragma Inline (Set_Next_Pragma);
pragma Inline (Set_Next_Rep_Item); pragma Inline (Set_Next_Rep_Item);
......
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