OSDN Git Service

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