summaryrefslogtreecommitdiffstats
path: root/gcc/ada/frontend.adb
blob: 758513eb180ef99ccdeed48d2c02c5844a5fbe08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             F R O N T E N D                              --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--          Copyright (C) 1992-2002 Free Software Foundation, Inc.          --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
-- MA 02111-1307, USA.                                                      --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

with Atree;    use Atree;
with Checks;
with CStand;
with Debug;    use Debug;
with Elists;
with Exp_Ch11;
with Exp_Dbug;
with Fmap;
with Fname.UF;
with Hostparm; use Hostparm;
with Inline;   use Inline;
with Lib;      use Lib;
with Lib.Load; use Lib.Load;
with Live;     use Live;
with Namet;    use Namet;
with Nlists;   use Nlists;
with Opt;      use Opt;
with Osint;
with Output;   use Output;
with Par;
with Rtsfind;
with Sprint;
with Scn;      use Scn;
with Sem;      use Sem;
with Sem_Ch8;  use Sem_Ch8;
with Sem_Elab; use Sem_Elab;
with Sem_Prag; use Sem_Prag;
with Sem_Warn; use Sem_Warn;
with Sinfo;    use Sinfo;
with Sinput;   use Sinput;
with Sinput.L; use Sinput.L;
with Types;    use Types;

procedure Frontend is
      Pragmas : List_Id;
      Prag    : Node_Id;

      Save_Style_Check : constant Boolean := Opt.Style_Check;
      --  Save style check mode so it can be restored later

