OSDN Git Service

* pa.h (DO_GLOBAL_DTORS_BODY): Fix pointer -> integer assignment
[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   /* Do dbx symbols */
2578 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2579   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2580     TIMEVAR (symout_time,
2581              {
2582                dbxout_finish (asm_out_file, main_input_filename);
2583              });
2584 #endif
2585
2586 #ifdef DWARF_DEBUGGING_INFO
2587   if (write_symbols == DWARF_DEBUG)
2588     TIMEVAR (symout_time,
2589              {
2590                dwarfout_finish ();
2591              });
2592 #endif
2593
2594   /* Output some stuff at end of file if nec.  */
2595
2596   if (!output_bytecode)
2597     {
2598       end_final (main_input_filename);
2599
2600 #ifdef ASM_FILE_END
2601       ASM_FILE_END (asm_out_file);
2602 #endif
2603     }
2604
2605   /* Language-specific end of compilation actions.  */
2606
2607   lang_finish ();
2608
2609   if (output_bytecode)
2610     bc_write_file (asm_out_file);
2611
2612   /* Close the dump files.  */
2613
2614   if (flag_gen_aux_info)
2615     {
2616       fclose (aux_info_file);
2617       if (errorcount)
2618         unlink (aux_info_file_name);
2619     }
2620
2621   if (rtl_dump)
2622     fclose (rtl_dump_file);
2623
2624   if (jump_opt_dump)
2625     fclose (jump_opt_dump_file);
2626
2627   if (cse_dump)
2628     fclose (cse_dump_file);
2629
2630   if (loop_dump)
2631     fclose (loop_dump_file);
2632
2633   if (cse2_dump)
2634     fclose (cse2_dump_file);
2635
2636   if (flow_dump)
2637     fclose (flow_dump_file);
2638
2639   if (combine_dump)
2640     {
2641       dump_combine_total_stats (combine_dump_file);
2642       fclose (combine_dump_file);
2643     }
2644
2645   if (sched_dump)
2646     fclose (sched_dump_file);
2647
2648   if (local_reg_dump)
2649     fclose (local_reg_dump_file);
2650
2651   if (global_reg_dump)
2652     fclose (global_reg_dump_file);
2653
2654   if (sched2_dump)
2655     fclose (sched2_dump_file);
2656
2657   if (jump2_opt_dump)
2658     fclose (jump2_opt_dump_file);
2659
2660   if (dbr_sched_dump)
2661     fclose (dbr_sched_dump_file);
2662
2663 #ifdef STACK_REGS
2664   if (stack_reg_dump)
2665     fclose (stack_reg_dump_file);
2666 #endif
2667
2668   /* Close non-debugging input and output files.  Take special care to note
2669      whether fclose returns an error, since the pages might still be on the
2670      buffer chain while the file is open.  */
2671
2672   fclose (finput);
2673   if (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0)
2674     fatal_io_error (asm_file_name);
2675
2676   /* Print the times.  */
2677
2678   if (! quiet_flag)
2679     {
2680       fprintf (stderr,"\n");
2681       print_time ("parse", parse_time);
2682
2683       if (!output_bytecode)
2684         {
2685           print_time ("integration", integration_time);
2686           print_time ("jump", jump_time);
2687           print_time ("cse", cse_time);
2688           print_time ("loop", loop_time);
2689           print_time ("cse2", cse2_time);
2690           print_time ("flow", flow_time);
2691           print_time ("combine", combine_time);
2692           print_time ("sched", sched_time);
2693           print_time ("local-alloc", local_alloc_time);
2694           print_time ("global-alloc", global_alloc_time);
2695           print_time ("sched2", sched2_time);
2696           print_time ("dbranch", dbr_sched_time);
2697           print_time ("shorten-branch", shorten_branch_time);
2698           print_time ("stack-reg", stack_reg_time);
2699           print_time ("final", final_time);
2700           print_time ("varconst", varconst_time);
2701           print_time ("symout", symout_time);
2702           print_time ("dump", dump_time);
2703         }
2704     }
2705 }
2706 \f
2707 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
2708    and TYPE_DECL nodes.
2709
2710    This does nothing for local (non-static) variables.
2711    Otherwise, it sets up the RTL and outputs any assembler code
2712    (label definition, storage allocation and initialization).
2713
2714    DECL is the declaration.  If ASMSPEC is nonzero, it specifies
2715    the assembler symbol name to be used.  TOP_LEVEL is nonzero
2716    if this declaration is not within a function.  */
2717
2718 void
2719 rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2720      tree decl;
2721      char *asmspec;
2722      int top_level;
2723      int at_end;
2724 {
2725   /* Declarations of variables, and of functions defined elsewhere.  */
2726
2727 /* The most obvious approach, to put an #ifndef around where
2728    this macro is used, doesn't work since it's inside a macro call.  */
2729 #ifndef ASM_FINISH_DECLARE_OBJECT
2730 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP, END)
2731 #endif
2732
2733   /* Forward declarations for nested functions are not "external",
2734      but we need to treat them as if they were.  */
2735   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
2736       || TREE_CODE (decl) == FUNCTION_DECL)
2737     TIMEVAR (varconst_time,
2738              {
2739                make_decl_rtl (decl, asmspec, top_level);
2740                /* Initialized extern variable exists to be replaced
2741                   with its value, or represents something that will be
2742                   output in another file.  */
2743                if (! (TREE_CODE (decl) == VAR_DECL
2744                       && DECL_EXTERNAL (decl) && TREE_READONLY (decl)
2745                       && DECL_INITIAL (decl) != 0
2746                       && DECL_INITIAL (decl) != error_mark_node))
2747                  /* Don't output anything
2748                     when a tentative file-scope definition is seen.
2749                     But at end of compilation, do output code for them.  */
2750                  if (! (! at_end && top_level
2751                         && (DECL_INITIAL (decl) == 0
2752                             || DECL_INITIAL (decl) == error_mark_node)))
2753                    assemble_variable (decl, top_level, at_end, 0);
2754                if (decl == last_assemble_variable_decl)
2755                  {
2756                    ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2757                                               top_level, at_end);
2758                  }
2759              });
2760   else if (DECL_REGISTER (decl) && asmspec != 0)
2761     {
2762       if (decode_reg_name (asmspec) >= 0)
2763         {
2764           DECL_RTL (decl) = 0;
2765           make_decl_rtl (decl, asmspec, top_level);
2766         }
2767       else
2768         error ("invalid register name `%s' for register variable", asmspec);
2769     }
2770 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2771   else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2772            && TREE_CODE (decl) == TYPE_DECL)
2773     TIMEVAR (symout_time, dbxout_symbol (decl, 0));
2774 #endif
2775 #ifdef SDB_DEBUGGING_INFO
2776   else if (write_symbols == SDB_DEBUG && top_level
2777            && TREE_CODE (decl) == TYPE_DECL)
2778     TIMEVAR (symout_time, sdbout_symbol (decl, 0));
2779 #endif
2780 }
2781
2782 /* Called after finishing a record, union or enumeral type.  */
2783
2784 void
2785 rest_of_type_compilation (type, toplev)
2786      tree type;
2787      int toplev;
2788 {
2789 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2790   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2791     TIMEVAR (symout_time, dbxout_symbol (TYPE_STUB_DECL (type), !toplev));
2792 #endif
2793 #ifdef SDB_DEBUGGING_INFO
2794   if (write_symbols == SDB_DEBUG)
2795     TIMEVAR (symout_time, sdbout_symbol (TYPE_STUB_DECL (type), !toplev));
2796 #endif
2797 }
2798
2799 /* This is called from finish_function (within yyparse)
2800    after each top-level definition is parsed.
2801    It is supposed to compile that function or variable
2802    and output the assembler code for it.
2803    After we return, the tree storage is freed.  */
2804
2805 void
2806 rest_of_compilation (decl)
2807      tree decl;
2808 {
2809   register rtx insns;
2810   int start_time = get_run_time ();
2811   int tem;
2812   /* Nonzero if we have saved the original DECL_INITIAL of the function,
2813      to be restored after we finish compiling the function
2814      (for use when compiling inline calls to this function).  */
2815   tree saved_block_tree = 0;
2816   /* Likewise, for DECL_ARGUMENTS.  */
2817   tree saved_arguments = 0;
2818   int failure = 0;
2819
2820   if (output_bytecode)
2821     return;
2822
2823   /* If we are reconsidering an inline function
2824      at the end of compilation, skip the stuff for making it inline.  */
2825
2826   if (DECL_SAVED_INSNS (decl) == 0)
2827     {
2828       int specd = DECL_INLINE (decl);
2829       char *lose;
2830
2831       /* If requested, consider whether to make this function inline.  */
2832       if (specd || flag_inline_functions)
2833         TIMEVAR (integration_time,
2834                  {
2835                    lose = function_cannot_inline_p (decl);
2836                    /* If not optimzing, then make sure the DECL_INLINE
2837                       bit is off.  */
2838                    if (lose || ! optimize)
2839                      {
2840                        if (warn_inline && specd)
2841                          warning_with_decl (decl, lose);
2842                        DECL_INLINE (decl) = 0;
2843                        DECL_ABSTRACT_ORIGIN (decl) = 0;
2844                        /* Don't really compile an extern inline function.
2845                           If we can't make it inline, pretend
2846                           it was only declared.  */
2847                        if (DECL_EXTERNAL (decl))
2848                          {
2849                            DECL_INITIAL (decl) = 0;
2850                            goto exit_rest_of_compilation;
2851                          }
2852                      }
2853                    else
2854                      DECL_INLINE (decl) = 1;
2855                  });
2856
2857       insns = get_insns ();
2858
2859       /* Dump the rtl code if we are dumping rtl.  */
2860
2861       if (rtl_dump)
2862         TIMEVAR (dump_time,
2863                  {
2864                    fprintf (rtl_dump_file, "\n;; Function %s\n\n",
2865                             IDENTIFIER_POINTER (DECL_NAME (decl)));
2866                    if (DECL_SAVED_INSNS (decl))
2867                      fprintf (rtl_dump_file, ";; (integrable)\n\n");
2868                    print_rtl (rtl_dump_file, insns);
2869                    fflush (rtl_dump_file);
2870                  });
2871
2872       /* If function is inline, and we don't yet know whether to
2873          compile it by itself, defer decision till end of compilation.
2874          finish_compilation will call rest_of_compilation again
2875          for those functions that need to be output.  Also defer those
2876          functions that we are supposed to defer.  */
2877
2878       if (DECL_DEFER_OUTPUT (decl)
2879           || ((specd || DECL_INLINE (decl))
2880               && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
2881                    && ! flag_keep_inline_functions)
2882                   || DECL_EXTERNAL (decl))))
2883         {
2884           DECL_DEFER_OUTPUT (decl) = 1;
2885
2886           /* If -Wreturn-type, we have to do a bit of compilation.  */
2887           if (! warn_return_type)
2888             {
2889 #ifdef DWARF_DEBUGGING_INFO
2890               /* Generate the DWARF info for the "abstract" instance
2891                  of a function which we may later generate inlined and/or
2892                  out-of-line instances of.  */
2893               if (write_symbols == DWARF_DEBUG)
2894                 {
2895                   set_decl_abstract_flags (decl, 1);
2896                   TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
2897                   set_decl_abstract_flags (decl, 0);
2898                 }
2899 #endif
2900               TIMEVAR (integration_time, save_for_inline_nocopy (decl));
2901               goto exit_rest_of_compilation;
2902             }
2903         }
2904
2905       /* If we have to compile the function now, save its rtl and subdecls
2906          so that its compilation will not affect what others get.  */
2907       if (DECL_INLINE (decl) || DECL_DEFER_OUTPUT (decl))
2908         {
2909 #ifdef DWARF_DEBUGGING_INFO
2910           /* Generate the DWARF info for the "abstract" instance of
2911              a function which we will generate an out-of-line instance
2912              of almost immediately (and which we may also later generate
2913              various inlined instances of).  */
2914           if (write_symbols == DWARF_DEBUG)
2915             {
2916               set_decl_abstract_flags (decl, 1);
2917               TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
2918               set_decl_abstract_flags (decl, 0);
2919             }
2920 #endif
2921           saved_block_tree = DECL_INITIAL (decl);
2922           saved_arguments = DECL_ARGUMENTS (decl);
2923           TIMEVAR (integration_time, save_for_inline_copying (decl));
2924         }
2925
2926       /* If specified extern inline but we aren't inlining it, we are
2927          done.  */
2928       if (specd && DECL_EXTERNAL (decl))
2929         goto exit_rest_of_compilation;
2930     }
2931
2932   if (! DECL_DEFER_OUTPUT (decl))
2933     TREE_ASM_WRITTEN (decl) = 1;
2934
2935   /* Now that integrate will no longer see our rtl, we need not distinguish
2936      between the return value of this function and the return value of called
2937      functions.  */
2938   rtx_equal_function_value_matters = 0;
2939
2940   /* Don't return yet if -Wreturn-type; we need to do jump_optimize.  */
2941   if ((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
2942     {
2943       goto exit_rest_of_compilation;
2944     }
2945
2946   /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
2947      Note that that may have been done above, in save_for_inline_copying.
2948      The call to resume_temporary_allocation near the end of this function
2949      goes back to the usual state of affairs.  */
2950
2951   rtl_in_current_obstack ();
2952
2953 #ifdef FINALIZE_PIC
2954   /* If we are doing position-independent code generation, now
2955      is the time to output special prologues and epilogues.
2956      We do not want to do this earlier, because it just clutters
2957      up inline functions with meaningless insns.  */
2958   if (flag_pic)
2959     FINALIZE_PIC;
2960 #endif
2961
2962   insns = get_insns ();
2963
2964   /* Copy any shared structure that should not be shared.  */
2965
2966   unshare_all_rtl (insns);
2967
2968   /* Instantiate all virtual registers.  */
2969
2970   instantiate_virtual_regs (current_function_decl, get_insns ());
2971
2972   /* See if we have allocated stack slots that are not directly addressable.
2973      If so, scan all the insns and create explicit address computation
2974      for all references to such slots.  */
2975 /*   fixup_stack_slots (); */
2976
2977   /* Do jump optimization the first time, if -opt.
2978      Also do it if -W, but in that case it doesn't change the rtl code,
2979      it only computes whether control can drop off the end of the function.  */
2980
2981   if (optimize > 0 || extra_warnings || warn_return_type
2982       /* If function is `noreturn', we should warn if it tries to return.  */
2983       || TREE_THIS_VOLATILE (decl))
2984     {
2985       TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
2986       TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 1));
2987     }
2988
2989   /* Now is when we stop if -fsyntax-only and -Wreturn-type.  */
2990   if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
2991     goto exit_rest_of_compilation;
2992
2993   /* Dump rtl code after jump, if we are doing that.  */
2994
2995   if (jump_opt_dump)
2996     TIMEVAR (dump_time,
2997              {
2998                fprintf (jump_opt_dump_file, "\n;; Function %s\n\n",
2999                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3000                print_rtl (jump_opt_dump_file, insns);
3001                fflush (jump_opt_dump_file);
3002              });
3003
3004   /* Perform common subexpression elimination.
3005      Nonzero value from `cse_main' means that jumps were simplified
3006      and some code may now be unreachable, so do
3007      jump optimization again.  */
3008
3009   if (cse_dump)
3010     TIMEVAR (dump_time,
3011              {
3012                fprintf (cse_dump_file, "\n;; Function %s\n\n",
3013                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3014              });
3015
3016   if (optimize > 0)
3017     {
3018       TIMEVAR (cse_time, reg_scan (insns, max_reg_num (), 1));
3019
3020       if (flag_thread_jumps)
3021         /* Hacks by tiemann & kenner.  */
3022         TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 1));
3023
3024       TIMEVAR (cse_time, tem = cse_main (insns, max_reg_num (),
3025                                          0, cse_dump_file));
3026       TIMEVAR (cse_time, delete_dead_from_cse (insns, max_reg_num ()));
3027
3028       if (tem || optimize > 1)
3029         TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
3030     }
3031
3032   /* Dump rtl code after cse, if we are doing that.  */
3033
3034   if (cse_dump)
3035     TIMEVAR (dump_time,
3036              {
3037                print_rtl (cse_dump_file, insns);
3038                fflush (cse_dump_file);
3039              });
3040
3041   if (loop_dump)
3042     TIMEVAR (dump_time,
3043              {
3044                fprintf (loop_dump_file, "\n;; Function %s\n\n",
3045                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3046              });
3047
3048   /* Move constant computations out of loops.  */
3049
3050   if (optimize > 0)
3051     {
3052       TIMEVAR (loop_time,
3053                {
3054                  loop_optimize (insns, loop_dump_file);
3055                });
3056     }
3057
3058   /* Dump rtl code after loop opt, if we are doing that.  */
3059
3060   if (loop_dump)
3061     TIMEVAR (dump_time,
3062              {
3063                print_rtl (loop_dump_file, insns);
3064                fflush (loop_dump_file);
3065              });
3066
3067   if (cse2_dump)
3068     TIMEVAR (dump_time,
3069              {
3070                fprintf (cse2_dump_file, "\n;; Function %s\n\n",
3071                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3072              });
3073
3074   if (optimize > 0 && flag_rerun_cse_after_loop)
3075     {
3076       /* Running another jump optimization pass before the second
3077          cse pass sometimes simplifies the RTL enough to allow
3078          the second CSE pass to do a better job.  Jump_optimize can change
3079          max_reg_num so we must rerun reg_scan afterwards.
3080          ??? Rework to not call reg_scan so often.  */
3081       TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
3082       TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 1));
3083
3084       TIMEVAR (cse2_time, reg_scan (insns, max_reg_num (), 0));
3085       TIMEVAR (cse2_time, tem = cse_main (insns, max_reg_num (),
3086                                           1, cse2_dump_file));
3087       if (tem)
3088         TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
3089     }
3090
3091   if (optimize > 0 && flag_thread_jumps)
3092     /* This pass of jump threading straightens out code
3093        that was kinked by loop optimization.  */
3094     TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 0));
3095
3096   /* Dump rtl code after cse, if we are doing that.  */
3097
3098   if (cse2_dump)
3099     TIMEVAR (dump_time,
3100              {
3101                print_rtl (cse2_dump_file, insns);
3102                fflush (cse2_dump_file);
3103              });
3104
3105   /* We are no longer anticipating cse in this function, at least.  */
3106
3107   cse_not_expected = 1;
3108
3109   /* Now we choose between stupid (pcc-like) register allocation
3110      (if we got the -noreg switch and not -opt)
3111      and smart register allocation.  */
3112
3113   if (optimize > 0)                     /* Stupid allocation probably won't work */
3114     obey_regdecls = 0;          /* if optimizations being done.  */
3115
3116   regclass_init ();
3117
3118   /* Print function header into flow dump now
3119      because doing the flow analysis makes some of the dump.  */
3120
3121   if (flow_dump)
3122     TIMEVAR (dump_time,
3123              {
3124                fprintf (flow_dump_file, "\n;; Function %s\n\n",
3125                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3126              });
3127
3128   if (obey_regdecls)
3129     {
3130       TIMEVAR (flow_time,
3131                {
3132                  regclass (insns, max_reg_num ());
3133                  stupid_life_analysis (insns, max_reg_num (),
3134                                        flow_dump_file);
3135                });
3136     }
3137   else
3138     {
3139       /* Do control and data flow analysis,
3140          and write some of the results to dump file.  */
3141
3142       TIMEVAR (flow_time, flow_analysis (insns, max_reg_num (),
3143                                          flow_dump_file));
3144       if (warn_uninitialized)
3145         {
3146           uninitialized_vars_warning (DECL_INITIAL (decl));
3147           setjmp_args_warning ();
3148         }
3149     }
3150
3151   /* Dump rtl after flow analysis.  */
3152
3153   if (flow_dump)
3154     TIMEVAR (dump_time,
3155              {
3156                print_rtl (flow_dump_file, insns);
3157                fflush (flow_dump_file);
3158              });
3159
3160   /* If -opt, try combining insns through substitution.  */
3161
3162   if (optimize > 0)
3163     TIMEVAR (combine_time, combine_instructions (insns, max_reg_num ()));
3164
3165   /* Dump rtl code after insn combination.  */
3166
3167   if (combine_dump)
3168     TIMEVAR (dump_time,
3169              {
3170                fprintf (combine_dump_file, "\n;; Function %s\n\n",
3171                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3172                dump_combine_stats (combine_dump_file);
3173                print_rtl (combine_dump_file, insns);
3174                fflush (combine_dump_file);
3175              });
3176
3177   /* Print function header into sched dump now
3178      because doing the sched analysis makes some of the dump.  */
3179
3180   if (sched_dump)
3181     TIMEVAR (dump_time,
3182              {
3183                fprintf (sched_dump_file, "\n;; Function %s\n\n",
3184                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3185              });
3186
3187   if (optimize > 0 && flag_schedule_insns)
3188     {
3189       /* Do control and data sched analysis,
3190          and write some of the results to dump file.  */
3191
3192       TIMEVAR (sched_time, schedule_insns (sched_dump_file));
3193     }
3194
3195   /* Dump rtl after instruction scheduling.  */
3196
3197   if (sched_dump)
3198     TIMEVAR (dump_time,
3199              {
3200                print_rtl (sched_dump_file, insns);
3201                fflush (sched_dump_file);
3202              });
3203
3204   /* Unless we did stupid register allocation,
3205      allocate pseudo-regs that are used only within 1 basic block.  */
3206
3207   if (!obey_regdecls)
3208     TIMEVAR (local_alloc_time,
3209              {
3210                regclass (insns, max_reg_num ());
3211                local_alloc ();
3212              });
3213
3214   /* Dump rtl code after allocating regs within basic blocks.  */
3215
3216   if (local_reg_dump)
3217     TIMEVAR (dump_time,
3218              {
3219                fprintf (local_reg_dump_file, "\n;; Function %s\n\n",
3220                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3221                dump_flow_info (local_reg_dump_file);
3222                dump_local_alloc (local_reg_dump_file);
3223                print_rtl (local_reg_dump_file, insns);
3224                fflush (local_reg_dump_file);
3225              });
3226
3227   if (global_reg_dump)
3228     TIMEVAR (dump_time,
3229              fprintf (global_reg_dump_file, "\n;; Function %s\n\n",
3230                       IDENTIFIER_POINTER (DECL_NAME (decl))));
3231
3232   /* Unless we did stupid register allocation,
3233      allocate remaining pseudo-regs, then do the reload pass
3234      fixing up any insns that are invalid.  */
3235
3236   TIMEVAR (global_alloc_time,
3237            {
3238              if (!obey_regdecls)
3239                failure = global_alloc (global_reg_dump_file);
3240              else
3241                failure = reload (insns, 0, global_reg_dump_file);
3242            });
3243
3244   if (global_reg_dump)
3245     TIMEVAR (dump_time,
3246              {
3247                dump_global_regs (global_reg_dump_file);
3248                print_rtl (global_reg_dump_file, insns);
3249                fflush (global_reg_dump_file);
3250              });
3251
3252   if (failure)
3253     goto exit_rest_of_compilation;
3254
3255   reload_completed = 1;
3256
3257   /* On some machines, the prologue and epilogue code, or parts thereof,
3258      can be represented as RTL.  Doing so lets us schedule insns between
3259      it and the rest of the code and also allows delayed branch
3260      scheduling to operate in the epilogue.  */
3261
3262   thread_prologue_and_epilogue_insns (insns);
3263
3264   if (optimize > 0 && flag_schedule_insns_after_reload)
3265     {
3266       if (sched2_dump)
3267         TIMEVAR (dump_time,
3268                  {
3269                    fprintf (sched2_dump_file, "\n;; Function %s\n\n",
3270                             IDENTIFIER_POINTER (DECL_NAME (decl)));
3271                  });
3272
3273       /* Do control and data sched analysis again,
3274          and write some more of the results to dump file.  */
3275
3276       TIMEVAR (sched2_time, schedule_insns (sched2_dump_file));
3277
3278       /* Dump rtl after post-reorder instruction scheduling.  */
3279
3280       if (sched2_dump)
3281         TIMEVAR (dump_time,
3282                  {
3283                    print_rtl (sched2_dump_file, insns);
3284                    fflush (sched2_dump_file);
3285                  });
3286     }
3287
3288 #ifdef LEAF_REGISTERS
3289   leaf_function = 0;
3290   if (optimize > 0 && only_leaf_regs_used () && leaf_function_p ())
3291     leaf_function = 1;
3292 #endif
3293
3294   /* One more attempt to remove jumps to .+1
3295      left by dead-store-elimination.
3296      Also do cross-jumping this time
3297      and delete no-op move insns.  */
3298
3299   if (optimize > 0)
3300     {
3301       TIMEVAR (jump_time, jump_optimize (insns, 1, 1, 0));
3302     }
3303
3304   /* Dump rtl code after jump, if we are doing that.  */
3305
3306   if (jump2_opt_dump)
3307     TIMEVAR (dump_time,
3308              {
3309                fprintf (jump2_opt_dump_file, "\n;; Function %s\n\n",
3310                         IDENTIFIER_POINTER (DECL_NAME (decl)));
3311                print_rtl (jump2_opt_dump_file, insns);
3312                fflush (jump2_opt_dump_file);
3313              });
3314
3315   /* If a machine dependent reorganization is needed, call it.  */
3316 #ifdef MACHINE_DEPENDENT_REORG
3317    MACHINE_DEPENDENT_REORG (insns);
3318 #endif
3319
3320   /* If a scheduling pass for delayed branches is to be done,
3321      call the scheduling code. */
3322
3323 #ifdef DELAY_SLOTS
3324   if (optimize > 0 && flag_delayed_branch)
3325     {
3326       TIMEVAR (dbr_sched_time, dbr_schedule (insns, dbr_sched_dump_file));
3327       if (dbr_sched_dump)
3328         {
3329           TIMEVAR (dump_time,
3330                  {
3331                    fprintf (dbr_sched_dump_file, "\n;; Function %s\n\n",
3332                             IDENTIFIER_POINTER (DECL_NAME (decl)));
3333                    print_rtl (dbr_sched_dump_file, insns);
3334                    fflush (dbr_sched_dump_file);
3335                  });
3336         }
3337     }
3338 #endif
3339
3340   if (optimize > 0)
3341     /* Shorten branches.  */
3342     TIMEVAR (shorten_branch_time,
3343              {
3344                shorten_branches (get_insns ());
3345              });
3346
3347 #ifdef STACK_REGS
3348   TIMEVAR (stack_reg_time, reg_to_stack (insns, stack_reg_dump_file));
3349   if (stack_reg_dump)
3350     {
3351       TIMEVAR (dump_time,
3352                {
3353                  fprintf (stack_reg_dump_file, "\n;; Function %s\n\n",
3354                           IDENTIFIER_POINTER (DECL_NAME (decl)));
3355                  print_rtl (stack_reg_dump_file, insns);
3356                  fflush (stack_reg_dump_file);
3357                });
3358     }
3359 #endif
3360
3361   /* Now turn the rtl into assembler code.  */
3362
3363   TIMEVAR (final_time,
3364            {
3365              rtx x;
3366              char *fnname;
3367
3368              /* Get the function's name, as described by its RTL.
3369                 This may be different from the DECL_NAME name used
3370                 in the source file.  */
3371
3372              x = DECL_RTL (decl);
3373              if (GET_CODE (x) != MEM)
3374                abort ();
3375              x = XEXP (x, 0);
3376              if (GET_CODE (x) != SYMBOL_REF)
3377                abort ();
3378              fnname = XSTR (x, 0);
3379
3380              assemble_start_function (decl, fnname);
3381              final_start_function (insns, asm_out_file, optimize);
3382              final (insns, asm_out_file, optimize, 0);
3383              final_end_function (insns, asm_out_file, optimize);
3384              assemble_end_function (decl, fnname);
3385              fflush (asm_out_file);
3386            });
3387
3388   /* Write DBX symbols if requested */
3389
3390   /* Note that for those inline functions where we don't initially
3391      know for certain that we will be generating an out-of-line copy,
3392      the first invocation of this routine (rest_of_compilation) will
3393      skip over this code by doing a `goto exit_rest_of_compilation;'.
3394      Later on, finish_compilation will call rest_of_compilation again
3395      for those inline functions that need to have out-of-line copies
3396      generated.  During that call, we *will* be routed past here.  */
3397
3398 #ifdef DBX_DEBUGGING_INFO
3399   if (write_symbols == DBX_DEBUG)
3400     TIMEVAR (symout_time, dbxout_function (decl));
3401 #endif
3402
3403 #ifdef DWARF_DEBUGGING_INFO
3404   if (write_symbols == DWARF_DEBUG)
3405     TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
3406 #endif
3407
3408  exit_rest_of_compilation:
3409
3410   /* In case the function was not output,
3411      don't leave any temporary anonymous types
3412      queued up for sdb output.  */
3413 #ifdef SDB_DEBUGGING_INFO
3414   if (write_symbols == SDB_DEBUG)
3415     sdbout_types (NULL_TREE);
3416 #endif
3417
3418   /* Put back the tree of subblocks and list of arguments
3419      from before we copied them.
3420      Code generation and the output of debugging info may have modified
3421      the copy, but the original is unchanged.  */
3422
3423   if (saved_block_tree != 0)
3424     DECL_INITIAL (decl) = saved_block_tree;
3425   if (saved_arguments != 0)
3426     DECL_ARGUMENTS (decl) = saved_arguments;
3427
3428   reload_completed = 0;
3429
3430   /* Clear out the real_constant_chain before some of the rtx's
3431      it runs through become garbage.  */
3432
3433   clear_const_double_mem ();
3434
3435   /* Cancel the effect of rtl_in_current_obstack.  */
3436
3437   resume_temporary_allocation ();
3438
3439   /* The parsing time is all the time spent in yyparse
3440      *except* what is spent in this function.  */
3441
3442   parse_time -= get_run_time () - start_time;
3443 }
3444 \f
3445 /* Entry point of cc1/c++.  Decode command args, then call compile_file.
3446    Exit code is 35 if can't open files, 34 if fatal error,
3447    33 if had nonfatal errors, else success.  */
3448
3449 int
3450 main (argc, argv, envp)
3451      int argc;
3452      char **argv;
3453      char **envp;
3454 {
3455   register int i;
3456   char *filename = 0;
3457   int flag_print_mem = 0;
3458   int version_flag = 0;
3459   char *p;
3460
3461   /* save in case md file wants to emit args as a comment.  */
3462   save_argc = argc;
3463   save_argv = argv;
3464
3465   p = argv[0] + strlen (argv[0]);
3466   while (p != argv[0] && p[-1] != '/'
3467 #ifdef DIR_SEPARATOR
3468          && p[-1] != DIR_SEPARATOR
3469 #endif
3470          )
3471     --p;
3472   progname = p;
3473
3474 #ifdef RLIMIT_STACK
3475   /* Get rid of any avoidable limit on stack size.  */
3476   {
3477     struct rlimit rlim;
3478
3479     /* Set the stack limit huge so that alloca does not fail. */
3480     getrlimit (RLIMIT_STACK, &rlim);
3481     rlim.rlim_cur = rlim.rlim_max;
3482     setrlimit (RLIMIT_STACK, &rlim);
3483   }
3484 #endif /* RLIMIT_STACK */
3485
3486   signal (SIGFPE, float_signal);
3487
3488 #ifdef SIGPIPE
3489   signal (SIGPIPE, pipe_closed);
3490 #endif
3491
3492   decl_printable_name = decl_name;
3493   lang_expand_expr = (struct rtx_def *(*)()) do_abort;
3494   interim_eh_hook = interim_eh;
3495
3496   /* Initialize whether `char' is signed.  */
3497   flag_signed_char = DEFAULT_SIGNED_CHAR;
3498 #ifdef DEFAULT_SHORT_ENUMS
3499   /* Initialize how much space enums occupy, by default.  */
3500   flag_short_enums = DEFAULT_SHORT_ENUMS;
3501 #endif
3502
3503   /* Scan to see what optimization level has been specified.  That will
3504      determine the default value of many flags.  */
3505   for (i = 1; i < argc; i++)
3506     {
3507       if (!strcmp (argv[i], "-O"))
3508         {
3509           optimize = 1;
3510         }
3511       else if (argv[i][0] == '-' && argv[i][1] == 'O')
3512         {
3513           /* Handle -O2, -O3, -O69, ...  */
3514           char *p = &argv[i][2];
3515           int c;
3516
3517           while (c = *p++)
3518             if (! (c >= '0' && c <= '9'))
3519               break;
3520           if (c == 0)
3521             optimize = atoi (&argv[i][2]);
3522         }
3523     }
3524
3525   obey_regdecls = (optimize == 0);
3526   if (optimize == 0)
3527     {
3528       flag_no_inline = 1;
3529       warn_inline = 0;
3530     }
3531
3532   if (optimize >= 1)
3533     {
3534       flag_defer_pop = 1;
3535       flag_thread_jumps = 1;
3536 #ifdef DELAY_SLOTS
3537       flag_delayed_branch = 1;
3538 #endif
3539 #ifdef CAN_DEBUG_WITHOUT_FP
3540       flag_omit_frame_pointer = 1;
3541 #endif
3542     }
3543
3544   if (optimize >= 2)
3545     {
3546       flag_cse_follow_jumps = 1;
3547       flag_cse_skip_blocks = 1;
3548       flag_expensive_optimizations = 1;
3549       flag_strength_reduce = 1;
3550       flag_rerun_cse_after_loop = 1;
3551       flag_caller_saves = 1;
3552 #ifdef INSN_SCHEDULING
3553       flag_schedule_insns = 1;
3554       flag_schedule_insns_after_reload = 1;
3555 #endif
3556     }
3557
3558   if (optimize >= 3)
3559     {
3560       flag_inline_functions = 1;
3561     }
3562
3563 #ifdef OPTIMIZATION_OPTIONS
3564   /* Allow default optimizations to be specified on a per-machine basis.  */
3565   OPTIMIZATION_OPTIONS (optimize);
3566 #endif
3567
3568   /* Initialize register usage now so switches may override.  */
3569   init_reg_sets ();
3570
3571   target_flags = 0;
3572   set_target_switch ("");
3573
3574   for (i = 1; i < argc; i++)
3575     {
3576       int j;
3577       /* If this is a language-specific option,
3578          decode it in a language-specific way.  */
3579       for (j = 0; lang_options[j] != 0; j++)
3580         if (!strncmp (argv[i], lang_options[j],
3581                       strlen (lang_options[j])))
3582           break;
3583       if (lang_options[j] != 0)
3584         /* If the option is valid for *some* language,
3585            treat it as valid even if this language doesn't understand it.  */
3586         lang_decode_option (argv[i]);
3587       else if (argv[i][0] == '-' && argv[i][1] != 0)
3588         {
3589           register char *str = argv[i] + 1;
3590           if (str[0] == 'Y')
3591             str++;
3592
3593           if (str[0] == 'm')
3594             set_target_switch (&str[1]);
3595           else if (!strcmp (str, "dumpbase"))
3596             {
3597               dump_base_name = argv[++i];
3598             }
3599           else if (str[0] == 'd')
3600             {
3601               register char *p = &str[1];
3602               while (*p)
3603                 switch (*p++)
3604                   {
3605                   case 'a':
3606                     combine_dump = 1;
3607                     dbr_sched_dump = 1;
3608                     flow_dump = 1;
3609                     global_reg_dump = 1;
3610                     jump_opt_dump = 1;
3611                     jump2_opt_dump = 1;
3612                     local_reg_dump = 1;
3613                     loop_dump = 1;
3614                     rtl_dump = 1;
3615                     cse_dump = 1, cse2_dump = 1;
3616                     sched_dump = 1;
3617                     sched2_dump = 1;
3618                     stack_reg_dump = 1;
3619                     break;
3620                   case 'k':
3621                     stack_reg_dump = 1;
3622                     break;
3623                   case 'c':
3624                     combine_dump = 1;
3625                     break;
3626                   case 'd':
3627                     dbr_sched_dump = 1;
3628                     break;
3629                   case 'f':
3630                     flow_dump = 1;
3631                     break;
3632                   case 'g':
3633                     global_reg_dump = 1;
3634                     break;
3635                   case 'j':
3636                     jump_opt_dump = 1;
3637                     break;
3638                   case 'J':
3639                     jump2_opt_dump = 1;
3640                     break;
3641                   case 'l':
3642                     local_reg_dump = 1;
3643                     break;
3644                   case 'L':
3645                     loop_dump = 1;
3646                     break;
3647                   case 'm':
3648                     flag_print_mem = 1;
3649                     break;
3650                   case 'p':
3651                     flag_print_asm_name = 1;
3652                     break;
3653                   case 'r':
3654                     rtl_dump = 1;
3655                     break;
3656                   case 's':
3657                     cse_dump = 1;
3658                     break;
3659                   case 't':
3660                     cse2_dump = 1;
3661                     break;
3662                   case 'S':
3663                     sched_dump = 1;
3664                     break;
3665                   case 'R':
3666                     sched2_dump = 1;
3667                     break;
3668                   case 'y':
3669                     set_yydebug (1);
3670                     break;
3671
3672                   case 'x':
3673                     rtl_dump_and_exit = 1;
3674                     break;
3675                   }
3676             }
3677           else if (str[0] == 'f')
3678             {
3679               register char *p = &str[1];
3680               int found = 0;
3681
3682               /* Some kind of -f option.
3683                  P's value is the option sans `-f'.
3684                  Search for it in the table of options.  */
3685
3686               for (j = 0;
3687                    !found && j < sizeof (f_options) / sizeof (f_options[0]);
3688                    j++)
3689                 {
3690                   if (!strcmp (p, f_options[j].string))
3691                     {
3692                       *f_options[j].variable = f_options[j].on_value;
3693                       /* A goto here would be cleaner,
3694                          but breaks the vax pcc.  */
3695                       found = 1;
3696                     }
3697                   if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
3698                       && ! strcmp (p+3, f_options[j].string))
3699                     {
3700                       *f_options[j].variable = ! f_options[j].on_value;
3701                       found = 1;
3702                     }
3703                 }
3704
3705               if (found)
3706                 ;
3707               else if (!strncmp (p, "fixed-", 6))
3708                 fix_register (&p[6], 1, 1);
3709               else if (!strncmp (p, "call-used-", 10))
3710                 fix_register (&p[10], 0, 1);
3711               else if (!strncmp (p, "call-saved-", 11))
3712                 fix_register (&p[11], 0, 0);
3713               else
3714                 error ("Invalid option `%s'", argv[i]);
3715             }
3716           else if (str[0] == 'O')
3717             {
3718               register char *p = str+1;
3719               while (*p && *p >= '0' && *p <= '9')
3720                 p++;
3721               if (*p == '\0')
3722                 ;
3723               else
3724                 error ("Invalid option `%s'", argv[i]);
3725             }
3726           else if (!strcmp (str, "pedantic"))
3727             pedantic = 1;
3728           else if (!strcmp (str, "pedantic-errors"))
3729             flag_pedantic_errors = pedantic = 1;
3730           else if (!strcmp (str, "quiet"))
3731             quiet_flag = 1;
3732           else if (!strcmp (str, "version"))
3733             version_flag = 1;
3734           else if (!strcmp (str, "w"))
3735             inhibit_warnings = 1;
3736           else if (!strcmp (str, "W"))
3737             {
3738               extra_warnings = 1;
3739               /* We save the value of warn_uninitialized, since if they put
3740                  -Wuninitialized on the command line, we need to generate a
3741                  warning about not using it without also specifying -O.  */
3742               if (warn_uninitialized != 1)
3743                 warn_uninitialized = 2;
3744             }
3745           else if (str[0] == 'W')
3746             {
3747               register char *p = &str[1];
3748               int found = 0;
3749
3750               /* Some kind of -W option.
3751                  P's value is the option sans `-W'.
3752                  Search for it in the table of options.  */
3753
3754               for (j = 0;
3755                    !found && j < sizeof (W_options) / sizeof (W_options[0]);
3756                    j++)
3757                 {
3758                   if (!strcmp (p, W_options[j].string))
3759                     {
3760                       *W_options[j].variable = W_options[j].on_value;
3761                       /* A goto here would be cleaner,
3762                          but breaks the vax pcc.  */
3763                       found = 1;
3764                     }
3765                   if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
3766                       && ! strcmp (p+3, W_options[j].string))
3767                     {
3768                       *W_options[j].variable = ! W_options[j].on_value;
3769                       found = 1;
3770                     }
3771                 }
3772
3773               if (found)
3774                 ;
3775               else if (!strncmp (p, "id-clash-", 9))
3776                 {
3777                   char *endp = p + 9;
3778
3779                   while (*endp)
3780                     {
3781                       if (*endp >= '0' && *endp <= '9')
3782                         endp++;
3783                       else
3784                         {
3785                           error ("Invalid option `%s'", argv[i]);
3786                           goto id_clash_lose;
3787                         }
3788                     }
3789                   warn_id_clash = 1;
3790                   id_clash_len = atoi (str + 10);
3791                 id_clash_lose: ;
3792                 }
3793               else if (!strncmp (p, "larger-than-", 12))
3794                 {
3795                   char *endp = p + 12;
3796
3797                   while (*endp)
3798                     {
3799                       if (*endp >= '0' && *endp <= '9')
3800                         endp++;
3801                       else
3802                         {
3803                           error ("Invalid option `%s'", argv[i]);
3804                           goto larger_than_lose;
3805                         }
3806                     }
3807                   warn_larger_than = 1;
3808                   larger_than_size = atoi (str + 13);
3809                 larger_than_lose: ;
3810                 }
3811               else
3812                 error ("Invalid option `%s'", argv[i]);
3813             }
3814           else if (!strcmp (str, "p"))
3815             {
3816               if (!output_bytecode)
3817                 profile_flag = 1;
3818               else
3819                 error ("profiling not supported in bytecode compilation");
3820             }
3821           else if (!strcmp (str, "a"))
3822             {
3823 #if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
3824               warning ("`-a' option (basic block profile) not supported");
3825 #else
3826               profile_block_flag = 1;
3827 #endif
3828             }
3829           else if (str[0] == 'g')
3830             {
3831               char *p = str + 1;
3832               char *q;
3833               unsigned len;
3834               unsigned level;
3835
3836               while (*p && (*p < '0' || *p > '9'))
3837                 p++;
3838               len = p - str;
3839               q = p;
3840               while (*q && (*q >= '0' && *q <= '9'))
3841                 q++;
3842               if (*p)
3843                 level = atoi (p);
3844               else
3845                 level = 2;      /* default debugging info level */
3846               if (*q || level > 3)
3847                 {
3848                   warning ("invalid debug level specification in option: `-%s'",
3849                            str);
3850                   warning ("no debugging information will be generated");
3851                   level = 0;
3852                 }
3853
3854               /* If more than one debugging type is supported,
3855                  you must define PREFERRED_DEBUGGING_TYPE
3856                  to choose a format in a system-dependent way.  */
3857               /* This is one long line cause VAXC can't handle a \-newline.  */
3858 #if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) + defined (DWARF_DEBUGGING_INFO) + defined (XCOFF_DEBUGGING_INFO))
3859 #ifdef PREFERRED_DEBUGGING_TYPE
3860               if (!strncmp (str, "ggdb", len))
3861                 write_symbols = PREFERRED_DEBUGGING_TYPE;
3862 #else /* no PREFERRED_DEBUGGING_TYPE */
3863 You Lose!  You must define PREFERRED_DEBUGGING_TYPE!
3864 #endif /* no PREFERRED_DEBUGGING_TYPE */
3865 #endif /* More than one debugger format enabled.  */
3866 #ifdef DBX_DEBUGGING_INFO
3867               if (write_symbols != NO_DEBUG)
3868                 ;
3869               else if (!strncmp (str, "ggdb", len))
3870                 write_symbols = DBX_DEBUG;
3871               else if (!strncmp (str, "gstabs", len))
3872                 write_symbols = DBX_DEBUG;
3873               else if (!strncmp (str, "gstabs+", len))
3874                 write_symbols = DBX_DEBUG;
3875
3876               /* Always enable extensions for -ggdb or -gstabs+, 
3877                  always disable for -gstabs.
3878                  For plain -g, use system-specific default.  */
3879               if (write_symbols == DBX_DEBUG && !strncmp (str, "ggdb", len)
3880                   && len >= 2)
3881                 use_gnu_debug_info_extensions = 1;
3882               else if (write_symbols == DBX_DEBUG && !strncmp (str, "gstabs+", len)
3883                        && len >= 7)
3884                 use_gnu_debug_info_extensions = 1;
3885               else if (write_symbols == DBX_DEBUG
3886                        && !strncmp (str, "gstabs", len) && len >= 2)
3887                 use_gnu_debug_info_extensions = 0;
3888               else
3889                 use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3890 #endif /* DBX_DEBUGGING_INFO */
3891 #ifdef DWARF_DEBUGGING_INFO
3892               if (write_symbols != NO_DEBUG)
3893                 ;
3894               else if (!strncmp (str, "g", len))
3895                 write_symbols = DWARF_DEBUG;
3896               else if (!strncmp (str, "ggdb", len))
3897                 write_symbols = DWARF_DEBUG;
3898               else if (!strncmp (str, "gdwarf", len))
3899                 write_symbols = DWARF_DEBUG;
3900
3901               /* Always enable extensions for -ggdb or -gdwarf+, 
3902                  always disable for -gdwarf.
3903                  For plain -g, use system-specific default.  */
3904               if (write_symbols == DWARF_DEBUG && !strncmp (str, "ggdb", len)
3905                   && len >= 2)
3906                 use_gnu_debug_info_extensions = 1;
3907               else if (write_symbols == DWARF_DEBUG && !strcmp (str, "gdwarf+"))
3908                 use_gnu_debug_info_extensions = 1;
3909               else if (write_symbols == DWARF_DEBUG
3910                        && !strncmp (str, "gdwarf", len) && len >= 2)
3911                 use_gnu_debug_info_extensions = 0;
3912               else
3913                 use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3914 #endif
3915 #ifdef SDB_DEBUGGING_INFO
3916               if (write_symbols != NO_DEBUG)
3917                 ;
3918               else if (!strncmp (str, "g", len))
3919                 write_symbols = SDB_DEBUG;
3920               else if (!strncmp (str, "gdb", len))
3921                 write_symbols = SDB_DEBUG;
3922               else if (!strncmp (str, "gcoff", len))
3923                 write_symbols = SDB_DEBUG;
3924 #endif /* SDB_DEBUGGING_INFO */
3925 #ifdef XCOFF_DEBUGGING_INFO
3926               if (write_symbols != NO_DEBUG)
3927                 ;
3928               else if (!strncmp (str, "g", len))
3929                 write_symbols = XCOFF_DEBUG;
3930               else if (!strncmp (str, "ggdb", len))
3931                 write_symbols = XCOFF_DEBUG;
3932               else if (!strncmp (str, "gxcoff", len))
3933                 write_symbols = XCOFF_DEBUG;
3934
3935               /* Always enable extensions for -ggdb or -gxcoff+,
3936                  always disable for -gxcoff.
3937                  For plain -g, use system-specific default.  */
3938               if (write_symbols == XCOFF_DEBUG && !strncmp (str, "ggdb", len)
3939                   && len >= 2)
3940                 use_gnu_debug_info_extensions = 1;
3941               else if (write_symbols == XCOFF_DEBUG && !strcmp (str, "gxcoff+"))
3942                 use_gnu_debug_info_extensions = 1;
3943               else if (write_symbols == XCOFF_DEBUG
3944                        && !strncmp (str, "gxcoff", len) && len >= 2)
3945                 use_gnu_debug_info_extensions = 0;
3946               else
3947                 use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3948 #endif        
3949               if (write_symbols == NO_DEBUG)
3950                 warning ("`-%s' option not supported on this version of GCC", str);
3951               else if (level == 0)
3952                 write_symbols = NO_DEBUG;
3953               else
3954                 debug_info_level = (enum debug_info_level) level;
3955             }
3956           else if (!strcmp (str, "o"))
3957             {
3958               asm_file_name = argv[++i];
3959             }
3960           else if (str[0] == 'G')
3961             {
3962               g_switch_set = TRUE;
3963               g_switch_value = atoi ((str[1] != '\0') ? str+1 : argv[++i]);
3964             }
3965           else if (!strncmp (str, "aux-info", 8))
3966             {
3967               flag_gen_aux_info = 1;
3968               aux_info_file_name = (str[8] != '\0' ? str+8 : argv[++i]);
3969             }
3970           else
3971             error ("Invalid option `%s'", argv[i]);
3972         }
3973       else if (argv[i][0] == '+')
3974         error ("Invalid option `%s'", argv[i]);
3975       else
3976         filename = argv[i];
3977     }
3978
3979   /* Initialize for bytecode output.  A good idea to do this as soon as
3980      possible after the "-f" options have been parsed. */
3981   if (output_bytecode)
3982     {
3983 #ifndef TARGET_SUPPORTS_BYTECODE
3984       /* Just die with a fatal error if not supported */
3985       fatal ("-fbytecode not supporter for this target");
3986 #else
3987       bc_initialize ();
3988 #endif
3989     }
3990
3991   if (optimize == 0)
3992     {
3993       /* Inlining does not work if not optimizing,
3994          so force it not to be done.  */
3995       flag_no_inline = 1;
3996       warn_inline = 0;
3997
3998       /* The c_decode_option and lang_decode_option functions set
3999          this to `2' if -Wall is used, so we can avoid giving out
4000          lots of errors for people who don't realize what -Wall does.  */
4001       if (warn_uninitialized == 1)
4002         warning ("-Wuninitialized is not supported without -O");
4003     }
4004
4005 #if defined(DWARF_DEBUGGING_INFO)
4006   if (write_symbols == DWARF_DEBUG
4007       && strcmp (language_string, "GNU C++") == 0)
4008     {
4009       warning ("-g option not supported for C++ on SVR4 systems");
4010       write_symbols = NO_DEBUG;
4011     }
4012 #endif /* defined(DWARF_DEBUGGING_INFO) */
4013
4014 #ifdef OVERRIDE_OPTIONS
4015   /* Some machines may reject certain combinations of options.  */
4016   OVERRIDE_OPTIONS;
4017 #endif
4018
4019   /* Unrolling all loops implies that standard loop unrolling must also
4020      be done.  */
4021   if (flag_unroll_all_loops)
4022     flag_unroll_loops = 1;
4023   /* Loop unrolling requires that strength_reduction be on also.  Silently
4024      turn on strength reduction here if it isn't already on.  Also, the loop
4025      unrolling code assumes that cse will be run after loop, so that must
4026      be turned on also.  */
4027   if (flag_unroll_loops)
4028     {
4029       flag_strength_reduce = 1;
4030       flag_rerun_cse_after_loop = 1;
4031     }
4032
4033   /* Warn about options that are not supported on this machine.  */
4034 #ifndef INSN_SCHEDULING
4035   if (flag_schedule_insns || flag_schedule_insns_after_reload)
4036     warning ("instruction scheduling not supported on this target machine");
4037 #endif
4038 #ifndef DELAY_SLOTS
4039   if (flag_delayed_branch)
4040     warning ("this target machine does not have delayed branches");
4041 #endif
4042
4043   /* If we are in verbose mode, write out the version and maybe all the
4044      option flags in use.  */
4045   if (version_flag)
4046     {
4047       fprintf (stderr, "%s version %s", language_string, version_string);
4048 #ifdef TARGET_VERSION
4049       TARGET_VERSION;
4050 #endif
4051 #ifdef __GNUC__
4052 #ifndef __VERSION__
4053 #define __VERSION__ "[unknown]"
4054 #endif
4055       fprintf (stderr, " compiled by GNU C version %s.\n", __VERSION__);
4056 #else
4057       fprintf (stderr, " compiled by CC.\n");
4058 #endif
4059       if (! quiet_flag)
4060         print_switch_values ();
4061     }
4062
4063   compile_file (filename);
4064
4065 #if !defined(OS2) && !defined(VMS) && !defined(WINNT)
4066   if (flag_print_mem)
4067     {
4068 #ifdef __alpha
4069       char *sbrk ();
4070 #endif
4071       char *lim = (char *) sbrk (0);
4072
4073       fprintf (stderr, "Data size %d.\n",
4074                lim - (char *) &environ);
4075       fflush (stderr);
4076
4077 #ifdef USG
4078       system ("ps -l 1>&2");
4079 #else /* not USG */
4080       system ("ps v");
4081 #endif /* not USG */
4082     }
4083 #endif /* not OS2 and not VMS and not WINNT */
4084
4085   if (errorcount)
4086     exit (FATAL_EXIT_CODE);
4087   if (sorrycount)
4088     exit (FATAL_EXIT_CODE);
4089   exit (SUCCESS_EXIT_CODE);
4090   return 34;
4091 }
4092 \f
4093 /* Decode -m switches.  */
4094
4095 /* Here is a table, controlled by the tm.h file, listing each -m switch
4096    and which bits in `target_switches' it should set or clear.
4097    If VALUE is positive, it is bits to set.
4098    If VALUE is negative, -VALUE is bits to clear.
4099    (The sign bit is not used so there is no confusion.)  */
4100
4101 struct {char *name; int value;} target_switches []
4102   = TARGET_SWITCHES;
4103
4104 /* This table is similar, but allows the switch to have a value.  */
4105
4106 #ifdef TARGET_OPTIONS
4107 struct {char *prefix; char ** variable;} target_options []
4108   = TARGET_OPTIONS;
4109 #endif
4110
4111 /* Decode the switch -mNAME.  */
4112
4113 void
4114 set_target_switch (name)
4115      char *name;
4116 {
4117   register int j;
4118   int valid = 0;
4119
4120   for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
4121     if (!strcmp (target_switches[j].name, name))
4122       {
4123         if (target_switches[j].value < 0)
4124           target_flags &= ~-target_switches[j].value;
4125         else
4126           target_flags |= target_switches[j].value;
4127         valid = 1;
4128       }
4129
4130 #ifdef TARGET_OPTIONS
4131   if (!valid)
4132     for (j = 0; j < sizeof target_options / sizeof target_options[0]; j++)
4133       {
4134         int len = strlen (target_options[j].prefix);
4135         if (!strncmp (target_options[j].prefix, name, len))
4136           {
4137             *target_options[j].variable = name + len;
4138             valid = 1;
4139           }
4140       }
4141 #endif
4142
4143   if (!valid)
4144     error ("Invalid option `%s'", name);
4145 }
4146 \f
4147 /* Variable used for communication between the following two routines.  */
4148
4149 static int line_position;
4150
4151 /* Print an option value and adjust the position in the line.  */
4152
4153 static void
4154 print_single_switch (type, name)
4155      char *type, *name;
4156 {
4157   fprintf (stderr, " %s%s", type, name);
4158
4159   line_position += strlen (type) + strlen (name) + 1;
4160
4161   if (line_position > 65)
4162     {
4163       fprintf (stderr, "\n\t");
4164       line_position = 8;
4165     }
4166 }
4167      
4168 /* Print default target switches for -version.  */
4169
4170 static void
4171 print_switch_values ()
4172 {
4173   register int j;
4174
4175   fprintf (stderr, "enabled:");
4176   line_position = 8;
4177
4178   for (j = 0; j < sizeof f_options / sizeof f_options[0]; j++)
4179     if (*f_options[j].variable == f_options[j].on_value)
4180       print_single_switch ("-f", f_options[j].string);
4181
4182   for (j = 0; j < sizeof W_options / sizeof W_options[0]; j++)
4183     if (*W_options[j].variable == W_options[j].on_value)
4184       print_single_switch ("-W", W_options[j].string);
4185
4186   for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
4187     if (target_switches[j].name[0] != '\0'
4188         && target_switches[j].value > 0
4189         && ((target_switches[j].value & target_flags)
4190             == target_switches[j].value))
4191       print_single_switch ("-m", target_switches[j].name);
4192
4193   fprintf (stderr, "\n");
4194 }