OSDN Git Service

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