Commit 4f18d860 by Bob Duff Committed by Arnaud Charlet

sem.adb (Semantics, [...]): Include dependents of bodies that are not included.

2009-04-20  Bob Duff  <duff@adacore.com>

	* sem.adb (Semantics, Walk_Library_Items): Include dependents of bodies
	that are not included. This is necessary if the main unit is a generic
	instantiation.

	* gnat1drv.adb (Gnat1drv): Comment out the call to Check_Library_Items,
	because it doesn't work if -gnatn is used.

From-SVN: r146408
parent 451800a0
2009-04-20 Bob Duff <duff@adacore.com>
* sem.adb (Semantics, Walk_Library_Items): Include dependents of bodies
that are not included. This is necessary if the main unit is a generic
instantiation.
* gnat1drv.adb (Gnat1drv): Comment out the call to Check_Library_Items,
because it doesn't work if -gnatn is used.
2009-04-20 Ed Schonberg <schonberg@adacore.com> 2009-04-20 Ed Schonberg <schonberg@adacore.com>
* rtsfind.adb (RTE, RTE_Record_Component): In * rtsfind.adb (RTE, RTE_Record_Component): In
...@@ -92,6 +92,8 @@ procedure Gnat1drv is ...@@ -92,6 +92,8 @@ procedure Gnat1drv is
procedure Check_Library_Items; procedure Check_Library_Items;
-- For debugging -- checks the behavior of Walk_Library_Items -- For debugging -- checks the behavior of Walk_Library_Items
pragma Warnings (Off, Check_Library_Items);
-- In case the call below is commented out
-------------------- --------------------
-- Check_Bad_Body -- -- Check_Bad_Body --
...@@ -738,7 +740,9 @@ begin ...@@ -738,7 +740,9 @@ begin
Namet.Lock; Namet.Lock;
Stringt.Lock; Stringt.Lock;
pragma Debug (Check_Library_Items); -- ???pragma Debug (Check_Library_Items);
-- Commented out, because it currently does not work if the -gnatn
-- switch (back end inlining) is used.
-- Here we call the back end to generate the output code -- Here we call the back end to generate the output code
......
...@@ -63,6 +63,9 @@ pragma Warnings (Off, Sem_Util); ...@@ -63,6 +63,9 @@ pragma Warnings (Off, Sem_Util);
package body Sem is package body Sem is
Debug_Unit_Walk : constant Boolean := False;
-- Set to True to print out debugging information for Walk_Library_Items
Outer_Generic_Scope : Entity_Id := Empty; Outer_Generic_Scope : Entity_Id := Empty;
-- Global reference to the outer scope that is generic. In a non -- Global reference to the outer scope that is generic. In a non
-- generic context, it is empty. At the moment, it is only used -- generic context, it is empty. At the moment, it is only used
...@@ -78,6 +81,12 @@ package body Sem is ...@@ -78,6 +81,12 @@ package body Sem is
-- If True, we suppress appending compilation units onto the -- If True, we suppress appending compilation units onto the
-- Comp_Unit_List. -- Comp_Unit_List.
procedure Write_Unit_Info
(Unit_Num : Unit_Number_Type;
Item : Node_Id;
Prefix : String := "");
-- Print out debugging information about the unit
------------- -------------
-- Analyze -- -- Analyze --
------------- -------------
...@@ -1345,9 +1354,18 @@ package body Sem is ...@@ -1345,9 +1354,18 @@ package body Sem is
Restore_Scope_Stack; Restore_Scope_Stack;
end Do_Analyze; end Do_Analyze;
Already_Analyzed : constant Boolean := Analyzed (Comp_Unit);
-- Start of processing for Semantics -- Start of processing for Semantics
begin begin
if Debug_Unit_Walk and then Already_Analyzed then
Write_Str ("(done)");
Write_Unit_Info (Get_Cunit_Unit_Number (Comp_Unit), Unit (Comp_Unit),
Prefix => "--> ");
Indent;
end if;
Compiler_State := Analyzing; Compiler_State := Analyzing;
Current_Sem_Unit := Get_Cunit_Unit_Number (Comp_Unit); Current_Sem_Unit := Get_Cunit_Unit_Number (Comp_Unit);
...@@ -1400,35 +1418,34 @@ package body Sem is ...@@ -1400,35 +1418,34 @@ package body Sem is
-- Do analysis, and then append the compilation unit onto the -- Do analysis, and then append the compilation unit onto the
-- Comp_Unit_List, if appropriate. This is done after analysis, so if -- Comp_Unit_List, if appropriate. This is done after analysis, so if
-- this unit depends on some others, they have already been -- this unit depends on some others, they have already been
-- appended. We ignore bodies, except for the main unit itself, and -- appended. We ignore bodies, except for the main unit itself. We
-- everything those bodies depend upon. We have also to guard against -- have also to guard against ill-formed subunits that have an
-- ill-formed subunits that have an improper context. -- improper context.
Do_Analyze;
if Ignore_Comp_Units then if Ignore_Comp_Units then
Do_Analyze; null;
pragma Assert (Ignore_Comp_Units); -- still
elsif Present (Comp_Unit) elsif Present (Comp_Unit)
and then Nkind (Unit (Comp_Unit)) in N_Proper_Body and then Nkind (Unit (Comp_Unit)) in N_Proper_Body
and then not In_Extended_Main_Source_Unit (Comp_Unit) and then not In_Extended_Main_Source_Unit (Comp_Unit)
then then
Ignore_Comp_Units := True; null;
Do_Analyze;
pragma Assert (Ignore_Comp_Units);
Ignore_Comp_Units := False;
else else
Do_Analyze; pragma Assert (not Ignore_Comp_Units);
-- pragma Assert (not Ignore_Comp_Units);
-- The above assertion is *almost* true. It fails only when a
-- subunit with's its parent procedure body, which has no explicit
-- spec.
if No (Comp_Unit_List) then -- Initialize if first time if No (Comp_Unit_List) then -- Initialize if first time
Comp_Unit_List := New_Elmt_List; Comp_Unit_List := New_Elmt_List;
end if; end if;
if not Ignore_Comp_Units then -- See above commented-out Assert
Append_Elmt (Comp_Unit, Comp_Unit_List); Append_Elmt (Comp_Unit, Comp_Unit_List);
if Debug_Unit_Walk then
Write_Str ("Appending ");
Write_Unit_Info
(Get_Cunit_Unit_Number (Comp_Unit), Unit (Comp_Unit));
end if; end if;
-- Ignore all units after main unit -- Ignore all units after main unit
...@@ -1456,6 +1473,13 @@ package body Sem is ...@@ -1456,6 +1473,13 @@ package body Sem is
Restore_Opt_Config_Switches (Save_Config_Switches); Restore_Opt_Config_Switches (Save_Config_Switches);
Expander_Mode_Restore; Expander_Mode_Restore;
if Debug_Unit_Walk and then Already_Analyzed then
Outdent;
Write_Str ("(done)");
Write_Unit_Info (Get_Cunit_Unit_Number (Comp_Unit), Unit (Comp_Unit),
Prefix => "<-- ");
end if;
end Semantics; end Semantics;
------------------------ ------------------------
...@@ -1463,8 +1487,8 @@ package body Sem is ...@@ -1463,8 +1487,8 @@ package body Sem is
------------------------ ------------------------
procedure Walk_Library_Items is procedure Walk_Library_Items is
Enable_Output : constant Boolean := False; type Unit_Number_Set is array (Main_Unit .. Last_Unit) of Boolean;
-- Set to True to print out the items as we go (for debugging) Seen : Unit_Number_Set := (others => False);
procedure Do_Action (CU : Node_Id; Item : Node_Id); procedure Do_Action (CU : Node_Id; Item : Node_Id);
-- Calls Action, with some validity checks -- Calls Action, with some validity checks
...@@ -1478,6 +1502,8 @@ package body Sem is ...@@ -1478,6 +1502,8 @@ package body Sem is
-- This calls Action at the end. All the preceding code is just -- This calls Action at the end. All the preceding code is just
-- assertions and debugging output. -- assertions and debugging output.
pragma Assert (No (CU) or else Nkind (CU) = N_Compilation_Unit);
case Nkind (Item) is case Nkind (Item) is
when N_Generic_Subprogram_Declaration | when N_Generic_Subprogram_Declaration |
N_Generic_Package_Declaration | N_Generic_Package_Declaration |
...@@ -1515,28 +1541,24 @@ package body Sem is ...@@ -1515,28 +1541,24 @@ package body Sem is
if Present (CU) then if Present (CU) then
pragma Assert (Item /= Stand.Standard_Package_Node); pragma Assert (Item /= Stand.Standard_Package_Node);
pragma Assert (Item = Unit (CU));
if Enable_Output then declare
Write_Unit_Name (Unit_Name (Get_Cunit_Unit_Number (CU))); Unit_Num : constant Unit_Number_Type :=
Write_Str (", Unit_Number = "); Get_Cunit_Unit_Number (CU);
Write_Int (Int (Get_Cunit_Unit_Number (CU))); begin
Write_Str (", "); Write_Unit_Info (Unit_Num, Item);
Write_Str (Node_Kind'Image (Nkind (Item)));
if Item /= Original_Node (Item) then pragma Assert (not Seen (Unit_Num));
Write_Str (", orig = "); Seen (Unit_Num) := True;
Write_Str (Node_Kind'Image (Nkind (Original_Node (Item)))); end;
end if;
Write_Eol;
end if;
else else
-- Must be Standard -- Must be Standard
pragma Assert (Item = Stand.Standard_Package_Node); pragma Assert (Item = Stand.Standard_Package_Node);
if Enable_Output then if Debug_Unit_Walk then
Write_Line ("Standard"); Write_Line ("Standard");
end if; end if;
end if; end if;
...@@ -1551,7 +1573,7 @@ package body Sem is ...@@ -1551,7 +1573,7 @@ package body Sem is
-- Start of processing for Walk_Library_Items -- Start of processing for Walk_Library_Items
begin begin
if Enable_Output then if Debug_Unit_Walk then
Write_Line ("Walk_Library_Items:"); Write_Line ("Walk_Library_Items:");
Indent; Indent;
end if; end if;
...@@ -1572,7 +1594,8 @@ package body Sem is ...@@ -1572,7 +1594,8 @@ package body Sem is
-- If it's a body, then ignore it, unless it's an instance (in -- If it's a body, then ignore it, unless it's an instance (in
-- which case we do the spec), or it's the main unit (in which -- which case we do the spec), or it's the main unit (in which
-- case we do it). Note that it could be both. -- case we do it). Note that it could be both, in which case we
-- do the spec first.
when N_Package_Body | N_Subprogram_Body => when N_Package_Body | N_Subprogram_Body =>
declare declare
...@@ -1593,7 +1616,11 @@ package body Sem is ...@@ -1593,7 +1616,11 @@ package body Sem is
end if; end if;
if Is_Generic_Instance (Entity) then if Is_Generic_Instance (Entity) then
Do_Action (CU, Unit (Library_Unit (CU))); declare
Spec_Unit : constant Node_Id := Library_Unit (CU);
begin
Do_Action (Spec_Unit, Unit (Spec_Unit));
end;
end if; end if;
end; end;
...@@ -1616,10 +1643,56 @@ package body Sem is ...@@ -1616,10 +1643,56 @@ package body Sem is
Next_Elmt (Cur); Next_Elmt (Cur);
end loop; end loop;
if Enable_Output then if Debug_Unit_Walk then
if Seen /= (Seen'Range => True) then
Write_Eol;
Write_Line ("Ignored units:");
Indent;
for Unit_Num in Seen'Range loop
if not Seen (Unit_Num) then
Write_Unit_Info (Unit_Num, Unit (Cunit (Unit_Num)));
end if;
end loop;
Outdent;
end if;
end if;
if Debug_Unit_Walk then
Outdent; Outdent;
Write_Line ("end Walk_Library_Items."); Write_Line ("end Walk_Library_Items.");
end if; end if;
end Walk_Library_Items; end Walk_Library_Items;
---------------------
-- Write_Unit_Info --
---------------------
procedure Write_Unit_Info
(Unit_Num : Unit_Number_Type;
Item : Node_Id;
Prefix : String := "")
is
begin
if Debug_Unit_Walk then
Write_Str (Prefix);
Write_Unit_Name (Unit_Name (Unit_Num));
Write_Str (", unit ");
Write_Int (Int (Unit_Num));
Write_Str (", ");
Write_Int (Int (Item));
Write_Str ("=");
Write_Str (Node_Kind'Image (Nkind (Item)));
if Item /= Original_Node (Item) then
Write_Str (", orig = ");
Write_Int (Int (Original_Node (Item)));
Write_Str ("=");
Write_Str (Node_Kind'Image (Nkind (Original_Node (Item))));
end if;
Write_Eol;
end if;
end Write_Unit_Info;
end Sem; end Sem;
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