OSDN Git Service

* gcc-interface/Makefile.in (gnatlib-shared-default): Append
[pf3gnuchains/gcc-fork.git] / gcc / ada / frontend.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             F R O N T E N D                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 with System.Strings; use System.Strings;
27
28 with Atree;    use Atree;
29 with Checks;
30 with CStand;
31 with Debug;    use Debug;
32 with Elists;
33 with Exp_Dbug;
34 with Fmap;
35 with Fname.UF;
36 with Inline;   use Inline;
37 with Lib;      use Lib;
38 with Lib.Load; use Lib.Load;
39 with Live;     use Live;
40 with Namet;    use Namet;
41 with Nlists;   use Nlists;
42 with Opt;      use Opt;
43 with Osint;
44 with Par;
45 with Prep;
46 with Prepcomp;
47 with Restrict; use Restrict;
48 with Rident;   use Rident;
49 with Rtsfind;  use Rtsfind;
50 with Snames;   use Snames;
51 with Sprint;
52 with Scn;      use Scn;
53 with Sem;      use Sem;
54 with Sem_Aux;
55 with Sem_Ch8;  use Sem_Ch8;
56 with Sem_SCIL;
57 with Sem_Elab; use Sem_Elab;
58 with Sem_Prag; use Sem_Prag;
59 with Sem_Warn; use Sem_Warn;
60 with Sinfo;    use Sinfo;
61 with Sinput;   use Sinput;
62 with Sinput.L; use Sinput.L;
63 with SCIL_LL;  use SCIL_LL;
64 with Targparm; use Targparm;
65 with Tbuild;   use Tbuild;
66 with Types;    use Types;
67
68 procedure Frontend is
69    Config_Pragmas : List_Id;
70    --  Gather configuration pragmas
71
72 begin
73    --  Carry out package initializations. These are initializations which might
74    --  logically be performed at elaboration time, were it not for the fact
75    --  that we may be doing things more than once in the big loop over files.
76    --  Like elaboration, the order in which these calls are made is in some
77    --  cases important. For example, Lib cannot be initialized before Namet,
78    --  since it uses names table entries.
79
80    Rtsfind.Initialize;
81    Atree.Initialize;
82    Nlists.Initialize;
83    Elists.Initialize;
84    Lib.Load.Initialize;
85    Sem_Aux.Initialize;
86    Sem_Ch8.Initialize;
87    Sem_Prag.Initialize;
88    Fname.UF.Initialize;
89    Checks.Initialize;
90    Sem_Warn.Initialize;
91    Prep.Initialize;
92
93    if Generate_SCIL then
94       SCIL_LL.Initialize;
95    end if;
96
97    --  Create package Standard
98
99    CStand.Create_Standard;
100
101    --  If the -gnatd.H flag is present, we are only interested in the Standard
102    --  package, so the frontend has done its job here.
103
104    if Debug_Flag_Dot_HH then
105       return;
106    end if;
107
108    --  Check possible symbol definitions specified by -gnateD switches
109
110    Prepcomp.Process_Command_Line_Symbol_Definitions;
111
112    --  If -gnatep= was specified, parse the preprocessing data file
113
114    if Preprocessing_Data_File /= null then
115       Name_Len := Preprocessing_Data_File'Length;
116       Name_Buffer (1 .. Name_Len) := Preprocessing_Data_File.all;
117       Prepcomp.Parse_Preprocessing_Data_File (Name_Find);
118
119    --  Otherwise, check if there were preprocessing symbols on the command
120    --  line and set preprocessing if there are.
121
122    else
123       Prepcomp.Check_Symbols;
124    end if;
125
126    --  We set Parsing_Main_Extended_Source true here to cover processing of all
127    --  the configuration pragma files, as well as the main source unit itself.
128
129    Parsing_Main_Extended_Source := True;
130
131    --  Now that the preprocessing situation is established, we are able to
132    --  load the main source (this is no longer done by Lib.Load.Initialize).
133
134    Lib.Load.Load_Main_Source;
135
136    --  Return immediately if the main source could not be found
137
138    if Sinput.Main_Source_File = No_Source_File then
139       return;
140    end if;
141
142    --  Read and process configuration pragma files if present
143
144    declare
145       Save_Style_Check : constant Boolean := Opt.Style_Check;
146       --  Save style check mode so it can be restored later
147
148       Source_Config_File : Source_File_Index;
149       --  Source reference for -gnatec configuration file
150
151       Prag : Node_Id;
152
153    begin
154       --  We always analyze config files with style checks off, since
155       --  we don't want a miscellaneous gnat.adc that is around to
156       --  discombobulate intended -gnatg or -gnaty compilations. We
157       --  also disconnect checking for maximum line length.
158
159       Opt.Style_Check := False;
160       Style_Check := False;
161
162       --  Capture current suppress options, which may get modified
163
164       Scope_Suppress := Opt.Suppress_Options;
165
166       --  First deal with gnat.adc file
167
168       if Opt.Config_File then
169          Name_Buffer (1 .. 8) := "gnat.adc";
170          Name_Len := 8;
171          Source_gnat_adc := Load_Config_File (Name_Enter);
172
173          if Source_gnat_adc /= No_Source_File then
174             Initialize_Scanner (No_Unit, Source_gnat_adc);
175             Config_Pragmas := Par (Configuration_Pragmas => True);
176          else
177             Config_Pragmas := Empty_List;
178          end if;
179
180       else
181          Config_Pragmas := Empty_List;
182       end if;
183
184       --  Now deal with specified config pragmas files if there are any
185
186       if Opt.Config_File_Names /= null then
187          for Index in Opt.Config_File_Names'Range loop
188             Name_Len := Config_File_Names (Index)'Length;
189             Name_Buffer (1 .. Name_Len) := Config_File_Names (Index).all;
190             Source_Config_File := Load_Config_File (Name_Enter);
191
192             if Source_Config_File = No_Source_File then
193                Osint.Fail
194                  ("cannot find configuration pragmas file "
195                   & Config_File_Names (Index).all);
196             end if;
197
198             Initialize_Scanner (No_Unit, Source_Config_File);
199             Append_List_To
200               (Config_Pragmas, Par (Configuration_Pragmas => True));
201          end loop;
202       end if;
203
204       --  Now analyze all pragmas except those whose analysis must be
205       --  deferred till after the main unit is analyzed.
206
207       if Config_Pragmas /= Error_List
208         and then Operating_Mode /= Check_Syntax
209       then
210          Prag := First (Config_Pragmas);
211          while Present (Prag) loop
212             if not Delay_Config_Pragma_Analyze (Prag) then
213                Analyze_Pragma (Prag);
214             end if;
215
216             Next (Prag);
217          end loop;
218       end if;
219
220       --  Restore style check, but if config file turned on checks, leave on!
221
222       Opt.Style_Check := Save_Style_Check or Style_Check;
223
224       --  Capture any modifications to suppress options from config pragmas
225
226       Opt.Suppress_Options := Scope_Suppress;
227    end;
228
229    --  This is where we can capture the value of the compilation unit specific
230    --  restrictions that have been set by the config pragma files (or from
231    --  Targparm), for later restoration when processing e.g. subunits.
232
233    Save_Config_Cunit_Boolean_Restrictions;
234
235    --  If there was a -gnatem switch, initialize the mappings of unit names to
236    --  file names and of file names to path names from the mapping file.
237
238    if Mapping_File_Name /= null then
239       Fmap.Initialize (Mapping_File_Name.all);
240    end if;
241
242    --  Adjust Optimize_Alignment mode from debug switches if necessary
243
244    if Debug_Flag_Dot_SS then
245       Optimize_Alignment := 'S';
246    elsif Debug_Flag_Dot_TT then
247       Optimize_Alignment := 'T';
248    end if;
249
250    --  We have now processed the command line switches, and the configuration
251    --  pragma files, so this is the point at which we want to capture the
252    --  values of the configuration switches (see Opt for further details).
253
254    Opt.Register_Opt_Config_Switches;
255
256    --  Check for file which contains No_Body pragma
257
258    if Source_File_Is_No_Body (Source_Index (Main_Unit)) then
259       Change_Main_Unit_To_Spec;
260    end if;
261
262    --  Initialize the scanner. Note that we do this after the call to
263    --  Create_Standard, which uses the scanner in its processing of
264    --  floating-point bounds.
265
266    Initialize_Scanner (Main_Unit, Source_Index (Main_Unit));
267
268    --  Here we call the parser to parse the compilation unit (or units in
269    --  the check syntax mode, but in that case we won't go on to the
270    --  semantics in any case).
271
272    Discard_List (Par (Configuration_Pragmas => False));
273    Parsing_Main_Extended_Source := False;
274
275    --  The main unit is now loaded, and subunits of it can be loaded,
276    --  without reporting spurious loading circularities.
277
278    Set_Loading (Main_Unit, False);
279
280    --  Now that the main unit is installed, we can complete the analysis
281    --  of the pragmas in gnat.adc and the configuration file, that require
282    --  a context for their semantic processing.
283
284    if Config_Pragmas /= Error_List
285      and then Operating_Mode /= Check_Syntax
286    then
287       --  Pragmas that require some semantic activity, such as
288       --  Interrupt_State, cannot be processed until the main unit
289       --  is installed, because they require a compilation unit on
290       --  which to attach with_clauses, etc. So analyze them now.
291
292       declare
293          Prag : Node_Id;
294
295       begin
296          Prag := First (Config_Pragmas);
297          while Present (Prag) loop
298             if Delay_Config_Pragma_Analyze (Prag) then
299                Analyze_Pragma (Prag);
300             end if;
301
302             Next (Prag);
303          end loop;
304       end;
305    end if;
306
307    --  If we have restriction No_Exception_Propagation, and we did not have an
308    --  explicit switch turning off Warn_On_Non_Local_Exception, then turn on
309    --  this warning by default if we have encountered an exception handler.
310
311    if Restriction_Check_Required (No_Exception_Propagation)
312      and then not No_Warn_On_Non_Local_Exception
313      and then Exception_Handler_Encountered
314    then
315       Warn_On_Non_Local_Exception := True;
316    end if;
317
318    --  Now on to the semantics. Skip if in syntax only mode
319
320    if Operating_Mode /= Check_Syntax then
321
322       --  Install the configuration pragmas in the tree
323
324       Set_Config_Pragmas (Aux_Decls_Node (Cunit (Main_Unit)), Config_Pragmas);
325
326       --  Following steps are skipped if we had a fatal error during parsing
327
328       if not Fatal_Error (Main_Unit) then
329
330          --  Reset Operating_Mode to Check_Semantics for subunits. We cannot
331          --  actually generate code for subunits, so we suppress expansion.
332          --  This also corrects certain problems that occur if we try to
333          --  incorporate subunits at a lower level.
334
335          if Operating_Mode = Generate_Code
336            and then Nkind (Unit (Cunit (Main_Unit))) = N_Subunit
337          then
338             Operating_Mode := Check_Semantics;
339          end if;
340
341          --  Analyze (and possibly expand) main unit
342
343          Scope_Suppress := Suppress_Options;
344          Semantics (Cunit (Main_Unit));
345
346          --  Cleanup processing after completing main analysis
347
348          if Operating_Mode = Generate_Code
349            or else (Operating_Mode = Check_Semantics
350                      and then ASIS_Mode)
351          then
352             Instantiate_Bodies;
353          end if;
354
355          if Operating_Mode = Generate_Code then
356             if Inline_Processing_Required then
357                Analyze_Inlined_Bodies;
358             end if;
359
360             --  Remove entities from program that do not have any
361             --  execution time references.
362
363             if Debug_Flag_UU then
364                Collect_Garbage_Entities;
365             end if;
366
367             Check_Elab_Calls;
368          end if;
369
370          --  List library units if requested
371
372          if List_Units then
373             Lib.List;
374          end if;
375
376          --  Output waiting warning messages
377
378          Sem_Warn.Output_Non_Modified_In_Out_Warnings;
379          Sem_Warn.Output_Unreferenced_Messages;
380          Sem_Warn.Check_Unused_Withs;
381          Sem_Warn.Output_Unused_Warnings_Off_Warnings;
382       end if;
383    end if;
384
385    --  Qualify all entity names in inner packages, package bodies, etc.,
386    --  except when compiling for the VM back-ends, which depend on having
387    --  unqualified names in certain cases and handles the generation of
388    --  qualified names when needed.
389
390    if VM_Target = No_VM then
391       Exp_Dbug.Qualify_All_Entity_Names;
392    end if;
393
394    --  SCIL backend requirement. Check that SCIL nodes associated with
395    --  dispatching calls reference subprogram calls.
396
397    if Generate_SCIL then
398       pragma Debug (Sem_SCIL.Check_SCIL_Nodes (Cunit (Main_Unit)));
399       null;
400    end if;
401
402    --  Dump the source now. Note that we do this as soon as the analysis
403    --  of the tree is complete, because it is not just a dump in the case
404    --  of -gnatD, where it rewrites all source locations in the tree.
405
406    Sprint.Source_Dump;
407
408    --  Check again for configuration pragmas that appear in the context of
409    --  the main unit. These pragmas only affect the main unit, and the
410    --  corresponding flag is reset after each call to Semantics, but they
411    --  may affect the generated ali for the unit, and therefore the flag
412    --  must be set properly after compilation. Currently we only check for
413    --  Initialize_Scalars, but others should be checked: as well???
414
415    declare
416       Item  : Node_Id;
417
418    begin
419       Item := First (Context_Items (Cunit (Main_Unit)));
420       while Present (Item) loop
421          if Nkind (Item) = N_Pragma
422            and then Pragma_Name (Item) = Name_Initialize_Scalars
423          then
424             Initialize_Scalars := True;
425          end if;
426
427          Next (Item);
428       end loop;
429    end;
430
431    --  If a mapping file has been specified by a -gnatem switch, update
432    --  it if there has been some sources that were not in the mappings.
433
434    if Mapping_File_Name /= null then
435       Fmap.Update_Mapping_File (Mapping_File_Name.all);
436    end if;
437
438    return;
439 end Frontend;