Mention KTR_IFQ and KTR_IF_START
[dragonfly.git] / contrib / gcc-3.4 / gcc / f / top.c
1 /* top.c -- Implementation File (module.c template V1.0)
2    Copyright (C) 1995, 1996, 1997, 1999, 2001, 2003
3    Free Software Foundation, Inc.
4    Contributed by James Craig Burley.
5
6 This file is part of GNU Fortran.
7
8 GNU Fortran is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU Fortran is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU Fortran; see the file COPYING.  If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.
22
23    Related Modules:
24       None.
25
26    Description:
27       The GNU Fortran Front End.
28
29    Modifications:
30 */
31
32 /* Include files. */
33
34 #include "proj.h"
35 #include "top.h"
36 #include "bad.h"
37 #include "bit.h"
38 #include "bld.h"
39 #include "com.h"
40 #include "data.h"
41 #include "equiv.h"
42 #include "expr.h"
43 #include "global.h"
44 #include "implic.h"
45 #include "info.h"
46 #include "intrin.h"
47 #include "lab.h"
48 #include "lex.h"
49 #include "malloc.h"
50 #include "name.h"
51 #include "options.h"
52 #include "opts.h"
53 #include "src.h"
54 #include "st.h"
55 #include "storag.h"
56 #include "symbol.h"
57 #include "target.h"
58 #include "where.h"
59 #include "flags.h"
60 #include "toplev.h"
61
62 /* Externals defined here. */
63
64 bool ffe_is_do_internal_checks_ = FALSE;
65 bool ffe_is_90_ = FFETARGET_defaultIS_90;
66 bool ffe_is_automatic_ = FFETARGET_defaultIS_AUTOMATIC;
67 bool ffe_is_backslash_ = FFETARGET_defaultIS_BACKSLASH;
68 bool ffe_is_emulate_complex_ = FALSE;
69 bool ffe_is_underscoring_ = FFETARGET_defaultEXTERNAL_UNDERSCORED
70   || FFETARGET_defaultUNDERSCORED_EXTERNAL_UNDERSCORED;
71 bool ffe_is_second_underscore_ = FFETARGET_defaultUNDERSCORED_EXTERNAL_UNDERSCORED;
72 bool ffe_is_debug_kludge_ = FALSE;
73 bool ffe_is_dollar_ok_ = FFETARGET_defaultIS_DOLLAR_OK;
74 bool ffe_is_f2c_ = FFETARGET_defaultIS_F2C;
75 bool ffe_is_f2c_library_ = FFETARGET_defaultIS_F2C_LIBRARY;
76 bool ffe_is_ffedebug_ = FALSE;
77 bool ffe_is_flatten_arrays_ = FALSE;
78 bool ffe_is_free_form_ = FFETARGET_defaultIS_FREE_FORM;
79 bool ffe_is_globals_ = TRUE;
80 bool ffe_is_init_local_zero_ = FFETARGET_defaultIS_INIT_LOCAL_ZERO;
81 bool ffe_is_mainprog_;          /* TRUE if current prog unit known to be
82                                    main. */
83 bool ffe_is_onetrip_ = FALSE;
84 bool ffe_is_silent_ = TRUE;
85 bool ffe_is_typeless_boz_ = FALSE;
86 bool ffe_is_pedantic_ = FFETARGET_defaultIS_PEDANTIC;
87 bool ffe_is_saveall_;           /* TRUE if mainprog or SAVE (no args) seen. */
88 bool ffe_is_ugly_args_ = TRUE;
89 bool ffe_is_ugly_assign_ = FALSE;       /* Try and store pointer to ASSIGN labels in INTEGER vars. */
90 bool ffe_is_ugly_assumed_ = FALSE;      /* DIMENSION X([...,]1) => DIMENSION X([...,]*) */
91 bool ffe_is_ugly_comma_ = FALSE;
92 bool ffe_is_ugly_complex_ = FALSE;
93 bool ffe_is_ugly_init_ = TRUE;
94 bool ffe_is_ugly_logint_ = FALSE;
95 bool ffe_is_version_ = FALSE;
96 bool ffe_is_vxt_ = FALSE;
97 bool ffe_is_warn_globals_ = TRUE;
98 bool ffe_is_warn_implicit_ = FALSE;
99 bool ffe_is_warn_surprising_ = FALSE;
100 bool ffe_is_zeros_ = FALSE;
101 ffeCase ffe_case_intrin_ = FFETARGET_defaultCASE_INTRIN;
102 ffeCase ffe_case_match_ = FFETARGET_defaultCASE_MATCH;
103 ffeCase ffe_case_source_ = FFETARGET_defaultCASE_SOURCE;
104 ffeCase ffe_case_symbol_ = FFETARGET_defaultCASE_SYMBOL;
105 ffeIntrinsicState ffe_intrinsic_state_badu77_ = FFE_intrinsicstateENABLED;
106 ffeIntrinsicState ffe_intrinsic_state_gnu_ = FFE_intrinsicstateENABLED;
107 ffeIntrinsicState ffe_intrinsic_state_f2c_ = FFE_intrinsicstateENABLED;
108 ffeIntrinsicState ffe_intrinsic_state_f90_ = FFE_intrinsicstateENABLED;
109 ffeIntrinsicState ffe_intrinsic_state_mil_ = FFE_intrinsicstateENABLED;
110 ffeIntrinsicState ffe_intrinsic_state_unix_ = FFE_intrinsicstateENABLED;
111 ffeIntrinsicState ffe_intrinsic_state_vxt_ = FFE_intrinsicstateENABLED;
112 int ffe_fixed_line_length_ = FFETARGET_defaultFIXED_LINE_LENGTH;
113 mallocPool ffe_file_pool_ = NULL;
114 mallocPool ffe_any_unit_pool_ = NULL;
115 mallocPool ffe_program_unit_pool_ = NULL;
116 ffeCounter ffe_count_0 = 0;
117 ffeCounter ffe_count_1 = 0;
118 ffeCounter ffe_count_2 = 0;
119 ffeCounter ffe_count_3 = 0;
120 ffeCounter ffe_count_4 = 0;
121 bool ffe_in_0 = FALSE;
122 bool ffe_in_1 = FALSE;
123 bool ffe_in_2 = FALSE;
124 bool ffe_in_3 = FALSE;
125 bool ffe_in_4 = FALSE;
126
127 /* Simple definitions and enumerations. */
128
129
130 /* Internal typedefs. */
131
132
133 /* Private include files. */
134
135
136 /* Internal structure definitions. */
137
138
139 /* Static objects accessed by functions in this module. */
140
141
142 /* Static functions (internal). */
143
144 static bool ffe_is_digit_string_ (const char *s);
145
146 /* Internal macros. */
147 \f
148 static bool
149 ffe_is_digit_string_ (const char *s)
150 {
151   const char *p;
152
153   for (p = s; ISDIGIT (*p); ++p)
154     ;
155
156   return (p != s) && (*p == '\0');
157 }
158
159 /* Get ready for options handling.  */
160 unsigned int
161 ffe_init_options (unsigned int argc ATTRIBUTE_UNUSED,
162                   const char **argv ATTRIBUTE_UNUSED)
163 {
164   /* Set default options for Fortran.  */
165   flag_move_all_movables = 1;
166   flag_reduce_all_givs = 1;
167   flag_argument_noalias = 2;
168   flag_merge_constants = 2;
169   flag_errno_math = 0;
170   flag_complex_divide_method = 1;
171
172   return CL_F77;
173 }
174
175 /* Handle command-line options.  Returns 0 if unrecognized, 1 if
176    recognized and handled.  */
177 int
178 ffe_handle_option (size_t scode, const char *arg, int value)
179 {
180   enum opt_code code = (enum opt_code) scode;
181
182   switch (code)
183     {
184     default:
185       abort();
186
187     case OPT_fversion:
188       ffe_set_is_version (TRUE);
189       ffe_set_is_do_internal_checks (TRUE);
190       break;
191
192     case OPT_ff66:
193       ffe_set_is_onetrip (value);
194       ffe_set_is_ugly_assumed (value);
195       break;
196
197     case OPT_ff77:
198       ffe_set_is_backslash (value);
199       if (value)
200         ffe_set_is_typeless_boz (FALSE);
201       break;
202
203     case OPT_ff90:
204       ffe_set_is_90 (value);
205       break;
206
207     case OPT_fautomatic:
208       ffe_set_is_automatic (value);
209       break;
210
211     case OPT_fdollar_ok:
212       ffe_set_is_dollar_ok (value);
213       break;
214
215     case OPT_ff2c:
216       ffe_set_is_f2c (value);
217       break;
218
219     case OPT_ff2c_library:
220       ffe_set_is_f2c_library (value);
221       break;
222
223     case OPT_fflatten_arrays:
224       ffe_set_is_f2c_library (value);
225       break;
226
227     case OPT_ffree_form:
228       ffe_set_is_free_form (value);
229       break;
230
231     case OPT_ffixed_form:
232       ffe_set_is_free_form (!value);
233       break;
234
235     case OPT_fpedantic:
236       ffe_set_is_pedantic (value);
237       break;
238
239     case OPT_fvxt:
240       ffe_set_is_vxt (value);
241       break;
242
243     case OPT_fvxt_not_f90:
244       warning ("-fvxt-not-f90 no longer supported -- try -fvxt");
245       break;
246
247     case OPT_ff90_not_vxt:
248       warning ("-ff90-not-vxt no longer supported -- try -fno-vxt -ff90");
249       break;
250
251     case OPT_fugly:
252       ffe_set_is_ugly_args (value);
253       ffe_set_is_ugly_assign (value);
254       ffe_set_is_ugly_assumed (value);
255       ffe_set_is_ugly_comma (value);
256       ffe_set_is_ugly_complex (value);
257       ffe_set_is_ugly_init (value);
258       ffe_set_is_ugly_logint (value);
259       break;
260
261     case OPT_fugly_args:
262       ffe_set_is_ugly_args (value);
263       break;
264
265     case OPT_fugly_assign:
266       ffe_set_is_ugly_assign (value);
267       break;
268
269     case OPT_fugly_assumed:
270       ffe_set_is_ugly_assumed (value);
271       break;
272
273     case OPT_fugly_comma:
274       ffe_set_is_ugly_comma (value);
275       break;
276
277     case OPT_fugly_complex:
278       ffe_set_is_ugly_complex (value);
279       break;
280
281     case OPT_fugly_init:
282       ffe_set_is_ugly_init (value);
283       break;
284
285     case OPT_fugly_logint:
286       ffe_set_is_ugly_logint (value);
287       break;
288
289     case OPT_fxyzzy:
290       ffe_set_is_ffedebug (value);
291       break;
292
293     case OPT_finit_local_zero:
294       ffe_set_is_init_local_zero (value);
295       break;
296
297     case OPT_femulate_complex:
298       ffe_set_is_emulate_complex (value);
299       break;
300
301     case OPT_fbackslash:
302       ffe_set_is_backslash (value);
303       break;
304
305     case OPT_funderscoring:
306       ffe_set_is_underscoring (value);
307       break;
308
309     case OPT_fsecond_underscore:
310       ffe_set_is_second_underscore (value);
311       break;
312
313     case OPT_fzeros:
314       ffe_set_is_zeros (value);
315       break;
316
317     case OPT_fdebug_kludge:
318       warning ("-fdebug-kludge is disabled, use normal debugging flags");
319       break;
320
321     case OPT_fonetrip:
322       ffe_set_is_onetrip (value);
323       break;
324
325     case OPT_fsilent:
326       ffe_set_is_silent (value);
327       break;
328
329     case OPT_fglobals:
330       ffe_set_is_globals (value);
331       break;
332
333     case OPT_ffortran_bounds_check:
334       flag_bounds_check = value;
335       break;
336
337     case OPT_ftypeless_boz:
338       ffe_set_is_typeless_boz (value);
339       break;
340
341     case OPT_fintrin_case_initcap:
342       ffe_set_case_intrin (FFE_caseINITCAP);
343       break;
344
345     case OPT_fintrin_case_lower:
346       ffe_set_case_intrin (FFE_caseLOWER);
347       break;
348
349     case OPT_fintrin_case_upper:
350       ffe_set_case_intrin (FFE_caseUPPER);
351       break;
352
353     case OPT_fintrin_case_any:
354       ffe_set_case_intrin (FFE_caseNONE);
355       break;
356
357     case OPT_fmatch_case_initcap:
358       ffe_set_case_match (FFE_caseINITCAP);
359       break;
360
361     case OPT_fmatch_case_lower:
362       ffe_set_case_match (FFE_caseLOWER);
363       break;
364
365     case OPT_fmatch_case_upper:
366       ffe_set_case_match (FFE_caseUPPER);
367       break;
368
369     case OPT_fmatch_case_any:
370       ffe_set_case_match (FFE_caseNONE);
371       break;
372
373     case OPT_fsource_case_lower:
374       ffe_set_case_source (FFE_caseLOWER);
375       break;
376
377     case OPT_fsource_case_preserve:
378       ffe_set_case_match (FFE_caseNONE);
379       break;
380
381     case OPT_fsource_case_upper:
382       ffe_set_case_source (FFE_caseUPPER);
383       break;
384
385     case OPT_fsymbol_case_initcap:
386       ffe_set_case_symbol (FFE_caseINITCAP);
387       break;
388
389     case OPT_fsymbol_case_lower:
390       ffe_set_case_symbol (FFE_caseLOWER);
391       break;
392
393     case OPT_fsymbol_case_upper:
394       ffe_set_case_symbol (FFE_caseUPPER);
395       break;
396
397     case OPT_fsymbol_case_any:
398       ffe_set_case_symbol (FFE_caseNONE);
399       break;
400
401     case OPT_fcase_strict_upper:
402       ffe_set_case_intrin (FFE_caseUPPER);
403       ffe_set_case_match (FFE_caseUPPER);
404       ffe_set_case_source (FFE_caseNONE);
405       ffe_set_case_symbol (FFE_caseUPPER);
406       break;
407
408     case OPT_fcase_strict_lower:
409       ffe_set_case_intrin (FFE_caseLOWER);
410       ffe_set_case_match (FFE_caseLOWER);
411       ffe_set_case_source (FFE_caseNONE);
412       ffe_set_case_symbol (FFE_caseLOWER);
413       break;
414
415     case OPT_fcase_initcap:
416       ffe_set_case_intrin (FFE_caseINITCAP);
417       ffe_set_case_match (FFE_caseINITCAP);
418       ffe_set_case_source (FFE_caseNONE);
419       ffe_set_case_symbol (FFE_caseINITCAP);
420       break;
421
422     case OPT_fcase_upper:
423       ffe_set_case_intrin (FFE_caseNONE);
424       ffe_set_case_match (FFE_caseNONE);
425       ffe_set_case_source (FFE_caseUPPER);
426       ffe_set_case_symbol (FFE_caseNONE);
427       break;
428
429     case OPT_fcase_lower:
430       ffe_set_case_intrin (FFE_caseNONE);
431       ffe_set_case_match (FFE_caseNONE);
432       ffe_set_case_source (FFE_caseLOWER);
433       ffe_set_case_symbol (FFE_caseNONE);
434       break;
435
436     case OPT_fcase_preserve:
437       ffe_set_case_intrin (FFE_caseNONE);
438       ffe_set_case_match (FFE_caseNONE);
439       ffe_set_case_source (FFE_caseNONE);
440       ffe_set_case_symbol (FFE_caseNONE);
441       break;
442
443     case OPT_fbadu77_intrinsics_delete:
444       ffe_set_intrinsic_state_badu77 (FFE_intrinsicstateDELETED);
445       break;
446
447     case OPT_fbadu77_intrinsics_hide:
448       ffe_set_intrinsic_state_badu77 (FFE_intrinsicstateHIDDEN);
449       break;
450
451     case OPT_fbadu77_intrinsics_disable:
452       ffe_set_intrinsic_state_badu77 (FFE_intrinsicstateDISABLED);
453       break;
454
455     case OPT_fbadu77_intrinsics_enable:
456       ffe_set_intrinsic_state_badu77 (FFE_intrinsicstateENABLED);
457       break;
458
459     case OPT_fgnu_intrinsics_delete:
460       ffe_set_intrinsic_state_gnu (FFE_intrinsicstateDELETED);
461       break;
462
463     case OPT_fgnu_intrinsics_hide:
464       ffe_set_intrinsic_state_gnu (FFE_intrinsicstateHIDDEN);
465       break;
466
467     case OPT_fgnu_intrinsics_disable:
468       ffe_set_intrinsic_state_gnu (FFE_intrinsicstateDISABLED);
469       break;
470
471     case OPT_fgnu_intrinsics_enable:
472       ffe_set_intrinsic_state_gnu (FFE_intrinsicstateENABLED);
473       break;
474
475     case OPT_ff2c_intrinsics_delete:
476       ffe_set_intrinsic_state_f2c (FFE_intrinsicstateDELETED);
477       break;
478
479     case OPT_ff2c_intrinsics_hide:
480       ffe_set_intrinsic_state_f2c (FFE_intrinsicstateHIDDEN);
481       break;
482
483     case OPT_ff2c_intrinsics_disable:
484       ffe_set_intrinsic_state_f2c (FFE_intrinsicstateDISABLED);
485       break;
486
487     case OPT_ff2c_intrinsics_enable:
488       ffe_set_intrinsic_state_f2c (FFE_intrinsicstateENABLED);
489       break;
490
491     case OPT_ff90_intrinsics_delete:
492       ffe_set_intrinsic_state_f90 (FFE_intrinsicstateDELETED);
493       break;
494
495     case OPT_ff90_intrinsics_hide:
496       ffe_set_intrinsic_state_f90 (FFE_intrinsicstateHIDDEN);
497       break;
498
499     case OPT_ff90_intrinsics_disable:
500       ffe_set_intrinsic_state_f90 (FFE_intrinsicstateDISABLED);
501       break;
502
503     case OPT_ff90_intrinsics_enable:
504       ffe_set_intrinsic_state_f90 (FFE_intrinsicstateENABLED);
505       break;
506
507     case OPT_fmil_intrinsics_delete:
508       ffe_set_intrinsic_state_mil (FFE_intrinsicstateDELETED);
509       break;
510
511     case OPT_fmil_intrinsics_hide:
512       ffe_set_intrinsic_state_mil (FFE_intrinsicstateHIDDEN);
513       break;
514
515     case OPT_fmil_intrinsics_disable:
516       ffe_set_intrinsic_state_mil (FFE_intrinsicstateDISABLED);
517       break;
518
519     case OPT_fmil_intrinsics_enable:
520       ffe_set_intrinsic_state_mil (FFE_intrinsicstateENABLED);
521       break;
522
523     case OPT_funix_intrinsics_delete:
524       ffe_set_intrinsic_state_unix (FFE_intrinsicstateDELETED);
525       break;
526
527     case OPT_funix_intrinsics_hide:
528       ffe_set_intrinsic_state_unix (FFE_intrinsicstateHIDDEN);
529       break;
530
531     case OPT_funix_intrinsics_disable:
532       ffe_set_intrinsic_state_unix (FFE_intrinsicstateDISABLED);
533       break;
534
535     case OPT_funix_intrinsics_enable:
536       ffe_set_intrinsic_state_unix (FFE_intrinsicstateENABLED);
537       break;
538
539     case OPT_fvxt_intrinsics_delete:
540       ffe_set_intrinsic_state_vxt (FFE_intrinsicstateDELETED);
541       break;
542
543     case OPT_fvxt_intrinsics_hide:
544       ffe_set_intrinsic_state_vxt (FFE_intrinsicstateHIDDEN);
545       break;
546
547     case OPT_fvxt_intrinsics_disable:
548       ffe_set_intrinsic_state_vxt (FFE_intrinsicstateDISABLED);
549       break;
550
551     case OPT_fvxt_intrinsics_enable:
552       ffe_set_intrinsic_state_vxt (FFE_intrinsicstateENABLED);
553       break;
554
555     case OPT_ffixed_line_length_:
556       if (strcmp (arg, "none") == 0)
557         ffe_set_fixed_line_length (0);
558       else if (ffe_is_digit_string_ (arg))
559         ffe_set_fixed_line_length (atol (arg));
560       else
561         return 0;
562       break;
563
564     case OPT_Wcomment:
565     case OPT_Wcomments:
566     case OPT_Wimport:
567     case OPT_Wtrigraphs:
568     case OPT_fpreprocessed:
569       /* These are for cpp.  */
570       break;
571
572     case OPT_Wglobals:
573       ffe_set_is_warn_globals (value);
574       break;
575
576     case OPT_Wimplicit:
577       ffe_set_is_warn_implicit (value);
578       break;
579
580     case OPT_Wsurprising:
581       ffe_set_is_warn_surprising (value);
582       break;
583
584     case OPT_Wall:
585       set_Wunused (value);
586       /* We save the value of warn_uninitialized, since if they put
587          -Wuninitialized on the command line, we need to generate a
588          warning about not using it without also specifying -O.  */
589       if (value)
590         {
591           if (warn_uninitialized != 1)
592             warn_uninitialized = 2;
593         }
594       else
595         warn_uninitialized = 0;
596       break;
597
598     case OPT_I:
599       ffecom_decode_include_option (arg);
600       break;
601     }
602
603   return 1;
604 }
605
606 /* Run the FFE on a source file (not an INCLUDEd file).
607
608    Runs the whole shebang.
609
610    Prepare and invoke the appropriate lexer.  */
611
612 void
613 ffe_file (ffewhereFile wf, FILE *f)
614 {
615   ffe_init_1 ();
616   ffelex_set_handler ((ffelexHandler) ffest_first);
617   ffewhere_file_set (wf, TRUE, 0);
618   if (ffe_is_free_form_)
619     ffelex_file_free (wf, f);
620   else
621     ffelex_file_fixed (wf, f);
622   ffest_eof ();
623   ffe_terminate_1 ();
624 }
625
626 /* ffe_init_0 -- Initialize the FFE per image invocation
627
628    ffe_init_0();
629
630    Performs per-image invocation.  */
631
632 void
633 ffe_init_0 (void)
634 {
635   ++ffe_count_0;
636   ffe_in_0 = TRUE;
637
638   ffebad_init_0 ();
639   ffebit_init_0 ();
640   ffebld_init_0 ();
641   ffecom_init_0 ();
642   ffedata_init_0 ();
643   ffeequiv_init_0 ();
644   ffeexpr_init_0 ();
645   ffeglobal_init_0 ();
646   ffeimplic_init_0 ();
647   ffeinfo_init_0 ();
648   ffeintrin_init_0 ();
649   ffelab_init_0 ();
650   ffelex_init_0 ();
651   ffename_init_0 ();
652   ffesrc_init_0 ();
653   ffest_init_0 ();
654   ffestorag_init_0 ();
655   ffesymbol_init_0 ();
656   ffetarget_init_0 ();
657   ffetype_init_0 ();
658   ffewhere_init_0 ();
659 }
660
661 /* ffe_init_1 -- Initialize the FFE per source file
662
663    ffe_init_1();
664
665    Performs per-source-file invocation (not including INCLUDEd files).  */
666
667 void
668 ffe_init_1 (void)
669 {
670   ++ffe_count_1;
671   ffe_in_1 = TRUE;
672
673   assert (ffe_file_pool_ == NULL);
674   ffe_file_pool_ = malloc_pool_new ("File", malloc_pool_image (), 1024);
675
676   ffebad_init_1 ();
677   ffebit_init_1 ();
678   ffebld_init_1 ();
679   ffecom_init_1 ();
680   ffedata_init_1 ();
681   ffeequiv_init_1 ();
682   ffeexpr_init_1 ();
683   ffeglobal_init_1 ();
684   ffeimplic_init_1 ();
685   ffeinfo_init_1 ();
686   ffeintrin_init_1 ();
687   ffelab_init_1 ();
688   ffelex_init_1 ();
689   ffename_init_1 ();
690   ffesrc_init_1 ();
691   ffest_init_1 ();
692   ffestorag_init_1 ();
693   ffesymbol_init_1 ();
694   ffetarget_init_1 ();
695   ffetype_init_1 ();
696   ffewhere_init_1 ();
697
698   ffe_init_2 ();
699 }
700
701 /* ffe_init_2 -- Initialize the FFE per outer program unit
702
703    ffe_init_2();
704
705    Performs per-program-unit invocation.  */
706
707 void
708 ffe_init_2 (void)
709 {
710   ++ffe_count_2;
711   ffe_in_2 = TRUE;
712
713   assert (ffe_program_unit_pool_ == NULL);
714   ffe_program_unit_pool_ = malloc_pool_new ("Program unit", ffe_file_pool_, 1024);
715   ffe_is_mainprog_ = FALSE;
716   ffe_is_saveall_ = !ffe_is_automatic_;
717
718   ffebad_init_2 ();
719   ffebit_init_2 ();
720   ffebld_init_2 ();
721   ffecom_init_2 ();
722   ffedata_init_2 ();
723   ffeequiv_init_2 ();
724   ffeexpr_init_2 ();
725   ffeglobal_init_2 ();
726   ffeimplic_init_2 ();
727   ffeinfo_init_2 ();
728   ffeintrin_init_2 ();
729   ffelab_init_2 ();
730   ffelex_init_2 ();
731   ffename_init_2 ();
732   ffesrc_init_2 ();
733   ffest_init_2 ();
734   ffestorag_init_2 ();
735   ffesymbol_init_2 ();
736   ffetarget_init_2 ();
737   ffetype_init_2 ();
738   ffewhere_init_2 ();
739
740   ffe_init_3 ();
741 }
742
743 /* ffe_init_3 -- Initialize the FFE per any program unit
744
745    ffe_init_3();
746
747    Performs per-any-unit initialization; does NOT do
748    per-statement-function-definition initialization (i.e. the chain
749    of inits, from 0-3, breaks here; level 4 must be invoked independently).  */
750
751 void
752 ffe_init_3 (void)
753 {
754   ++ffe_count_3;
755   ffe_in_3 = TRUE;
756
757   assert (ffe_any_unit_pool_ == NULL);
758   ffe_any_unit_pool_ = malloc_pool_new ("Any unit", ffe_program_unit_pool_, 1024);
759
760   ffebad_init_3 ();
761   ffebit_init_3 ();
762   ffebld_init_3 ();
763   ffecom_init_3 ();
764   ffedata_init_3 ();
765   ffeequiv_init_3 ();
766   ffeexpr_init_3 ();
767   ffeglobal_init_3 ();
768   ffeimplic_init_3 ();
769   ffeinfo_init_3 ();
770   ffeintrin_init_3 ();
771   ffelab_init_3 ();
772   ffelex_init_3 ();
773   ffename_init_3 ();
774   ffesrc_init_3 ();
775   ffest_init_3 ();
776   ffestorag_init_3 ();
777   ffesymbol_init_3 ();
778   ffetarget_init_3 ();
779   ffetype_init_3 ();
780   ffewhere_init_3 ();
781 }
782
783 /* ffe_init_4 -- Initialize the FFE per statement function definition
784
785    ffe_init_4();  */
786
787 void
788 ffe_init_4 (void)
789 {
790   ++ffe_count_4;
791   ffe_in_4 = TRUE;
792
793   ffebad_init_4 ();
794   ffebit_init_4 ();
795   ffebld_init_4 ();
796   ffecom_init_4 ();
797   ffedata_init_4 ();
798   ffeequiv_init_4 ();
799   ffeexpr_init_4 ();
800   ffeglobal_init_4 ();
801   ffeimplic_init_4 ();
802   ffeinfo_init_4 ();
803   ffeintrin_init_4 ();
804   ffelab_init_4 ();
805   ffelex_init_4 ();
806   ffename_init_4 ();
807   ffesrc_init_4 ();
808   ffest_init_4 ();
809   ffestorag_init_4 ();
810   ffesymbol_init_4 ();
811   ffetarget_init_4 ();
812   ffetype_init_4 ();
813   ffewhere_init_4 ();
814 }
815
816 /* ffe_terminate_0 -- Terminate the FFE prior to image termination
817
818    ffe_terminate_0();  */
819
820 void
821 ffe_terminate_0 (void)
822 {
823   ffe_count_1 = 0;
824   ffe_in_0 = FALSE;
825
826   ffebad_terminate_0 ();
827   ffebit_terminate_0 ();
828   ffebld_terminate_0 ();
829   ffecom_terminate_0 ();
830   ffedata_terminate_0 ();
831   ffeequiv_terminate_0 ();
832   ffeexpr_terminate_0 ();
833   ffeglobal_terminate_0 ();
834   ffeimplic_terminate_0 ();
835   ffeinfo_terminate_0 ();
836   ffeintrin_terminate_0 ();
837   ffelab_terminate_0 ();
838   ffelex_terminate_0 ();
839   ffename_terminate_0 ();
840   ffesrc_terminate_0 ();
841   ffest_terminate_0 ();
842   ffestorag_terminate_0 ();
843   ffesymbol_terminate_0 ();
844   ffetarget_terminate_0 ();
845   ffetype_terminate_0 ();
846   ffewhere_terminate_0 ();
847 }
848
849 /* ffe_terminate_1 -- Terminate the FFE after seeing source file EOF
850
851    ffe_terminate_1();  */
852
853 void
854 ffe_terminate_1 (void)
855 {
856   ffe_count_2 = 0;
857   ffe_in_1 = FALSE;
858
859   ffe_terminate_2 ();
860
861   ffebad_terminate_1 ();
862   ffebit_terminate_1 ();
863   ffebld_terminate_1 ();
864   ffecom_terminate_1 ();
865   ffedata_terminate_1 ();
866   ffeequiv_terminate_1 ();
867   ffeexpr_terminate_1 ();
868   ffeglobal_terminate_1 ();
869   ffeimplic_terminate_1 ();
870   ffeinfo_terminate_1 ();
871   ffeintrin_terminate_1 ();
872   ffelab_terminate_1 ();
873   ffelex_terminate_1 ();
874   ffename_terminate_1 ();
875   ffesrc_terminate_1 ();
876   ffest_terminate_1 ();
877   ffestorag_terminate_1 ();
878   ffesymbol_terminate_1 ();
879   ffetarget_terminate_1 ();
880   ffetype_terminate_1 ();
881   ffewhere_terminate_1 ();
882
883   assert (ffe_file_pool_ != NULL);
884   malloc_pool_kill (ffe_file_pool_);
885   ffe_file_pool_ = NULL;
886 }
887
888 /* ffe_terminate_2 -- Terminate the FFE after seeing outer program unit END
889
890    ffe_terminate_2();  */
891
892 void
893 ffe_terminate_2 (void)
894 {
895   ffe_count_3 = 0;
896   ffe_in_2 = FALSE;
897
898   ffe_terminate_3 ();
899
900   ffebad_terminate_2 ();
901   ffebit_terminate_2 ();
902   ffebld_terminate_2 ();
903   ffecom_terminate_2 ();
904   ffedata_terminate_2 ();
905   ffeequiv_terminate_2 ();
906   ffeexpr_terminate_2 ();
907   ffeglobal_terminate_2 ();
908   ffeimplic_terminate_2 ();
909   ffeinfo_terminate_2 ();
910   ffeintrin_terminate_2 ();
911   ffelab_terminate_2 ();
912   ffelex_terminate_2 ();
913   ffename_terminate_2 ();
914   ffesrc_terminate_2 ();
915   ffest_terminate_2 ();
916   ffestorag_terminate_2 ();
917   ffesymbol_terminate_2 ();
918   ffetarget_terminate_2 ();
919   ffetype_terminate_2 ();
920   ffewhere_terminate_2 ();
921
922   assert (ffe_program_unit_pool_ != NULL);
923   malloc_pool_kill (ffe_program_unit_pool_);
924   ffe_program_unit_pool_ = NULL;
925 }
926
927 /* ffe_terminate_3 -- Terminate the FFE after seeing any program unit END
928
929    ffe_terminate_3();  */
930
931 void
932 ffe_terminate_3 (void)
933 {
934   ffe_count_4 = 0;
935   ffe_in_3 = FALSE;
936
937   ffebad_terminate_3 ();
938   ffebit_terminate_3 ();
939   ffebld_terminate_3 ();
940   ffecom_terminate_3 ();
941   ffedata_terminate_3 ();
942   ffeequiv_terminate_3 ();
943   ffeexpr_terminate_3 ();
944   ffeglobal_terminate_3 ();
945   ffeimplic_terminate_3 ();
946   ffeinfo_terminate_3 ();
947   ffeintrin_terminate_3 ();
948   ffelab_terminate_3 ();
949   ffelex_terminate_3 ();
950   ffename_terminate_3 ();
951   ffesrc_terminate_3 ();
952   ffest_terminate_3 ();
953   ffestorag_terminate_3 ();
954   ffesymbol_terminate_3 ();
955   ffetarget_terminate_3 ();
956   ffetype_terminate_3 ();
957   ffewhere_terminate_3 ();
958
959   assert (ffe_any_unit_pool_ != NULL);
960   malloc_pool_kill (ffe_any_unit_pool_);
961   ffe_any_unit_pool_ = NULL;
962 }
963
964 /* ffe_terminate_4 -- Terminate the FFE after seeing sfunc def expression
965
966    ffe_terminate_4();  */
967
968 void
969 ffe_terminate_4 (void)
970 {
971   ffe_in_4 = FALSE;
972
973   ffebad_terminate_4 ();
974   ffebit_terminate_4 ();
975   ffebld_terminate_4 ();
976   ffecom_terminate_4 ();
977   ffedata_terminate_4 ();
978   ffeequiv_terminate_4 ();
979   ffeexpr_terminate_4 ();
980   ffeglobal_terminate_4 ();
981   ffeimplic_terminate_4 ();
982   ffeinfo_terminate_4 ();
983   ffeintrin_terminate_4 ();
984   ffelab_terminate_4 ();
985   ffelex_terminate_4 ();
986   ffename_terminate_4 ();
987   ffesrc_terminate_4 ();
988   ffest_terminate_4 ();
989   ffestorag_terminate_4 ();
990   ffesymbol_terminate_4 ();
991   ffetarget_terminate_4 ();
992   ffetype_terminate_4 ();
993   ffewhere_terminate_4 ();
994 }