begin
   --  Carry out package initializations. These are initializations which
   --  might logically be performed at elaboration time, were it not for
   --  the fact that we may be doing things more than once in the big loop
   --  over files. Like elaboration, the order in which these calls are
   --  made is in some cases important. For example, Lib cannot be
   --  initialized until Namet, since it uses names table entries.

   Rtsfind.Initialize;
   Atree.Initialize;
   Nlists.Initialize;
   Elists.Initialize;
   Lib.Load.Initialize;
   Sem_Ch8.Initialize;
   Fname.UF.Initialize;
   Exp_Ch11.Initialize;
   Checks.Initialize;

   --  Create package Standard

   CStand.Create_Standard;

   --  Read and process gnat.adc file if one is present

   if Opt.Config_File then

      --  We always analyze the gnat.adc file with style checks off,
      --  since we don't want a miscellaneous gnat.adc that is around
      --  to discombobulate intended -gnatg compilations.

      Opt.Style_Check := False;

      --  Capture current suppress options, which may get modified

      Scope_Suppress := Opt.Suppress_Options;

      Name_Buffer (1 .. 8) := "gnat.adc";
      Name_Len := 8;
      Source_gnat_adc := Load_Config_File (Name_Enter);

      if Source_gnat_adc /= No_Source_File then
         Initialize_Scanner (No_Unit, Source_gnat_adc);
         Pragmas := Par (Configuration_Pragmas => True);

         if Pragmas /= Error_List
           and then Operating_Mode /= Check_Syntax
         then
            Prag := First (Pragmas);
            while Present (Prag) loop
               Analyze_Pragma (Prag);
               Next (Prag);
            end loop;
         end if;
      end if;

      --  Restore style check, but if gnat.adc turned on checks, leave on!

      Opt.Style_Check := Save_Style_Check or Style_Check;

      --  Capture any modifications to suppress options from config pragmas

      Opt.Suppress_Options := Scope_Suppress;
   end if;

   --  Read and process the configuration pragmas file if one is present

   if Config_File_Name /= null then

      declare
         New_Pragmas        : List_Id;
         Style_Check_Saved  : constant Boolean  := Opt.Style_Check;
         Source_Config_File : Source_File_Index := No_Source_File;

      begin
         --  We always analyze the config pragmas file with style checks off,
         --  since we don't want it to discombobulate intended
         --  -gnatg compilations.

         Opt.Style_Check := False;

         --  Capture current suppress options, which may get modified

         Scope_Suppress := Opt.Suppress_Options;

         Name_Buffer (1 .. Config_File_Name'Length) := Config_File_Name.all;
         Name_Len := Config_File_Name'Length;
         Source_Config_File := Load_Config_File (Name_Enter);

         if Source_Config_File = No_Source_File then
            Osint.Fail
              ("cannot find configuration pragmas file ",
               Config_File_Name.all);
         end if;

         Initialize_Scanner (No_Unit, Source_Config_File);
         New_Pragmas := Par (Configuration_Pragmas => True);

         if New_Pragmas /= Error_List
           and then Operating_Mode /= Check_Syntax
         then
            Prag := First (New_Pragmas);
            while Present (Prag) loop
               Analyze_Pragma (Prag);
               Next (Prag);
            end loop;
         end if;

         --  Restore style check, but if the config pragmas file
         --  turned on checks, leave on!

         Opt.Style_Check := Style_Check_Saved or Style_Check;

         --  Capture any modifications to suppress options from config pragmas

         Opt.Suppress_Options := Scope_Suppress;
      end;

   end if;

   --  If there was a -gnatem switch, initialize the mappings of unit names to
   --  file names and of file names to path names from the mapping file.

   if Mapping_File_Name /= null then
      Fmap.Initialize (Mapping_File_Name.all);
   end if;

   --  We have now processed the command line switches, and the gnat.adc
   --  file, so this is the point at which we want to capture the values
   --  of the configuration switches (see Opt for further details).

   Opt.Register_Opt_Config_Switches;

   --  Initialize the scanner. Note that we do this after the call to
   --  Create_Standard, which uses the scanner in its processing of
   --  floating-point bounds.

   Initialize_Scanner (Main_Unit, Source_Index (Main_Unit));

   --  Output header if in verbose mode or full list mode

   if Verbose_Mode or Full_List then
      Write_Eol;

      if Operating_Mode = Generate_Code then
         Write_Str ("Compiling: ");
      else
         Write_Str ("Checking: ");
      end if;

      Write_Name (Full_File_Name (Current_Source_File));

      if not Debug_Flag_7 then
         Write_Str (" (source file time stamp: ");
         Write_Time_Stamp (Current_Source_File);
         Write_Char (')');
      end if;

      Write_Eol;
   end if;

   --  Here we call the parser to parse the compilation unit (or units in
   --  the check syntax mode, but in that case we won't go on to the
   --  semantics in any case).

   declare
      Discard : List_Id;

   begin
      Discard := Par (Configuration_Pragmas => False);
   end;

   --  The main unit is now loaded, and subunits of it can be loaded,
   --  without reporting spurious loading circularities.

   Set_Loading (Main_Unit, False);

   --  Now on to the semantics. We skip the semantics if we are in syntax
   --  only mode, or if we encountered a fatal error during the parsing.

   if Operating_Mode /= Check_Syntax
     and then not Fatal_Error (Main_Unit)
   then
      --  Reset Operating_Mode to Check_Semantics for subunits. We cannot
      --  actually generate code for subunits, so we suppress expansion.
      --  This also corrects certain problems that occur if we try to
      --  incorporate subunits at a lower level.

      if Operating_Mode = Generate_Code
         and then Nkind (Unit (Cunit (Main_Unit))) = N_Subunit
      then
         Operating_Mode := Check_Semantics;
      end if;

      --  Analyze (and possibly expand) main unit

      Scope_Suppress := Suppress_Options;
      Semantics (Cunit (Main_Unit));

      --  Cleanup processing after completing main analysis

      if Operating_Mode = Generate_Code
         or else (Operating_Mode = Check_Semantics
                   and then Tree_Output)
      then
         Instantiate_Bodies;
      end if;

      if Operating_Mode = Generate_Code then

         if Inline_Processing_Required then
            Analyze_Inlined_Bodies;
         end if;

         --  Remove entities from program that do not have any
         --  execution time references.

         if Debug_Flag_UU then
            Collect_Garbage_Entities;
         end if;

         Check_Elab_Calls;

         --  Build unit exception table. We leave this up to the end to
         --  make sure that all the necessary information is at hand.

         Exp_Ch11.Generate_Unit_Exception_Table;
      end if;

      --  List library units if requested

      if List_Units then
         Lib.List;
      end if;

      --  Output any messages for unreferenced entities

      Output_Unreferenced_Messages;
      Sem_Warn.Check_Unused_Withs;
   end if;

   --  Qualify all entity names in inner packages, package bodies, etc.,
   --  except when compiling for the JVM back end, which depends on
   --  having unqualified names in certain cases and handles the generation
   --  of qualified names when needed.

   if not Java_VM then
      Exp_Dbug.Qualify_All_Entity_Names;
      Exp_Dbug.Generate_Auxiliary_Types;
   end if;

   --  Dump the source now. Note that we do this as soon as the analysis
   --  of the tree is complete, because it is not just a dump in the case
   --  of -gnatD, where it rewrites all source locations in the tree.

   Sprint.Source_Dump;

   --  If a mapping file has been specified by a -gnatem switch,
   --  update it if there has been some sourcs that were not in the mappings.

   if Mapping_File_Name /= null then
      Fmap.Update_Mapping_File (Mapping_File_Name.all);
   end if;

end Frontend;
OpenPOWER on IntegriCloud