OSDN Git Service

2010-05-13 Kai Tietz <kai.tietz@onevision.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / frontend.adb
index 00eb5ca..89746b8 100644 (file)
@@ -46,12 +46,14 @@ with Prep;
 with Prepcomp;
 with Restrict; use Restrict;
 with Rident;   use Rident;
-with Rtsfind;
+with Rtsfind;  use Rtsfind;
+with Snames;   use Snames;
 with Sprint;
 with Scn;      use Scn;
 with Sem;      use Sem;
 with Sem_Aux;
 with Sem_Ch8;  use Sem_Ch8;
+with Sem_SCIL;
 with Sem_Elab; use Sem_Elab;
 with Sem_Prag; use Sem_Prag;
 with Sem_Warn; use Sem_Warn;
@@ -63,40 +65,6 @@ with Tbuild;   use Tbuild;
 with Types;    use Types;
 
 procedure Frontend is
-
-   --  Comment: I think SCIL processing is gettings scattered too much, this
-   --  is a good case, why should the top level frontend driver be doing stuff
-   --  at this level, seems wrong to me. I think we should introduce a new
-   --  unit Sem_SCIL, and move a lot of this SCIL stuff there. ???
-
-   function Check_SCIL_Node (N : Node_Id) return Traverse_Result;
-   --  Process a single node during the tree traversal, verifying that field
-   --  SCIL_Related_Node of SCIL dispatching call nodes reference subprogram
-   --  calls.
-
-   procedure Check_SCIL_Nodes is new Traverse_Proc (Check_SCIL_Node);
-   --  The traversal procedure itself
-
-   ---------------------
-   -- Check_SCIL_Node --
-   ---------------------
-
-   function Check_SCIL_Node (N : Node_Id) return Traverse_Result is
-   begin
-      if Nkind (N) = N_SCIL_Dispatching_Call then
-         if not Nkind_In (SCIL_Related_Node (N), N_Function_Call,
-                                                 N_Procedure_Call_Statement)
-         then
-            pragma Assert (False);
-            raise Program_Error;
-         end if;
-
-         return Skip;
-      else
-         return OK;
-      end if;
-   end Check_SCIL_Node;
-
    Config_Pragmas : List_Id;
    --  Gather configuration pragmas
 
@@ -342,7 +310,7 @@ begin
          --  incorporate subunits at a lower level.
 
          if Operating_Mode = Generate_Code
-            and then Nkind (Unit (Cunit (Main_Unit))) = N_Subunit
+           and then Nkind (Unit (Cunit (Main_Unit))) = N_Subunit
          then
             Operating_Mode := Check_Semantics;
          end if;
@@ -355,8 +323,8 @@ begin
          --  Cleanup processing after completing main analysis
 
          if Operating_Mode = Generate_Code
-            or else (Operating_Mode = Check_Semantics
-                      and then ASIS_Mode)
+           or else (Operating_Mode = Check_Semantics
+                     and then ASIS_Mode)
          then
             Instantiate_Bodies;
          end if;
@@ -384,7 +352,7 @@ begin
 
          --  Output waiting warning messages
 
-         Sem_Warn.Output_Non_Modifed_In_Out_Warnings;
+         Sem_Warn.Output_Non_Modified_In_Out_Warnings;
          Sem_Warn.Output_Unreferenced_Messages;
          Sem_Warn.Check_Unused_Withs;
          Sem_Warn.Output_Unused_Warnings_Off_Warnings;
@@ -404,7 +372,8 @@ begin
    --  dispatching calls reference subprogram calls.
 
    if Generate_SCIL then
-      Check_SCIL_Nodes (Cunit (Main_Unit));
+      pragma Debug (Sem_SCIL.Check_SCIL_Nodes (Cunit (Main_Unit)));
+      null;
    end if;
 
    --  Dump the source now. Note that we do this as soon as the analysis
@@ -413,6 +382,29 @@ begin
 
    Sprint.Source_Dump;
 
+   --  Check again for configuration pragmas that appear in the context of
+   --  the main unit. These pragmas only affect the main unit, and the
+   --  corresponding flag is reset after each call to Semantics, but they
+   --  may affect the generated ali for the unit, and therefore the flag
+   --  must be set properly after compilation. Currently we only check for
+   --  Initialize_Scalars, but others should be checked: as well???
+
+   declare
+      Item  : Node_Id;
+
+   begin
+      Item := First (Context_Items (Cunit (Main_Unit)));
+      while Present (Item) loop
+         if Nkind (Item) = N_Pragma
+           and then Pragma_Name (Item) = Name_Initialize_Scalars
+         then
+            Initialize_Scalars := True;
+         end if;
+
+         Next (Item);
+      end loop;
+   end;
+
    --  If a mapping file has been specified by a -gnatem switch, update
    --  it if there has been some sources that were not in the mappings.