OSDN Git Service

aa8f5e13972561175048ff55064ea883f5189aa7
[pf3gnuchains/gcc-fork.git] / gcc / toplev.c
1 /* Top level of GNU C compiler
2    Copyright (C) 1987, 88, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20 /* This is the top level of cc1/c++.
21    It parses command args, opens files, invokes the various passes
22    in the proper order, and counts the time used by each.
23    Error messages and low-level interface to malloc also handled here.  */
24
25 #include "config.h"
26 #ifdef __STDC__
27 #include <stdarg.h>
28 #else
29 #include <varargs.h>
30 #endif
31 #include <stdio.h>
32 #include <signal.h>
33 #include <setjmp.h>
34 #include <sys/types.h>
35 #include <ctype.h>
36 #include <sys/stat.h>
37
38 #ifndef WINNT
39 #ifdef USG
40 #undef FLOAT
41 #include <sys/param.h>
42 /* This is for hpux.  It is a real screw.  They should change hpux.  */
43 #undef FLOAT
44 #include <sys/times.h>
45 #include <time.h>   /* Correct for hpux at least.  Is it good on other USG?  */
46 #undef FFS  /* Some systems define this in param.h.  */
47 #else
48 #ifndef VMS
49 #include <sys/time.h>
50 #include <sys/resource.h>
51 #endif
52 #endif
53 #endif
54
55 #include "input.h"
56 #include "tree.h"
57 #include "rtl.h"
58 #include "flags.h"
59 #include "insn-attr.h"
60 #include "defaults.h"
61 #include "output.h"
62 #include "bytecode.h"
63 #include "bc-emit.h"
64
65 #ifdef XCOFF_DEBUGGING_INFO
66 #include "xcoffout.h"
67 #endif
68 \f
69 #ifdef VMS
70 /* The extra parameters substantially improve the I/O performance.  */
71 static FILE *
72 vms_fopen (fname, type)
73      char * fname;
74      char * type;
75 {
76   /* The <stdio.h> in the gcc-vms-1.42 distribution prototypes fopen with two
77      fixed arguments, which matches ANSI's specification but not VAXCRTL's
78      pre-ANSI implementation.  This hack circumvents the mismatch problem.  */
79   FILE *(*vmslib_fopen)() = (FILE *(*)()) fopen;
80
81   if (*type == 'w')
82     return (*vmslib_fopen) (fname, type, "mbc=32",
83                             "deq=64", "fop=tef", "shr=nil");
84   else
85     return (*vmslib_fopen) (fname, type, "mbc=32");
86 }
87 #define fopen vms_fopen
88 #endif  /* VMS */
89
90 #ifndef DEFAULT_GDB_EXTENSIONS
91 #define DEFAULT_GDB_EXTENSIONS 1
92 #endif
93
94 extern int rtx_equal_function_value_matters;
95
96 #if ! (defined (VMS) || defined (OS2))
97 extern char **environ;
98 #endif
99 extern char *version_string, *language_string;
100
101 /* Carry information from ASM_DECLARE_OBJECT_NAME
102    to ASM_FINISH_DECLARE_OBJECT.  */
103
104 extern int size_directive_output;
105 extern tree last_assemble_variable_decl;
106
107 extern void init_lex ();
108 extern void init_decl_processing ();
109 extern void init_obstacks ();
110 extern void init_tree_codes ();
111 extern void init_rtl ();
112 extern void init_regs ();
113 extern void init_optabs ();
114 extern void init_stmt ();
115 extern void init_reg_sets ();
116 extern void dump_flow_info ();
117 extern void dump_sched_info ();
118 extern void dump_local_alloc ();
119
120 void rest_of_decl_compilation ();
121 void error_with_file_and_line PVPROTO((char *file, int line, char *s, ...));
122 void error_with_decl PVPROTO((tree decl, char *s, ...));
123 void error_for_asm PVPROTO((rtx insn, char *s, ...));
124 void error PVPROTO((char *s, ...));
125 void fatal PVPROTO((char *s, ...));
126 void warning_with_file_and_line PVPROTO((char *file, int line, char *s, ...));
127 void warning_with_decl PVPROTO((tree decl, char *s, ...));
128 void warning_for_asm PVPROTO((rtx insn, char *s, ...));
129 void warning PVPROTO((char *s, ...));
130 void pedwarn PVPROTO((char *s, ...));
131 void pedwarn_with_decl PVPROTO((tree decl, char *s, ...));
132 void pedwarn_with_file_and_line PVPROTO((char *file, int line, char *s, ...));
133 void sorry PVPROTO((char *s, ...));
134 void really_sorry PVPROTO((char *s, ...));
135 void fancy_abort ();
136 #ifndef abort
137 void abort ();
138 #endif
139 void set_target_switch ();
140 static void print_switch_values ();
141 static char *decl_name ();
142
143 /* Name of program invoked, sans directories.  */
144
145 char *progname;
146
147 /* Copy of arguments to main.  */
148 int save_argc;
149 char **save_argv;
150 \f
151 /* Name of current original source file (what was input to cpp).
152    This comes from each #-command in the actual input.  */
153
154 char *input_filename;
155
156 /* Name of top-level original source file (what was input to cpp).
157    This comes from the #-command at the beginning of the actual input.
158    If there isn't any there, then this is the cc1 input file name.  */
159
160 char *main_input_filename;
161
162 /* Stream for reading from the input file.  */
163
164 FILE *finput;
165
166 /* Current line number in real source file.  */
167
168 int lineno;
169
170 /* Stack of currently pending input files.  */
171
172 struct file_stack *input_file_stack;
173
174 /* Incremented on each change to input_file_stack.  */
175 int input_file_stack_tick;
176
177 /* FUNCTION_DECL for function now being parsed or compiled.  */
178
179 extern tree current_function_decl;
180
181 /* Name to use as base of names for dump output files.  */
182
183 char *dump_base_name;
184
185 /* Bit flags that specify the machine subtype we are compiling for.
186    Bits are tested using macros TARGET_... defined in the tm.h file
187    and set by `-m...' switches.  Must be defined in rtlanal.c.  */
188
189 extern int target_flags;
190
191 /* Flags saying which kinds of debugging dump have been requested.  */
192
193 int rtl_dump = 0;
194 int rtl_dump_and_exit = 0;
195 int jump_opt_dump = 0;
196 int cse_dump = 0;
197 int loop_dump = 0;
198 int cse2_dump = 0;
199 int flow_dump = 0;
200 int combine_dump = 0;
201 int sched_dump = 0;
202 int local_reg_dump = 0;
203 int global_reg_dump = 0;
204 int sched2_dump = 0;
205 int jump2_opt_dump = 0;
206 int dbr_sched_dump = 0;
207 int flag_print_asm_name = 0;
208 int stack_reg_dump = 0;
209
210 /* Name for output file of assembly code, specified with -o.  */
211
212 char *asm_file_name;
213
214 /* Value of the -G xx switch, and whether it was passed or not.  */
215 int g_switch_value;
216 int g_switch_set;
217
218 /* Type(s) of debugging information we are producing (if any).
219    See flags.h for the definitions of the different possible
220    types of debugging information.  */
221 enum debug_info_type write_symbols = NO_DEBUG;
222
223 /* Level of debugging information we are producing.  See flags.h
224    for the definitions of the different possible levels.  */
225 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
226
227 /* Nonzero means use GNU-only extensions in the generated symbolic
228    debugging information.  */
229 /* Currently, this only has an effect when write_symbols is set to
230    DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
231 int use_gnu_debug_info_extensions = 0;
232
233 /* Nonzero means do optimizations.  -O.
234    Particular numeric values stand for particular amounts of optimization;
235    thus, -O2 stores 2 here.  However, the optimizations beyond the basic
236    ones are not controlled directly by this variable.  Instead, they are
237    controlled by individual `flag_...' variables that are defaulted
238    based on this variable.  */
239
240 int optimize = 0;
241
242 /* Number of error messages and warning messages so far.  */
243
244 int errorcount = 0;
245 int warningcount = 0;
246 int sorrycount = 0;
247
248 /* Flag to output bytecode instead of native assembler */
249 int output_bytecode = 0;
250
251 /* Pointer to function to compute the name to use to print a declaration.  */
252
253 char *(*decl_printable_name) ();
254
255 /* Pointer to function to compute rtl for a language-specific tree code.  */
256
257 struct rtx_def *(*lang_expand_expr) ();
258
259 /* Pointer to function to finish handling an incomplete decl at the
260    end of compilation.  */
261
262 void (*incomplete_decl_finalize_hook) () = 0;
263
264 /* Pointer to function for interim exception handling implementation.
265    This interface will change, and it is only here until a better interface
266    replaces it.  */
267
268 void (*interim_eh_hook) PROTO((tree));
269
270 /* Nonzero if generating code to do profiling.  */
271
272 int profile_flag = 0;
273
274 /* Nonzero if generating code to do profiling on a line-by-line basis.  */
275
276 int profile_block_flag;
277
278 /* Nonzero for -pedantic switch: warn about anything
279    that standard spec forbids.  */
280
281 int pedantic = 0;
282
283 /* Temporarily suppress certain warnings.
284    This is set while reading code from a system header file.  */
285
286 int in_system_header = 0;
287
288 /* Nonzero means do stupid register allocation.
289    Currently, this is 1 if `optimize' is 0.  */
290
291 int obey_regdecls = 0;
292
293 /* Don't print functions as they are compiled and don't print
294    times taken by the various passes.  -quiet.  */
295
296 int quiet_flag = 0;
297 \f
298 /* -f flags.  */
299
300 /* Nonzero means `char' should be signed.  */
301
302 int flag_signed_char;
303
304 /* Nonzero means give an enum type only as many bytes as it needs.  */
305
306 int flag_short_enums;
307
308 /* Nonzero for -fcaller-saves: allocate values in regs that need to
309    be saved across function calls, if that produces overall better code.
310    Optional now, so people can test it.  */
311
312 #ifdef DEFAULT_CALLER_SAVES
313 int flag_caller_saves = 1;
314 #else
315 int flag_caller_saves = 0;
316 #endif
317
318 /* Nonzero if structures and unions should be returned in memory.
319
320    This should only be defined if compatibility with another compiler or
321    with an ABI is needed, because it results in slower code.  */
322
323 #ifndef DEFAULT_PCC_STRUCT_RETURN
324 #define DEFAULT_PCC_STRUCT_RETURN 1
325 #endif
326
327 /* Nonzero for -fpcc-struct-return: return values the same way PCC does.  */
328
329 int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
330
331 /* Nonzero for -fforce-mem: load memory value into a register
332    before arithmetic on it.  This makes better cse but slower compilation.  */
333
334 int flag_force_mem = 0;
335
336 /* Nonzero for -fforce-addr: load memory address into a register before
337    reference to memory.  This makes better cse but slower compilation.  */
338
339 int flag_force_addr = 0;
340
341 /* Nonzero for -fdefer-pop: don't pop args after each function call;
342    instead save them up to pop many calls' args with one insns.  */
343
344 int flag_defer_pop = 0;
345
346 /* Nonzero for -ffloat-store: don't allocate floats and doubles
347    in extended-precision registers.  */
348
349 int flag_float_store = 0;
350
351 /* Nonzero for -fcse-follow-jumps:
352    have cse follow jumps to do a more extensive job.  */
353
354 int flag_cse_follow_jumps;
355
356 /* Nonzero for -fcse-skip-blocks:
357    have cse follow a branch around a block.  */
358 int flag_cse_skip_blocks;
359
360 /* Nonzero for -fexpensive-optimizations:
361    perform miscellaneous relatively-expensive optimizations.  */
362 int flag_expensive_optimizations;
363
364 /* Nonzero for -fthread-jumps:
365    have jump optimize output of loop.  */
366
367 int flag_thread_jumps;
368
369 /* Nonzero enables strength-reduction in loop.c.  */
370
371 int flag_strength_reduce = 0;
372
373 /* Nonzero enables loop unrolling in unroll.c.  Only loops for which the
374    number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
375    UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
376    unrolled.  */
377
378 int flag_unroll_loops;
379
380 /* Nonzero enables loop unrolling in unroll.c.  All loops are unrolled.
381    This is generally not a win.  */
382
383 int flag_unroll_all_loops;
384
385 /* Nonzero for -fwritable-strings:
386    store string constants in data segment and don't uniquize them.  */
387
388 int flag_writable_strings = 0;
389
390 /* Nonzero means don't put addresses of constant functions in registers.
391    Used for compiling the Unix kernel, where strange substitutions are
392    done on the assembly output.  */
393
394 int flag_no_function_cse = 0;
395
396 /* Nonzero for -fomit-frame-pointer:
397    don't make a frame pointer in simple functions that don't require one.  */
398
399 int flag_omit_frame_pointer = 0;
400
401 /* Nonzero to inhibit use of define_optimization peephole opts.  */
402
403 int flag_no_peephole = 0;
404
405 /* Nonzero allows GCC to violate some IEEE or ANSI rules regarding math
406    operations in the interest of optimization.  For example it allows
407    GCC to assume arguments to sqrt are nonnegative numbers, allowing
408    faster code for sqrt to be generated. */
409
410 int flag_fast_math = 0;
411
412 /* Nonzero means all references through pointers are volatile.  */
413
414 int flag_volatile;
415
416 /* Nonzero means treat all global and extern variables as global.  */
417
418 int flag_volatile_global;
419
420 /* Nonzero means just do syntax checking; don't output anything.  */
421
422 int flag_syntax_only = 0;
423
424 /* Nonzero means to rerun cse after loop optimization.  This increases
425    compilation time about 20% and picks up a few more common expressions.  */
426
427 static int flag_rerun_cse_after_loop;
428
429 /* Nonzero for -finline-functions: ok to inline functions that look like
430    good inline candidates.  */
431
432 int flag_inline_functions;
433
434 /* Nonzero for -fkeep-inline-functions: even if we make a function
435    go inline everywhere, keep its definition around for debugging
436    purposes.  */
437
438 int flag_keep_inline_functions;
439
440 /* Nonzero means that functions will not be inlined.  */
441
442 int flag_no_inline;
443
444 /* Nonzero means we should be saving declaration info into a .X file.  */
445
446 int flag_gen_aux_info = 0;
447
448 /* Specified name of aux-info file.  */
449
450 static char *aux_info_file_name;
451
452 /* Nonzero means make the text shared if supported.  */
453
454 int flag_shared_data;
455
456 /* Nonzero means schedule into delayed branch slots if supported.  */
457
458 int flag_delayed_branch;
459
460 /* Nonzero means to run cleanups after CALL_EXPRs.  */
461
462 int flag_short_temps;
463
464 /* Nonzero if we are compiling pure (sharable) code.
465    Value is 1 if we are doing reasonable (i.e. simple
466    offset into offset table) pic.  Value is 2 if we can
467    only perform register offsets.  */
468
469 int flag_pic;
470
471 /* Nonzero means place uninitialized global data in the bss section. */
472
473 int flag_no_common;
474
475 /* Nonzero means pretend it is OK to examine bits of target floats,
476    even if that isn't true.  The resulting code will have incorrect constants,
477    but the same series of instructions that the native compiler would make.  */
478
479 int flag_pretend_float;
480
481 /* Nonzero means change certain warnings into errors.
482    Usually these are warnings about failure to conform to some standard.  */
483
484 int flag_pedantic_errors = 0;
485
486 /* flag_schedule_insns means schedule insns within basic blocks (before
487    local_alloc).
488    flag_schedule_insns_after_reload means schedule insns after
489    global_alloc.  */
490
491 int flag_schedule_insns = 0;
492 int flag_schedule_insns_after_reload = 0;
493
494 /* -finhibit-size-directive inhibits output of .size for ELF.
495    This is used only for compiling crtstuff.c, 
496    and it may be extended to other effects
497    needed for crtstuff.c on other systems.  */
498 int flag_inhibit_size_directive = 0;
499
500 /* -fverbose-asm causes extra commentary information to be produced in
501    the generated assembly code (to make it more readable).  This option
502    is generally only of use to those who actually need to read the
503    generated assembly code (perhaps while debugging the compiler itself).  */
504
505 int flag_verbose_asm = 0;
506
507 /* -fgnu-linker specifies use of the GNU linker for initializations.
508    (Or, more generally, a linker that handles initializations.)
509    -fno-gnu-linker says that collect2 will be used.  */
510 #ifdef USE_COLLECT2
511 int flag_gnu_linker = 0;
512 #else
513 int flag_gnu_linker = 1;
514 #endif
515
516 /* Tag all structures with __attribute__(packed) */
517 int flag_pack_struct = 0;
518
519 /* Table of language-independent -f options.
520    STRING is the option name.  VARIABLE is the address of the variable.
521    ON_VALUE is the value to store in VARIABLE
522     if `-fSTRING' is seen as an option.
523    (If `-fno-STRING' is seen as an option, the opposite value is stored.)  */
524
525 struct { char *string; int *variable; int on_value;} f_options[] =
526 {
527   {"float-store", &flag_float_store, 1},
528   {"volatile", &flag_volatile, 1},
529   {"volatile-global", &flag_volatile_global, 1},
530   {"defer-pop", &flag_defer_pop, 1},
531   {"omit-frame-pointer", &flag_omit_frame_pointer, 1},
532   {"cse-follow-jumps", &flag_cse_follow_jumps, 1},
533   {"cse-skip-blocks", &flag_cse_skip_blocks, 1},
534   {"expensive-optimizations", &flag_expensive_optimizations, 1},
535   {"thread-jumps", &flag_thread_jumps, 1},
536   {"strength-reduce", &flag_strength_reduce, 1},
537   {"unroll-loops", &flag_unroll_loops, 1},
538   {"unroll-all-loops", &flag_unroll_all_loops, 1},
539   {"writable-strings", &flag_writable_strings, 1},
540   {"peephole", &flag_no_peephole, 0},
541   {"force-mem", &flag_force_mem, 1},
542   {"force-addr", &flag_force_addr, 1},
543   {"function-cse", &flag_no_function_cse, 0},
544   {"inline-functions", &flag_inline_functions, 1},
545   {"keep-inline-functions", &flag_keep_inline_functions, 1},
546   {"inline", &flag_no_inline, 0},
547   {"syntax-only", &flag_syntax_only, 1},
548   {"shared-data", &flag_shared_data, 1},
549   {"caller-saves", &flag_caller_saves, 1},
550   {"pcc-struct-return", &flag_pcc_struct_return, 1},
551   {"reg-struct-return", &flag_pcc_struct_return, 0},
552   {"delayed-branch", &flag_delayed_branch, 1},
553   {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1},
554   {"pretend-float", &flag_pretend_float, 1},
555   {"schedule-insns", &flag_schedule_insns, 1},
556   {"schedule-insns2", &flag_schedule_insns_after_reload, 1},
557   {"pic", &flag_pic, 1},
558   {"PIC", &flag_pic, 2},
559   {"fast-math", &flag_fast_math, 1},
560   {"common", &flag_no_common, 0},
561   {"inhibit-size-directive", &flag_inhibit_size_directive, 1},
562   {"verbose-asm", &flag_verbose_asm, 1},
563   {"gnu-linker", &flag_gnu_linker, 1},
564   {"pack-struct", &flag_pack_struct, 1},
565   {"bytecode", &output_bytecode, 1}
566 };
567
568 /* Table of language-specific options.  */
569
570 char *lang_options[] =
571 {
572   "-ansi",
573   "-fallow-single-precision",
574
575   "-fsigned-bitfields",
576   "-funsigned-bitfields",
577   "-fno-signed-bitfields",
578   "-fno-unsigned-bitfields",
579   "-fsigned-char",
580   "-funsigned-char",
581   "-fno-signed-char",
582   "-fno-unsigned-char",
583
584   "-ftraditional",
585   "-traditional",
586   "-fnotraditional",
587   "-fno-traditional",
588
589   "-fasm",
590   "-fno-asm",
591   "-fbuiltin",
592   "-fno-builtin",
593   "-fcond-mismatch",
594   "-fno-cond-mismatch",
595   "-fdollars-in-identifiers",
596   "-fno-dollars-in-identifiers",
597   "-fident",
598   "-fno-ident",
599   "-fshort-double",
600   "-fno-short-double",
601   "-fshort-enums",
602   "-fno-short-enums",
603
604   "-Wall",
605   "-Wbad-function-cast",
606   "-Wno-bad-function-cast",
607   "-Wcast-qual",
608   "-Wno-cast-qual",
609   "-Wchar-subscripts",
610   "-Wno-char-subscripts",
611   "-Wcomment",
612   "-Wno-comment",
613   "-Wcomments",
614   "-Wno-comments",
615   "-Wconversion",
616   "-Wno-conversion",
617   "-Wformat",
618   "-Wno-format",
619   "-Wimport",
620   "-Wno-import",
621   "-Wimplicit",
622   "-Wno-implicit",
623   "-Wmissing-braces",
624   "-Wno-missing-braces",
625   "-Wmissing-declarations",
626   "-Wno-missing-declarations",
627   "-Wmissing-prototypes",
628   "-Wno-missing-prototypes",
629   "-Wnested-externs",
630   "-Wno-nested-externs",
631   "-Wparentheses",
632   "-Wno-parentheses",
633   "-Wpointer-arith",
634   "-Wno-pointer-arith",
635   "-Wredundant-decls",
636   "-Wno-redundant-decls",
637   "-Wstrict-prototypes",
638   "-Wno-strict-prototypes",
639   "-Wtraditional",
640   "-Wno-traditional",
641   "-Wtrigraphs",
642   "-Wno-trigraphs",
643   "-Wwrite-strings",
644   "-Wno-write-strings",
645
646   /* These are for C++.  */
647   "-+e0",                       /* gcc.c tacks the `-' on the front.  */
648   "-+e1",
649   "-+e2",
650   "-faccess-control",
651   "-fno-access-control",
652   "-fall-virtual",
653   "-fno-all-virtual",
654   "-falt-external-templates",
655   "-fno-alt-external-templates",
656   "-fansi-overloading",
657   "-fno-ansi-overloading",
658   "-fcadillac",
659   "-fno-cadillac",
660   "-fcheck-new",
661   "-fno-check-new",
662   "-fconserve-space",
663   "-fno-conserve-space",
664   "-fdefault-inline",
665   "-fno-default-inline",
666   "-frtti",
667   "-fno-rtti",
668   "-felide-constructors",
669   "-fno-elide-constructors",
670   "-fenum-int-equiv",
671   "-fno-enum-int-equiv",
672   "-fexternal-templates",
673   "-fno-external-templates",
674   "-fgc",
675   "-fno-gc",
676   "-fgnu-keywords",
677   "-fno-gnu-keywords",
678   "-fhandle-exceptions",
679   "-fno-handle-exceptions",
680   "-fhandle-signatures",
681   "-fno-handle-signatures",
682   "-fhuge-objects",
683   "-fno-huge-objects",
684   "-fimplement-inlines",
685   "-fno-implement-inlines",
686   "-fimplicit-templates",
687   "-fno-implicit-templates",
688   "-flabels-ok",
689   "-fno-labels-ok",
690   "-fmemoize-lookups",
691   "-fno-memoize-lookups",
692   "-fnonnull-objects",
693   "-fno-nonnull-objects",
694   "-foperator-names",
695   "-fno-operator-names",
696   "-frepo",
697   "-fno-repo",
698   "-fsave-memoized",
699   "-fno-save-memoized",
700   "-fshort-temps",
701   "-fno-short-temps",
702   "-fstats",
703   "-fno-stats",
704   "-fstrict-prototype",
705   "-fno-strict-prototype",
706   "-fthis-is-variable",
707   "-fno-this-is-variable",
708   "-fvtable-thunks",
709   "-fno-vtable-thunks",
710   "-fxref",
711   "-fno-xref",
712
713   "-Wreturn-type",
714   "-Wno-return-type",
715   "-Woverloaded-virtual",
716   "-Wno-overloaded-virtual",
717   "-Wtemplate-debugging",
718   "-Wno-template-debugging",
719   "-Wctor-dtor-privacy",
720   "-Wno-ctor-dtor-privacy",
721   "-Wnon-virtual-dtor",
722   "-Wno-non-virtual-dtor",
723   "-Wextern-inline",
724   "-Wno-extern-inline",
725   "-Wreorder",
726   "-Wno-reorder",
727   "-Wsynth",
728   "-Wno-synth",
729
730   /* these are for obj c */
731   "-lang-objc",
732   "-gen-decls",
733   "-fgnu-runtime",
734   "-fno-gnu-runtime",
735   "-fnext-runtime",
736   "-fno-next-runtime",
737   "-Wselector",
738   "-Wno-selector",
739   "-Wprotocol",
740   "-Wno-protocol",
741
742   /* THESE ARE FOR FORTRAN. */
743   "-fversion",
744   "-ff90",
745   "-fno-f90",
746   "-fautomatic",
747   "-fno-automatic",
748   "-fdollar-ok",
749   "-fno-dollar-ok",
750   "-ff2c",
751   "-fno-f2c",
752   "-ff2c-library",
753   "-fno-f2c-library",
754   "-ffree-form",
755   "-fno-free-form",
756   "-ffixed-form",
757   "-fno-fixed-form",
758   "-fpedantic",
759   "-fno-pedantic",
760   "-fvxt-not-f90",
761   "-ff90-not-vxt",
762   "-fugly",
763   "-fno-ugly",
764   "-fdebug",
765   "-fno-debug",
766   "-fintrin-case-initcap",
767   "-fintrin-case-upper",
768   "-fintrin-case-lower",
769   "-fintrin-case-any",
770   "-fmatch-case-initcap",
771   "-fmatch-case-upper",
772   "-fmatch-case-lower",
773   "-fmatch-case-any",
774   "-fsource-case-upper",
775   "-fsource-case-upper",
776   "-fsource-case-lower",
777   "-fsource-case-preserve",
778   "-fsymbol-case-initcap",
779   "-fsymbol-case-upper",
780   "-fsymbol-case-lower",
781   "-fsymbol-case-any",
782   "-fcase-strict-upper",
783   "-fcase-strict-lower",
784   "-fcase-initcap",
785   "-fcase-upper",
786   "-fcase-lower",
787   "-fcase-preserve",
788   "-fdcp-intrinsics-delete",
789   "-fdcp-intrinsics-hide",
790   "-fdcp-intrinsics-disable",
791   "-fdcp-intrinsics-enable",
792   "-ff2c-intrinsics-delete",
793   "-ff2c-intrinsics-hide",
794   "-ff2c-intrinsics-disable",
795   "-ff2c-intrinsics-enable",
796   "-ff90-intrinsics-delete",
797   "-ff90-intrinsics-hide",
798   "-ff90-intrinsics-disable",
799   "-ff90-intrinsics-enable",
800   "-fmil-intrinsics-delete",
801   "-fmil-intrinsics-hide",
802   "-fmil-intrinsics-disable",
803   "-fmil-intrinsics-enable",
804   "-fvxt-intrinsics-delete",
805   "-fvxt-intrinsics-hide",
806   "-fvxt-intrinsics-disable",
807   "-fvxt-intrinsics-enable",
808
809   /* This is for GNAT and is temporary.  */
810   "-gnat",
811   0
812 };
813 \f
814 /* Options controlling warnings */
815
816 /* Don't print warning messages.  -w.  */
817
818 int inhibit_warnings = 0;
819
820 /* Print various extra warnings.  -W.  */
821
822 int extra_warnings = 0;
823
824 /* Treat warnings as errors.  -Werror.  */
825
826 int warnings_are_errors = 0;
827
828 /* Nonzero to warn about unused local variables.  */
829
830 int warn_unused;
831
832 /* Nonzero to warn about variables used before they are initialized.  */
833
834 int warn_uninitialized;
835
836 /* Nonzero means warn about all declarations which shadow others.   */
837
838 int warn_shadow;
839
840 /* Warn if a switch on an enum fails to have a case for every enum value.  */
841
842 int warn_switch;
843
844 /* Nonzero means warn about function definitions that default the return type
845    or that use a null return and have a return-type other than void.  */
846
847 int warn_return_type;
848
849 /* Nonzero means warn about pointer casts that increase the required
850    alignment of the target type (and might therefore lead to a crash
851    due to a misaligned access).  */
852
853 int warn_cast_align;
854
855 /* Nonzero means warn about any identifiers that match in the first N
856    characters.  The value N is in `id_clash_len'.  */
857
858 int warn_id_clash;
859 unsigned id_clash_len;
860
861 /* Nonzero means warn about any objects definitions whose size is larger
862    than N bytes.  Also want about function definitions whose returned
863    values are larger than N bytes. The value N is in `larger_than_size'.  */
864  
865 int warn_larger_than;
866 unsigned larger_than_size;
867
868 /* Nonzero means warn if inline function is too large.  */
869
870 int warn_inline;
871
872 /* Warn if a function returns an aggregate,
873    since there are often incompatible calling conventions for doing this.  */
874
875 int warn_aggregate_return;
876
877 /* Likewise for -W.  */
878
879 struct { char *string; int *variable; int on_value;} W_options[] =
880 {
881   {"unused", &warn_unused, 1},
882   {"error", &warnings_are_errors, 1},
883   {"shadow", &warn_shadow, 1},
884   {"switch", &warn_switch, 1},
885   {"aggregate-return", &warn_aggregate_return, 1},
886   {"cast-align", &warn_cast_align, 1},
887   {"uninitialized", &warn_uninitialized, 1},
888   {"inline", &warn_inline, 1}
889 };
890 \f
891 /* Output files for assembler code (real compiler output)
892    and debugging dumps.  */
893
894 FILE *asm_out_file;
895 FILE *aux_info_file;
896 FILE *rtl_dump_file;
897 FILE *jump_opt_dump_file;
898 FILE *cse_dump_file;
899 FILE *loop_dump_file;
900 FILE *cse2_dump_file;
901 FILE *flow_dump_file;
902 FILE *combine_dump_file;
903 FILE *sched_dump_file;
904 FILE *local_reg_dump_file;
905 FILE *global_reg_dump_file;
906 FILE *sched2_dump_file;
907 FILE *jump2_opt_dump_file;
908 FILE *dbr_sched_dump_file;
909 FILE *stack_reg_dump_file;
910
911 /* Time accumulators, to count the total time spent in various passes.  */
912
913 int parse_time;
914 int varconst_time;
915 int integration_time;
916 int jump_time;
917 int cse_time;
918 int loop_time;
919 int cse2_time;
920 int flow_time;
921 int combine_time;
922 int sched_time;
923 int local_alloc_time;
924 int global_alloc_time;
925 int sched2_time;
926 int dbr_sched_time;
927 int shorten_branch_time;
928 int stack_reg_time;
929 int final_time;
930 int symout_time;
931 int dump_time;
932 \f
933 /* Return time used so far, in microseconds.  */
934
935 int
936 get_run_time ()
937 {
938 #ifndef WINNT
939 #ifdef USG
940   struct tms tms;
941 #else
942 #ifndef VMS
943   struct rusage rusage;
944 #else
945   struct
946     {
947       int proc_user_time;
948       int proc_system_time;
949       int child_user_time;
950       int child_system_time;
951     } vms_times;
952 #endif
953 #endif
954 #endif
955
956   if (quiet_flag)
957     return 0;
958 #ifdef WINNT
959   if (clock() < 0)
960     return 0;
961   else
962     return (clock() * 1000);
963 #else /* not WINNT */
964 #ifdef USG
965   times (&tms);
966   return (tms.tms_utime + tms.tms_stime) * (1000000 / HZ);
967 #else
968 #ifndef VMS
969   getrusage (0, &rusage);
970   return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec
971           + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec);
972 #else /* VMS */
973   times (&vms_times);
974   return (vms_times.proc_user_time + vms_times.proc_system_time) * 10000;
975 #endif
976 #endif
977 #endif
978 }
979
980 #define TIMEVAR(VAR, BODY)    \
981 do { int otime = get_run_time (); BODY; VAR += get_run_time () - otime; } while (0)
982
983 void
984 print_time (str, total)
985      char *str;
986      int total;
987 {
988   fprintf (stderr,
989            "time in %s: %d.%06d\n",
990            str, total / 1000000, total % 1000000);
991 }
992
993 /* Count an error or warning.  Return 1 if the message should be printed.  */
994
995 int
996 count_error (warningp)
997      int warningp;
998 {
999   if (warningp && inhibit_warnings)
1000     return 0;
1001
1002   if (warningp && !warnings_are_errors)
1003     warningcount++;
1004   else
1005     {
1006       static int warning_message = 0;
1007
1008       if (warningp && !warning_message)
1009         {
1010           fprintf (stderr, "%s: warnings being treated as errors\n", progname);
1011           warning_message = 1;
1012         }
1013       errorcount++;
1014     }
1015
1016   return 1;
1017 }
1018
1019 /* Print a fatal error message.  NAME is the text.
1020    Also include a system error message based on `errno'.  */
1021
1022 void
1023 pfatal_with_name (name)
1024      char *name;
1025 {
1026   fprintf (stderr, "%s: ", progname);
1027   perror (name);
1028   exit (35);
1029 }
1030
1031 void
1032 fatal_io_error (name)
1033      char *name;
1034 {
1035   fprintf (stderr, "%s: %s: I/O error\n", progname, name);
1036   exit (35);
1037 }
1038
1039 /* Called to give a better error message for a bad insn rather than
1040    just calling abort().  */
1041
1042 void
1043 fatal_insn (message, insn)
1044      char *message;
1045      rtx insn;
1046 {
1047   if (!output_bytecode)
1048     {
1049       error (message);
1050       debug_rtx (insn);
1051     }
1052   if (asm_out_file)
1053     fflush (asm_out_file);
1054   if (aux_info_file)
1055     fflush (aux_info_file);
1056   if (rtl_dump_file)
1057     fflush (rtl_dump_file);
1058   if (jump_opt_dump_file)
1059     fflush (jump_opt_dump_file);
1060   if (cse_dump_file)
1061     fflush (cse_dump_file);
1062   if (loop_dump_file)
1063     fflush (loop_dump_file);
1064   if (cse2_dump_file)
1065     fflush (cse2_dump_file);
1066   if (flow_dump_file)
1067     fflush (flow_dump_file);
1068   if (combine_dump_file)
1069     fflush (combine_dump_file);
1070   if (sched_dump_file)
1071     fflush (sched_dump_file);
1072   if (local_reg_dump_file)
1073     fflush (local_reg_dump_file);
1074   if (global_reg_dump_file)
1075     fflush (global_reg_dump_file);
1076   if (sched2_dump_file)
1077     fflush (sched2_dump_file);
1078   if (jump2_opt_dump_file)
1079     fflush (jump2_opt_dump_file);
1080   if (dbr_sched_dump_file)
1081     fflush (dbr_sched_dump_file);
1082   if (stack_reg_dump_file)
1083     fflush (stack_reg_dump_file);
1084   abort ();
1085 }
1086
1087 /* Called to give a better error message when we don't have an insn to match
1088    what we are looking for or if the insn's constraints aren't satisfied,
1089    rather than just calling abort().  */
1090
1091 void
1092 fatal_insn_not_found (insn)
1093      rtx insn;
1094 {
1095   if (INSN_CODE (insn) < 0)
1096     fatal_insn ("internal error--unrecognizable insn:", insn);
1097   else
1098     fatal_insn ("internal error--insn does not satisfy its constraints:", insn);
1099 }
1100
1101 /* This is the default decl_printable_name function.  */
1102
1103 static char *
1104 decl_name (decl, kind)
1105      tree decl;
1106      char **kind;
1107 {
1108   return IDENTIFIER_POINTER (DECL_NAME (decl));
1109 }
1110
1111 /* This is the default interim_eh_hook function.  */
1112
1113 void
1114 interim_eh (finalization)
1115      tree finalization;
1116 {
1117   /* Don't do anything by default.  */
1118 }
1119 \f
1120 static int need_error_newline;
1121
1122 /* Function of last error message;
1123    more generally, function such that if next error message is in it
1124    then we don't have to mention the function name.  */
1125 static tree last_error_function = NULL;
1126
1127 /* Used to detect when input_file_stack has changed since last described.  */
1128 static int last_error_tick;
1129
1130 /* Called when the start of a function definition is parsed,
1131    this function prints on stderr the name of the function.  */
1132
1133 void
1134 announce_function (decl)
1135      tree decl;
1136 {
1137   if (! quiet_flag)
1138     {
1139       char *junk;
1140       if (rtl_dump_and_exit)
1141         fprintf (stderr, "%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
1142       else
1143         fprintf (stderr, " %s", (*decl_printable_name) (decl, &junk));
1144       fflush (stderr);
1145       need_error_newline = 1;
1146       last_error_function = current_function_decl;
1147     }
1148 }
1149
1150 /* The default function to print out name of current function that caused
1151    an error.  */
1152
1153 void
1154 default_print_error_function (file)
1155      char *file;
1156 {
1157   if (last_error_function != current_function_decl)
1158     {
1159       char *kind = "function";
1160       if (current_function_decl != 0
1161           && TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
1162         kind = "method";
1163
1164       if (file)
1165         fprintf (stderr, "%s: ", file);
1166
1167       if (current_function_decl == NULL)
1168         fprintf (stderr, "At top level:\n");
1169       else
1170         {
1171           char *name = (*decl_printable_name) (current_function_decl, &kind);
1172           fprintf (stderr, "In %s `%s':\n", kind, name);
1173         }
1174
1175       last_error_function = current_function_decl;
1176     }
1177 }
1178
1179 /* Called by report_error_function to print out function name.
1180  * Default may be overridden by language front-ends. */
1181
1182 void (*print_error_function) PROTO((char*)) = default_print_error_function;
1183
1184 /* Prints out, if necessary, the name of the current function
1185   that caused an error.  Called from all error and warning functions.  */
1186
1187 void
1188 report_error_function (file)
1189      char *file;
1190 {
1191   struct file_stack *p;
1192
1193   if (need_error_newline)
1194     {
1195       fprintf (stderr, "\n");
1196       need_error_newline = 0;
1197     }
1198
1199   (*print_error_function) (file);
1200
1201   if (input_file_stack && input_file_stack->next != 0
1202       && input_file_stack_tick != last_error_tick)
1203     {
1204       fprintf (stderr, "In file included");
1205       for (p = input_file_stack->next; p; p = p->next)
1206         {
1207           fprintf (stderr, " from %s:%d", p->name, p->line);
1208           if (p->next)
1209             fprintf (stderr, ",\n                ");
1210         }
1211       fprintf (stderr, ":\n");
1212       last_error_tick = input_file_stack_tick;
1213     }
1214 }
1215 \f
1216 /* Print a message.  */
1217
1218 static void
1219 vmessage (prefix, s, ap)
1220      char *prefix;
1221      char *s;
1222      va_list ap;
1223 {
1224   if (prefix)
1225     fprintf (stderr, "%s: ", prefix);
1226
1227 #ifdef HAVE_VPRINTF
1228   vfprintf (stderr, s, ap);
1229 #else
1230   {
1231     HOST_WIDE_INT v1 = va_arg(ap, HOST_WIDE_INT);
1232     HOST_WIDE_INT v2 = va_arg(ap, HOST_WIDE_INT);
1233     HOST_WIDE_INT v3 = va_arg(ap, HOST_WIDE_INT);
1234     fprintf (stderr, s, v1, v2, v3);
1235   }
1236 #endif
1237 }
1238
1239 /* Print a message relevant to line LINE of file FILE.  */
1240
1241 static void
1242 v_message_with_file_and_line (file, line, prefix, s, ap)
1243      char *file;
1244      int line;
1245      char *prefix;
1246      char *s;
1247      va_list ap;
1248 {
1249   if (file)
1250     fprintf (stderr, "%s:%d: ", file, line);
1251   else
1252     fprintf (stderr, "%s: ", progname);
1253
1254   vmessage (prefix, s, ap);
1255   fputc ('\n', stderr);
1256 }
1257
1258 /* Print a message relevant to the given DECL.  */
1259
1260 static void
1261 v_message_with_decl (decl, prefix, s, ap)
1262      tree decl;
1263      char *prefix;
1264      char *s;
1265      va_list ap;
1266 {
1267   char *n, *p, *junk;
1268
1269   fprintf (stderr, "%s:%d: ",
1270            DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
1271
1272   if (prefix)
1273     fprintf (stderr, "%s: ", prefix);
1274
1275   /* Do magic to get around lack of varargs support for insertion
1276      of arguments into existing list.  We know that the decl is first;
1277      we ass_u_me that it will be printed with "%s".  */
1278
1279   for (p = s; *p; ++p)
1280     {
1281       if (*p == '%')
1282         {
1283           if (*(p + 1) == '%')
1284             ++p;
1285           else
1286             break;
1287         }
1288     }
1289
1290   if (p > s)                    /* Print the left-hand substring.  */
1291     {
1292       char fmt[sizeof "%.255s"];
1293       long width = p - s;
1294              
1295       if (width > 255L) width = 255L;   /* arbitrary */
1296       sprintf (fmt, "%%.%lds", width);
1297       fprintf (stderr, fmt, s);
1298     }
1299
1300   if (*p == '%')                /* Print the name.  */
1301     {
1302       char *n = (DECL_NAME (decl)
1303                  ? (*decl_printable_name) (decl, &junk)
1304                  : "((anonymous))");
1305       fputs (n, stderr);
1306       while (*p)
1307         {
1308           ++p;
1309           if (isalpha (*(p - 1) & 0xFF))
1310             break;
1311         }
1312     }
1313
1314   if (*p)                       /* Print the rest of the message.  */
1315     vmessage ((char *)NULL, p, ap);
1316
1317   fputc ('\n', stderr);
1318 }
1319
1320 /* Figure file and line of the given INSN.  */
1321
1322 static void
1323 file_and_line_for_asm (insn, pfile, pline)
1324      rtx insn;
1325      char **pfile;
1326      int *pline;
1327 {
1328   rtx body = PATTERN (insn);
1329   rtx asmop;
1330
1331   /* Find the (or one of the) ASM_OPERANDS in the insn.  */
1332   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1333     asmop = SET_SRC (body);
1334   else if (GET_CODE (body) == ASM_OPERANDS)
1335     asmop = body;
1336   else if (GET_CODE (body) == PARALLEL
1337            && GET_CODE (XVECEXP (body, 0, 0)) == SET)
1338     asmop = SET_SRC (XVECEXP (body, 0, 0));
1339   else if (GET_CODE (body) == PARALLEL
1340            && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1341     asmop = XVECEXP (body, 0, 0);
1342   else
1343     asmop = NULL;
1344
1345   if (asmop)
1346     {
1347       *pfile = ASM_OPERANDS_SOURCE_FILE (asmop);
1348       *pline = ASM_OPERANDS_SOURCE_LINE (asmop);
1349     }
1350   else
1351     {
1352       *pfile = input_filename;
1353       *pline = lineno;
1354     }
1355 }
1356
1357 /* Report an error at line LINE of file FILE.  */
1358
1359 static void
1360 v_error_with_file_and_line (file, line, s, ap)
1361      char *file;
1362      int line;
1363      char *s;
1364      va_list ap;
1365 {
1366   count_error (0);
1367   report_error_function (file);
1368   v_message_with_file_and_line (file, line, (char *)NULL, s, ap);
1369 }
1370
1371 void
1372 error_with_file_and_line VPROTO((char *file, int line, char *s, ...))
1373 {
1374 #ifndef __STDC__
1375   char *file;
1376   int line;
1377   char *s;
1378 #endif
1379   va_list ap;
1380
1381   VA_START (ap, s);
1382
1383 #ifndef __STDC__
1384   file = va_arg (ap, char *);
1385   line = va_arg (ap, int);
1386   s = va_arg (ap, char *);
1387 #endif
1388
1389   v_error_with_file_and_line (file, line, s, ap);
1390   va_end (ap);
1391 }
1392
1393 /* Report an error at the declaration DECL.
1394    S is a format string which uses %s to substitute the declaration
1395    name; subsequent substitutions are a la printf.  */
1396
1397 static void
1398 v_error_with_decl (decl, s, ap)
1399      tree decl;
1400      char *s;
1401      va_list ap;
1402 {
1403   count_error (0);
1404   report_error_function (DECL_SOURCE_FILE (decl));
1405   v_message_with_decl (decl, (char *)NULL, s, ap);
1406 }
1407
1408 void
1409 error_with_decl VPROTO((tree decl, char *s, ...))
1410 {
1411 #ifndef __STDC__
1412   tree decl;
1413   char *s;
1414 #endif
1415   va_list ap;
1416
1417   VA_START (ap, s);
1418
1419 #ifndef __STDC__
1420   decl = va_arg (ap, tree);
1421   s = va_arg (ap, char *);
1422 #endif
1423
1424   v_error_with_decl (decl, s, ap);
1425   va_end (ap);
1426 }
1427
1428 /* Report an error at the line number of the insn INSN.
1429    This is used only when INSN is an `asm' with operands,
1430    and each ASM_OPERANDS records its own source file and line.  */
1431
1432 static void
1433 v_error_for_asm (insn, s, ap)
1434      rtx insn;
1435      char *s;
1436      va_list ap;
1437 {
1438   char *file;
1439   int line;
1440
1441   count_error (0);
1442   file_and_line_for_asm (insn, &file, &line);
1443   report_error_function (file);
1444   v_message_with_file_and_line (file, line, (char *)NULL, s, ap);
1445 }
1446
1447 void
1448 error_for_asm VPROTO((rtx insn, char *s, ...))
1449 {
1450 #ifndef __STDC__
1451   rtx insn;
1452   char *s;
1453 #endif
1454   va_list ap;
1455
1456   VA_START (ap, s);
1457
1458 #ifndef __STDC__
1459   insn = va_arg (ap, rtx);
1460   s = va_arg (ap, char *);
1461 #endif
1462
1463   v_error_for_asm (insn, s, ap);
1464   va_end (ap);
1465 }
1466
1467 /* Report an error at the current line number.  */
1468
1469 static void
1470 verror (s, ap)
1471      char *s;
1472      va_list ap;
1473 {
1474   v_error_with_file_and_line (input_filename, lineno, s, ap);
1475 }
1476
1477 void
1478 error VPROTO((char *s, ...))
1479 {
1480 #ifndef __STDC__
1481   char *s;
1482 #endif
1483   va_list ap;
1484
1485   VA_START (ap, s);
1486
1487 #ifndef __STDC__
1488   s = va_arg (ap, char *);
1489 #endif
1490
1491   verror (s, ap);
1492   va_end (ap);
1493 }
1494
1495 /* Report a fatal error at the current line number.  */
1496
1497 static void
1498 vfatal (s, ap)
1499      char *s;
1500      va_list ap;
1501 {
1502   verror (s, ap);
1503   exit (34);
1504 }
1505
1506 void
1507 fatal VPROTO((char *s, ...))
1508 {
1509 #ifndef __STDC__
1510   char *s;
1511 #endif
1512   va_list ap;
1513
1514   VA_START (ap, s);
1515
1516 #ifndef __STDC__
1517   s = va_arg (ap, char *);
1518 #endif
1519
1520   vfatal (s, ap);
1521   va_end (ap);
1522 }
1523
1524 /* Report a warning at line LINE of file FILE.  */
1525
1526 static void
1527 v_warning_with_file_and_line (file, line, s, ap)
1528      char *file;
1529      int line;
1530      char *s;
1531      va_list ap;
1532 {
1533   if (count_error (1))
1534     {
1535       report_error_function (file);
1536       v_message_with_file_and_line (file, line, "warning", s, ap);
1537     }
1538 }
1539
1540 void
1541 warning_with_file_and_line VPROTO((char *file, int line, char *s, ...))
1542 {
1543 #ifndef __STDC__
1544   char *file;
1545   int line;
1546   char *s;
1547 #endif
1548   va_list ap;
1549
1550   VA_START (ap, s);
1551
1552 #ifndef __STDC__
1553   file = va_arg (ap, char *);
1554   line = va_arg (ap, int);
1555   s = va_arg (ap, char *);
1556 #endif
1557
1558   v_warning_with_file_and_line (file, line, s, ap);
1559   va_end (ap);
1560 }
1561
1562 /* Report a warning at the declaration DECL.
1563    S is a format string which uses %s to substitute the declaration
1564    name; subsequent substitutions are a la printf.  */
1565
1566 static void
1567 v_warning_with_decl (decl, s, ap)
1568      tree decl;
1569      char *s;
1570      va_list ap;
1571 {
1572   if (count_error (1))
1573     {
1574       report_error_function (DECL_SOURCE_FILE (decl));
1575       v_message_with_decl (decl, "warning", s, ap);
1576     }
1577 }
1578
1579 void
1580 warning_with_decl VPROTO((tree decl, char *s, ...))
1581 {
1582 #ifndef __STDC__
1583   tree decl;
1584   char *s;
1585 #endif
1586   va_list ap;
1587
1588   VA_START (ap, s);
1589
1590 #ifndef __STDC__
1591   decl = va_arg (ap, tree);
1592   s = va_arg (ap, char *);
1593 #endif
1594
1595   v_warning_with_decl (decl, s, ap);
1596   va_end (ap);
1597 }
1598
1599 /* Report a warning at the line number of the insn INSN.
1600    This is used only when INSN is an `asm' with operands,
1601    and each ASM_OPERANDS records its own source file and line.  */
1602
1603 static void
1604 v_warning_for_asm (insn, s, ap)
1605      rtx insn;
1606      char *s;
1607      va_list ap;
1608 {
1609   if (count_error (1))
1610     {
1611       char *file;
1612       int line;
1613
1614       file_and_line_for_asm (insn, &file, &line);
1615       report_error_function (file);
1616       v_message_with_file_and_line (file, line, "warning", s, ap);
1617     }
1618 }
1619
1620 void
1621 warning_for_asm VPROTO((rtx insn, char *s, ...))
1622 {
1623 #ifndef __STDC__
1624   rtx insn;
1625   char *s;
1626 #endif
1627   va_list ap;
1628
1629   VA_START (ap, s);
1630
1631 #ifndef __STDC__
1632   insn = va_arg (ap, rtx);
1633   s = va_arg (ap, char *);
1634 #endif
1635
1636   v_warning_for_asm (insn, s, ap);
1637   va_end (ap);
1638 }
1639
1640 /* Report a warning at the current line number.  */
1641
1642 static void
1643 vwarning (s, ap)
1644      char *s;
1645      va_list ap;
1646 {
1647   v_warning_with_file_and_line (input_filename, lineno, s, ap);
1648 }
1649
1650 void
1651 warning VPROTO((char *s, ...))
1652 {
1653 #ifndef __STDC__
1654   char *s;
1655 #endif
1656   va_list ap;
1657
1658   VA_START (ap, s);
1659
1660 #ifndef __STDC__
1661   s = va_arg (ap, char *);
1662 #endif
1663
1664   vwarning (s, ap);
1665   va_end (ap);
1666 }
1667
1668 /* These functions issue either warnings or errors depending on
1669    -pedantic-errors.  */
1670
1671 static void
1672 vpedwarn (s, ap)
1673      char *s;
1674      va_list ap;
1675 {
1676   if (flag_pedantic_errors)
1677     verror (s, ap);
1678   else
1679     vwarning (s, ap);
1680 }
1681
1682 void
1683 pedwarn VPROTO((char *s, ...))
1684 {
1685 #ifndef __STDC__
1686   char *s;
1687 #endif
1688   va_list ap;
1689
1690   VA_START (ap, s);
1691
1692 #ifndef __STDC__
1693   s = va_arg (ap, char *);
1694 #endif
1695
1696   vpedwarn (s, ap);
1697   va_end (ap);
1698 }
1699
1700 static void
1701 v_pedwarn_with_decl (decl, s, ap)
1702      tree decl;
1703      char *s;
1704      va_list ap;
1705 {
1706   /* We don't want -pedantic-errors to cause the compilation to fail from
1707      "errors" in system header files.  Sometimes fixincludes can't fix what's
1708      broken (eg: unsigned char bitfields - fixing it may change the alignment
1709      which will cause programs to mysteriously fail because the C library
1710      or kernel uses the original layout).  There's no point in issuing a
1711      warning either, it's just unnecessary noise.  */
1712
1713   if (! DECL_IN_SYSTEM_HEADER (decl))
1714     {
1715       if (flag_pedantic_errors)
1716         v_error_with_decl (decl, s, ap);
1717       else
1718         v_warning_with_decl (decl, s, ap);
1719     }
1720 }
1721
1722 void
1723 pedwarn_with_decl VPROTO((tree decl, char *s, ...))
1724 {
1725 #ifndef __STDC__
1726   tree decl;
1727   char *s;
1728 #endif
1729   va_list ap;
1730
1731   VA_START (ap, s);
1732
1733 #ifndef __STDC__
1734   decl = va_arg (ap, tree);
1735   s = va_arg (ap, char *);
1736 #endif
1737
1738   v_pedwarn_with_decl (decl, s, ap);
1739   va_end (ap);
1740 }
1741
1742 static void
1743 v_pedwarn_with_file_and_line (file, line, s, ap)
1744      char *file;
1745      int line;
1746      char *s;
1747      va_list ap;
1748 {
1749   if (flag_pedantic_errors)
1750     v_error_with_file_and_line (file, line, s, ap);
1751   else
1752     v_warning_with_file_and_line (file, line, s, ap);
1753 }
1754
1755 void
1756 pedwarn_with_file_and_line VPROTO((char *file, int line, char *s, ...))
1757 {
1758 #ifndef __STDC__
1759   char *file;
1760   int line;
1761   char *s;
1762 #endif
1763   va_list ap;
1764
1765   VA_START (ap, s);
1766
1767 #ifndef __STDC__
1768   file = va_arg (ap, char *);
1769   line = va_arg (ap, int);
1770   s = va_arg (ap, char *);
1771 #endif
1772
1773   v_pedwarn_with_file_and_line (file, line, s, ap);
1774   va_end (ap);
1775 }
1776
1777 /* Apologize for not implementing some feature.  */
1778
1779 static void
1780 vsorry (s, ap)
1781      char *s;
1782      va_list ap;
1783 {
1784   sorrycount++;
1785   if (input_filename)
1786     fprintf (stderr, "%s:%d: ", input_filename, lineno);
1787   else
1788     fprintf (stderr, "%s: ", progname);
1789   vmessage ("sorry, not implemented", s, ap);
1790   fputc ('\n', stderr);
1791 }
1792
1793 void
1794 sorry VPROTO((char *s, ...))
1795 {
1796 #ifndef __STDC__
1797   char *s;
1798 #endif
1799   va_list ap;
1800
1801   VA_START (ap, s);
1802
1803 #ifndef __STDC__
1804   s = va_arg (ap, char *);
1805 #endif
1806
1807   vsorry (s, ap);
1808   va_end (ap);
1809 }
1810
1811 /* Apologize for not implementing some feature, then quit.  */
1812
1813 static void
1814 v_really_sorry (s, ap)
1815      char *s;
1816      va_list ap;
1817 {
1818   sorrycount++;
1819   if (input_filename)
1820     fprintf (stderr, "%s:%d: ", input_filename, lineno);
1821   else
1822     fprintf (stderr, "%s: ", progname);
1823   vmessage ("sorry, not implemented", s, ap);
1824   fatal (" (fatal)\n");
1825 }
1826
1827 void
1828 really_sorry VPROTO((char *s, ...))
1829 {
1830 #ifndef __STDC__
1831   char *s;
1832 #endif
1833   va_list ap;
1834
1835   VA_START (ap, s);
1836
1837 #ifndef __STDC__
1838   s = va_arg (ap, char *);
1839 #endif
1840
1841   v_really_sorry (s, ap);
1842   va_end (ap);
1843 }
1844 \f
1845 /* More 'friendly' abort that prints the line and file.
1846    config.h can #define abort fancy_abort if you like that sort of thing.
1847
1848    I don't think this is actually a good idea.
1849    Other sorts of crashes will look a certain way.
1850    It is a good thing if crashes from calling abort look the same way.
1851      -- RMS  */
1852
1853 void
1854 fancy_abort ()
1855 {
1856   fatal ("internal gcc abort");
1857 }
1858
1859 /* This calls abort and is used to avoid problems when abort if a macro.
1860    It is used when we need to pass the address of abort.  */
1861
1862 void
1863 do_abort ()
1864 {
1865   abort ();
1866 }
1867
1868 /* When `malloc.c' is compiled with `rcheck' defined,
1869    it calls this function to report clobberage.  */
1870
1871 void
1872 botch (s)
1873 {
1874   abort ();
1875 }
1876
1877 /* Same as `malloc' but report error if no memory available.  */
1878
1879 char *
1880 xmalloc (size)
1881      unsigned size;
1882 {
1883   register char *value = (char *) malloc (size);
1884   if (value == 0)
1885     fatal ("virtual memory exhausted");
1886   return value;
1887 }
1888
1889 /* Same as `realloc' but report error if no memory available.  */
1890
1891 char *
1892 xrealloc (ptr, size)
1893      char *ptr;
1894      int size;
1895 {
1896   char *result = (char *) realloc (ptr, size);
1897   if (!result)
1898     fatal ("virtual memory exhausted");
1899   return result;
1900 }
1901 \f
1902 /* Return the logarithm of X, base 2, considering X unsigned,
1903    if X is a power of 2.  Otherwise, returns -1.
1904
1905    This should be used via the `exact_log2' macro.  */
1906
1907 int
1908 exact_log2_wide (x)
1909      register unsigned HOST_WIDE_INT x;
1910 {
1911   register int log = 0;
1912   /* Test for 0 or a power of 2.  */
1913   if (x == 0 || x != (x & -x))
1914     return -1;
1915   while ((x >>= 1) != 0)
1916     log++;
1917   return log;
1918 }
1919
1920 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
1921    If X is 0, return -1.
1922
1923    This should be used via the floor_log2 macro.  */
1924
1925 int
1926 floor_log2_wide (x)
1927      register unsigned HOST_WIDE_INT x;
1928 {
1929   register int log = -1;
1930   while (x != 0)
1931     log++,
1932     x >>= 1;
1933   return log;
1934 }
1935
1936 int float_handled;
1937 jmp_buf float_handler;
1938
1939 /* Specify where to longjmp to when a floating arithmetic error happens.
1940    If HANDLER is 0, it means don't handle the errors any more.  */
1941
1942 void
1943 set_float_handler (handler)
1944      jmp_buf handler;
1945 {
1946   float_handled = (handler != 0);
1947   if (handler)
1948     bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
1949 }
1950
1951 /* Specify, in HANDLER, where to longjmp to when a floating arithmetic
1952    error happens, pushing the previous specification into OLD_HANDLER.
1953    Return an indication of whether there was a previous handler in effect.  */
1954
1955 int
1956 push_float_handler (handler, old_handler)
1957      jmp_buf handler, old_handler;
1958 {
1959   int was_handled = float_handled;
1960
1961   float_handled = 1;
1962   if (was_handled)
1963     bcopy ((char *) float_handler, (char *) old_handler,
1964            sizeof (float_handler));
1965
1966   bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
1967   return was_handled;
1968 }
1969
1970 /* Restore the previous specification of whether and where to longjmp to
1971    when a floating arithmetic error happens.  */
1972
1973 void
1974 pop_float_handler (handled, handler)
1975      int handled;
1976      jmp_buf handler;
1977 {
1978   float_handled = handled;
1979   if (handled)
1980     bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
1981 }
1982
1983 /* Signals actually come here.  */
1984
1985 static void
1986 float_signal (signo)
1987      /* If this is missing, some compilers complain.  */
1988      int signo;
1989 {
1990   if (float_handled == 0)
1991     abort ();
1992 #if defined (USG) || defined (hpux)
1993   signal (SIGFPE, float_signal);  /* re-enable the signal catcher */
1994 #endif
1995   float_handled = 0;
1996   signal (SIGFPE, float_signal);
1997   longjmp (float_handler, 1);
1998 }
1999
2000 /* Handler for SIGPIPE.  */
2001
2002 static void
2003 pipe_closed (signo)
2004      /* If this is missing, some compilers complain.  */
2005      int signo;
2006 {
2007   fatal ("output pipe has been closed");
2008 }
2009
2010 /* Strip off a legitimate source ending from the input string NAME of
2011    length LEN. */
2012
2013 void
2014 strip_off_ending (name, len)
2015      char *name;
2016      int len;
2017 {
2018   if (len > 2 && ! strcmp (".c", name + len - 2))
2019     name[len - 2] = 0;
2020   else if (len > 2 && ! strcmp (".m", name + len - 2))
2021     name[len - 2] = 0;
2022   else if (len > 2 && ! strcmp (".i", name + len - 2))
2023     name[len - 2] = 0;
2024   else if (len > 3 && ! strcmp (".ii", name + len - 3))
2025     name[len - 3] = 0;
2026   else if (len > 3 && ! strcmp (".co", name + len - 3))
2027     name[len - 3] = 0;
2028   else if (len > 3 && ! strcmp (".cc", name + len - 3))
2029     name[len - 3] = 0;
2030   else if (len > 2 && ! strcmp (".C", name + len - 2))
2031     name[len - 2] = 0;
2032   else if (len > 4 && ! strcmp (".cxx", name + len - 4))
2033     name[len - 4] = 0;
2034   else if (len > 4 && ! strcmp (".cpp", name + len - 4))
2035     name[len - 4] = 0;
2036   else if (len > 2 && ! strcmp (".f", name + len - 2))
2037     name[len - 2] = 0;
2038   /* Ada will use extensions like .ada, .adb, and .ads, so just test
2039      for "ad".  */
2040   else if (len > 4 && ! strncmp (".ad", name + len - 4, 3))
2041     name[len - 4] = 0;
2042   else if (len > 4 && ! strcmp (".atr", name + len - 4))
2043     name[len - 4] = 0;
2044 }
2045
2046 /* Output a quoted string.  */
2047 void
2048 output_quoted_string (asm_file, string)
2049      FILE *asm_file;
2050      char *string;
2051 {
2052   char c;
2053
2054   putc ('\"', asm_file);
2055   while ((c = *string++) != 0)
2056     {
2057       if (c == '\"' || c == '\\')
2058         putc ('\\', asm_file);
2059       putc (c, asm_file);
2060     }
2061   putc ('\"', asm_file);
2062 }
2063
2064 /* Output a file name in the form wanted by System V.  */
2065
2066 void
2067 output_file_directive (asm_file, input_name)
2068      FILE *asm_file;
2069      char *input_name;
2070 {
2071   int len = strlen (input_name);
2072   char *na = input_name + len;
2073
2074   /* NA gets INPUT_NAME sans directory names.  */
2075   while (na > input_name)
2076     {
2077       if (na[-1] == '/')
2078         break;
2079       na--;
2080     }
2081
2082 #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
2083   ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
2084 #else
2085 #ifdef ASM_OUTPUT_SOURCE_FILENAME
2086   ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
2087 #else
2088   fprintf (asm_file, "\t.file\t");
2089   output_quoted_string (asm_file, na);
2090   fputc ('\n', asm_file);
2091 #endif
2092 #endif
2093 }
2094 \f
2095 /* Routine to build language identifier for object file. */
2096 static void
2097 output_lang_identify (asm_out_file)
2098      FILE *asm_out_file;
2099 {
2100   int len = strlen (lang_identify ()) + sizeof ("__gnu_compiled_") + 1;
2101   char *s = (char *) alloca (len);
2102   sprintf (s, "__gnu_compiled_%s", lang_identify ());
2103   ASM_OUTPUT_LABEL (asm_out_file, s);
2104 }
2105
2106 /* Routine to open a dump file.  */
2107 static FILE *
2108 open_dump_file (base_name, suffix)
2109      char *base_name;
2110      char *suffix;
2111 {
2112   FILE *f;
2113   char *dumpname = (char *) alloca (strlen (base_name) + strlen (suffix) + 1);
2114
2115   strcpy (dumpname, base_name);
2116   strcat (dumpname, suffix);
2117   f = fopen (dumpname, "w");
2118   if (f == 0)
2119     pfatal_with_name (dumpname);
2120   return f;
2121 }
2122
2123 /* Compile an entire file of output from cpp, named NAME.
2124    Write a file of assembly output and various debugging dumps.  */
2125
2126 static void
2127 compile_file (name)
2128      char *name;
2129 {
2130   tree globals;
2131   int start_time;
2132
2133   int name_specified = name != 0;
2134
2135   if (dump_base_name == 0)
2136     dump_base_name = name ? name : "gccdump";
2137
2138   parse_time = 0;
2139   varconst_time = 0;
2140   integration_time = 0;
2141   jump_time = 0;
2142   cse_time = 0;
2143   loop_time = 0;
2144   cse2_time = 0;
2145   flow_time = 0;
2146   combine_time = 0;
2147   sched_time = 0;
2148   local_alloc_time = 0;
2149   global_alloc_time = 0;
2150   sched2_time = 0;
2151   dbr_sched_time = 0;
2152   shorten_branch_time = 0;
2153   stack_reg_time = 0;
2154   final_time = 0;
2155   symout_time = 0;
2156   dump_time = 0;
2157
2158   /* Open input file.  */
2159
2160   if (name == 0 || !strcmp (name, "-"))
2161     {
2162       finput = stdin;
2163       name = "stdin";
2164     }
2165   else
2166     finput = fopen (name, "r");
2167   if (finput == 0)
2168     pfatal_with_name (name);
2169
2170 #ifdef IO_BUFFER_SIZE
2171   setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE);
2172 #endif
2173
2174   /* Initialize data in various passes.  */
2175
2176   init_obstacks ();
2177   init_tree_codes ();
2178   init_lex ();
2179   /* Some of these really don't need to be called when generating bytecode,
2180      but the options would have to be parsed first to know that. -bson */
2181   init_rtl ();
2182   init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
2183                   || debug_info_level == DINFO_LEVEL_VERBOSE);
2184   init_regs ();
2185   init_decl_processing ();
2186   init_optabs ();
2187   init_stmt ();
2188   init_expmed ();
2189   init_expr_once ();
2190   init_loop ();
2191   init_reload ();
2192
2193   if (flag_caller_saves)
2194     init_caller_save ();
2195
2196   /* If auxiliary info generation is desired, open the output file.
2197      This goes in the same directory as the source file--unlike
2198      all the other output files.  */
2199   if (flag_gen_aux_info)
2200     {
2201       aux_info_file = fopen (aux_info_file_name, "w");
2202       if (aux_info_file == 0)
2203         pfatal_with_name (aux_info_file_name);
2204     }
2205
2206   /* If rtl dump desired, open the output file.  */
2207   if (rtl_dump)
2208     rtl_dump_file = open_dump_file (dump_base_name, ".rtl");
2209
2210   /* If jump_opt dump desired, open the output file.  */
2211   if (jump_opt_dump)
2212     jump_opt_dump_file = open_dump_file (dump_base_name, ".jump");
2213
2214   /* If cse dump desired, open the output file.  */
2215   if (cse_dump)
2216     cse_dump_file = open_dump_file (dump_base_name, ".cse");
2217
2218   /* If loop dump desired, open the output file.  */
2219   if (loop_dump)
2220     loop_dump_file = open_dump_file (dump_base_name, ".loop");
2221
2222   /* If cse2 dump desired, open the output file.  */
2223   if (cse2_dump)
2224     cse2_dump_file = open_dump_file (dump_base_name, ".cse2");
2225
2226   /* If flow dump desired, open the output file.  */
2227   if (flow_dump)
2228     flow_dump_file = open_dump_file (dump_base_name, ".flow");
2229
2230   /* If combine dump desired, open the output file.  */
2231   if (combine_dump)
2232     combine_dump_file = open_dump_file (dump_base_name, ".combine");
2233
2234   /* If scheduling dump desired, open the output file.  */
2235   if (sched_dump)
2236     sched_dump_file = open_dump_file (dump_base_name, ".sched");
2237
2238   /* If local_reg dump desired, open the output file.  */
2239   if (local_reg_dump)
2240     local_reg_dump_file = open_dump_file (dump_base_name, ".lreg");
2241
2242   /* If global_reg dump desired, open the output file.  */
2243   if (global_reg_dump)
2244     global_reg_dump_file = open_dump_file (dump_base_name, ".greg");
2245
2246   /* If 2nd scheduling dump desired, open the output file.  */
2247   if (sched2_dump)
2248     sched2_dump_file = open_dump_file (dump_base_name, ".sched2");
2249
2250   /* If jump2_opt dump desired, open the output file.  */
2251   if (jump2_opt_dump)
2252     jump2_opt_dump_file = open_dump_file (dump_base_name, ".jump2");
2253
2254   /* If dbr_sched dump desired, open the output file.  */
2255   if (dbr_sched_dump)
2256     dbr_sched_dump_file = open_dump_file (dump_base_name, ".dbr");
2257
2258 #ifdef STACK_REGS
2259
2260   /* If stack_reg dump desired, open the output file.  */
2261   if (stack_reg_dump)
2262     stack_reg_dump_file = open_dump_file (dump_base_name, ".stack");
2263
2264 #endif
2265
2266   /* Open assembler code output file.  */
2267
2268   if (! name_specified && asm_file_name == 0)
2269     asm_out_file = stdout;
2270   else
2271     {
2272       int len = strlen (dump_base_name);
2273       register char *dumpname = (char *) xmalloc (len + 6);
2274       strcpy (dumpname, dump_base_name);
2275       strip_off_ending (dumpname, len);
2276       strcat (dumpname, ".s");
2277       if (asm_file_name == 0)
2278         {
2279           asm_file_name = (char *) xmalloc (strlen (dumpname) + 1);
2280           strcpy (asm_file_name, dumpname);
2281         }
2282       if (!strcmp (asm_file_name, "-"))
2283         asm_out_file = stdout;
2284       else
2285         asm_out_file = fopen (asm_file_name, "w");
2286       if (asm_out_file == 0)
2287         pfatal_with_name (asm_file_name);
2288     }
2289
2290 #ifdef IO_BUFFER_SIZE
2291   setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
2292            _IOFBF, IO_BUFFER_SIZE);
2293 #endif
2294
2295   input_filename = name;
2296
2297   /* Put an entry on the input file stack for the main input file.  */
2298   input_file_stack
2299     = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2300   input_file_stack->next = 0;
2301   input_file_stack->name = input_filename;
2302
2303   /* Perform language-specific initialization.
2304      This may set main_input_filename.  */
2305   lang_init ();
2306
2307   /* If the input doesn't start with a #line, use the input name
2308      as the official input file name.  */
2309   if (main_input_filename == 0)
2310     main_input_filename = name;
2311
2312   if (!output_bytecode)
2313     {
2314       ASM_FILE_START (asm_out_file);
2315     }
2316
2317   /* Output something to inform GDB that this compilation was by GCC.  Also
2318      serves to tell GDB file consists of bytecodes. */
2319   if (output_bytecode)
2320     fprintf (asm_out_file, "bc_gcc2_compiled.:\n");
2321   else
2322     {
2323 #ifndef ASM_IDENTIFY_GCC
2324       fprintf (asm_out_file, "gcc2_compiled.:\n");
2325 #else
2326       ASM_IDENTIFY_GCC (asm_out_file);
2327 #endif
2328     }
2329
2330   /* Output something to identify which front-end produced this file. */
2331 #ifdef ASM_IDENTIFY_LANGUAGE
2332   ASM_IDENTIFY_LANGUAGE (asm_out_file);
2333 #endif
2334
2335   if (output_bytecode)
2336     {
2337       if (profile_flag || profile_block_flag)
2338         error ("profiling not supported in bytecode compilation");
2339     }
2340   else
2341     {
2342       /* ??? Note: There used to be a conditional here
2343          to call assemble_zeros without fail if DBX_DEBUGGING_INFO is defined.
2344          This was to guarantee separation between gcc_compiled. and
2345          the first function, for the sake of dbx on Suns.
2346          However, having the extra zero here confused the Emacs
2347          code for unexec, and might confuse other programs too.
2348          Therefore, I took out that change.
2349          In future versions we should find another way to solve
2350          that dbx problem.  -- rms, 23 May 93.  */
2351       
2352       /* Don't let the first function fall at the same address
2353          as gcc_compiled., if profiling.  */
2354       if (profile_flag || profile_block_flag)
2355         assemble_zeros (UNITS_PER_WORD);
2356     }
2357
2358   /* If dbx symbol table desired, initialize writing it
2359      and output the predefined types.  */
2360 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2361   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2362     TIMEVAR (symout_time, dbxout_init (asm_out_file, main_input_filename,
2363                                        getdecls ()));
2364 #endif
2365 #ifdef SDB_DEBUGGING_INFO
2366   if (write_symbols == SDB_DEBUG)
2367     TIMEVAR (symout_time, sdbout_init (asm_out_file, main_input_filename,
2368                                        getdecls ()));
2369 #endif
2370 #ifdef DWARF_DEBUGGING_INFO
2371   if (write_symbols == DWARF_DEBUG)
2372     TIMEVAR (symout_time, dwarfout_init (asm_out_file, main_input_filename));
2373 #endif
2374
2375   /* Initialize yet another pass.  */
2376
2377   if (!output_bytecode)
2378     init_final (main_input_filename);
2379
2380   start_time = get_run_time ();
2381
2382   /* Call the parser, which parses the entire file
2383      (calling rest_of_compilation for each function).  */
2384
2385   if (yyparse () != 0)
2386     {
2387       if (errorcount == 0)
2388         fprintf (stderr, "Errors detected in input file (your bison.simple is out of date)");
2389
2390       /* In case there were missing closebraces,
2391          get us back to the global binding level.  */
2392       while (! global_bindings_p ())
2393         poplevel (0, 0, 0);
2394     }
2395
2396   /* Compilation is now finished except for writing
2397      what's left of the symbol table output.  */
2398
2399   parse_time += get_run_time () - start_time;
2400
2401   parse_time -= integration_time;
2402   parse_time -= varconst_time;
2403
2404   globals = getdecls ();
2405
2406   /* Really define vars that have had only a tentative definition.
2407      Really output inline functions that must actually be callable
2408      and have not been output so far.  */
2409
2410   {
2411     int len = list_length (globals);
2412     tree *vec = (tree *) alloca (sizeof (tree) * len);
2413     int i;
2414     tree decl;
2415     int reconsider = 1;
2416
2417     /* Process the decls in reverse order--earliest first.
2418        Put them into VEC from back to front, then take out from front.  */
2419
2420     for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
2421       vec[len - i - 1] = decl;
2422
2423     for (i = 0; i < len; i++)
2424       {
2425         decl = vec[i];
2426
2427         /* We're not deferring this any longer.  */
2428         DECL_DEFER_OUTPUT (decl) = 0;
2429
2430         if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0
2431             && incomplete_decl_finalize_hook != 0)
2432           (*incomplete_decl_finalize_hook) (decl);
2433       }
2434
2435     /* Now emit any global variables or functions that we have been putting
2436        off.  We need to loop in case one of the things emitted here
2437        references another one which comes earlier in the list.  */
2438     while (reconsider)
2439       {
2440         reconsider = 0;
2441         for (i = 0; i < len; i++)
2442           {
2443             decl = vec[i];
2444
2445             if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
2446               continue;
2447
2448             /* Don't write out static consts, unless we still need them.
2449
2450                We also keep static consts if not optimizing (for debugging).
2451                ??? They might be better written into the debug information.
2452                This is possible when using DWARF.
2453
2454                A language processor that wants static constants to be always
2455                written out (even if it is not used) is responsible for
2456                calling rest_of_decl_compilation itself.  E.g. the C front-end
2457                calls rest_of_decl_compilation from finish_decl.
2458                One motivation for this is that is conventional in some
2459                environments to write things like:
2460                    static const char rcsid[] = "... version string ...";
2461                intending to force the string to be in the executable.
2462
2463                A language processor that would prefer to have unneeded
2464                static constants "optimized away" would just defer writing
2465                them out until here.  E.g. C++ does this, because static
2466                constants are often defined in header files.
2467
2468                ??? A tempting alternative (for both C and C++) would be
2469                to force a constant to be written if and only if it is
2470                defined in a main file, as opposed to an include file. */
2471
2472             if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2473                 && (! TREE_READONLY (decl)
2474                     || TREE_PUBLIC (decl)
2475                     || !optimize
2476                     || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2477               {
2478                 reconsider = 1;
2479                 rest_of_decl_compilation (decl, NULL_PTR, 1, 1);
2480               }
2481
2482             if (TREE_CODE (decl) == FUNCTION_DECL
2483                 && DECL_INITIAL (decl) != 0
2484                 && DECL_SAVED_INSNS (decl) != 0
2485                 && (flag_keep_inline_functions
2486                     || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2487               {
2488                 reconsider = 1;
2489                 temporary_allocation ();
2490                 output_inline_function (decl);
2491                 permanent_allocation (1);
2492               }
2493           }
2494       }
2495
2496     for (i = 0; i < len; i++)
2497       {
2498         decl = vec[i];
2499
2500         if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2501             && ! TREE_ASM_WRITTEN (decl))
2502           /* Cancel the RTL for this decl so that, if debugging info
2503              output for global variables is still to come,
2504              this one will be omitted.  */
2505           DECL_RTL (decl) = NULL;
2506
2507         /* Warn about any function
2508            declared static but not defined.
2509            We don't warn about variables,
2510            because many programs have static variables
2511            that exist only to get some text into the object file.  */
2512         if (TREE_CODE (decl) == FUNCTION_DECL
2513             && (warn_unused
2514                 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2515             && DECL_INITIAL (decl) == 0
2516             && DECL_EXTERNAL (decl)
2517             && ! TREE_PUBLIC (decl))
2518           {
2519             pedwarn_with_decl (decl, 
2520                                "`%s' declared `static' but never defined");
2521             /* This symbol is effectively an "extern" declaration now.  */
2522             TREE_PUBLIC (decl) = 1;
2523             assemble_external (decl);
2524           }
2525
2526         /* Warn about static fns or vars defined but not used,
2527            but not about inline functions or static consts
2528            since defining those in header files is normal practice.  */
2529         if (warn_unused
2530             && ((TREE_CODE (decl) == FUNCTION_DECL && ! DECL_INLINE (decl))
2531                 || (TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
2532             && ! DECL_IN_SYSTEM_HEADER (decl)
2533             && ! DECL_EXTERNAL (decl)
2534             && ! TREE_PUBLIC (decl)
2535             && ! TREE_USED (decl)
2536             && ! DECL_REGISTER (decl)
2537             /* The TREE_USED bit for file-scope decls
2538                is kept in the identifier, to handle multiple
2539                external decls in different scopes.  */
2540             && ! TREE_USED (DECL_NAME (decl)))
2541           warning_with_decl (decl, "`%s' defined but not used");
2542
2543 #ifdef SDB_DEBUGGING_INFO
2544         /* The COFF linker can move initialized global vars to the end.
2545            And that can screw up the symbol ordering.
2546            By putting the symbols in that order to begin with,
2547            we avoid a problem.  mcsun!unido!fauern!tumuc!pes@uunet.uu.net.  */
2548         if (write_symbols == SDB_DEBUG && TREE_CODE (decl) == VAR_DECL
2549             && TREE_PUBLIC (decl) && DECL_INITIAL (decl)
2550             && ! DECL_EXTERNAL (decl)
2551             && DECL_RTL (decl) != 0)
2552           TIMEVAR (symout_time, sdbout_symbol (decl, 0));
2553
2554         /* Output COFF information for non-global
2555            file-scope initialized variables. */
2556         if (write_symbols == SDB_DEBUG
2557             && TREE_CODE (decl) == VAR_DECL
2558             && DECL_INITIAL (decl)
2559             && ! DECL_EXTERNAL (decl)
2560             && DECL_RTL (decl) != 0
2561             && GET_CODE (DECL_RTL (decl)) == MEM)
2562           TIMEVAR (symout_time, sdbout_toplevel_data (decl));
2563 #endif /* SDB_DEBUGGING_INFO */
2564 #ifdef DWARF_DEBUGGING_INFO
2565         /* Output DWARF information for file-scope tentative data object
2566            declarations, file-scope (extern) function declarations (which
2567            had no corresponding body) and file-scope tagged type declarations
2568            and definitions which have not yet been forced out.  */
2569
2570         if (write_symbols == DWARF_DEBUG
2571             && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
2572           TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 1));
2573 #endif
2574       }
2575   }
2576
2577   /* Write out any pending weak symbol declarations.  */
2578
2579   weak_finish ();
2580
2581   /* Do dbx symbols */
2582 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2583   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2584     TIMEVAR (symout_time,
2585              {
2586                dbxout_finish (asm_out_file, main_input_filename);
2587              });
2588 #endif
2589
2590 #ifdef DWARF_DEBUGGING_INFO
2591   if (write_symbols == DWARF_DEBUG)
2592     TIMEVAR (symout_time,
2593              {
2594                dwarfout_finish ();
2595              });
2596 #endif
2597
2598   /* Output some stuff at end of file if nec.  */
2599
2600   if (!output_bytecode)
2601     {
2602       end_final (main_input_filename);
2603
2604 #ifdef ASM_FILE_END
2605       ASM_FILE_END (asm_out_file);
2606 #endif
2607     }
2608
2609   /* Language-specific end of compilation actions.  */
2610
2611   lang_finish ();
2612
2613   if (output_bytecode)
2614     bc_write_file (asm_out_file);
2615
2616   /* Close the dump files.  */
2617
2618   if (flag_gen_aux_info)
2619     {
2620       fclose (aux_info_file);
2621       if (errorcount)
2622         unlink (aux_info_file_name);
2623     }
2624
2625   if (rtl_dump)
2626     fclose (rtl_dump_file);
2627
2628   if (jump_opt_dump)
2629     fclose (jump_opt_dump_file);
2630
2631   if (cse_dump)
2632     fclose (cse_dump_file);
2633
2634   if (loop_dump)
2635     fclose (loop_dump_file);
2636
2637   if (cse2_dump)
2638     fclose (cse2_dump_file);
2639
2640   if (flow_dump)
2641     fclose (flow_dump_file);
2642
2643   if (combine_dump)
2644     {
2645       dump_combine_total_stats (combine_dump_file);
2646       fclose (combine_dump_file);
2647     }
2648
2649   if (sched_dump)
2650     fclose (sched_dump_file);
2651
2652   if (local_reg_dump)
2653     fclose (local_reg_dump_file);
2654
2655   if (global_reg_dump)
2656     fclose (global_reg_dump_file);
2657
2658   if (sched2_dump)
2659     fclose (sched2_dump_file);
2660
2661   if (jump2_opt_dump)
2662     fclose (jump2_opt_dump_file);
2663
2664   if (dbr_sched_dump)
2665     fclose (dbr_sched_dump_file);
2666
2667 #ifdef STACK_REGS
2668   if (stack_reg_dump)
2669     fclose (stack_reg_dump_file);
2670 #endif
2671
2672   /* Close non-debugging input and output files.  Take special care to note
2673      whether fclose returns an error, since the pages might still be on the
2674      buffer chain while the file is open.  */
2675
2676   fclose (finput);
2677   if (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0)
2678     fatal_io_error (asm_file_name);
2679
2680   /* Print the times.  */
2681
2682   if (! quiet_flag)
2683     {
2684       fprintf (stderr,"\n");
2685       print_time ("parse", parse_time);
2686
2687       if (!output_bytecode)
2688         {
2689           print_time ("integration", integration_time);
2690           print_time ("jump", jump_time);
2691           print_time ("cse", cse_time);
2692           print_time ("loop", loop_time);
2693           print_time ("cse2", cse2_time);
2694           print_time ("flow", flow_time);
2695           print_time ("combine", combine_time);
2696           print_time ("sched", sched_time);
2697           print_time ("local-alloc", local_alloc_time);
2698           print_time ("global-alloc", global_alloc_time);
2699           print_time ("sched2", sched2_time);
2700           print_time ("dbranch", dbr_sched_time);
2701           print_time ("shorten-branch", shorten_branch_time);
2702           print_time ("stack-reg", stack_reg_time);
2703           print_time ("final", final_time);
2704           print_time ("varconst", varconst_time);
2705           print_time ("symout", symout_time);
2706           print_time ("dump", dump_time);
2707         }
2708     }
2709 }
2710 \f
2711 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
2712    and TYPE_DECL nodes.
2713
2714    This does nothing for local (non-static) variables.
2715    Otherwise, it sets up the RTL and outputs any assembler code
2716    (label definition, storage allocation and initialization).
2717
2718    DECL is the declaration.  If ASMSPEC is nonzero, it specifies
2719    the assembler symbol name to be used.  TOP_LEVEL is nonzero
2720    if this declaration is not within a function.  */
2721
2722 void
2723 rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2724      tree decl;
2725      char *asmspec;
2726      int top_level;
2727      int at_end;
2728 {
2729   /* Declarations of variables, and of functions defined elsewhere.  */
2730
2731 /* The most obvious approach, to put an #ifndef around where
2732    this macro is used, doesn't work since it's inside a macro call.  */
2733 #ifndef ASM_FINISH_DECLARE_OBJECT
2734 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP, END)
2735 #endif
2736
2737   /* Forward declarations for nested functions are not "external",
2738      but we need to treat them as if they were.  */
2739   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
2740       || TREE_CODE (decl) == FUNCTION_DECL)
2741     TIMEVAR (varconst_time,
2742              {
2743                make_decl_rtl (decl, asmspec, top_level);
2744                /* Initialized extern variable exists to be replaced
2745                   with its value, or represents something that will be
2746                   output in another file.  */
2747                if (! (TREE_CODE (decl) == VAR_DECL
2748                       && DECL_EXTERNAL (decl) && TREE_READONLY (decl)
2749                       && DECL_INITIAL (decl) != 0
2750                       && DECL_INITIAL (decl) != error_mark_node))
2751                  /* Don't output anything
2752                     when a tentative file-scope definition is seen.
2753                     But at end of compilation, do output code for them.  */
2754                  if (! (! at_end && top_level
2755                         && (DECL_INITIAL (decl) == 0
2756                             || DECL_INITIAL (decl) == error_mark_node)))
2757                    assemble_variable (decl, top_level, at_end, 0);
2758                if (decl == last_assemble_variable_decl)
2759                  {
2760                    ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2761                                               top_level, at_end);
2762                  }
2763              });
2764   else if (DECL_REGISTER (decl) && asmspec != 0)
2765     {
2766       if (decode_reg_name (asmspec) >= 0)
2767         {
2768           DECL_RTL (decl) = 0;
2769           make_decl_rtl (decl, asmspec, top_level);
2770         }
2771       else
2772         error ("invalid register name `%s' for register variable", asmspec);
2773     }
2774 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2775   else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2776            && TREE_CODE (decl) == TYPE_DECL)
2777     TIMEVAR (symout_time, dbxout_symbol (decl, 0));
2778 #endif
2779 #ifdef SDB_DEBUGGING_INFO
2780   else if (write_symbols == SDB_DEBUG && top_level
2781            && TREE_CODE (decl) == TYPE_DECL)
2782     TIMEVAR (symout_time, sdbout_symbol (decl, 0));
2783 #endif
2784 }
2785
2786 /* Called after finishing a record, union or enumeral type.  */
2787
2788 void
2789 rest_of_type_compilation (type, toplev)
2790      tree type;
2791      int toplev;
2792 {
2793 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2794   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2795     TIMEVAR (symout_time, dbxout_symbol (TYPE_STUB_DECL (type), !toplev));
2796 #endif
2797 #ifdef SDB_DEBUGGING_INFO
2798   if (write_symbols == SDB_DEBUG)
2799     TIMEVAR (symout_time, sdbout_symbol (TYPE_STUB_DECL (type), !toplev));
2800 #endif
2801 }
2802
2803 /* This is called from finish_function (within yyparse)
2804    after each top-level definition is parsed.
2805    It is supposed to compile that function or variable
2806    and output the assembler code for it.
2807    After we return, the tree storage is freed.  */
2808
2809 void
2810 rest_of_compilation (decl)
2811      tree decl;
2812 {
2813   register rtx insns;
2814   int start_time = get_run_time ();
2815   int tem;
2816   /* Nonzero if we have saved the original DECL_INITIAL of the function,
2817      to be restored after we finish compiling the function
2818      (for use when compiling inline calls to this function).  */
2819   tree saved_block_tree = 0;
2820   /* Likewise, for DECL_ARGUMENTS.  */
2821   tree saved_arguments = 0;
2822   int failure = 0;
2823
2824   if (output_bytecode)
2825     return;
2826
2827   /* If we are reconsidering an inline function
2828      at the end of compilation, skip the stuff for making it inline.  */
2829
2830   if (DECL_SAVED_INSNS (decl) == 0)
2831     {
2832       int specd = DECL_INLINE (decl);
2833       char *lose;
2834
2835       /* If requested, consider whether to make this function inline.  */
2836       if (specd || flag_inline_functions)
2837         TIMEVAR (integration_time,
2838                  {
2839                    lose = function_cannot_inline_p (decl);
2840                    /* If not optimzing, then make sure the DECL_INLINE
2841                       bit is off.  */
2842                    if (lose || ! optimize)
2843                      {
2844                        if (warn_inline && specd)
2845                          warning_with_decl (decl, lose);
2846                        DECL_INLINE (decl) = 0;
2847                        DECL_ABSTRACT_ORIGIN (decl) = 0;
2848                        /* Don't really compile an extern inline function.
2849                           If we can't make it inline, pretend
2850                           it was only declared.  */
2851                        if (DECL_EXTERNAL (decl))
2852                          {
2853                            DECL_INITIAL (decl) = 0;
2854                            goto exit_rest_of_compilation;
2855                          }
2856                      }
2857                    else
2858                      DECL_INLINE (decl) = 1;
2859                  });
2860
2861       insns = get_insns ();
2862
2863       /* Dump the rtl code if we are dumping rtl.  */
2864
2865       if (rtl_dump)
2866         TIMEVAR (dump_time,
2867                  {
2868                    fprintf (rtl_dump_file, "\n;; Function %s\n\n",
2869                             IDENTIFIER_POINTER (DECL_NAME (decl)));
2870                    if (DECL_SAVED_INSNS (decl))
2871                      fprintf (rtl_dump_file, ";; (integrable)\n\n");
2872                    print_rtl (rtl_dump_file, insns);
2873                    fflush (rtl_dump_file);
2874                  });
2875
2876       /* If function is inline, and we don't yet know whether to
2877          compile it by itself, defer decision till end of compilation.
2878          finish_compilation will call rest_of_compilation again
2879          for those functions that need to be output.  Also defer those
2880          functions that we are supposed to defer.  */
2881
2882       if (DECL_DEFER_OUTPUT (decl)
2883           || ((specd || DECL_INLINE (decl))
2884               && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
2885                    && ! flag_keep_inline_functions)
2886                   || DECL_EXTERNAL (decl))))
2887         {
2888           DECL_DEFER_OUTPUT (decl) = 1;
2889
2890           /* If -Wreturn-type, we have to do a bit of compilation.  */
2891           if (! warn_return_type)
2892             {
2893 #ifdef DWARF_DEBUGGING_INFO
2894               /* Generate the DWARF info for the "abstract" instance
2895                  of a function which we may later generate inlined and/or
2896                  out-of-line instances of.  */
2897               if (write_symbols == DWARF_DEBUG)
2898                 {
2899                   set_decl_abstract_flags (decl, 1);
2900                   TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
2901                   set_decl_abstract_flags (decl, 0);
2902                 }
2903 #endif
2904               TIMEVAR (integration_time, save_for_inline_nocopy (decl));
2905               goto exit_rest_of_compilation;
2906             }
2907         }
2908
2909       /* If we have to compile the function now, save its rtl and subdecls
2910          so that its compilation will not affect what others get.  */
2911       if (DECL_INLINE (decl) || DECL_DEFER_OUTPUT (decl))
2912         {
2913 #ifdef DWARF_DEBUGGING_INFO
2914           /* Generate the DWARF info for the "abstract" instance of
2915              a function which we will generate an out-of-line instance
2916              of almost immediately (and which we may also later generate
2917              various inlined instances of).  */
2918           if (write_symbols == DWARF_DEBUG)
2919             {
2920               set_decl_abstract_flags (decl, 1);
2921               TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
2922               set_decl_abstract_flags (decl, 0);
2923             }
2924 #endif
2925           saved_block_tree = DECL_INITIAL (decl);
2926           saved_arguments = DECL_ARGUMENTS (decl);
2927           TIMEVAR (integration_time, save_for_inline_copying (decl));
2928         }
2929
2930       /* If specified extern inline but we aren't inlining it, we are
2931          done.  */
2932       if (specd && DECL_EXTERNAL (decl))
2933         goto exit_rest_of_compilation;
2934     }
2935
2936   if (! DECL_DEFER_OUTPUT (decl))
2937     TREE_ASM_WRITTEN (decl) = 1;
2938
2939   /* Now that integrate will no longer see our rtl, we need not distinguish
2940      between the return value of this function and the return value of called
2941      functions.  */
2942   rtx_equal_function_value_matters = 0;
2943
2944   /* Don't return yet if -Wreturn-type; we need to do jump_optimize.  */
2945   if ((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
2946     {
2947       goto exit_rest_of_compilation;
2948     }
2949
2950   /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
2951      Note that that may have been done above, in save_for_inline_copying.
2952      The call to resume_temporary_allocation near the end of this function
2953      goes back to the usual state of affairs.  */
2954
2955   rtl_in_current_obstack ();
2956
2957 #ifdef FINALIZE_PIC
2958   /* If we are doing position-independent code generation, now
2959      is the time to output special prologues and epilogues.
2960      We do not want to do this earlier, because it just clutters
2961      up inline functions with meaningless insns.  */
2962   if (flag_pic)
2963     FINALIZE_PIC;
2964 #endif
2965
2966   insns = get_insns ();
2967
2968   /* Copy any shared structure that should not be shared.  */
2969
2970   unshare_all_rtl (insns);
2971
2972   /* Instantiate all virtual registers.  */
2973
2974   instantiate_virtual_regs (current_function_decl, get_insns ());
2975
2976   /* See if we have allocated stack slots that are not directly addressable.
2977      If so, scan all the insns and create explicit address computation
2978      for all references to such slots.  */
2979 /*   fixup_stack_slots (); */
2980
2981   /* Do jump optimization the first time, if -opt.
2982      Also do it if -W, but in that case it doesn't change the rtl code,
2983      it only computes whether control can drop off the end of the function.  */
2984
2985   if (optimize > 0 || extra_warnings || warn_return_type
2986       /* If function is `noreturn', we should warn if it tries to return.  */
2987       || TREE_THIS_VOLATILE (decl))
2988     {
2989       TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
2990       TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 1));
2991     }
2992
2993   /* Now is when we stop if -fsyntax-only and -Wreturn-type.  */
2994   if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
2995     goto exit_rest_of_compilation;
2996
2997   /* Dump rtl code after jump, if we are doing that.  */
2998
2999   if (jump_opt_dump)
3000     TIMEVAR (dump_time,
3001              {
3002                fprintf (jump_opt_dump_file, "\n;; Function %s\n\n",
3003                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3004                print_rtl (jump_opt_dump_file, insns);
3005                fflush (jump_opt_dump_file);
3006              });
3007
3008   /* Perform common subexpression elimination.
3009      Nonzero value from `cse_main' means that jumps were simplified
3010      and some code may now be unreachable, so do
3011      jump optimization again.  */
3012
3013   if (cse_dump)
3014     TIMEVAR (dump_time,
3015              {
3016                fprintf (cse_dump_file, "\n;; Function %s\n\n",
3017                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3018              });
3019
3020   if (optimize > 0)
3021     {
3022       TIMEVAR (cse_time, reg_scan (insns, max_reg_num (), 1));
3023
3024       if (flag_thread_jumps)
3025         /* Hacks by tiemann & kenner.  */
3026         TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 1));
3027
3028       TIMEVAR (cse_time, tem = cse_main (insns, max_reg_num (),
3029                                          0, cse_dump_file));
3030       TIMEVAR (cse_time, delete_dead_from_cse (insns, max_reg_num ()));
3031
3032       if (tem || optimize > 1)
3033         TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
3034     }
3035
3036   /* Dump rtl code after cse, if we are doing that.  */
3037
3038   if (cse_dump)
3039     TIMEVAR (dump_time,
3040              {
3041                print_rtl (cse_dump_file, insns);
3042                fflush (cse_dump_file);
3043              });
3044
3045   if (loop_dump)
3046     TIMEVAR (dump_time,
3047              {
3048                fprintf (loop_dump_file, "\n;; Function %s\n\n",
3049                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3050              });
3051
3052   /* Move constant computations out of loops.  */
3053
3054   if (optimize > 0)
3055     {
3056       TIMEVAR (loop_time,
3057                {
3058                  loop_optimize (insns, loop_dump_file);
3059                });
3060     }
3061
3062   /* Dump rtl code after loop opt, if we are doing that.  */
3063
3064   if (loop_dump)
3065     TIMEVAR (dump_time,
3066              {
3067                print_rtl (loop_dump_file, insns);
3068                fflush (loop_dump_file);
3069              });
3070
3071   if (cse2_dump)
3072     TIMEVAR (dump_time,
3073              {
3074                fprintf (cse2_dump_file, "\n;; Function %s\n\n",
3075                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3076              });
3077
3078   if (optimize > 0 && flag_rerun_cse_after_loop)
3079     {
3080       /* Running another jump optimization pass before the second
3081          cse pass sometimes simplifies the RTL enough to allow
3082          the second CSE pass to do a better job.  Jump_optimize can change
3083          max_reg_num so we must rerun reg_scan afterwards.
3084          ??? Rework to not call reg_scan so often.  */
3085       TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
3086       TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 1));
3087
3088       TIMEVAR (cse2_time, reg_scan (insns, max_reg_num (), 0));
3089       TIMEVAR (cse2_time, tem = cse_main (insns, max_reg_num (),
3090                                           1, cse2_dump_file));
3091       if (tem)
3092         TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
3093     }
3094
3095   if (optimize > 0 && flag_thread_jumps)
3096     /* This pass of jump threading straightens out code
3097        that was kinked by loop optimization.  */
3098     TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 0));
3099
3100   /* Dump rtl code after cse, if we are doing that.  */
3101
3102   if (cse2_dump)
3103     TIMEVAR (dump_time,
3104              {
3105                print_rtl (cse2_dump_file, insns);
3106                fflush (cse2_dump_file);
3107              });
3108
3109   /* We are no longer anticipating cse in this function, at least.  */
3110
3111   cse_not_expected = 1;
3112
3113   /* Now we choose between stupid (pcc-like) register allocation
3114      (if we got the -noreg switch and not -opt)
3115      and smart register allocation.  */
3116
3117   if (optimize > 0)                     /* Stupid allocation probably won't work */
3118     obey_regdecls = 0;          /* if optimizations being done.  */
3119
3120   regclass_init ();
3121
3122   /* Print function header into flow dump now
3123      because doing the flow analysis makes some of the dump.  */
3124
3125   if (flow_dump)
3126     TIMEVAR (dump_time,
3127              {
3128                fprintf (flow_dump_file, "\n;; Function %s\n\n",
3129                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3130              });
3131
3132   if (obey_regdecls)
3133     {
3134       TIMEVAR (flow_time,
3135                {
3136                  regclass (insns, max_reg_num ());
3137                  stupid_life_analysis (insns, max_reg_num (),
3138                                        flow_dump_file);
3139                });
3140     }
3141   else
3142     {
3143       /* Do control and data flow analysis,
3144          and write some of the results to dump file.  */
3145
3146       TIMEVAR (flow_time, flow_analysis (insns, max_reg_num (),
3147                                          flow_dump_file));
3148       if (warn_uninitialized)
3149         {
3150           uninitialized_vars_warning (DECL_INITIAL (decl));
3151           setjmp_args_warning ();
3152         }
3153     }
3154
3155   /* Dump rtl after flow analysis.  */
3156
3157   if (flow_dump)
3158     TIMEVAR (dump_time,
3159              {
3160                print_rtl (flow_dump_file, insns);
3161                fflush (flow_dump_file);
3162              });
3163
3164   /* If -opt, try combining insns through substitution.  */
3165
3166   if (optimize > 0)
3167     TIMEVAR (combine_time, combine_instructions (insns, max_reg_num ()));
3168
3169   /* Dump rtl code after insn combination.  */
3170
3171   if (combine_dump)
3172     TIMEVAR (dump_time,
3173              {
3174                fprintf (combine_dump_file, "\n;; Function %s\n\n",
3175                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3176                dump_combine_stats (combine_dump_file);
3177                print_rtl (combine_dump_file, insns);
3178                fflush (combine_dump_file);
3179              });
3180
3181   /* Print function header into sched dump now
3182      because doing the sched analysis makes some of the dump.  */
3183
3184   if (sched_dump)
3185     TIMEVAR (dump_time,
3186              {
3187                fprintf (sched_dump_file, "\n;; Function %s\n\n",
3188                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3189              });
3190
3191   if (optimize > 0 && flag_schedule_insns)
3192     {
3193       /* Do control and data sched analysis,
3194          and write some of the results to dump file.  */
3195
3196       TIMEVAR (sched_time, schedule_insns (sched_dump_file));
3197     }
3198
3199   /* Dump rtl after instruction scheduling.  */
3200
3201   if (sched_dump)
3202     TIMEVAR (dump_time,
3203              {
3204                print_rtl (sched_dump_file, insns);
3205                fflush (sched_dump_file);
3206              });
3207
3208   /* Unless we did stupid register allocation,
3209      allocate pseudo-regs that are used only within 1 basic block.  */
3210
3211   if (!obey_regdecls)
3212     TIMEVAR (local_alloc_time,
3213              {
3214                regclass (insns, max_reg_num ());
3215                local_alloc ();
3216              });
3217
3218   /* Dump rtl code after allocating regs within basic blocks.  */
3219
3220   if (local_reg_dump)
3221     TIMEVAR (dump_time,
3222              {
3223                fprintf (local_reg_dump_file, "\n;; Function %s\n\n",
3224                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3225                dump_flow_info (local_reg_dump_file);
3226                dump_local_alloc (local_reg_dump_file);
3227                print_rtl (local_reg_dump_file, insns);
3228                fflush (local_reg_dump_file);
3229              });
3230
3231   if (global_reg_dump)
3232     TIMEVAR (dump_time,
3233              fprintf (global_reg_dump_file, "\n;; Function %s\n\n",
3234                       IDENTIFIER_POINTER (DECL_NAME (decl))));
3235
3236   /* Unless we did stupid register allocation,
3237      allocate remaining pseudo-regs, then do the reload pass
3238      fixing up any insns that are invalid.  */
3239
3240   TIMEVAR (global_alloc_time,
3241            {
3242              if (!obey_regdecls)
3243                failure = global_alloc (global_reg_dump_file);
3244              else
3245                failure = reload (insns, 0, global_reg_dump_file);
3246            });
3247
3248   if (global_reg_dump)
3249     TIMEVAR (dump_time,
3250              {
3251                dump_global_regs (global_reg_dump_file);
3252                print_rtl (global_reg_dump_file, insns);
3253                fflush (global_reg_dump_file);
3254              });
3255
3256   if (failure)
3257     goto exit_rest_of_compilation;
3258
3259   reload_completed = 1;
3260
3261   /* On some machines, the prologue and epilogue code, or parts thereof,
3262      can be represented as RTL.  Doing so lets us schedule insns between
3263      it and the rest of the code and also allows delayed branch
3264      scheduling to operate in the epilogue.  */
3265
3266   thread_prologue_and_epilogue_insns (insns);
3267
3268   if (optimize > 0 && flag_schedule_insns_after_reload)
3269     {
3270       if (sched2_dump)
3271         TIMEVAR (dump_time,
3272                  {
3273                    fprintf (sched2_dump_file, "\n;; Function %s\n\n",
3274                             IDENTIFIER_POINTER (DECL_NAME (decl)));
3275                  });
3276
3277       /* Do control and data sched analysis again,
3278          and write some more of the results to dump file.  */
3279
3280       TIMEVAR (sched2_time, schedule_insns (sched2_dump_file));
3281
3282       /* Dump rtl after post-reorder instruction scheduling.  */
3283
3284       if (sched2_dump)
3285         TIMEVAR (dump_time,
3286                  {
3287                    print_rtl (sched2_dump_file, insns);
3288                    fflush (sched2_dump_file);
3289                  });
3290     }
3291
3292 #ifdef LEAF_REGISTERS
3293   leaf_function = 0;
3294   if (optimize > 0 && only_leaf_regs_used () && leaf_function_p ())
3295     leaf_function = 1;
3296 #endif
3297
3298   /* One more attempt to remove jumps to .+1
3299      left by dead-store-elimination.
3300      Also do cross-jumping this time
3301      and delete no-op move insns.  */
3302
3303   if (optimize > 0)
3304     {
3305       TIMEVAR (jump_time, jump_optimize (insns, 1, 1, 0));
3306     }
3307
3308   /* Dump rtl code after jump, if we are doing that.  */
3309
3310   if (jump2_opt_dump)
3311     TIMEVAR (dump_time,
3312              {
3313                fprintf (jump2_opt_dump_file, "\n;; Function %s\n\n",
3314                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3315                print_rtl (jump2_opt_dump_file, insns);
3316                fflush (jump2_opt_dump_file);
3317              });
3318
3319   /* If a machine dependent reorganization is needed, call it.  */
3320 #ifdef MACHINE_DEPENDENT_REORG
3321    MACHINE_DEPENDENT_REORG (insns);
3322 #endif
3323
3324   /* If a scheduling pass for delayed branches is to be done,
3325      call the scheduling code. */
3326
3327 #ifdef DELAY_SLOTS
3328   if (optimize > 0 && flag_delayed_branch)
3329     {
3330       TIMEVAR (dbr_sched_time, dbr_schedule (insns, dbr_sched_dump_file));
3331       if (dbr_sched_dump)
3332         {
3333           TIMEVAR (dump_time,
3334                  {
3335                    fprintf (dbr_sched_dump_file, "\n;; Function %s\n\n",
3336                             IDENTIFIER_POINTER (DECL_NAME (decl)));
3337                    print_rtl (dbr_sched_dump_file, insns);
3338                    fflush (dbr_sched_dump_file);
3339                  });
3340         }
3341     }
3342 #endif
3343
3344   if (optimize > 0)
3345     /* Shorten branches.  */
3346     TIMEVAR (shorten_branch_time,
3347              {
3348                shorten_branches (get_insns ());
3349              });
3350
3351 #ifdef STACK_REGS
3352   TIMEVAR (stack_reg_time, reg_to_stack (insns, stack_reg_dump_file));
3353   if (stack_reg_dump)
3354     {
3355       TIMEVAR (dump_time,
3356                {
3357                  fprintf (stack_reg_dump_file, "\n;; Function %s\n\n",
3358                           IDENTIFIER_POINTER (DECL_NAME (decl)));
3359                  print_rtl (stack_reg_dump_file, insns);
3360                  fflush (stack_reg_dump_file);
3361                });
3362     }
3363 #endif
3364
3365   /* Now turn the rtl into assembler code.  */
3366
3367   TIMEVAR (final_time,
3368            {
3369              rtx x;
3370              char *fnname;
3371
3372              /* Get the function's name, as described by its RTL.
3373                 This may be different from the DECL_NAME name used
3374                 in the source file.  */
3375
3376              x = DECL_RTL (decl);
3377              if (GET_CODE (x) != MEM)
3378                abort ();
3379              x = XEXP (x, 0);
3380              if (GET_CODE (x) != SYMBOL_REF)
3381                abort ();
3382              fnname = XSTR (x, 0);
3383
3384              assemble_start_function (decl, fnname);
3385              final_start_function (insns, asm_out_file, optimize);
3386              final (insns, asm_out_file, optimize, 0);
3387              final_end_function (insns, asm_out_file, optimize);
3388              assemble_end_function (decl, fnname);
3389              fflush (asm_out_file);
3390            });
3391
3392   /* Write DBX symbols if requested */
3393
3394   /* Note that for those inline functions where we don't initially
3395      know for certain that we will be generating an out-of-line copy,
3396      the first invocation of this routine (rest_of_compilation) will
3397      skip over this code by doing a `goto exit_rest_of_compilation;'.
3398      Later on, finish_compilation will call rest_of_compilation again
3399      for those inline functions that need to have out-of-line copies
3400      generated.  During that call, we *will* be routed past here.  */
3401
3402 #ifdef DBX_DEBUGGING_INFO
3403   if (write_symbols == DBX_DEBUG)
3404     TIMEVAR (symout_time, dbxout_function (decl));
3405 #endif
3406
3407 #ifdef DWARF_DEBUGGING_INFO
3408   if (write_symbols == DWARF_DEBUG)
3409     TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
3410 #endif
3411
3412  exit_rest_of_compilation:
3413
3414   /* In case the function was not output,
3415      don't leave any temporary anonymous types
3416      queued up for sdb output.  */
3417 #ifdef SDB_DEBUGGING_INFO
3418   if (write_symbols == SDB_DEBUG)
3419     sdbout_types (NULL_TREE);
3420 #endif
3421
3422   /* Put back the tree of subblocks and list of arguments
3423      from before we copied them.
3424      Code generation and the output of debugging info may have modified
3425      the copy, but the original is unchanged.  */
3426
3427   if (saved_block_tree != 0)
3428     DECL_INITIAL (decl) = saved_block_tree;
3429   if (saved_arguments != 0)
3430     DECL_ARGUMENTS (decl) = saved_arguments;
3431
3432   reload_completed = 0;
3433
3434   /* Clear out the real_constant_chain before some of the rtx's
3435      it runs through become garbage.  */
3436
3437   clear_const_double_mem ();
3438
3439   /* Cancel the effect of rtl_in_current_obstack.  */
3440
3441   resume_temporary_allocation ();
3442
3443   /* The parsing time is all the time spent in yyparse
3444      *except* what is spent in this function.  */
3445
3446   parse_time -= get_run_time () - start_time;
3447 }
3448 \f
3449 /* Entry point of cc1/c++.  Decode command args, then call compile_file.
3450    Exit code is 35 if can't open files, 34 if fatal error,
3451    33 if had nonfatal errors, else success.  */
3452
3453 int
3454 main (argc, argv, envp)
3455      int argc;
3456      char **argv;
3457      char **envp;
3458 {
3459   register int i;
3460   char *filename = 0;
3461   int flag_print_mem = 0;
3462   int version_flag = 0;
3463   char *p;
3464
3465   /* save in case md file wants to emit args as a comment.  */
3466   save_argc = argc;
3467   save_argv = argv;
3468
3469   p = argv[0] + strlen (argv[0]);
3470   while (p != argv[0] && p[-1] != '/'
3471 #ifdef DIR_SEPARATOR
3472          && p[-1] != DIR_SEPARATOR
3473 #endif
3474          )
3475     --p;
3476   progname = p;
3477
3478 #ifdef RLIMIT_STACK
3479   /* Get rid of any avoidable limit on stack size.  */
3480   {
3481     struct rlimit rlim;
3482
3483     /* Set the stack limit huge so that alloca does not fail. */
3484     getrlimit (RLIMIT_STACK, &rlim);
3485     rlim.rlim_cur = rlim.rlim_max;
3486     setrlimit (RLIMIT_STACK, &rlim);
3487   }
3488 #endif /* RLIMIT_STACK */
3489
3490   signal (SIGFPE, float_signal);
3491
3492 #ifdef SIGPIPE
3493   signal (SIGPIPE, pipe_closed);
3494 #endif
3495
3496   decl_printable_name = decl_name;
3497   lang_expand_expr = (struct rtx_def *(*)()) do_abort;
3498   interim_eh_hook = interim_eh;
3499
3500   /* Initialize whether `char' is signed.  */
3501   flag_signed_char = DEFAULT_SIGNED_CHAR;
3502 #ifdef DEFAULT_SHORT_ENUMS
3503   /* Initialize how much space enums occupy, by default.  */
3504   flag_short_enums = DEFAULT_SHORT_ENUMS;
3505 #endif
3506
3507   /* Scan to see what optimization level has been specified.  That will
3508      determine the default value of many flags.  */
3509   for (i = 1; i < argc; i++)
3510     {
3511       if (!strcmp (argv[i], "-O"))
3512         {
3513           optimize = 1;
3514         }
3515       else if (argv[i][0] == '-' && argv[i][1] == 'O')
3516         {
3517           /* Handle -O2, -O3, -O69, ...  */
3518           char *p = &argv[i][2];
3519           int c;
3520
3521           while (c = *p++)
3522             if (! (c >= '0' && c <= '9'))
3523               break;
3524           if (c == 0)
3525             optimize = atoi (&argv[i][2]);
3526         }
3527     }
3528
3529   obey_regdecls = (optimize == 0);
3530   if (optimize == 0)
3531     {
3532       flag_no_inline = 1;
3533       warn_inline = 0;
3534     }
3535
3536   if (optimize >= 1)
3537     {
3538       flag_defer_pop = 1;
3539       flag_thread_jumps = 1;
3540 #ifdef DELAY_SLOTS
3541       flag_delayed_branch = 1;
3542 #endif
3543 #ifdef CAN_DEBUG_WITHOUT_FP
3544       flag_omit_frame_pointer = 1;
3545 #endif
3546     }
3547
3548   if (optimize >= 2)
3549     {
3550       flag_cse_follow_jumps = 1;
3551       flag_cse_skip_blocks = 1;
3552       flag_expensive_optimizations = 1;
3553       flag_strength_reduce = 1;
3554       flag_rerun_cse_after_loop = 1;
3555       flag_caller_saves = 1;
3556       flag_force_mem = 1;
3557 #ifdef INSN_SCHEDULING
3558       flag_schedule_insns = 1;
3559       flag_schedule_insns_after_reload = 1;
3560 #endif
3561     }
3562
3563   if (optimize >= 3)
3564     {
3565       flag_inline_functions = 1;
3566     }
3567
3568 #ifdef OPTIMIZATION_OPTIONS
3569   /* Allow default optimizations to be specified on a per-machine basis.  */
3570   OPTIMIZATION_OPTIONS (optimize);
3571 #endif
3572
3573   /* Initialize register usage now so switches may override.  */
3574   init_reg_sets ();
3575
3576   target_flags = 0;
3577   set_target_switch ("");
3578
3579   for (i = 1; i < argc; i++)
3580     {
3581       int j;
3582       /* If this is a language-specific option,
3583          decode it in a language-specific way.  */
3584       for (j = 0; lang_options[j] != 0; j++)
3585         if (!strncmp (argv[i], lang_options[j],
3586                       strlen (lang_options[j])))
3587           break;
3588       if (lang_options[j] != 0)
3589         /* If the option is valid for *some* language,
3590            treat it as valid even if this language doesn't understand it.  */
3591         lang_decode_option (argv[i]);
3592       else if (argv[i][0] == '-' && argv[i][1] != 0)
3593         {
3594           register char *str = argv[i] + 1;
3595           if (str[0] == 'Y')
3596             str++;
3597
3598           if (str[0] == 'm')
3599             set_target_switch (&str[1]);
3600           else if (!strcmp (str, "dumpbase"))
3601             {
3602               dump_base_name = argv[++i];
3603             }
3604           else if (str[0] == 'd')
3605             {
3606               register char *p = &str[1];
3607               while (*p)
3608                 switch (*p++)
3609                   {
3610                   case 'a':
3611                     combine_dump = 1;
3612                     dbr_sched_dump = 1;
3613                     flow_dump = 1;
3614                     global_reg_dump = 1;
3615                     jump_opt_dump = 1;
3616                     jump2_opt_dump = 1;
3617                     local_reg_dump = 1;
3618                     loop_dump = 1;
3619                     rtl_dump = 1;
3620                     cse_dump = 1, cse2_dump = 1;
3621                     sched_dump = 1;
3622                     sched2_dump = 1;
3623                     stack_reg_dump = 1;
3624                     break;
3625                   case 'k':
3626                     stack_reg_dump = 1;
3627                     break;
3628                   case 'c':
3629                     combine_dump = 1;
3630                     break;
3631                   case 'd':
3632                     dbr_sched_dump = 1;
3633                     break;
3634                   case 'f':
3635                     flow_dump = 1;
3636                     break;
3637                   case 'g':
3638                     global_reg_dump = 1;
3639                     break;
3640                   case 'j':
3641                     jump_opt_dump = 1;
3642                     break;
3643                   case 'J':
3644                     jump2_opt_dump = 1;
3645                     break;
3646                   case 'l':
3647                     local_reg_dump = 1;
3648                     break;
3649                   case 'L':
3650                     loop_dump = 1;
3651                     break;
3652                   case 'm':
3653                     flag_print_mem = 1;
3654                     break;
3655                   case 'p':
3656                     flag_print_asm_name = 1;
3657                     break;
3658                   case 'r':
3659                     rtl_dump = 1;
3660                     break;
3661                   case 's':
3662                     cse_dump = 1;
3663                     break;
3664                   case 't':
3665                     cse2_dump = 1;
3666                     break;
3667                   case 'S':
3668                     sched_dump = 1;
3669                     break;
3670                   case 'R':
3671                     sched2_dump = 1;
3672                     break;
3673                   case 'y':
3674                     set_yydebug (1);
3675                     break;
3676
3677                   case 'x':
3678                     rtl_dump_and_exit = 1;
3679                     break;
3680                   }
3681             }
3682           else if (str[0] == 'f')
3683             {
3684               register char *p = &str[1];
3685               int found = 0;
3686
3687               /* Some kind of -f option.
3688                  P's value is the option sans `-f'.
3689                  Search for it in the table of options.  */
3690
3691               for (j = 0;
3692                    !found && j < sizeof (f_options) / sizeof (f_options[0]);
3693                    j++)
3694                 {
3695                   if (!strcmp (p, f_options[j].string))
3696                     {
3697                       *f_options[j].variable = f_options[j].on_value;
3698                       /* A goto here would be cleaner,
3699                          but breaks the vax pcc.  */
3700                       found = 1;
3701                     }
3702                   if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
3703                       && ! strcmp (p+3, f_options[j].string))
3704                     {
3705                       *f_options[j].variable = ! f_options[j].on_value;
3706                       found = 1;
3707                     }
3708                 }
3709
3710               if (found)
3711                 ;
3712               else if (!strncmp (p, "fixed-", 6))
3713                 fix_register (&p[6], 1, 1);
3714               else if (!strncmp (p, "call-used-", 10))
3715                 fix_register (&p[10], 0, 1);
3716               else if (!strncmp (p, "call-saved-", 11))
3717                 fix_register (&p[11], 0, 0);
3718               else
3719                 error ("Invalid option `%s'", argv[i]);
3720             }
3721           else if (str[0] == 'O')
3722             {
3723               register char *p = str+1;
3724               while (*p && *p >= '0' && *p <= '9')
3725                 p++;
3726               if (*p == '\0')
3727                 ;
3728               else
3729                 error ("Invalid option `%s'", argv[i]);
3730             }
3731           else if (!strcmp (str, "pedantic"))
3732             pedantic = 1;
3733           else if (!strcmp (str, "pedantic-errors"))
3734             flag_pedantic_errors = pedantic = 1;
3735           else if (!strcmp (str, "quiet"))
3736             quiet_flag = 1;
3737           else if (!strcmp (str, "version"))
3738             version_flag = 1;
3739           else if (!strcmp (str, "w"))
3740             inhibit_warnings = 1;
3741           else if (!strcmp (str, "W"))
3742             {
3743               extra_warnings = 1;
3744               /* We save the value of warn_uninitialized, since if they put
3745                  -Wuninitialized on the command line, we need to generate a
3746                  warning about not using it without also specifying -O.  */
3747               if (warn_uninitialized != 1)
3748                 warn_uninitialized = 2;
3749             }
3750           else if (str[0] == 'W')
3751             {
3752               register char *p = &str[1];
3753               int found = 0;
3754
3755               /* Some kind of -W option.
3756                  P's value is the option sans `-W'.
3757                  Search for it in the table of options.  */
3758
3759               for (j = 0;
3760                    !found && j < sizeof (W_options) / sizeof (W_options[0]);
3761                    j++)
3762                 {
3763                   if (!strcmp (p, W_options[j].string))
3764                     {
3765                       *W_options[j].variable = W_options[j].on_value;
3766                       /* A goto here would be cleaner,
3767                          but breaks the vax pcc.  */
3768                       found = 1;
3769                     }
3770                   if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
3771                       && ! strcmp (p+3, W_options[j].string))
3772                     {
3773                       *W_options[j].variable = ! W_options[j].on_value;
3774                       found = 1;
3775                     }
3776                 }
3777
3778               if (found)
3779                 ;
3780               else if (!strncmp (p, "id-clash-", 9))
3781                 {
3782                   char *endp = p + 9;
3783
3784                   while (*endp)
3785                     {
3786                       if (*endp >= '0' && *endp <= '9')
3787                         endp++;
3788                       else
3789                         {
3790                           error ("Invalid option `%s'", argv[i]);
3791                           goto id_clash_lose;
3792                         }
3793                     }
3794                   warn_id_clash = 1;
3795                   id_clash_len = atoi (str + 10);
3796                 id_clash_lose: ;
3797                 }
3798               else if (!strncmp (p, "larger-than-", 12))
3799                 {
3800                   char *endp = p + 12;
3801
3802                   while (*endp)
3803                     {
3804                       if (*endp >= '0' && *endp <= '9')
3805                         endp++;
3806                       else
3807                         {
3808                           error ("Invalid option `%s'", argv[i]);
3809                           goto larger_than_lose;
3810                         }
3811                     }
3812                   warn_larger_than = 1;
3813                   larger_than_size = atoi (str + 13);
3814                 larger_than_lose: ;
3815                 }
3816               else
3817                 error ("Invalid option `%s'", argv[i]);
3818             }
3819           else if (!strcmp (str, "p"))
3820             {
3821               if (!output_bytecode)
3822                 profile_flag = 1;
3823               else
3824                 error ("profiling not supported in bytecode compilation");
3825             }
3826           else if (!strcmp (str, "a"))
3827             {
3828 #if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
3829               warning ("`-a' option (basic block profile) not supported");
3830 #else
3831               profile_block_flag = 1;
3832 #endif
3833             }
3834           else if (str[0] == 'g')
3835             {
3836               char *p = str + 1;
3837               char *q;
3838               unsigned len;
3839               unsigned level;
3840
3841               while (*p && (*p < '0' || *p > '9'))
3842                 p++;
3843               len = p - str;
3844               q = p;
3845               while (*q && (*q >= '0' && *q <= '9'))
3846                 q++;
3847               if (*p)
3848                 level = atoi (p);
3849               else
3850                 level = 2;      /* default debugging info level */
3851               if (*q || level > 3)
3852                 {
3853                   warning ("invalid debug level specification in option: `-%s'",
3854                            str);
3855                   warning ("no debugging information will be generated");
3856                   level = 0;
3857                 }
3858
3859               /* If more than one debugging type is supported,
3860                  you must define PREFERRED_DEBUGGING_TYPE
3861                  to choose a format in a system-dependent way.  */
3862               /* This is one long line cause VAXC can't handle a \-newline.  */
3863 #if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) + defined (DWARF_DEBUGGING_INFO) + defined (XCOFF_DEBUGGING_INFO))
3864 #ifdef PREFERRED_DEBUGGING_TYPE
3865               if (!strncmp (str, "ggdb", len))
3866                 write_symbols = PREFERRED_DEBUGGING_TYPE;
3867 #else /* no PREFERRED_DEBUGGING_TYPE */
3868 You Lose!  You must define PREFERRED_DEBUGGING_TYPE!
3869 #endif /* no PREFERRED_DEBUGGING_TYPE */
3870 #endif /* More than one debugger format enabled.  */
3871 #ifdef DBX_DEBUGGING_INFO
3872               if (write_symbols != NO_DEBUG)
3873                 ;
3874               else if (!strncmp (str, "ggdb", len))
3875                 write_symbols = DBX_DEBUG;
3876               else if (!strncmp (str, "gstabs", len))
3877                 write_symbols = DBX_DEBUG;
3878               else if (!strncmp (str, "gstabs+", len))
3879                 write_symbols = DBX_DEBUG;
3880
3881               /* Always enable extensions for -ggdb or -gstabs+, 
3882                  always disable for -gstabs.
3883                  For plain -g, use system-specific default.  */
3884               if (write_symbols == DBX_DEBUG && !strncmp (str, "ggdb", len)
3885                   && len >= 2)
3886                 use_gnu_debug_info_extensions = 1;
3887               else if (write_symbols == DBX_DEBUG && !strncmp (str, "gstabs+", len)
3888                        && len >= 7)
3889                 use_gnu_debug_info_extensions = 1;
3890               else if (write_symbols == DBX_DEBUG
3891                        && !strncmp (str, "gstabs", len) && len >= 2)
3892                 use_gnu_debug_info_extensions = 0;
3893               else
3894                 use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3895 #endif /* DBX_DEBUGGING_INFO */
3896 #ifdef DWARF_DEBUGGING_INFO
3897               if (write_symbols != NO_DEBUG)
3898                 ;
3899               else if (!strncmp (str, "g", len))
3900                 write_symbols = DWARF_DEBUG;
3901               else if (!strncmp (str, "ggdb", len))
3902                 write_symbols = DWARF_DEBUG;
3903               else if (!strncmp (str, "gdwarf", len))
3904                 write_symbols = DWARF_DEBUG;
3905
3906               /* Always enable extensions for -ggdb or -gdwarf+, 
3907                  always disable for -gdwarf.
3908                  For plain -g, use system-specific default.  */
3909               if (write_symbols == DWARF_DEBUG && !strncmp (str, "ggdb", len)
3910                   && len >= 2)
3911                 use_gnu_debug_info_extensions = 1;
3912               else if (write_symbols == DWARF_DEBUG && !strcmp (str, "gdwarf+"))
3913                 use_gnu_debug_info_extensions = 1;
3914               else if (write_symbols == DWARF_DEBUG
3915                        && !strncmp (str, "gdwarf", len) && len >= 2)
3916                 use_gnu_debug_info_extensions = 0;
3917               else
3918                 use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3919 #endif
3920 #ifdef SDB_DEBUGGING_INFO
3921               if (write_symbols != NO_DEBUG)
3922                 ;
3923               else if (!strncmp (str, "g", len))
3924                 write_symbols = SDB_DEBUG;
3925               else if (!strncmp (str, "gdb", len))
3926                 write_symbols = SDB_DEBUG;
3927               else if (!strncmp (str, "gcoff", len))
3928                 write_symbols = SDB_DEBUG;
3929 #endif /* SDB_DEBUGGING_INFO */
3930 #ifdef XCOFF_DEBUGGING_INFO
3931               if (write_symbols != NO_DEBUG)
3932                 ;
3933               else if (!strncmp (str, "g", len))
3934                 write_symbols = XCOFF_DEBUG;
3935               else if (!strncmp (str, "ggdb", len))
3936                 write_symbols = XCOFF_DEBUG;
3937               else if (!strncmp (str, "gxcoff", len))
3938                 write_symbols = XCOFF_DEBUG;
3939
3940               /* Always enable extensions for -ggdb or -gxcoff+,
3941                  always disable for -gxcoff.
3942                  For plain -g, use system-specific default.  */
3943               if (write_symbols == XCOFF_DEBUG && !strncmp (str, "ggdb", len)
3944                   && len >= 2)
3945                 use_gnu_debug_info_extensions = 1;
3946               else if (write_symbols == XCOFF_DEBUG && !strcmp (str, "gxcoff+"))
3947                 use_gnu_debug_info_extensions = 1;
3948               else if (write_symbols == XCOFF_DEBUG
3949                        && !strncmp (str, "gxcoff", len) && len >= 2)
3950                 use_gnu_debug_info_extensions = 0;
3951               else
3952                 use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3953 #endif        
3954               if (write_symbols == NO_DEBUG)
3955                 warning ("`-%s' option not supported on this version of GCC", str);
3956               else if (level == 0)
3957                 write_symbols = NO_DEBUG;
3958               else
3959                 debug_info_level = (enum debug_info_level) level;
3960             }
3961           else if (!strcmp (str, "o"))
3962             {
3963               asm_file_name = argv[++i];
3964             }
3965           else if (str[0] == 'G')
3966             {
3967               g_switch_set = TRUE;
3968               g_switch_value = atoi ((str[1] != '\0') ? str+1 : argv[++i]);
3969             }
3970           else if (!strncmp (str, "aux-info", 8))
3971             {
3972               flag_gen_aux_info = 1;
3973               aux_info_file_name = (str[8] != '\0' ? str+8 : argv[++i]);
3974             }
3975           else
3976             error ("Invalid option `%s'", argv[i]);
3977         }
3978       else if (argv[i][0] == '+')
3979         error ("Invalid option `%s'", argv[i]);
3980       else
3981         filename = argv[i];
3982     }
3983
3984   /* Initialize for bytecode output.  A good idea to do this as soon as
3985      possible after the "-f" options have been parsed. */
3986   if (output_bytecode)
3987     {
3988 #ifndef TARGET_SUPPORTS_BYTECODE
3989       /* Just die with a fatal error if not supported */
3990       fatal ("-fbytecode not supporter for this target");
3991 #else
3992       bc_initialize ();
3993 #endif
3994     }
3995
3996   if (optimize == 0)
3997     {
3998       /* Inlining does not work if not optimizing,
3999          so force it not to be done.  */
4000       flag_no_inline = 1;
4001       warn_inline = 0;
4002
4003       /* The c_decode_option and lang_decode_option functions set
4004          this to `2' if -Wall is used, so we can avoid giving out
4005          lots of errors for people who don't realize what -Wall does.  */
4006       if (warn_uninitialized == 1)
4007         warning ("-Wuninitialized is not supported without -O");
4008     }
4009
4010 #if defined(DWARF_DEBUGGING_INFO)
4011   if (write_symbols == DWARF_DEBUG
4012       && strcmp (language_string, "GNU C++") == 0)
4013     {
4014       warning ("-g option not supported for C++ on SVR4 systems");
4015       write_symbols = NO_DEBUG;
4016     }
4017 #endif /* defined(DWARF_DEBUGGING_INFO) */
4018
4019 #ifdef OVERRIDE_OPTIONS
4020   /* Some machines may reject certain combinations of options.  */
4021   OVERRIDE_OPTIONS;
4022 #endif
4023
4024   /* Unrolling all loops implies that standard loop unrolling must also
4025      be done.  */
4026   if (flag_unroll_all_loops)
4027     flag_unroll_loops = 1;
4028   /* Loop unrolling requires that strength_reduction be on also.  Silently
4029      turn on strength reduction here if it isn't already on.  Also, the loop
4030      unrolling code assumes that cse will be run after loop, so that must
4031      be turned on also.  */
4032   if (flag_unroll_loops)
4033     {
4034       flag_strength_reduce = 1;
4035       flag_rerun_cse_after_loop = 1;
4036     }
4037
4038   /* Warn about options that are not supported on this machine.  */
4039 #ifndef INSN_SCHEDULING
4040   if (flag_schedule_insns || flag_schedule_insns_after_reload)
4041     warning ("instruction scheduling not supported on this target machine");
4042 #endif
4043 #ifndef DELAY_SLOTS
4044   if (flag_delayed_branch)
4045     warning ("this target machine does not have delayed branches");
4046 #endif
4047
4048   /* If we are in verbose mode, write out the version and maybe all the
4049      option flags in use.  */
4050   if (version_flag)
4051     {
4052       fprintf (stderr, "%s version %s", language_string, version_string);
4053 #ifdef TARGET_VERSION
4054       TARGET_VERSION;
4055 #endif
4056 #ifdef __GNUC__
4057 #ifndef __VERSION__
4058 #define __VERSION__ "[unknown]"
4059 #endif
4060       fprintf (stderr, " compiled by GNU C version %s.\n", __VERSION__);
4061 #else
4062       fprintf (stderr, " compiled by CC.\n");
4063 #endif
4064       if (! quiet_flag)
4065         print_switch_values ();
4066     }
4067
4068   compile_file (filename);
4069
4070 #if !defined(OS2) && !defined(VMS) && !defined(WINNT)
4071   if (flag_print_mem)
4072     {
4073 #ifdef __alpha
4074       char *sbrk ();
4075 #endif
4076       char *lim = (char *) sbrk (0);
4077
4078       fprintf (stderr, "Data size %d.\n",
4079                lim - (char *) &environ);
4080       fflush (stderr);
4081
4082 #ifdef USG
4083       system ("ps -l 1>&2");
4084 #else /* not USG */
4085       system ("ps v");
4086 #endif /* not USG */
4087     }
4088 #endif /* not OS2 and not VMS and not WINNT */
4089
4090   if (errorcount)
4091     exit (FATAL_EXIT_CODE);
4092   if (sorrycount)
4093     exit (FATAL_EXIT_CODE);
4094   exit (SUCCESS_EXIT_CODE);
4095   return 34;
4096 }
4097 \f
4098 /* Decode -m switches.  */
4099
4100 /* Here is a table, controlled by the tm.h file, listing each -m switch
4101    and which bits in `target_switches' it should set or clear.
4102    If VALUE is positive, it is bits to set.
4103    If VALUE is negative, -VALUE is bits to clear.
4104    (The sign bit is not used so there is no confusion.)  */
4105
4106 struct {char *name; int value;} target_switches []
4107   = TARGET_SWITCHES;
4108
4109 /* This table is similar, but allows the switch to have a value.  */
4110
4111 #ifdef TARGET_OPTIONS
4112 struct {char *prefix; char ** variable;} target_options []
4113   = TARGET_OPTIONS;
4114 #endif
4115
4116 /* Decode the switch -mNAME.  */
4117
4118 void
4119 set_target_switch (name)
4120      char *name;
4121 {
4122   register int j;
4123   int valid = 0;
4124
4125   for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
4126     if (!strcmp (target_switches[j].name, name))
4127       {
4128         if (target_switches[j].value < 0)
4129           target_flags &= ~-target_switches[j].value;
4130         else
4131           target_flags |= target_switches[j].value;
4132         valid = 1;
4133       }
4134
4135 #ifdef TARGET_OPTIONS
4136   if (!valid)
4137     for (j = 0; j < sizeof target_options / sizeof target_options[0]; j++)
4138       {
4139         int len = strlen (target_options[j].prefix);
4140         if (!strncmp (target_options[j].prefix, name, len))
4141           {
4142             *target_options[j].variable = name + len;
4143             valid = 1;
4144           }
4145       }
4146 #endif
4147
4148   if (!valid)
4149     error ("Invalid option `%s'", name);
4150 }
4151 \f
4152 /* Variable used for communication between the following two routines.  */
4153
4154 static int line_position;
4155
4156 /* Print an option value and adjust the position in the line.  */
4157
4158 static void
4159 print_single_switch (type, name)
4160      char *type, *name;
4161 {
4162   fprintf (stderr, " %s%s", type, name);
4163
4164   line_position += strlen (type) + strlen (name) + 1;
4165
4166   if (line_position > 65)
4167     {
4168       fprintf (stderr, "\n\t");
4169       line_position = 8;
4170     }
4171 }
4172      
4173 /* Print default target switches for -version.  */
4174
4175 static void
4176 print_switch_values ()
4177 {
4178   register int j;
4179
4180   fprintf (stderr, "enabled:");
4181   line_position = 8;
4182
4183   for (j = 0; j < sizeof f_options / sizeof f_options[0]; j++)
4184     if (*f_options[j].variable == f_options[j].on_value)
4185       print_single_switch ("-f", f_options[j].string);
4186
4187   for (j = 0; j < sizeof W_options / sizeof W_options[0]; j++)
4188     if (*W_options[j].variable == W_options[j].on_value)
4189       print_single_switch ("-W", W_options[j].string);
4190
4191   for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
4192     if (target_switches[j].name[0] != '\0'
4193         && target_switches[j].value > 0
4194         && ((target_switches[j].value & target_flags)
4195             == target_switches[j].value))
4196       print_single_switch ("-m", target_switches[j].name);
4197
4198   fprintf (stderr, "\n");
4199 }