1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
10 -- Copyright (C) 1992-2002 Free Software Foundation, Inc. --
12 -- GNAT is free software; you can redistribute it and/or modify it under --
13 -- terms of the GNU General Public License as published by the Free Soft- --
14 -- ware Foundation; either version 2, or (at your option) any later ver- --
15 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
16 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
17 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
18 -- for more details. You should have received a copy of the GNU General --
19 -- Public License distributed with GNAT; see file COPYING. If not, write --
20 -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
21 -- MA 02111-1307, USA. --
23 -- GNAT was originally developed by the GNAT team at New York University. --
24 -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
26 ------------------------------------------------------------------------------
28 with Atree
; use Atree
;
31 with Debug
; use Debug
;
37 with Hostparm
; use Hostparm
;
38 with Inline
; use Inline
;
40 with Lib
.Load
; use Lib
.Load
;
42 with Namet
; use Namet
;
43 with Nlists
; use Nlists
;
46 with Output
; use Output
;
52 with Sem_Ch8
; use Sem_Ch8
;
53 with Sem_Elab
; use Sem_Elab
;
54 with Sem_Prag
; use Sem_Prag
;
55 with Sem_Warn
; use Sem_Warn
;
56 with Sinfo
; use Sinfo
;
57 with Sinput
; use Sinput
;
58 with Sinput
.L
; use Sinput
.L
;
59 with Types
; use Types
;
65 Save_Style_Check
: constant Boolean := Opt
.Style_Check
;
66 -- Save style check mode so it can be restored later
69 -- Carry out package initializations. These are initializations which
70 -- might logically be performed at elaboration time, were it not for
71 -- the fact that we may be doing things more than once in the big loop
72 -- over files. Like elaboration, the order in which these calls are
73 -- made is in some cases important. For example, Lib cannot be
74 -- initialized until Namet, since it uses names table entries.
86 -- Create package Standard
88 CStand
.Create_Standard
;
90 -- Read and process gnat.adc file if one is present
92 if Opt
.Config_File
then
94 -- We always analyze the gnat.adc file with style checks off,
95 -- since we don't want a miscellaneous gnat.adc that is around
96 -- to discombobulate intended -gnatg compilations.
98 Opt
.Style_Check
:= False;
100 -- Capture current suppress options, which may get modified
102 Scope_Suppress
:= Opt
.Suppress_Options
;
104 Name_Buffer
(1 .. 8) := "gnat.adc";
106 Source_gnat_adc
:= Load_Config_File
(Name_Enter
);
108 if Source_gnat_adc
/= No_Source_File
then
109 Initialize_Scanner
(No_Unit
, Source_gnat_adc
);
110 Pragmas
:= Par
(Configuration_Pragmas
=> True);
112 if Pragmas
/= Error_List
113 and then Operating_Mode
/= Check_Syntax
115 Prag
:= First
(Pragmas
);
116 while Present
(Prag
) loop
117 Analyze_Pragma
(Prag
);
123 -- Restore style check, but if gnat.adc turned on checks, leave on!
125 Opt
.Style_Check
:= Save_Style_Check
or Style_Check
;
127 -- Capture any modifications to suppress options from config pragmas
129 Opt
.Suppress_Options
:= Scope_Suppress
;
132 -- Read and process the configuration pragmas file if one is present
134 if Config_File_Name
/= null then
137 New_Pragmas
: List_Id
;
138 Style_Check_Saved
: constant Boolean := Opt
.Style_Check
;
139 Source_Config_File
: Source_File_Index
:= No_Source_File
;
142 -- We always analyze the config pragmas file with style checks off,
143 -- since we don't want it to discombobulate intended
144 -- -gnatg compilations.
146 Opt
.Style_Check
:= False;
148 -- Capture current suppress options, which may get modified
150 Scope_Suppress
:= Opt
.Suppress_Options
;
152 Name_Buffer
(1 .. Config_File_Name
'Length) := Config_File_Name
.all;
153 Name_Len
:= Config_File_Name
'Length;
154 Source_Config_File
:= Load_Config_File
(Name_Enter
);
156 if Source_Config_File
= No_Source_File
then
158 ("cannot find configuration pragmas file ",
159 Config_File_Name
.all);
162 Initialize_Scanner
(No_Unit
, Source_Config_File
);
163 New_Pragmas
:= Par
(Configuration_Pragmas
=> True);
165 if New_Pragmas
/= Error_List
166 and then Operating_Mode
/= Check_Syntax
168 Prag
:= First
(New_Pragmas
);
169 while Present
(Prag
) loop
170 Analyze_Pragma
(Prag
);
175 -- Restore style check, but if the config pragmas file
176 -- turned on checks, leave on!
178 Opt
.Style_Check
:= Style_Check_Saved
or Style_Check
;
180 -- Capture any modifications to suppress options from config pragmas
182 Opt
.Suppress_Options
:= Scope_Suppress
;
187 -- If there was a -gnatem switch, initialize the mappings of unit names to
188 -- file names and of file names to path names from the mapping file.
190 if Mapping_File_Name
/= null then
191 Fmap
.Initialize
(Mapping_File_Name
.all);
194 -- We have now processed the command line switches, and the gnat.adc
195 -- file, so this is the point at which we want to capture the values
196 -- of the configuration switches (see Opt for further details).
198 Opt
.Register_Opt_Config_Switches
;
200 -- Initialize the scanner. Note that we do this after the call to
201 -- Create_Standard, which uses the scanner in its processing of
202 -- floating-point bounds.
204 Initialize_Scanner
(Main_Unit
, Source_Index
(Main_Unit
));
206 -- Output header if in verbose mode or full list mode
208 if Verbose_Mode
or Full_List
then
211 if Operating_Mode
= Generate_Code
then
212 Write_Str
("Compiling: ");
214 Write_Str
("Checking: ");
217 Write_Name
(Full_File_Name
(Current_Source_File
));
219 if not Debug_Flag_7
then
220 Write_Str
(" (source file time stamp: ");
221 Write_Time_Stamp
(Current_Source_File
);
228 -- Here we call the parser to parse the compilation unit (or units in
229 -- the check syntax mode, but in that case we won't go on to the
230 -- semantics in any case).
236 Discard
:= Par
(Configuration_Pragmas
=> False);
239 -- The main unit is now loaded, and subunits of it can be loaded,
240 -- without reporting spurious loading circularities.
242 Set_Loading
(Main_Unit
, False);
244 -- Now on to the semantics. We skip the semantics if we are in syntax
245 -- only mode, or if we encountered a fatal error during the parsing.
247 if Operating_Mode
/= Check_Syntax
248 and then not Fatal_Error
(Main_Unit
)
250 -- Reset Operating_Mode to Check_Semantics for subunits. We cannot
251 -- actually generate code for subunits, so we suppress expansion.
252 -- This also corrects certain problems that occur if we try to
253 -- incorporate subunits at a lower level.
255 if Operating_Mode
= Generate_Code
256 and then Nkind
(Unit
(Cunit
(Main_Unit
))) = N_Subunit
258 Operating_Mode
:= Check_Semantics
;
261 -- Analyze (and possibly expand) main unit
263 Scope_Suppress
:= Suppress_Options
;
264 Semantics
(Cunit
(Main_Unit
));
266 -- Cleanup processing after completing main analysis
268 if Operating_Mode
= Generate_Code
269 or else (Operating_Mode
= Check_Semantics
270 and then Tree_Output
)
275 if Operating_Mode
= Generate_Code
then
277 if Inline_Processing_Required
then
278 Analyze_Inlined_Bodies
;
281 -- Remove entities from program that do not have any
282 -- execution time references.
284 if Debug_Flag_UU
then
285 Collect_Garbage_Entities
;
290 -- Build unit exception table. We leave this up to the end to
291 -- make sure that all the necessary information is at hand.
293 Exp_Ch11
.Generate_Unit_Exception_Table
;
296 -- List library units if requested
302 -- Output any messages for unreferenced entities
304 Output_Unreferenced_Messages
;
305 Sem_Warn
.Check_Unused_Withs
;
308 -- Qualify all entity names in inner packages, package bodies, etc.,
309 -- except when compiling for the JVM back end, which depends on
310 -- having unqualified names in certain cases and handles the generation
311 -- of qualified names when needed.
314 Exp_Dbug
.Qualify_All_Entity_Names
;
315 Exp_Dbug
.Generate_Auxiliary_Types
;
318 -- Dump the source now. Note that we do this as soon as the analysis
319 -- of the tree is complete, because it is not just a dump in the case
320 -- of -gnatD, where it rewrites all source locations in the tree.
324 -- If a mapping file has been specified by a -gnatem switch,
325 -- update it if there has been some sourcs that were not in the mappings.
327 if Mapping_File_Name
/= null then
328 Fmap
.Update_Mapping_File
(Mapping_File_Name
.all);