OSDN Git Service

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