OSDN Git Service

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