OSDN Git Service

* cse.c (delete_trivially_dead_insns): Replace alloca with
[pf3gnuchains/gcc-fork.git] / gcc / toplev.c
1 /* Top level of GNU C compiler
2    Copyright (C) 1987, 88, 89, 92-98, 1999 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 #undef FLOAT /* This is for hpux. They should change hpux.  */
28 #undef FFS  /* Some systems define this in param.h.  */
29 #include "system.h"
30 #include <signal.h>
31 #include <setjmp.h>
32
33 #ifdef HAVE_SYS_RESOURCE_H
34 # include <sys/resource.h>
35 #endif
36
37 #ifdef HAVE_SYS_TIMES_H
38 # include <sys/times.h>
39 #endif
40
41 #include "input.h"
42 #include "tree.h"
43 #include "rtl.h"
44 #include "tm_p.h"
45 #include "flags.h"
46 #include "insn-attr.h"
47 #include "insn-codes.h"
48 #include "insn-config.h"
49 #include "recog.h"
50 #include "defaults.h"
51 #include "output.h"
52 #include "except.h"
53 #include "function.h"
54 #include "toplev.h"
55 #include "expr.h"
56 #include "basic-block.h"
57 #include "intl.h"
58 #include "ggc.h"
59 #include "graph.h"
60
61 #ifdef DWARF_DEBUGGING_INFO
62 #include "dwarfout.h"
63 #endif
64
65 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
66 #include "dwarf2out.h"
67 #endif
68
69 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
70 #include "dbxout.h"
71 #endif
72
73 #ifdef SDB_DEBUGGING_INFO
74 #include "sdbout.h"
75 #endif
76
77 #ifdef XCOFF_DEBUGGING_INFO
78 #include "xcoffout.h"
79 #endif
80 \f
81 #ifdef VMS
82 /* The extra parameters substantially improve the I/O performance.  */
83 static FILE *
84 vms_fopen (fname, type)
85      char * fname;
86      char * type;
87 {
88   /* The <stdio.h> in the gcc-vms-1.42 distribution prototypes fopen with two
89      fixed arguments, which matches ANSI's specification but not VAXCRTL's
90      pre-ANSI implementation.  This hack circumvents the mismatch problem.  */
91   FILE *(*vmslib_fopen)() = (FILE *(*)()) fopen;
92
93   if (*type == 'w')
94     return (*vmslib_fopen) (fname, type, "mbc=32",
95                             "deq=64", "fop=tef", "shr=nil");
96   else
97     return (*vmslib_fopen) (fname, type, "mbc=32");
98 }
99 #define fopen vms_fopen
100 #endif  /* VMS */
101
102 #ifndef DEFAULT_GDB_EXTENSIONS
103 #define DEFAULT_GDB_EXTENSIONS 1
104 #endif
105
106 /* If more than one debugging type is supported, you must define
107    PREFERRED_DEBUGGING_TYPE to choose a format in a system-dependent way. 
108
109    This is one long line cause VAXC can't handle a \-newline.  */
110 #if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) + defined (DWARF_DEBUGGING_INFO) + defined (DWARF2_DEBUGGING_INFO) + defined (XCOFF_DEBUGGING_INFO))
111 #ifndef PREFERRED_DEBUGGING_TYPE
112 You Lose!  You must define PREFERRED_DEBUGGING_TYPE!
113 #endif /* no PREFERRED_DEBUGGING_TYPE */
114 #else /* Only one debugging format supported.  Define PREFERRED_DEBUGGING_TYPE
115          so the following code needn't care.  */
116 #ifdef DBX_DEBUGGING_INFO
117 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
118 #endif
119 #ifdef SDB_DEBUGGING_INFO
120 #define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
121 #endif
122 #ifdef DWARF_DEBUGGING_INFO
123 #define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
124 #endif
125 #ifdef DWARF2_DEBUGGING_INFO
126 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
127 #endif
128 #ifdef XCOFF_DEBUGGING_INFO
129 #define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG
130 #endif
131 #endif /* More than one debugger format enabled.  */
132
133 /* If still not defined, must have been because no debugging formats
134    are supported.  */
135 #ifndef PREFERRED_DEBUGGING_TYPE
136 #define PREFERRED_DEBUGGING_TYPE NO_DEBUG
137 #endif
138
139 #ifndef DIR_SEPARATOR
140 #define DIR_SEPARATOR '/'
141 #endif
142
143 #if ! (defined (VMS) || defined (OS2))
144 extern char **environ;
145 #endif
146 extern char *version_string;
147
148 /* Carry information from ASM_DECLARE_OBJECT_NAME
149    to ASM_FINISH_DECLARE_OBJECT.  */
150
151 extern int size_directive_output;
152 extern tree last_assemble_variable_decl;
153
154 static void notice PVPROTO((const char *s, ...)) ATTRIBUTE_PRINTF_1;
155 static void set_target_switch PROTO((const char *));
156 static const char *decl_name PROTO((tree, int));
157 static void vmessage PROTO((const char *, const char *, va_list));
158 static void v_message_with_file_and_line PROTO((const char *, int, int,
159                                                 const char *, va_list));
160 static void v_message_with_decl PROTO((tree, int, const char *, va_list));
161 static void file_and_line_for_asm PROTO((rtx, char **, int *));
162 static void v_error_with_file_and_line PROTO((const char *, int,
163                                               const char *, va_list));
164 static void v_error_with_decl PROTO((tree, const char *, va_list));
165 static void v_error_for_asm PROTO((rtx, const char *, va_list));
166 static void verror PROTO((const char *, va_list));
167 static void vfatal PROTO((const char *, va_list)) ATTRIBUTE_NORETURN;
168 static void v_warning_with_file_and_line PROTO ((const char *, int,
169                                                  const char *, va_list));
170 static void v_warning_with_decl PROTO((tree, const char *, va_list));
171 static void v_warning_for_asm PROTO((rtx, const char *, va_list));
172 static void vwarning PROTO((const char *, va_list));
173 static void vpedwarn PROTO((const char *, va_list));
174 static void v_pedwarn_with_decl PROTO((tree, const char *, va_list));
175 static void v_pedwarn_with_file_and_line PROTO((const char *, int,
176                                                 const char *, va_list));
177 static void vsorry PROTO((const char *, va_list));
178 extern void set_fatal_function PROTO((void (*)(const char *, va_list)));
179 static void float_signal PROTO((int)) ATTRIBUTE_NORETURN;
180 static void pipe_closed PROTO((int)) ATTRIBUTE_NORETURN;
181 #ifdef ASM_IDENTIFY_LANGUAGE
182 /* This might or might not be used in ASM_IDENTIFY_LANGUAGE. */
183 static void output_lang_identify PROTO((FILE *)) ATTRIBUTE_UNUSED;
184 #endif
185 static void open_dump_file PROTO((const char *, const char *));
186 static void close_dump_file PROTO((void (*) (FILE *, rtx), rtx));
187 static void dump_rtl PROTO((const char *, tree, void (*) (FILE *, rtx), rtx));
188 static void clean_dump_file PROTO((const char *));
189 static void compile_file PROTO((char *));
190 static void display_help PROTO ((void));
191 static void report_file_and_line PROTO ((const char *, int, int));
192 static void vnotice PROTO ((FILE *, const char *, va_list));
193 static void mark_file_stack PROTO ((void *));
194
195 static void decode_d_option PROTO ((const char *));
196 static int  decode_f_option PROTO ((const char *));
197 static int  decode_W_option PROTO ((const char *));
198 static int  decode_g_option PROTO ((const char *));
199 static unsigned independent_decode_option PROTO ((int, char **, unsigned));
200
201 static void print_version PROTO((FILE *, const char *));
202 static int print_single_switch PROTO((FILE *, int, int, const char *,
203                                       const char *, const char *,
204                                       const char *, const char *));
205 static void print_switch_values PROTO((FILE *, int, int, const char *,
206                                        const char *, const char *));
207
208 /* Length of line when printing switch values.  */
209 #define MAX_LINE 75
210
211 /* Name of program invoked, sans directories.  */
212
213 const char *progname;
214
215 /* Copy of arguments to main.  */
216 int save_argc;
217 char **save_argv;
218 \f
219 /* Name of current original source file (what was input to cpp).
220    This comes from each #-command in the actual input.  */
221
222 char *input_filename;
223
224 /* Name of top-level original source file (what was input to cpp).
225    This comes from the #-command at the beginning of the actual input.
226    If there isn't any there, then this is the cc1 input file name.  */
227
228 char *main_input_filename;
229
230 /* Current line number in real source file.  */
231
232 int lineno;
233
234 /* Nonzero if it is unsafe to create any new pseudo registers.  */
235 int no_new_pseudos;
236
237 /* Stack of currently pending input files.  */
238
239 struct file_stack *input_file_stack;
240
241 /* Incremented on each change to input_file_stack.  */
242 int input_file_stack_tick;
243
244 /* Name to use as base of names for dump output files.  */
245
246 const char *dump_base_name;
247
248 /* Bit flags that specify the machine subtype we are compiling for.
249    Bits are tested using macros TARGET_... defined in the tm.h file
250    and set by `-m...' switches.  Must be defined in rtlanal.c.  */
251
252 extern int target_flags;
253
254 /* Flags saying which kinds of debugging dump have been requested.  */
255
256 int rtl_dump = 0;
257 int rtl_dump_and_exit = 0;
258 int jump_opt_dump = 0;
259 int addressof_dump = 0;
260 int cse_dump = 0;
261 int gcse_dump = 0;
262 int loop_dump = 0;
263 int cse2_dump = 0;
264 int branch_prob_dump = 0;
265 int flow_dump = 0;
266 int combine_dump = 0;
267 int regmove_dump = 0;
268 int sched_dump = 0;
269 int local_reg_dump = 0;
270 int global_reg_dump = 0;
271 int flow2_dump = 0;
272 int peephole2_dump = 0;
273 int sched2_dump = 0;
274 int jump2_opt_dump = 0;
275 #ifdef DELAY_SLOTS
276 int dbr_sched_dump = 0;
277 #endif
278 int flag_print_asm_name = 0;
279 #ifdef STACK_REGS
280 int stack_reg_dump = 0;
281 #endif
282 #ifdef MACHINE_DEPENDENT_REORG
283 int mach_dep_reorg_dump = 0;
284 #endif
285 static int flag_print_mem = 0;
286 static int version_flag = 0;
287 static char * filename = 0;
288 enum graph_dump_types graph_dump_format;
289
290 /* Name for output file of assembly code, specified with -o.  */
291
292 char *asm_file_name;
293
294 /* Value of the -G xx switch, and whether it was passed or not.  */
295 int g_switch_value;
296 int g_switch_set;
297
298 /* Type(s) of debugging information we are producing (if any).
299    See flags.h for the definitions of the different possible
300    types of debugging information.  */
301 enum debug_info_type write_symbols = NO_DEBUG;
302
303 /* Level of debugging information we are producing.  See flags.h
304    for the definitions of the different possible levels.  */
305 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
306
307 /* Nonzero means use GNU-only extensions in the generated symbolic
308    debugging information.  */
309 /* Currently, this only has an effect when write_symbols is set to
310    DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
311 int use_gnu_debug_info_extensions = 0;
312
313 /* Nonzero means do optimizations.  -O.
314    Particular numeric values stand for particular amounts of optimization;
315    thus, -O2 stores 2 here.  However, the optimizations beyond the basic
316    ones are not controlled directly by this variable.  Instead, they are
317    controlled by individual `flag_...' variables that are defaulted
318    based on this variable.  */
319
320 int optimize = 0;
321
322 /* Nonzero means optimize for size.  -Os.
323    The only valid values are zero and non-zero. When optimize_size is
324    non-zero, optimize defaults to 2, but certain individual code
325    bloating optimizations are disabled.  */
326
327 int optimize_size = 0;
328
329 /* Number of error messages and warning messages so far.  */
330
331 int errorcount = 0;
332 int warningcount = 0;
333 int sorrycount = 0;
334
335 /* Pointer to function to compute the name to use to print a declaration.
336    DECL is the declaration in question.
337    VERBOSITY determines what information will be printed:
338      0: DECL_NAME, demangled as necessary.
339      1: and scope information.
340      2: and any other information that might be interesting, such as function
341         parameter types in C++.  */
342
343 const char *(*decl_printable_name)      PROTO ((tree, int));
344
345 /* Pointer to function to compute rtl for a language-specific tree code.  */
346
347 typedef rtx (*lang_expand_expr_t)
348   PROTO ((union tree_node *, rtx, enum machine_mode,
349           enum expand_modifier modifier));
350
351 lang_expand_expr_t lang_expand_expr = 0;
352
353 tree (*lang_expand_constant) PROTO((tree)) = 0;
354
355 /* Pointer to function to finish handling an incomplete decl at the
356    end of compilation.  */
357
358 void (*incomplete_decl_finalize_hook) PROTO((tree)) = 0;
359
360 /* Nonzero if generating code to do profiling.  */
361
362 int profile_flag = 0;
363
364 /* Nonzero if generating code to do profiling on a line-by-line basis.  */
365
366 int profile_block_flag;
367
368 /* Nonzero if generating code to profile program flow graph arcs.  */
369
370 int profile_arc_flag = 0;
371
372 /* Nonzero if generating info for gcov to calculate line test coverage.  */
373
374 int flag_test_coverage = 0;
375
376 /* Nonzero indicates that branch taken probabilities should be calculated.  */
377
378 int flag_branch_probabilities = 0;
379
380 /* Nonzero for -pedantic switch: warn about anything
381    that standard spec forbids.  */
382
383 int pedantic = 0;
384
385 /* Temporarily suppress certain warnings.
386    This is set while reading code from a system header file.  */
387
388 int in_system_header = 0;
389
390 /* Nonzero means do stupid register allocation.
391    Currently, this is 1 if `optimize' is 0.  */
392
393 int obey_regdecls = 0;
394
395 /* Don't print functions as they are compiled and don't print
396    times taken by the various passes.  -quiet.  */
397
398 int quiet_flag = 0;
399 \f
400 /* -f flags.  */
401
402 /* Nonzero means `char' should be signed.  */
403
404 int flag_signed_char;
405
406 /* Nonzero means give an enum type only as many bytes as it needs.  */
407
408 int flag_short_enums;
409
410 /* Nonzero for -fcaller-saves: allocate values in regs that need to
411    be saved across function calls, if that produces overall better code.
412    Optional now, so people can test it.  */
413
414 #ifdef DEFAULT_CALLER_SAVES
415 int flag_caller_saves = 1;
416 #else
417 int flag_caller_saves = 0;
418 #endif
419
420 /* Nonzero if structures and unions should be returned in memory.
421
422    This should only be defined if compatibility with another compiler or
423    with an ABI is needed, because it results in slower code.  */
424
425 #ifndef DEFAULT_PCC_STRUCT_RETURN
426 #define DEFAULT_PCC_STRUCT_RETURN 1
427 #endif
428
429 /* Nonzero for -fpcc-struct-return: return values the same way PCC does.  */
430
431 int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
432
433 /* Nonzero for -fforce-mem: load memory value into a register
434    before arithmetic on it.  This makes better cse but slower compilation.  */
435
436 int flag_force_mem = 0;
437
438 /* Nonzero for -fforce-addr: load memory address into a register before
439    reference to memory.  This makes better cse but slower compilation.  */
440
441 int flag_force_addr = 0;
442
443 /* Nonzero for -fdefer-pop: don't pop args after each function call;
444    instead save them up to pop many calls' args with one insns.  */
445
446 int flag_defer_pop = 0;
447
448 /* Nonzero for -ffloat-store: don't allocate floats and doubles
449    in extended-precision registers.  */
450
451 int flag_float_store = 0;
452
453 /* Nonzero for -fcse-follow-jumps:
454    have cse follow jumps to do a more extensive job.  */
455
456 int flag_cse_follow_jumps;
457
458 /* Nonzero for -fcse-skip-blocks:
459    have cse follow a branch around a block.  */
460 int flag_cse_skip_blocks;
461
462 /* Nonzero for -fexpensive-optimizations:
463    perform miscellaneous relatively-expensive optimizations.  */
464 int flag_expensive_optimizations;
465
466 /* Nonzero for -fthread-jumps:
467    have jump optimize output of loop.  */
468
469 int flag_thread_jumps;
470
471 /* Nonzero enables strength-reduction in loop.c.  */
472
473 int flag_strength_reduce = 0;
474
475 /* Nonzero enables loop unrolling in unroll.c.  Only loops for which the
476    number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
477    UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
478    unrolled.  */
479
480 int flag_unroll_loops;
481
482 /* Nonzero enables loop unrolling in unroll.c.  All loops are unrolled.
483    This is generally not a win.  */
484
485 int flag_unroll_all_loops;
486
487 /* Nonzero forces all invariant computations in loops to be moved
488    outside the loop. */
489
490 int flag_move_all_movables = 0;
491
492 /* Nonzero forces all general induction variables in loops to be
493    strength reduced. */
494
495 int flag_reduce_all_givs = 0;
496
497 /* Nonzero to perform full register move optimization passes.  This is the
498    default for -O2.  */
499
500 int flag_regmove = 0;
501
502 /* Nonzero for -fwritable-strings:
503    store string constants in data segment and don't uniquize them.  */
504
505 int flag_writable_strings = 0;
506
507 /* Nonzero means don't put addresses of constant functions in registers.
508    Used for compiling the Unix kernel, where strange substitutions are
509    done on the assembly output.  */
510
511 int flag_no_function_cse = 0;
512
513 /* Nonzero for -fomit-frame-pointer:
514    don't make a frame pointer in simple functions that don't require one.  */
515
516 int flag_omit_frame_pointer = 0;
517
518 /* Nonzero means place each function into its own section on those platforms
519    which support arbitrary section names and unlimited numbers of sections.  */
520
521 int flag_function_sections = 0;
522
523 /* ... and similar for data.  */
524  
525 int flag_data_sections = 0;
526
527 /* Nonzero to inhibit use of define_optimization peephole opts.  */
528
529 int flag_no_peephole = 0;
530
531 /* Nonzero allows GCC to violate some IEEE or ANSI rules regarding math
532    operations in the interest of optimization.  For example it allows
533    GCC to assume arguments to sqrt are nonnegative numbers, allowing
534    faster code for sqrt to be generated.  */
535
536 int flag_fast_math = 0;
537
538 /* Nonzero means the front end generally wants `errno' maintained by math
539    operations, like built-in SQRT, unless overridden by flag_fast_math.  */
540
541 int flag_errno_math = 1;
542
543 /* 0 means straightforward implementation of complex divide acceptable.
544    1 means wide ranges of inputs must work for complex divide.
545    2 means C9X-like requirements for complex divide (not yet implemented).  */
546
547 int flag_complex_divide_method = 0;
548
549 /* Nonzero means all references through pointers are volatile.  */
550
551 int flag_volatile;
552
553 /* Nonzero means treat all global and extern variables as volatile.  */
554
555 int flag_volatile_global;
556
557 /* Nonzero means treat all static variables as volatile.  */
558
559 int flag_volatile_static;
560
561 /* Nonzero means just do syntax checking; don't output anything.  */
562
563 int flag_syntax_only = 0;
564
565 /* Nonzero means perform global cse.  */
566
567 static int flag_gcse;
568
569 /* Nonzero means to use global dataflow analysis to eliminate
570    useless null pointer tests.  */
571
572 static int flag_delete_null_pointer_checks;
573
574 /* Nonzero means to rerun cse after loop optimization.  This increases
575    compilation time about 20% and picks up a few more common expressions.  */
576
577 static int flag_rerun_cse_after_loop;
578
579 /* Nonzero means to run loop optimizations twice.  */
580
581 int flag_rerun_loop_opt;
582
583 /* Nonzero for -finline-functions: ok to inline functions that look like
584    good inline candidates.  */
585
586 int flag_inline_functions;
587
588 /* Nonzero for -fkeep-inline-functions: even if we make a function
589    go inline everywhere, keep its definition around for debugging
590    purposes.  */
591
592 int flag_keep_inline_functions;
593
594 /* Nonzero means that functions will not be inlined.  */
595
596 int flag_no_inline;
597
598 /* Nonzero means that we should emit static const variables
599    regardless of whether or not optimization is turned on.  */
600
601 int flag_keep_static_consts = 1;
602
603 /* Nonzero means we should be saving declaration info into a .X file.  */
604
605 int flag_gen_aux_info = 0;
606
607 /* Specified name of aux-info file.  */
608
609 static char *aux_info_file_name;
610
611 /* Nonzero means make the text shared if supported.  */
612
613 int flag_shared_data;
614
615 /* Nonzero means schedule into delayed branch slots if supported.  */
616
617 int flag_delayed_branch;
618
619 /* Nonzero if we are compiling pure (sharable) code.
620    Value is 1 if we are doing reasonable (i.e. simple
621    offset into offset table) pic.  Value is 2 if we can
622    only perform register offsets.  */
623
624 int flag_pic;
625
626 /* Nonzero means generate extra code for exception handling and enable
627    exception handling.  */
628
629 int flag_exceptions;
630
631 /* Nonzero means use the new model for exception handling. Replaces 
632    -DNEW_EH_MODEL as a compile option. */
633
634 int flag_new_exceptions = 1;
635
636 /* Nonzero means generate frame unwind info table when supported */
637
638 int flag_unwind_tables = 0;
639
640 /* Nonzero means don't place uninitialized global data in common storage
641    by default.  */
642
643 int flag_no_common;
644
645 /* Nonzero means pretend it is OK to examine bits of target floats,
646    even if that isn't true.  The resulting code will have incorrect constants,
647    but the same series of instructions that the native compiler would make.  */
648
649 int flag_pretend_float;
650
651 /* Nonzero means change certain warnings into errors.
652    Usually these are warnings about failure to conform to some standard.  */
653
654 int flag_pedantic_errors = 0;
655
656 /* flag_schedule_insns means schedule insns within basic blocks (before
657    local_alloc).
658    flag_schedule_insns_after_reload means schedule insns after
659    global_alloc.  */
660
661 int flag_schedule_insns = 0;
662 int flag_schedule_insns_after_reload = 0;
663
664 /* The following flags have effect only for scheduling before register
665    allocation:
666
667    flag_schedule_interblock means schedule insns accross basic blocks.
668    flag_schedule_speculative means allow speculative motion of non-load insns.
669    flag_schedule_speculative_load means allow speculative motion of some
670    load insns.
671    flag_schedule_speculative_load_dangerous allows speculative motion of more
672    load insns.  */
673
674 int flag_schedule_interblock = 1;
675 int flag_schedule_speculative = 1;
676 int flag_schedule_speculative_load = 0;
677 int flag_schedule_speculative_load_dangerous = 0;
678
679 /* flag_on_branch_count_reg means try to replace add-1,compare,branch tupple
680    by a cheaper branch, on a count register. */
681 int flag_branch_on_count_reg;
682
683 /* -finhibit-size-directive inhibits output of .size for ELF.
684    This is used only for compiling crtstuff.c, 
685    and it may be extended to other effects
686    needed for crtstuff.c on other systems.  */
687 int flag_inhibit_size_directive = 0;
688
689 /* -fverbose-asm causes extra commentary information to be produced in
690    the generated assembly code (to make it more readable).  This option
691    is generally only of use to those who actually need to read the
692    generated assembly code (perhaps while debugging the compiler itself).
693    -fno-verbose-asm, the default, causes the extra information
694    to be omitted and is useful when comparing two assembler files.  */
695
696 int flag_verbose_asm = 0;
697
698 /* -dA causes debug commentary information to be produced in
699    the generated assembly code (to make it more readable).  This option
700    is generally only of use to those who actually need to read the
701    generated assembly code (perhaps while debugging the compiler itself).
702    Currently, this switch is only used by dwarfout.c; however, it is intended
703    to be a catchall for printing debug information in the assembler file.  */
704
705 int flag_debug_asm = 0;
706
707 /* -fgnu-linker specifies use of the GNU linker for initializations.
708    (Or, more generally, a linker that handles initializations.)
709    -fno-gnu-linker says that collect2 will be used.  */
710 #ifdef USE_COLLECT2
711 int flag_gnu_linker = 0;
712 #else
713 int flag_gnu_linker = 1;
714 #endif
715
716 /* Tag all structures with __attribute__(packed) */
717 int flag_pack_struct = 0;
718
719 /* Emit code to check for stack overflow; also may cause large objects
720    to be allocated dynamically.  */
721 int flag_stack_check;
722
723 /* -fcheck-memory-usage causes extra code to be generated in order to check
724    memory accesses.  This is used by a detector of bad memory accesses such
725    as Checker.  */
726 int flag_check_memory_usage = 0;
727
728 /* -fprefix-function-name causes function name to be prefixed.  This
729    can be used with -fcheck-memory-usage to isolate code compiled with
730    -fcheck-memory-usage.  */
731 int flag_prefix_function_name = 0;
732
733 /* 0 if pointer arguments may alias each other.  True in C.
734    1 if pointer arguments may not alias each other but may alias
735    global variables.
736    2 if pointer arguments may not alias each other and may not
737    alias global variables.  True in Fortran.
738    This defaults to 0 for C.  */
739 int flag_argument_noalias = 0;
740
741 /* Nonzero if we should do (language-dependent) alias analysis.
742    Typically, this analysis will assume that expressions of certain
743    types do not alias expressions of certain other types.  Only used
744    if alias analysis (in general) is enabled.  */
745 int flag_strict_aliasing = 0;
746
747 /* Instrument functions with calls at entry and exit, for profiling.  */
748 int flag_instrument_function_entry_exit = 0;
749
750 /* Nonzero means ignore `#ident' directives.  0 means handle them.
751    On SVR4 targets, it also controls whether or not to emit a
752    string identifying the compiler.  */
753
754 int flag_no_ident = 0;
755
756 /* This will perform a peephole pass before sched2. */
757 int flag_peephole2 = 0;
758
759 /* -fbounded-pointers causes gcc to compile pointers as composite
760    objects occupying three words: the pointer value, the base address
761    of the referent object, and the address immediately beyond the end
762    of the referent object.  The base and extent allow us to perform
763    runtime bounds checking.  -fbounded-pointers implies -fcheck-bounds.  */
764 int flag_bounded_pointers = 0;
765
766 /* -fcheck-bounds causes gcc to generate array bounds checks.
767    For C, C++: defaults to value of flag_bounded_pointers.
768    For ObjC: defaults to off.
769    For Java: defaults to on.
770    For Fortran: defaults to off.
771    For CHILL: defaults to off.  */
772 int flag_bounds_check = 0;
773
774 /* If one, renumber instruction UIDs to reduce the number of
775    unused UIDs if there are a lot of instructions.  If greater than
776    one, unconditionally renumber instruction UIDs.  */
777 int flag_renumber_insns = 1;
778
779 /* Values of the -falign-* flags: how much to align labels in code. 
780    0 means `use default', 1 means `don't align'.  
781    For each variable, there is an _log variant which is the power
782    of two not less than the variable, for .align output.  */
783
784 int align_loops;
785 int align_loops_log;
786 int align_jumps;
787 int align_jumps_log;
788 int align_labels;
789 int align_labels_log;
790 int align_functions;
791 int align_functions_log;
792
793 /* Table of supported debugging formats.  */
794 static struct
795 {
796   const char * arg;
797   /* Since PREFERRED_DEBUGGING_TYPE isn't necessarily a
798      constant expression, we use NO_DEBUG in its place.  */
799   enum debug_info_type debug_type;
800   int use_extensions_p;
801   const char * description;
802 } *da,
803 debug_args[] =
804 {
805   { "",       NO_DEBUG, DEFAULT_GDB_EXTENSIONS,
806     "Generate default debug format output" },
807   { "gdb",    NO_DEBUG, 1, "Generate default extended debug format output" },
808 #ifdef DBX_DEBUGGING_INFO
809   { "stabs",  DBX_DEBUG, 0, "Generate STABS format debug output" },
810   { "stabs+", DBX_DEBUG, 1, "Generate extended STABS format debug output" },
811 #endif
812 #ifdef DWARF_DEBUGGING_INFO
813   { "dwarf",  DWARF_DEBUG, 0, "Generate DWARF-1 format debug output"},
814   { "dwarf+", DWARF_DEBUG, 1,
815     "Generated extended DWARF-1 format debug output" },
816 #endif
817 #ifdef DWARF2_DEBUGGING_INFO
818   { "dwarf-2", DWARF2_DEBUG, 0, "Enable DWARF-2 debug output" },
819 #endif
820 #ifdef XCOFF_DEBUGGING_INFO
821   { "xcoff",  XCOFF_DEBUG, 0, "Generate XCOFF format debug output" },
822   { "xcoff+", XCOFF_DEBUG, 1, "Generate extended XCOFF format debug output" },
823 #endif
824 #ifdef SDB_DEBUGGING_INFO
825   { "coff", SDB_DEBUG, 0, "Generate COFF format debug output" },
826 #endif
827   { 0, 0, 0, 0 }
828 };
829
830 typedef struct
831 {
832   const char * string;
833   int *  variable;
834   int    on_value;
835   const char * description;
836 }
837 lang_independent_options;
838
839 /* Add or remove a leading underscore from user symbols.  */
840 int flag_leading_underscore = -1;
841
842 /* The user symbol prefix after having resolved same.  */
843 const char *user_label_prefix;
844
845 /* A default for same.  */
846 #ifndef USER_LABEL_PREFIX
847 #define USER_LABEL_PREFIX ""
848 #endif
849
850 /* Table of language-independent -f options.
851    STRING is the option name.  VARIABLE is the address of the variable.
852    ON_VALUE is the value to store in VARIABLE
853     if `-fSTRING' is seen as an option.
854    (If `-fno-STRING' is seen as an option, the opposite value is stored.)  */
855
856 lang_independent_options f_options[] =
857 {
858   {"float-store", &flag_float_store, 1,
859    "Do not store floats in registers" },
860   {"volatile", &flag_volatile, 1,
861    "Consider all mem refs through pointers as volatile"},
862   {"volatile-global", &flag_volatile_global, 1,
863    "Consider all mem refs to global data to be volatile" },
864   {"volatile-static", &flag_volatile_static, 1,
865    "Consider all mem refs to static data to be volatile" },
866   {"defer-pop", &flag_defer_pop, 1,
867    "Defer popping functions args from stack until later" },
868   {"omit-frame-pointer", &flag_omit_frame_pointer, 1,
869    "When possible do not generate stack frames"},
870   {"cse-follow-jumps", &flag_cse_follow_jumps, 1,
871    "When running CSE, follow jumps to their targets" },
872   {"cse-skip-blocks", &flag_cse_skip_blocks, 1,
873    "When running CSE, follow conditional jumps" },
874   {"expensive-optimizations", &flag_expensive_optimizations, 1,
875    "Perform a number of minor, expensive optimisations" },
876   {"thread-jumps", &flag_thread_jumps, 1,
877    "Perform jump threading optimisations"},
878   {"strength-reduce", &flag_strength_reduce, 1,
879    "Perform strength reduction optimisations" },
880   {"unroll-loops", &flag_unroll_loops, 1,
881    "Perform loop unrolling when iteration count is known" },
882   {"unroll-all-loops", &flag_unroll_all_loops, 1,
883    "Perform loop unrolling for all loops" },
884   {"move-all-movables", &flag_move_all_movables, 1,
885    "Force all loop invariant computations out of loops" },
886   {"reduce-all-givs", &flag_reduce_all_givs, 1,
887    "Strength reduce all loop general induction variables" },
888   {"writable-strings", &flag_writable_strings, 1,
889    "Store strings in writable data section" },
890   {"peephole", &flag_no_peephole, 0,
891    "Enable machine specific peephole optimisations" },
892   {"force-mem", &flag_force_mem, 1,
893    "Copy memory operands into registers before using" },
894   {"force-addr", &flag_force_addr, 1,
895    "Copy memory address constants into regs before using" },
896   {"function-cse", &flag_no_function_cse, 0,
897    "Allow function addresses to be held in registers" },
898   {"inline-functions", &flag_inline_functions, 1,
899    "Integrate simple functions into their callers" },
900   {"keep-inline-functions", &flag_keep_inline_functions, 1,
901    "Generate code for funcs even if they are fully inlined" },
902   {"inline", &flag_no_inline, 0,
903    "Pay attention to the 'inline' keyword"},
904   {"keep-static-consts", &flag_keep_static_consts, 1,
905    "Emit static const variables even if they are not used" },
906   {"syntax-only", &flag_syntax_only, 1,
907    "Check for syntax errors, then stop" },
908   {"shared-data", &flag_shared_data, 1,
909    "Mark data as shared rather than private" },
910   {"caller-saves", &flag_caller_saves, 1,
911    "Enable saving registers around function calls" },
912   {"pcc-struct-return", &flag_pcc_struct_return, 1,
913    "Return 'short' aggregates in memory, not registers" },
914   {"reg-struct-return", &flag_pcc_struct_return, 0,
915    "Return 'short' aggregates in registers" },
916   {"delayed-branch", &flag_delayed_branch, 1,
917    "Attempt to fill delay slots of branch instructions" },
918   {"gcse", &flag_gcse, 1,
919    "Perform the global common subexpression elimination" },
920   {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1,
921    "Run CSE pass after loop optimisations"},
922   {"rerun-loop-opt", &flag_rerun_loop_opt, 1,
923    "Run the loop optimiser twice"},
924   {"delete-null-pointer-checks", &flag_delete_null_pointer_checks, 1,
925    "Delete useless null pointer checks" },
926   {"pretend-float", &flag_pretend_float, 1,
927    "Pretend that host and target use the same FP format"},
928   {"schedule-insns", &flag_schedule_insns, 1,
929    "Reschedule instructions to avoid pipeline stalls"},
930   {"schedule-insns2", &flag_schedule_insns_after_reload, 1,
931   "Run two passes of the instruction scheduler"},
932   {"sched-interblock",&flag_schedule_interblock, 1,
933    "Enable scheduling across basic blocks" },
934   {"sched-spec",&flag_schedule_speculative, 1,
935    "Allow speculative motion of non-loads" },
936   {"sched-spec-load",&flag_schedule_speculative_load, 1,
937    "Allow speculative motion of some loads" },
938   {"sched-spec-load-dangerous",&flag_schedule_speculative_load_dangerous, 1,
939    "Allow speculative motion of more loads" },
940   {"branch-count-reg",&flag_branch_on_count_reg, 1,
941    "Replace add,compare,branch with branch on count reg"},
942   {"pic", &flag_pic, 1,
943    "Generate position independent code, if possible"},
944   {"PIC", &flag_pic, 2, ""},
945   {"exceptions", &flag_exceptions, 1,
946    "Enable exception handling" },
947   {"new-exceptions", &flag_new_exceptions, 1,
948    "Use the new model for exception handling" },
949   {"unwind-tables", &flag_unwind_tables, 1,
950     "Just generate unwind tables for exception handling" },
951   {"sjlj-exceptions", &exceptions_via_longjmp, 1,
952    "Use setjmp/longjmp to handle exceptions" },
953   {"asynchronous-exceptions", &asynchronous_exceptions, 1,
954    "Support asynchronous exceptions" },
955   {"profile-arcs", &profile_arc_flag, 1,
956    "Insert arc based program profiling code" },
957   {"test-coverage", &flag_test_coverage, 1,
958    "Create data files needed by gcov" },
959   {"branch-probabilities", &flag_branch_probabilities, 1,
960    "Use profiling information for branch probabilities" },
961   {"fast-math", &flag_fast_math, 1,
962    "Improve FP speed by violating ANSI & IEEE rules" },
963   {"common", &flag_no_common, 0,
964    "Do not put unitialised globals in the common section" },
965   {"inhibit-size-directive", &flag_inhibit_size_directive, 1,
966    "Do not generate .size directives" },
967   {"function-sections", &flag_function_sections, 1,
968    "place each function into its own section" },
969   {"data-sections", &flag_data_sections, 1,
970    "place data items into their own section" },
971   {"verbose-asm", &flag_verbose_asm, 1,
972    "Add extra commentry to assembler output"},
973   {"gnu-linker", &flag_gnu_linker, 1,
974    "Output GNU ld formatted global initialisers"},
975   {"regmove", &flag_regmove, 1,
976    "Enables a register move optimisation"},
977   {"optimize-register-move", &flag_regmove, 1,
978    "Do the full regmove optimization pass"},
979   {"pack-struct", &flag_pack_struct, 1,
980    "Pack structure members together without holes" },
981   {"stack-check", &flag_stack_check, 1,
982    "Insert stack checking code into the program" },
983   {"argument-alias", &flag_argument_noalias, 0,
984    "Specify that arguments may alias each other & globals"},
985   {"argument-noalias", &flag_argument_noalias, 1,
986    "Assume arguments may alias globals but not each other"},
987   {"argument-noalias-global", &flag_argument_noalias, 2,
988    "Assume arguments do not alias each other or globals" },
989   {"strict-aliasing", &flag_strict_aliasing, 1,
990    "Assume strict aliasing rules apply" },
991   {"align-loops", &align_loops, 0, 
992    "Align the start of loops" },
993   {"align-jumps", &align_jumps, 0, 
994    "Align labels which are only reached by jumping" },
995   {"align-labels", &align_labels, 0,
996    "Align all labels" },
997   {"align-functions", &align_functions, 0,
998    "Align the start of functions" },
999   {"check-memory-usage", &flag_check_memory_usage, 1,
1000    "Generate code to check every memory access" },
1001   {"prefix-function-name", &flag_prefix_function_name, 1,
1002    "Add a prefix to all function names" },
1003   {"dump-unnumbered", &flag_dump_unnumbered, 1,
1004    "Suppress output of instruction numbers and line number notes in debugging dumps"},
1005   {"instrument-functions", &flag_instrument_function_entry_exit, 1,
1006    "Instrument function entry/exit with profiling calls"},
1007   {"leading-underscore", &flag_leading_underscore, 1,
1008    "External symbols have a leading underscore" },
1009   {"ident", &flag_no_ident, 0,
1010    "Process #ident directives"},
1011   { "peephole2", &flag_peephole2, 1,
1012     "Enables an rtl peephole pass run before sched2" },
1013   {"math-errno", &flag_errno_math, 1,
1014    "Set errno after built-in math functions"},
1015   {"bounded-pointers", &flag_bounded_pointers, 1,
1016    "Compile pointers as triples: value, base & end" },
1017   {"bounds-check", &flag_bounds_check, 1,
1018    "Generate code to check bounds before dereferencing pointers and arrays" }
1019 };
1020
1021 #define NUM_ELEM(a)  (sizeof (a) / sizeof ((a)[0]))
1022
1023 /* Table of language-specific options.  */
1024
1025 static struct lang_opt
1026 {
1027   const char * option;
1028   const char * description;
1029 }
1030 documented_lang_options[] =
1031 {
1032   /* In order not to overload the --help output, the convention
1033      used here is to only describe those options which are not
1034      enabled by default.  */
1035
1036   { "-ansi", "Compile just for ANSI C" },
1037   { "-fallow-single-precision",
1038     "Do not promote floats to double if using -traditional" },
1039   { "-std= ", "Determine language standard"},
1040
1041   { "-fsigned-bitfields", "" },
1042   { "-funsigned-bitfields","Make bitfields by unsigned by default" },
1043   { "-fno-signed-bitfields", "" },
1044   { "-fno-unsigned-bitfields","" },
1045   { "-fsigned-char", "Make 'char' be signed by default"},
1046   { "-funsigned-char", "Make 'char' be unsigned by default"},
1047   { "-fno-signed-char", "" },
1048   { "-fno-unsigned-char", "" },
1049
1050   { "-ftraditional", "" },
1051   { "-traditional", "Attempt to support traditional K&R style C"},
1052   { "-fnotraditional", "" },
1053   { "-fno-traditional", "" },
1054
1055   { "-fasm", "" },
1056   { "-fno-asm", "Do not recognise the 'asm' keyword" },
1057   { "-fbuiltin", "" },
1058   { "-fno-builtin", "Do not recognise any built in functions" },
1059   { "-fhosted", "Assume normal C execution environment" },
1060   { "-fno-hosted", "" },
1061   { "-ffreestanding",
1062     "Assume that standard libraries & main might not exist" },
1063   { "-fno-freestanding", "" },
1064   { "-fcond-mismatch", "Allow different types as args of ? operator"},
1065   { "-fno-cond-mismatch", "" },
1066   { "-fdollars-in-identifiers", "Allow the use of $ inside identifiers" },
1067   { "-fno-dollars-in-identifiers", "" },
1068   { "-fpreprocessed", "" },
1069   { "-fno-preprocessed", "" },
1070   { "-fshort-double", "Use the same size for double as for float" },
1071   { "-fno-short-double", "" },
1072   { "-fshort-enums", "Use the smallest fitting integer to hold enums"},
1073   { "-fno-short-enums", "" },
1074   { "-fshort-wchar", "Override the underlying type for wchar_t to `unsigned short'" },
1075   { "-fno-short-wchar", "" },
1076
1077   { "-Wall", "Enable most warning messages" },
1078   { "-Wbad-function-cast",
1079     "Warn about casting functions to incompatible types" },
1080   { "-Wno-bad-function-cast", "" },
1081   { "-Wmissing-noreturn",
1082     "Warn about functions which might be candidates for attribute noreturn" },
1083   { "-Wno-missing-noreturn", "" },
1084   { "-Wcast-qual", "Warn about casts which discard qualifiers"},
1085   { "-Wno-cast-qual", "" },
1086   { "-Wchar-subscripts", "Warn about subscripts whose type is 'char'"},
1087   { "-Wno-char-subscripts", "" },
1088   { "-Wcomment", "Warn if nested comments are detected" },
1089   { "-Wno-comment", "" },
1090   { "-Wcomments", "Warn if nested comments are detected" },
1091   { "-Wno-comments", "" },
1092   { "-Wconversion", "Warn about possibly confusing type conversions" },
1093   { "-Wno-conversion", "" },
1094   { "-Wformat", "Warn about printf format anomalies" },
1095   { "-Wno-format", "" },
1096   { "-Wimplicit-function-declaration",
1097     "Warn about implicit function declarations" },
1098   { "-Wno-implicit-function-declaration", "" },
1099   { "-Werror-implicit-function-declaration", "" },
1100   { "-Wimplicit-int", "Warn when a declaration does not specify a type" },
1101   { "-Wno-implicit-int", "" },
1102   { "-Wimplicit", "" },
1103   { "-Wno-implicit", "" },
1104   { "-Wimport", "Warn about the use of the #import directive" },
1105   { "-Wno-import", "" },
1106   { "-Wlong-long","" },
1107   { "-Wno-long-long", "Do not warn about using 'long long' when -pedantic" },
1108   { "-Wmain", "Warn about suspicious declarations of main" },
1109   { "-Wno-main", "" },
1110   { "-Wmissing-braces",
1111     "Warn about possibly missing braces around initialisers" },
1112   { "-Wno-missing-braces", "" },
1113   { "-Wmissing-declarations",
1114     "Warn about global funcs without previous declarations"},
1115   { "-Wno-missing-declarations", "" },
1116   { "-Wmissing-prototypes", "Warn about global funcs without prototypes" },
1117   { "-Wno-missing-prototypes", "" },
1118   { "-Wmultichar", "Warn about use of multicharacter literals"},
1119   { "-Wno-multichar", "" },
1120   { "-Wnested-externs", "Warn about externs not at file scope level" },
1121   { "-Wno-nested-externs", "" },
1122   { "-Wparentheses", "Warn about possible missing parentheses" },
1123   { "-Wno-parentheses", "" },
1124   { "-Wpointer-arith", "Warn about function pointer arithmetic" },
1125   { "-Wno-pointer-arith", "" },
1126   { "-Wredundant-decls",
1127     "Warn about multiple declarations of the same object" },
1128   { "-Wno-redundant-decls", "" },
1129   { "-Wsign-compare", "Warn about signed/unsigned comparisons" },
1130   { "-Wno-sign-compare", "" },
1131   { "-Wfloat-equal", "Warn about testing equality of floating point numbers" },
1132   { "-Wno-float-equal", "" },
1133   { "-Wunknown-pragmas", "Warn about unrecognised pragmas" },
1134   { "-Wno-unknown-pragmas", "" },
1135   { "-Wstrict-prototypes", "Warn about non-prototyped function decls" },
1136   { "-Wno-strict-prototypes", "" },
1137   { "-Wtraditional", "Warn about constructs whose meaning change in ANSI C"},
1138   { "-Wno-traditional", "" },
1139   { "-Wtrigraphs", "Warn when trigraphs are encountered" },
1140   { "-Wno-trigraphs", "" },
1141   { "-Wundef", "" },
1142   { "-Wno-undef", "" },
1143   { "-Wwrite-strings", "Mark strings as 'const char *'"},
1144   { "-Wno-write-strings", "" },
1145   
1146 #define DEFINE_LANG_NAME(NAME) { NULL, NAME },
1147   
1148   /* These are for Objective C.  */
1149   DEFINE_LANG_NAME ("Objective C")
1150   
1151   { "-lang-objc", "" },
1152   { "-gen-decls", "Dump decls to a .decl file" },
1153   { "-fgnu-runtime", "Generate code for GNU runtime environment" },
1154   { "-fno-gnu-runtime", "" },
1155   { "-fnext-runtime", "Generate code for NeXT runtime environment" },
1156   { "-fno-next-runtime", "" },
1157   { "-Wselector", "Warn if a selector has multiple methods" },
1158   { "-Wno-selector", "" },
1159   { "-Wprotocol", "" },
1160   { "-Wno-protocol", "Do not warn if inherited methods are unimplemented"},
1161   { "-print-objc-runtime-info",
1162     "Generate C header of platform specific features" },
1163
1164 #include "options.h"
1165   
1166 };
1167
1168 /* Here is a table, controlled by the tm.h file, listing each -m switch
1169    and which bits in `target_switches' it should set or clear.
1170    If VALUE is positive, it is bits to set.
1171    If VALUE is negative, -VALUE is bits to clear.
1172    (The sign bit is not used so there is no confusion.)  */
1173
1174 struct
1175 {
1176   const char * name;
1177   int    value;
1178   const char * description;
1179 }
1180 target_switches [] = TARGET_SWITCHES;
1181
1182 /* This table is similar, but allows the switch to have a value.  */
1183
1184 #ifdef TARGET_OPTIONS
1185 struct
1186 {
1187   const char *  prefix;
1188   const char ** variable;
1189   const char *  description;
1190 }
1191 target_options [] = TARGET_OPTIONS;
1192 #endif
1193 \f
1194 /* Options controlling warnings */
1195
1196 /* Don't print warning messages.  -w.  */
1197
1198 int inhibit_warnings = 0;
1199
1200 /* Print various extra warnings.  -W.  */
1201
1202 int extra_warnings = 0;
1203
1204 /* Treat warnings as errors.  -Werror.  */
1205
1206 int warnings_are_errors = 0;
1207
1208 /* Nonzero to warn about unused local variables.  */
1209
1210 int warn_unused;
1211
1212 /* Nonzero to warn about code which is never reached.  */
1213
1214 int warn_notreached;
1215
1216 /* Nonzero to warn about variables used before they are initialized.  */
1217
1218 int warn_uninitialized;
1219
1220 /* Nonzero means warn about all declarations which shadow others.   */
1221
1222 int warn_shadow;
1223
1224 /* Warn if a switch on an enum fails to have a case for every enum value.  */
1225
1226 int warn_switch;
1227
1228 /* Nonzero means warn about function definitions that default the return type
1229    or that use a null return and have a return-type other than void.  */
1230
1231 int warn_return_type;
1232
1233 /* Nonzero means warn about pointer casts that increase the required
1234    alignment of the target type (and might therefore lead to a crash
1235    due to a misaligned access).  */
1236
1237 int warn_cast_align;
1238
1239 /* Nonzero means warn about any identifiers that match in the first N
1240    characters.  The value N is in `id_clash_len'.  */
1241
1242 int warn_id_clash;
1243 unsigned id_clash_len;
1244
1245 /* Nonzero means warn about any objects definitions whose size is larger
1246    than N bytes.  Also want about function definitions whose returned
1247    values are larger than N bytes. The value N is in `larger_than_size'.  */
1248  
1249 int warn_larger_than;
1250 unsigned larger_than_size;
1251
1252 /* Nonzero means warn if inline function is too large.  */
1253
1254 int warn_inline;
1255
1256 /* Warn if a function returns an aggregate,
1257    since there are often incompatible calling conventions for doing this.  */
1258
1259 int warn_aggregate_return;
1260
1261 /* Likewise for -W.  */
1262
1263 lang_independent_options W_options[] =
1264 {
1265   {"unused", &warn_unused, 1, "Warn when a variable is unused" },
1266   {"error", &warnings_are_errors, 1, ""},
1267   {"shadow", &warn_shadow, 1, "Warn when one local variable shadows another" },
1268   {"switch", &warn_switch, 1,
1269    "Warn about enumerated switches missing a specific case" },
1270   {"aggregate-return", &warn_aggregate_return, 1,
1271    "Warn about returning structures, unions or arrays" },
1272   {"cast-align", &warn_cast_align, 1,
1273    "Warn about pointer casts which increase alignment" },
1274   {"unreachable-code", &warn_notreached, 1, 
1275    "Warn about code that will never be executed" },
1276   {"uninitialized", &warn_uninitialized, 1,
1277    "Warn about unitialized automatic variables"},
1278   {"inline", &warn_inline, 1,
1279    "Warn when an inlined function cannot be inlined"}
1280 };
1281 \f
1282 /* Output files for assembler code (real compiler output)
1283    and debugging dumps.  */
1284
1285 FILE *asm_out_file;
1286 FILE *aux_info_file;
1287 FILE *rtl_dump_file = NULL;
1288
1289 /* Decode the string P as an integral parameter.
1290    If the string is indeed an integer return its numeric value else
1291    issue an Invalid Option error for the option PNAME and return DEFVAL.
1292    If PNAME is zero just return DEFVAL, do not call error.               */
1293    
1294 int
1295 read_integral_parameter (p, pname, defval)
1296      const char *p;
1297      const char *pname;
1298      const int  defval;
1299 {
1300   const char *endp = p;
1301
1302   while (*endp)
1303     {
1304       if (*endp >= '0' && *endp <= '9')
1305         endp++;
1306       else
1307         break;
1308     }
1309
1310   if (*endp != 0)
1311     {
1312       if (pname != 0)
1313         error ("Invalid option `%s'", pname);
1314       return defval;
1315     }
1316
1317   return atoi (p);
1318 }
1319
1320
1321 /* Time accumulators, to count the total time spent in various passes.  */
1322
1323 int parse_time;
1324 int varconst_time;
1325 int integration_time;
1326 int jump_time;
1327 int cse_time;
1328 int gcse_time;
1329 int loop_time;
1330 int cse2_time;
1331 int branch_prob_time;
1332 int flow_time;
1333 int combine_time;
1334 int regmove_time;
1335 int sched_time;
1336 int local_alloc_time;
1337 int global_alloc_time;
1338 int flow2_time;
1339 int peephole2_time;
1340 int sched2_time;
1341 int dbr_sched_time;
1342 int shorten_branch_time;
1343 int stack_reg_time;
1344 int final_time;
1345 int symout_time;
1346 int dump_time;
1347 int gc_time;
1348 int all_time;
1349 \f
1350 /* Return time used so far, in microseconds.  */
1351
1352 long
1353 get_run_time ()
1354 {
1355   if (quiet_flag)
1356     return 0;
1357
1358 #ifdef __BEOS__
1359   return 0;
1360 #else /* not BeOS */
1361 #if defined (_WIN32) && !defined (__CYGWIN__)
1362   if (clock() < 0)
1363     return 0;
1364   else
1365     return (clock() * 1000);
1366 #else /* not _WIN32 */
1367 #ifdef _SC_CLK_TCK
1368   {
1369     static int tick;
1370     struct tms tms;
1371     if (tick == 0)
1372       tick = 1000000 / sysconf(_SC_CLK_TCK);
1373     times (&tms);
1374     return (tms.tms_utime + tms.tms_stime) * tick;
1375   }
1376 #else
1377 #ifdef USG
1378   {
1379     struct tms tms;
1380 #   if HAVE_SYSCONF && defined _SC_CLK_TCK
1381 #    define TICKS_PER_SECOND sysconf (_SC_CLK_TCK) /* POSIX 1003.1-1996 */
1382 #   else
1383 #    ifdef CLK_TCK
1384 #     define TICKS_PER_SECOND CLK_TCK /* POSIX 1003.1-1988; obsolescent */
1385 #    else
1386 #     define TICKS_PER_SECOND HZ /* traditional UNIX */
1387 #    endif
1388 #   endif
1389     times (&tms);
1390     return (tms.tms_utime + tms.tms_stime) * (1000000 / TICKS_PER_SECOND);
1391   }
1392 #else
1393 #ifndef VMS
1394   {
1395     struct rusage rusage;
1396     getrusage (0, &rusage);
1397     return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec
1398             + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec);
1399   }
1400 #else /* VMS */
1401   {
1402     struct
1403       {
1404         int proc_user_time;
1405         int proc_system_time;
1406         int child_user_time;
1407         int child_system_time;
1408       } vms_times;
1409     times ((void *) &vms_times);
1410     return (vms_times.proc_user_time + vms_times.proc_system_time) * 10000;
1411   }
1412 #endif  /* VMS */
1413 #endif  /* USG */
1414 #endif  /* _SC_CLK_TCK */
1415 #endif  /* _WIN32 */
1416 #endif  /* __BEOS__ */
1417 }
1418
1419 #define TIMEVAR(VAR, BODY)    \
1420 do { int otime = get_run_time (); BODY; VAR += get_run_time () - otime; } while (0)
1421
1422 void
1423 print_time (str, total)
1424      const char *str;
1425      int total;
1426 {
1427   fprintf (stderr,
1428            "time in %s: %d.%06d (%.0f%%)\n",
1429            str, total / 1000000, total % 1000000,
1430            (double)total / (double)all_time * 100.0);
1431 }
1432
1433 /* Count an error or warning.  Return 1 if the message should be printed.  */
1434
1435 int
1436 count_error (warningp)
1437      int warningp;
1438 {
1439   if (warningp && inhibit_warnings)
1440     return 0;
1441
1442   if (warningp && !warnings_are_errors)
1443     warningcount++;
1444   else
1445     {
1446       static int warning_message = 0;
1447
1448       if (warningp && !warning_message)
1449         {
1450           notice ("%s: warnings being treated as errors\n", progname);
1451           warning_message = 1;
1452         }
1453       errorcount++;
1454     }
1455
1456   return 1;
1457 }
1458
1459 /* Print a fatal error message.  NAME is the text.
1460    Also include a system error message based on `errno'.  */
1461
1462 void
1463 pfatal_with_name (name)
1464   const char *name;
1465 {
1466   fprintf (stderr, "%s: ", progname);
1467   perror (name);
1468   exit (FATAL_EXIT_CODE);
1469 }
1470
1471 void
1472 fatal_io_error (name)
1473   const char *name;
1474 {
1475   notice ("%s: %s: I/O error\n", progname, name);
1476   exit (FATAL_EXIT_CODE);
1477 }
1478
1479 /* This is the default decl_printable_name function.  */
1480
1481 static const char *
1482 decl_name (decl, verbosity)
1483      tree decl;
1484      int verbosity ATTRIBUTE_UNUSED;
1485 {
1486   return IDENTIFIER_POINTER (DECL_NAME (decl));
1487 }
1488 \f
1489 /* Mark P for GC.  Also mark main_input_filename and input_filename.  */
1490 static void
1491 mark_file_stack (p)
1492      void *p;
1493 {
1494   struct file_stack *stack = *(struct file_stack **)p;
1495
1496   /* We're only called for input_file_stack, so we can mark the current
1497      input_filename here as well.  */
1498   ggc_mark_string (main_input_filename);
1499   ggc_mark_string (input_filename);
1500
1501   while (stack)
1502     {
1503       ggc_mark_string (stack->name);
1504       stack = stack->next;
1505     }
1506 }
1507
1508 static int need_error_newline;
1509
1510 /* Function of last error message;
1511    more generally, function such that if next error message is in it
1512    then we don't have to mention the function name.  */
1513 static tree last_error_function = NULL;
1514
1515 /* Used to detect when input_file_stack has changed since last described.  */
1516 static int last_error_tick;
1517
1518 /* Called when the start of a function definition is parsed,
1519    this function prints on stderr the name of the function.  */
1520
1521 void
1522 announce_function (decl)
1523      tree decl;
1524 {
1525   if (! quiet_flag)
1526     {
1527       if (rtl_dump_and_exit)
1528         fprintf (stderr, "%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
1529       else
1530         fprintf (stderr, " %s", (*decl_printable_name) (decl, 2));
1531       fflush (stderr);
1532       need_error_newline = 1;
1533       last_error_function = current_function_decl;
1534     }
1535 }
1536
1537 /* The default function to print out name of current function that caused
1538    an error.  */
1539
1540 void
1541 default_print_error_function (file)
1542   const char *file;
1543 {
1544   if (last_error_function != current_function_decl)
1545     {
1546       if (file)
1547         fprintf (stderr, "%s: ", file);
1548
1549       if (current_function_decl == NULL)
1550         notice ("At top level:\n");
1551       else
1552         notice ((TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE
1553                  ? "In method `%s':\n"
1554                  : "In function `%s':\n"),
1555                 (*decl_printable_name) (current_function_decl, 2));
1556
1557       last_error_function = current_function_decl;
1558     }
1559 }
1560
1561 /* Called by report_error_function to print out function name.
1562  * Default may be overridden by language front-ends.  */
1563
1564 void (*print_error_function) PROTO((const char *)) =
1565   default_print_error_function;
1566
1567 /* Prints out, if necessary, the name of the current function
1568   that caused an error.  Called from all error and warning functions.
1569   We ignore the FILE parameter, as it cannot be relied upon.  */
1570
1571 void
1572 report_error_function (file)
1573   const char *file ATTRIBUTE_UNUSED;
1574 {
1575   struct file_stack *p;
1576
1577   if (need_error_newline)
1578     {
1579       fprintf (stderr, "\n");
1580       need_error_newline = 0;
1581     }
1582
1583   if (input_file_stack && input_file_stack->next != 0
1584       && input_file_stack_tick != last_error_tick)
1585     {
1586       for (p = input_file_stack->next; p; p = p->next)
1587         notice ((p == input_file_stack->next
1588                  ?    "In file included from %s:%d"
1589                  : ",\n                 from %s:%d"),
1590                 p->name, p->line);
1591       fprintf (stderr, ":\n");
1592       last_error_tick = input_file_stack_tick;
1593     }
1594
1595   (*print_error_function) (input_filename);
1596 }
1597 \f
1598 /* Print a message.  */
1599
1600 static void
1601 vnotice (file, msgid, ap)
1602      FILE *file;
1603      const char *msgid;
1604      va_list ap;
1605 {
1606   vfprintf (file, _(msgid), ap);
1607 }
1608
1609 static void
1610 notice VPROTO((const char *msgid, ...))
1611 {
1612 #ifndef ANSI_PROTOTYPES
1613   char *msgid;
1614 #endif
1615   va_list ap;
1616
1617   VA_START (ap, msgid);
1618
1619 #ifndef ANSI_PROTOTYPES
1620   msgid = va_arg (ap, char *);
1621 #endif
1622
1623   vnotice (stderr, msgid, ap);
1624   va_end (ap);
1625 }
1626
1627 void
1628 fnotice VPROTO((FILE *file, const char *msgid, ...))
1629 {
1630 #ifndef ANSI_PROTOTYPES
1631   FILE *file;
1632   const char *msgid;
1633 #endif
1634   va_list ap;
1635
1636   VA_START (ap, msgid);
1637
1638 #ifndef ANSI_PROTOTYPES
1639   file = va_arg (ap, FILE *);
1640   msgid = va_arg (ap, const char *);
1641 #endif
1642
1643   vnotice (file, msgid, ap);
1644   va_end (ap);
1645 }
1646
1647 /* Report FILE and LINE (or program name), and optionally just WARN.  */
1648
1649 static void
1650 report_file_and_line (file, line, warn)
1651      const char *file;
1652      int line;
1653      int warn;
1654 {
1655   if (file)
1656     fprintf (stderr, "%s:%d: ", file, line);
1657   else
1658     fprintf (stderr, "%s: ", progname);
1659
1660   if (warn)
1661     notice ("warning: ");
1662 }
1663
1664 /* Print a message.  */
1665
1666 static void
1667 vmessage (prefix, msgid, ap)
1668      const char *prefix;
1669      const char *msgid;
1670      va_list ap;
1671 {
1672   if (prefix)
1673     fprintf (stderr, "%s: ", prefix);
1674
1675   vfprintf (stderr, msgid, ap);
1676 }
1677
1678 /* Print a message relevant to line LINE of file FILE.  */
1679
1680 static void
1681 v_message_with_file_and_line (file, line, warn, msgid, ap)
1682      const char *file;
1683      int line;
1684      int warn;
1685      const char *msgid;
1686      va_list ap;
1687 {
1688   report_file_and_line (file, line, warn);
1689   vnotice (stderr, msgid, ap);
1690   fputc ('\n', stderr);
1691 }
1692
1693 /* Print a message relevant to the given DECL.  */
1694
1695 static void
1696 v_message_with_decl (decl, warn, msgid, ap)
1697      tree decl;
1698      int warn;
1699      const char *msgid;
1700      va_list ap;
1701 {
1702   const char *p;
1703
1704   report_file_and_line (DECL_SOURCE_FILE (decl),
1705                         DECL_SOURCE_LINE (decl), warn);
1706
1707   /* Do magic to get around lack of varargs support for insertion
1708      of arguments into existing list.  We know that the decl is first;
1709      we ass_u_me that it will be printed with "%s".  */
1710
1711   for (p = _(msgid); *p; ++p)
1712     {
1713       if (*p == '%')
1714         {
1715           if (*(p + 1) == '%')
1716             ++p;
1717           else if (*(p + 1) != 's')
1718             abort ();
1719           else
1720             break;
1721         }
1722     }
1723
1724   if (p > _(msgid))                     /* Print the left-hand substring.  */
1725     {
1726       char fmt[sizeof "%.255s"];
1727       long width = p - _(msgid);
1728              
1729       if (width > 255L) width = 255L;   /* arbitrary */
1730       sprintf (fmt, "%%.%lds", width);
1731       fprintf (stderr, fmt, _(msgid));
1732     }
1733
1734   if (*p == '%')                /* Print the name.  */
1735     {
1736       const char *n = (DECL_NAME (decl)
1737                  ? (*decl_printable_name) (decl, 2)
1738                  : "((anonymous))");
1739       fputs (n, stderr);
1740       while (*p)
1741         {
1742           ++p;
1743           if (ISALPHA (*(p - 1) & 0xFF))
1744             break;
1745         }
1746     }
1747
1748   if (*p)                       /* Print the rest of the message.  */
1749     vmessage ((char *)NULL, p, ap);
1750
1751   fputc ('\n', stderr);
1752 }
1753
1754 /* Figure file and line of the given INSN.  */
1755
1756 static void
1757 file_and_line_for_asm (insn, pfile, pline)
1758      rtx insn;
1759      char **pfile;
1760      int *pline;
1761 {
1762   rtx body = PATTERN (insn);
1763   rtx asmop;
1764
1765   /* Find the (or one of the) ASM_OPERANDS in the insn.  */
1766   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1767     asmop = SET_SRC (body);
1768   else if (GET_CODE (body) == ASM_OPERANDS)
1769     asmop = body;
1770   else if (GET_CODE (body) == PARALLEL
1771            && GET_CODE (XVECEXP (body, 0, 0)) == SET)
1772     asmop = SET_SRC (XVECEXP (body, 0, 0));
1773   else if (GET_CODE (body) == PARALLEL
1774            && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1775     asmop = XVECEXP (body, 0, 0);
1776   else
1777     asmop = NULL;
1778
1779   if (asmop)
1780     {
1781       *pfile = ASM_OPERANDS_SOURCE_FILE (asmop);
1782       *pline = ASM_OPERANDS_SOURCE_LINE (asmop);
1783     }
1784   else
1785     {
1786       *pfile = input_filename;
1787       *pline = lineno;
1788     }
1789 }
1790
1791 /* Report an error at line LINE of file FILE.  */
1792
1793 static void
1794 v_error_with_file_and_line (file, line, msgid, ap)
1795      const char *file;
1796      int line;
1797      const char *msgid;
1798      va_list ap;
1799 {
1800   count_error (0);
1801   report_error_function (file);
1802   v_message_with_file_and_line (file, line, 0, msgid, ap);
1803 }
1804
1805 void
1806 error_with_file_and_line VPROTO((const char *file, int line,
1807                                  const char *msgid, ...))
1808 {
1809 #ifndef ANSI_PROTOTYPES
1810   const char *file;
1811   int line;
1812   const char *msgid;
1813 #endif
1814   va_list ap;
1815
1816   VA_START (ap, msgid);
1817
1818 #ifndef ANSI_PROTOTYPES
1819   file = va_arg (ap, const char *);
1820   line = va_arg (ap, int);
1821   msgid = va_arg (ap, const char *);
1822 #endif
1823
1824   v_error_with_file_and_line (file, line, msgid, ap);
1825   va_end (ap);
1826 }
1827
1828 /* Report an error at the declaration DECL.
1829    MSGID is a format string which uses %s to substitute the declaration
1830    name; subsequent substitutions are a la printf.  */
1831
1832 static void
1833 v_error_with_decl (decl, msgid, ap)
1834      tree decl;
1835      const char *msgid;
1836      va_list ap;
1837 {
1838   count_error (0);
1839   report_error_function (DECL_SOURCE_FILE (decl));
1840   v_message_with_decl (decl, 0, msgid, ap);
1841 }
1842
1843 void
1844 error_with_decl VPROTO((tree decl, const char *msgid, ...))
1845 {
1846 #ifndef ANSI_PROTOTYPES
1847   tree decl;
1848   const char *msgid;
1849 #endif
1850   va_list ap;
1851
1852   VA_START (ap, msgid);
1853
1854 #ifndef ANSI_PROTOTYPES
1855   decl = va_arg (ap, tree);
1856   msgid = va_arg (ap, const char *);
1857 #endif
1858
1859   v_error_with_decl (decl, msgid, ap);
1860   va_end (ap);
1861 }
1862
1863 /* Report an error at the line number of the insn INSN.
1864    This is used only when INSN is an `asm' with operands,
1865    and each ASM_OPERANDS records its own source file and line.  */
1866
1867 static void
1868 v_error_for_asm (insn, msgid, ap)
1869      rtx insn;
1870      const char *msgid;
1871      va_list ap;
1872 {
1873   char *file;
1874   int line;
1875
1876   count_error (0);
1877   file_and_line_for_asm (insn, &file, &line);
1878   report_error_function (file);
1879   v_message_with_file_and_line (file, line, 0, msgid, ap);
1880 }
1881
1882 void
1883 error_for_asm VPROTO((rtx insn, const char *msgid, ...))
1884 {
1885 #ifndef ANSI_PROTOTYPES
1886   rtx insn;
1887   const char *msgid;
1888 #endif
1889   va_list ap;
1890
1891   VA_START (ap, msgid);
1892
1893 #ifndef ANSI_PROTOTYPES
1894   insn = va_arg (ap, rtx);
1895   msgid = va_arg (ap, const char *);
1896 #endif
1897
1898   v_error_for_asm (insn, msgid, ap);
1899   va_end (ap);
1900 }
1901
1902 /* Report an error at the current line number.  */
1903
1904 static void
1905 verror (msgid, ap)
1906      const char *msgid;
1907      va_list ap;
1908 {
1909   v_error_with_file_and_line (input_filename, lineno, msgid, ap);
1910 }
1911
1912 void
1913 error VPROTO((const char *msgid, ...))
1914 {
1915 #ifndef ANSI_PROTOTYPES
1916   const char *msgid;
1917 #endif
1918   va_list ap;
1919
1920   VA_START (ap, msgid);
1921
1922 #ifndef ANSI_PROTOTYPES
1923   msgid = va_arg (ap, const char *);
1924 #endif
1925
1926   verror (msgid, ap);
1927   va_end (ap);
1928 }
1929
1930 /* Report a fatal error at the current line number.  Allow a front end to
1931    intercept the message.  */
1932
1933 static void (*fatal_function) PROTO ((const char *, va_list));
1934
1935 /* Set the function to call when a fatal error occurs.  */
1936
1937 void
1938 set_fatal_function (f)
1939      void (*f) PROTO ((const char *, va_list));
1940 {
1941   fatal_function = f;
1942 }
1943
1944 static void
1945 vfatal (msgid, ap)
1946      const char *msgid;
1947      va_list ap;
1948 {
1949    if (fatal_function != 0)
1950      (*fatal_function) (_(msgid), ap);
1951
1952   verror (msgid, ap);
1953   exit (FATAL_EXIT_CODE);
1954 }
1955
1956 void
1957 fatal VPROTO((const char *msgid, ...))
1958 {
1959 #ifndef ANSI_PROTOTYPES
1960   const char *msgid;
1961 #endif
1962   va_list ap;
1963
1964   VA_START (ap, msgid);
1965
1966 #ifndef ANSI_PROTOTYPES
1967   msgid = va_arg (ap, const char *);
1968 #endif
1969
1970   vfatal (msgid, ap);
1971   va_end (ap);
1972 }
1973
1974 void
1975 _fatal_insn (msgid, insn, file, line, function)
1976      const char *msgid;
1977      rtx insn;
1978      const char *file;
1979      int line;
1980      const char *function;
1981 {
1982   error (msgid);
1983   debug_rtx (insn);
1984   fancy_abort (file, line, function);
1985 }
1986
1987 void
1988 _fatal_insn_not_found (insn, file, line, function)
1989      rtx insn;
1990      const char *file;
1991      int line;
1992      const char *function;
1993 {
1994   if (INSN_CODE (insn) < 0)
1995     _fatal_insn ("Unrecognizable insn:", insn, file, line, function);
1996   else
1997     _fatal_insn ("Insn does not satisfy its constraints:",
1998                 insn, file, line, function);
1999 }
2000
2001 /* Report a warning at line LINE of file FILE.  */
2002
2003 static void
2004 v_warning_with_file_and_line (file, line, msgid, ap)
2005      const char *file;
2006      int line;
2007      const char *msgid;
2008      va_list ap;
2009 {
2010   if (count_error (1))
2011     {
2012       report_error_function (file);
2013       v_message_with_file_and_line (file, line, 1, msgid, ap);
2014     }
2015 }
2016
2017 void
2018 warning_with_file_and_line VPROTO((const char *file, int line,
2019                                    const char *msgid, ...))
2020 {
2021 #ifndef ANSI_PROTOTYPES
2022   const char *file;
2023   int line;
2024   const char *msgid;
2025 #endif
2026   va_list ap;
2027
2028   VA_START (ap, msgid);
2029
2030 #ifndef ANSI_PROTOTYPES
2031   file = va_arg (ap, const char *);
2032   line = va_arg (ap, int);
2033   msgid = va_arg (ap, const char *);
2034 #endif
2035
2036   v_warning_with_file_and_line (file, line, msgid, ap);
2037   va_end (ap);
2038 }
2039
2040 /* Report a warning at the declaration DECL.
2041    MSGID is a format string which uses %s to substitute the declaration
2042    name; subsequent substitutions are a la printf.  */
2043
2044 static void
2045 v_warning_with_decl (decl, msgid, ap)
2046      tree decl;
2047      const char *msgid;
2048      va_list ap;
2049 {
2050   if (count_error (1))
2051     {
2052       report_error_function (DECL_SOURCE_FILE (decl));
2053       v_message_with_decl (decl, 1, msgid, ap);
2054     }
2055 }
2056
2057 void
2058 warning_with_decl VPROTO((tree decl, const char *msgid, ...))
2059 {
2060 #ifndef ANSI_PROTOTYPES
2061   tree decl;
2062   const char *msgid;
2063 #endif
2064   va_list ap;
2065
2066   VA_START (ap, msgid);
2067
2068 #ifndef ANSI_PROTOTYPES
2069   decl = va_arg (ap, tree);
2070   msgid = va_arg (ap, const char *);
2071 #endif
2072
2073   v_warning_with_decl (decl, msgid, ap);
2074   va_end (ap);
2075 }
2076
2077 /* Report a warning at the line number of the insn INSN.
2078    This is used only when INSN is an `asm' with operands,
2079    and each ASM_OPERANDS records its own source file and line.  */
2080
2081 static void
2082 v_warning_for_asm (insn, msgid, ap)
2083      rtx insn;
2084      const char *msgid;
2085      va_list ap;
2086 {
2087   if (count_error (1))
2088     {
2089       char *file;
2090       int line;
2091
2092       file_and_line_for_asm (insn, &file, &line);
2093       report_error_function (file);
2094       v_message_with_file_and_line (file, line, 1, msgid, ap);
2095     }
2096 }
2097
2098 void
2099 warning_for_asm VPROTO((rtx insn, const char *msgid, ...))
2100 {
2101 #ifndef ANSI_PROTOTYPES
2102   rtx insn;
2103   const char *msgid;
2104 #endif
2105   va_list ap;
2106
2107   VA_START (ap, msgid);
2108
2109 #ifndef ANSI_PROTOTYPES
2110   insn = va_arg (ap, rtx);
2111   msgid = va_arg (ap, const char *);
2112 #endif
2113
2114   v_warning_for_asm (insn, msgid, ap);
2115   va_end (ap);
2116 }
2117
2118 /* Report a warning at the current line number.  */
2119
2120 static void
2121 vwarning (msgid, ap)
2122      const char *msgid;
2123      va_list ap;
2124 {
2125   v_warning_with_file_and_line (input_filename, lineno, msgid, ap);
2126 }
2127
2128 void
2129 warning VPROTO((const char *msgid, ...))
2130 {
2131 #ifndef ANSI_PROTOTYPES
2132   const char *msgid;
2133 #endif
2134   va_list ap;
2135
2136   VA_START (ap, msgid);
2137
2138 #ifndef ANSI_PROTOTYPES
2139   msgid = va_arg (ap, const char *);
2140 #endif
2141
2142   vwarning (msgid, ap);
2143   va_end (ap);
2144 }
2145
2146 /* These functions issue either warnings or errors depending on
2147    -pedantic-errors.  */
2148
2149 static void
2150 vpedwarn (msgid, ap)
2151      const char *msgid;
2152      va_list ap;
2153 {
2154   if (flag_pedantic_errors)
2155     verror (msgid, ap);
2156   else
2157     vwarning (msgid, ap);
2158 }
2159
2160 void
2161 pedwarn VPROTO((const char *msgid, ...))
2162 {
2163 #ifndef ANSI_PROTOTYPES
2164   const char *msgid;
2165 #endif
2166   va_list ap;
2167
2168   VA_START (ap, msgid);
2169
2170 #ifndef ANSI_PROTOTYPES
2171   msgid = va_arg (ap, const char *);
2172 #endif
2173
2174   vpedwarn (msgid, ap);
2175   va_end (ap);
2176 }
2177
2178 static void
2179 v_pedwarn_with_decl (decl, msgid, ap)
2180      tree decl;
2181      const char *msgid;
2182      va_list ap;
2183 {
2184   /* We don't want -pedantic-errors to cause the compilation to fail from
2185      "errors" in system header files.  Sometimes fixincludes can't fix what's
2186      broken (eg: unsigned char bitfields - fixing it may change the alignment
2187      which will cause programs to mysteriously fail because the C library
2188      or kernel uses the original layout).  There's no point in issuing a
2189      warning either, it's just unnecessary noise.  */
2190
2191   if (! DECL_IN_SYSTEM_HEADER (decl))
2192     {
2193       if (flag_pedantic_errors)
2194         v_error_with_decl (decl, msgid, ap);
2195       else
2196         v_warning_with_decl (decl, msgid, ap);
2197     }
2198 }
2199
2200 void
2201 pedwarn_with_decl VPROTO((tree decl, const char *msgid, ...))
2202 {
2203 #ifndef ANSI_PROTOTYPES
2204   tree decl;
2205   const char *msgid;
2206 #endif
2207   va_list ap;
2208
2209   VA_START (ap, msgid);
2210
2211 #ifndef ANSI_PROTOTYPES
2212   decl = va_arg (ap, tree);
2213   msgid = va_arg (ap, const char *);
2214 #endif
2215
2216   v_pedwarn_with_decl (decl, msgid, ap);
2217   va_end (ap);
2218 }
2219
2220 static void
2221 v_pedwarn_with_file_and_line (file, line, msgid, ap)
2222      const char *file;
2223      int line;
2224      const char *msgid;
2225      va_list ap;
2226 {
2227   if (flag_pedantic_errors)
2228     v_error_with_file_and_line (file, line, msgid, ap);
2229   else
2230     v_warning_with_file_and_line (file, line, msgid, ap);
2231 }
2232
2233 void
2234 pedwarn_with_file_and_line VPROTO((const char *file, int line,
2235                                    const char *msgid, ...))
2236 {
2237 #ifndef ANSI_PROTOTYPES
2238   const char *file;
2239   int line;
2240   const char *msgid;
2241 #endif
2242   va_list ap;
2243
2244   VA_START (ap, msgid);
2245
2246 #ifndef ANSI_PROTOTYPES
2247   file = va_arg (ap, const char *);
2248   line = va_arg (ap, int);
2249   msgid = va_arg (ap, const char *);
2250 #endif
2251
2252   v_pedwarn_with_file_and_line (file, line, msgid, ap);
2253   va_end (ap);
2254 }
2255
2256 /* Apologize for not implementing some feature.  */
2257
2258 static void
2259 vsorry (msgid, ap)
2260      const char *msgid;
2261      va_list ap;
2262 {
2263   sorrycount++;
2264   if (input_filename)
2265     fprintf (stderr, "%s:%d: ", input_filename, lineno);
2266   else
2267     fprintf (stderr, "%s: ", progname);
2268   notice ("sorry, not implemented: ");
2269   vnotice (stderr, msgid, ap);
2270   fputc ('\n', stderr);
2271 }
2272
2273 void
2274 sorry VPROTO((const char *msgid, ...))
2275 {
2276 #ifndef ANSI_PROTOTYPES
2277   const char *msgid;
2278 #endif
2279   va_list ap;
2280
2281   VA_START (ap, msgid);
2282
2283 #ifndef ANSI_PROTOTYPES
2284   msgid = va_arg (ap, const char *);
2285 #endif
2286
2287   vsorry (msgid, ap);
2288   va_end (ap);
2289 }
2290 \f
2291
2292 /* This calls abort and is used to avoid problems when abort if a macro.
2293    It is used when we need to pass the address of abort.  */
2294
2295 void
2296 do_abort ()
2297 {
2298   abort ();
2299 }
2300
2301 /* When `malloc.c' is compiled with `rcheck' defined,
2302    it calls this function to report clobberage.  */
2303
2304 void
2305 botch (s)
2306   const char * s ATTRIBUTE_UNUSED;
2307 {
2308   abort ();
2309 }
2310 \f
2311 /* Return the logarithm of X, base 2, considering X unsigned,
2312    if X is a power of 2.  Otherwise, returns -1.
2313
2314    This should be used via the `exact_log2' macro.  */
2315
2316 int
2317 exact_log2_wide (x)
2318      register unsigned HOST_WIDE_INT x;
2319 {
2320   register int log = 0;
2321   /* Test for 0 or a power of 2.  */
2322   if (x == 0 || x != (x & -x))
2323     return -1;
2324   while ((x >>= 1) != 0)
2325     log++;
2326   return log;
2327 }
2328
2329 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
2330    If X is 0, return -1.
2331
2332    This should be used via the floor_log2 macro.  */
2333
2334 int
2335 floor_log2_wide (x)
2336      register unsigned HOST_WIDE_INT x;
2337 {
2338   register int log = -1;
2339   while (x != 0)
2340     log++,
2341     x >>= 1;
2342   return log;
2343 }
2344
2345 static int float_handler_set;
2346 int float_handled;
2347 jmp_buf float_handler;
2348
2349 /* Signals actually come here.  */
2350
2351 static void
2352 float_signal (signo)
2353      /* If this is missing, some compilers complain.  */
2354      int signo ATTRIBUTE_UNUSED;
2355 {
2356   if (float_handled == 0)
2357     abort ();
2358 #if defined (USG) || defined (hpux)
2359   signal (SIGFPE, float_signal);  /* re-enable the signal catcher */
2360 #endif
2361   float_handled = 0;
2362   signal (SIGFPE, float_signal);
2363   longjmp (float_handler, 1);
2364 }
2365
2366 /* Specify where to longjmp to when a floating arithmetic error happens.
2367    If HANDLER is 0, it means don't handle the errors any more.  */
2368
2369 void
2370 set_float_handler (handler)
2371      jmp_buf handler;
2372 {
2373   float_handled = (handler != 0);
2374   if (handler)
2375     bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
2376
2377   if (float_handled && ! float_handler_set)
2378     {
2379       signal (SIGFPE, float_signal);
2380       float_handler_set = 1;
2381     }
2382 }
2383
2384 /* This is a wrapper function for code which might elicit an
2385    arithmetic exception.  That code should be passed in as a function
2386    pointer FN, and one argument DATA.  DATA is usually a struct which
2387    contains the real input and output for function FN.  This function
2388    returns 0 (failure) if longjmp was called (i.e. an exception
2389    occured.)  It returns 1 (success) otherwise. */
2390
2391 int
2392 do_float_handler (fn, data)
2393   void (*fn) PROTO ((PTR));
2394   PTR data;
2395 {
2396   jmp_buf buf;
2397
2398   if (setjmp (buf))
2399     {
2400       /* We got here via longjmp() caused by an exception in function fn() */
2401       set_float_handler (NULL);
2402       return 0;
2403     }
2404
2405   set_float_handler (buf);
2406   (*fn)(data);
2407   set_float_handler (NULL);
2408   return 1;
2409 }
2410
2411 /* Specify, in HANDLER, where to longjmp to when a floating arithmetic
2412    error happens, pushing the previous specification into OLD_HANDLER.
2413    Return an indication of whether there was a previous handler in effect.  */
2414
2415 int
2416 push_float_handler (handler, old_handler)
2417      jmp_buf handler, old_handler;
2418 {
2419   int was_handled = float_handled;
2420
2421   float_handled = 1;
2422   if (was_handled)
2423     memcpy ((char *) old_handler, (char *) float_handler,
2424            sizeof (float_handler));
2425
2426   memcpy ((char *) float_handler, (char *) handler, sizeof (float_handler));
2427   return was_handled;
2428 }
2429
2430 /* Restore the previous specification of whether and where to longjmp to
2431    when a floating arithmetic error happens.  */
2432
2433 void
2434 pop_float_handler (handled, handler)
2435      int handled;
2436      jmp_buf handler;
2437 {
2438   float_handled = handled;
2439   if (handled)
2440     bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
2441 }
2442
2443 /* Handler for SIGPIPE.  */
2444
2445 static void
2446 pipe_closed (signo)
2447      /* If this is missing, some compilers complain.  */
2448      int signo ATTRIBUTE_UNUSED;
2449 {
2450   fatal ("output pipe has been closed");
2451 }
2452
2453 /* Strip off a legitimate source ending from the input string NAME of
2454    length LEN.  Rather than having to know the names used by all of
2455    our front ends, we strip off an ending of a period followed by
2456    up to five characters.  (Java uses ".class".) */
2457
2458 void
2459 strip_off_ending (name, len)
2460      char *name;
2461      int len;
2462 {
2463   int i;
2464   for (i = 2;  i < 6 && len > i;  i++)
2465     {
2466       if (name[len - i] == '.')
2467         {
2468           name[len - i] = '\0';
2469           break;
2470         }
2471     }
2472 }
2473
2474 /* Output a quoted string.  */
2475
2476 void
2477 output_quoted_string (asm_file, string)
2478      FILE *asm_file;
2479      const char *string;
2480 {
2481 #ifdef OUTPUT_QUOTED_STRING
2482   OUTPUT_QUOTED_STRING (asm_file, string);
2483 #else
2484   char c;
2485
2486   putc ('\"', asm_file);
2487   while ((c = *string++) != 0)
2488     {
2489       if (c == '\"' || c == '\\')
2490         putc ('\\', asm_file);
2491       putc (c, asm_file);
2492     }
2493   putc ('\"', asm_file);
2494 #endif
2495 }
2496
2497 /* Output a file name in the form wanted by System V.  */
2498
2499 void
2500 output_file_directive (asm_file, input_name)
2501      FILE *asm_file;
2502      const char *input_name;
2503 {
2504   int len = strlen (input_name);
2505   const char *na = input_name + len;
2506
2507   /* NA gets INPUT_NAME sans directory names.  */
2508   while (na > input_name)
2509     {
2510       if (na[-1] == '/')
2511         break;
2512 #ifdef DIR_SEPARATOR
2513       if (na[-1] == DIR_SEPARATOR)
2514         break;
2515 #endif
2516       na--;
2517     }
2518
2519 #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
2520   ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
2521 #else
2522 #ifdef ASM_OUTPUT_SOURCE_FILENAME
2523   ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
2524 #else
2525   fprintf (asm_file, "\t.file\t");
2526   output_quoted_string (asm_file, na);
2527   fputc ('\n', asm_file);
2528 #endif
2529 #endif
2530 }
2531 \f
2532 #ifdef ASM_IDENTIFY_LANGUAGE
2533 /* Routine to build language identifier for object file.  */
2534 static void
2535 output_lang_identify (asm_out_file)
2536      FILE *asm_out_file;
2537 {
2538   int len = strlen (lang_identify ()) + sizeof ("__gnu_compiled_") + 1;
2539   char *s = (char *) alloca (len);
2540   sprintf (s, "__gnu_compiled_%s", lang_identify ());
2541   ASM_OUTPUT_LABEL (asm_out_file, s);
2542 }
2543 #endif
2544
2545 /* Routine to open a dump file.  */
2546 static void
2547 open_dump_file (suffix, function_name)
2548      const char *suffix;
2549      const char *function_name;
2550 {
2551   char *dumpname;
2552
2553   TIMEVAR
2554     (dump_time,
2555      {
2556        dumpname = concat (dump_base_name, suffix, NULL);
2557
2558        if (rtl_dump_file != NULL)
2559          fclose (rtl_dump_file);
2560   
2561        rtl_dump_file = fopen (dumpname, "a");
2562        
2563        if (rtl_dump_file == NULL)
2564          pfatal_with_name (dumpname);
2565        
2566        free (dumpname);
2567
2568        if (function_name)
2569          fprintf (rtl_dump_file, "\n;; Function %s\n\n", function_name);
2570      });
2571   
2572   return;
2573 }
2574
2575 /* Routine to close a dump file.  */
2576 static void
2577 close_dump_file (func, insns)
2578      void (*func) PROTO ((FILE *, rtx));
2579      rtx    insns;
2580 {
2581   TIMEVAR
2582     (dump_time,
2583      {
2584        if (func)
2585          func (rtl_dump_file, insns);
2586        
2587        fflush (rtl_dump_file);
2588        fclose (rtl_dump_file);
2589        
2590        rtl_dump_file = NULL;
2591      });
2592
2593   return;
2594 }
2595
2596 /* Routine to dump rtl into a file.  */
2597 static void
2598 dump_rtl (suffix, decl, func, insns)
2599      const char *suffix;
2600      tree   decl;
2601      void (*func) PROTO ((FILE *, rtx));
2602      rtx    insns;
2603 {
2604   open_dump_file (suffix, decl_printable_name (decl, 2));
2605   close_dump_file (func, insns);
2606 }
2607
2608 /* Routine to empty a dump file.  */
2609 static void
2610 clean_dump_file (suffix)
2611   const char *suffix;
2612 {
2613   char * const dumpname = concat (dump_base_name, suffix, NULL);
2614
2615   rtl_dump_file = fopen (dumpname, "w");
2616
2617   if (rtl_dump_file == NULL)
2618     pfatal_with_name (dumpname);       
2619
2620   free (dumpname);
2621
2622   fclose (rtl_dump_file);
2623   rtl_dump_file = NULL;
2624   
2625   return;
2626 }
2627
2628 /* Do any final processing required for the declarations in VEC, of
2629    which there are LEN.  We write out inline functions and variables
2630    that have been deferred until this point, but which are required.
2631    Returns non-zero if anything was put out.  */ 
2632 int
2633 wrapup_global_declarations (vec, len)
2634      tree *vec;
2635      int len;
2636 {
2637   tree decl;
2638   int i;
2639   int reconsider;
2640   int output_something = 0;
2641
2642   for (i = 0; i < len; i++)
2643     {
2644       decl = vec[i];
2645       
2646       /* We're not deferring this any longer.  */
2647       DECL_DEFER_OUTPUT (decl) = 0;
2648       
2649       if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0
2650           && incomplete_decl_finalize_hook != 0)
2651         (*incomplete_decl_finalize_hook) (decl);
2652     }
2653
2654   /* Now emit any global variables or functions that we have been
2655      putting off.  We need to loop in case one of the things emitted
2656      here references another one which comes earlier in the list.  */
2657   do
2658     {
2659       reconsider = 0;
2660       for (i = 0; i < len; i++)
2661         {
2662           decl = vec[i];
2663
2664           if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
2665             continue;
2666
2667           /* Don't write out static consts, unless we still need them.
2668
2669              We also keep static consts if not optimizing (for debugging),
2670              unless the user specified -fno-keep-static-consts.
2671              ??? They might be better written into the debug information.
2672              This is possible when using DWARF.
2673
2674              A language processor that wants static constants to be always
2675              written out (even if it is not used) is responsible for
2676              calling rest_of_decl_compilation itself.  E.g. the C front-end
2677              calls rest_of_decl_compilation from finish_decl.
2678              One motivation for this is that is conventional in some
2679              environments to write things like:
2680              static const char rcsid[] = "... version string ...";
2681              intending to force the string to be in the executable.
2682
2683              A language processor that would prefer to have unneeded
2684              static constants "optimized away" would just defer writing
2685              them out until here.  E.g. C++ does this, because static
2686              constants are often defined in header files.
2687
2688              ??? A tempting alternative (for both C and C++) would be
2689              to force a constant to be written if and only if it is
2690              defined in a main file, as opposed to an include file.  */
2691
2692           if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2693               && (! TREE_READONLY (decl)
2694                   || TREE_PUBLIC (decl)
2695                   || (!optimize && flag_keep_static_consts)
2696                   || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2697             {
2698               reconsider = 1;
2699               rest_of_decl_compilation (decl, NULL_PTR, 1, 1);
2700             }
2701
2702           if (TREE_CODE (decl) == FUNCTION_DECL
2703               && DECL_INITIAL (decl) != 0
2704               && DECL_SAVED_INSNS (decl) != 0
2705               && (flag_keep_inline_functions
2706                   || (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
2707                   || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2708             {
2709               reconsider = 1;
2710               temporary_allocation ();
2711               output_inline_function (decl);
2712               permanent_allocation (1);
2713             }
2714         }
2715
2716       if (reconsider)
2717         output_something = 1;
2718     }
2719   while (reconsider);
2720
2721   return output_something;
2722 }
2723
2724 /* Issue appropriate warnings for the global declarations in VEC (of
2725    which there are LEN).  Output debugging information for them.  */
2726 void
2727 check_global_declarations (vec, len)
2728      tree *vec;
2729      int len;
2730 {
2731   tree decl;
2732   int i;
2733
2734   for (i = 0; i < len; i++)
2735     {
2736       decl = vec[i];
2737
2738       if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2739           && ! TREE_ASM_WRITTEN (decl))
2740         /* Cancel the RTL for this decl so that, if debugging info
2741            output for global variables is still to come,
2742            this one will be omitted.  */
2743         DECL_RTL (decl) = NULL;
2744
2745       /* Warn about any function
2746          declared static but not defined.
2747          We don't warn about variables,
2748          because many programs have static variables
2749          that exist only to get some text into the object file.  */
2750       if (TREE_CODE (decl) == FUNCTION_DECL
2751           && (warn_unused
2752               || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2753           && DECL_INITIAL (decl) == 0
2754           && DECL_EXTERNAL (decl)
2755           && ! DECL_ARTIFICIAL (decl)
2756           && ! TREE_PUBLIC (decl))
2757         {
2758           if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2759             pedwarn_with_decl (decl,
2760                                "`%s' used but never defined");
2761           else
2762             warning_with_decl (decl,
2763                                "`%s' declared `static' but never defined");
2764           /* This symbol is effectively an "extern" declaration now.  */
2765           TREE_PUBLIC (decl) = 1;
2766           assemble_external (decl);
2767         }
2768
2769       /* Warn about static fns or vars defined but not used,
2770          but not about inline functions or static consts
2771          since defining those in header files is normal practice.  */
2772       if (warn_unused
2773           && ((TREE_CODE (decl) == FUNCTION_DECL && ! DECL_INLINE (decl))
2774               || (TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
2775           && ! DECL_IN_SYSTEM_HEADER (decl)
2776           && ! DECL_EXTERNAL (decl)
2777           && ! TREE_PUBLIC (decl)
2778           && ! TREE_USED (decl)
2779           && (TREE_CODE (decl) == FUNCTION_DECL || ! DECL_REGISTER (decl))
2780           /* The TREE_USED bit for file-scope decls
2781              is kept in the identifier, to handle multiple
2782              external decls in different scopes.  */
2783           && ! TREE_USED (DECL_NAME (decl)))
2784         warning_with_decl (decl, "`%s' defined but not used");
2785
2786 #ifdef SDB_DEBUGGING_INFO
2787       /* The COFF linker can move initialized global vars to the end.
2788          And that can screw up the symbol ordering.
2789          By putting the symbols in that order to begin with,
2790          we avoid a problem.  mcsun!unido!fauern!tumuc!pes@uunet.uu.net.  */
2791       if (write_symbols == SDB_DEBUG && TREE_CODE (decl) == VAR_DECL
2792           && TREE_PUBLIC (decl) && DECL_INITIAL (decl)
2793           && ! DECL_EXTERNAL (decl)
2794           && DECL_RTL (decl) != 0)
2795         TIMEVAR (symout_time, sdbout_symbol (decl, 0));
2796
2797       /* Output COFF information for non-global
2798          file-scope initialized variables.  */
2799       if (write_symbols == SDB_DEBUG
2800           && TREE_CODE (decl) == VAR_DECL
2801           && DECL_INITIAL (decl)
2802           && ! DECL_EXTERNAL (decl)
2803           && DECL_RTL (decl) != 0
2804           && GET_CODE (DECL_RTL (decl)) == MEM)
2805         TIMEVAR (symout_time, sdbout_toplevel_data (decl));
2806 #endif /* SDB_DEBUGGING_INFO */
2807 #ifdef DWARF_DEBUGGING_INFO
2808       /* Output DWARF information for file-scope tentative data object
2809          declarations, file-scope (extern) function declarations (which
2810          had no corresponding body) and file-scope tagged type declarations
2811          and definitions which have not yet been forced out.  */
2812
2813       if (write_symbols == DWARF_DEBUG
2814           && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
2815         TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 1));
2816 #endif
2817 #ifdef DWARF2_DEBUGGING_INFO
2818       /* Output DWARF2 information for file-scope tentative data object
2819          declarations, file-scope (extern) function declarations (which
2820          had no corresponding body) and file-scope tagged type declarations
2821          and definitions which have not yet been forced out.  */
2822
2823       if (write_symbols == DWARF2_DEBUG
2824           && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
2825         TIMEVAR (symout_time, dwarf2out_decl (decl));
2826 #endif
2827     }
2828 }
2829
2830 /* Compile an entire file of output from cpp, named NAME.
2831    Write a file of assembly output and various debugging dumps.  */
2832
2833 static void
2834 compile_file (name)
2835      char *name;
2836 {
2837   tree globals;
2838   int start_time;
2839
2840   int name_specified = name != 0;
2841
2842   if (dump_base_name == 0)
2843     dump_base_name = name ? name : "gccdump";
2844
2845   parse_time = 0;
2846   varconst_time = 0;
2847   integration_time = 0;
2848   jump_time = 0;
2849   cse_time = 0;
2850   gcse_time = 0;
2851   loop_time = 0;
2852   cse2_time = 0;
2853   branch_prob_time = 0;
2854   flow_time = 0;
2855   combine_time = 0;
2856   regmove_time = 0;
2857   sched_time = 0;
2858   local_alloc_time = 0;
2859   global_alloc_time = 0;
2860   flow2_time = 0;
2861   peephole2_time = 0;
2862   sched2_time = 0;
2863   dbr_sched_time = 0;
2864   shorten_branch_time = 0;
2865   stack_reg_time = 0;
2866   final_time = 0;
2867   symout_time = 0;
2868   dump_time = 0;
2869
2870   /* Initialize data in various passes.  */
2871
2872   init_obstacks ();
2873   init_tree_codes ();
2874   name = init_parse (name);
2875   init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
2876                   || debug_info_level == DINFO_LEVEL_VERBOSE
2877                   || flag_test_coverage
2878                   || warn_notreached);
2879   init_regs ();
2880   init_decl_processing ();
2881   init_optabs ();
2882   init_stmt ();
2883   init_eh ();
2884   init_loop ();
2885   init_reload ();
2886   init_alias_once ();
2887   init_function_once ();
2888   init_stor_layout_once ();
2889   init_varasm_once ();
2890
2891   /* The following initialization functions need to generate rtl, so
2892      provide a dummy function context for them.  */
2893   init_dummy_function_start ();
2894   init_expmed ();
2895   init_expr_once ();
2896   if (flag_caller_saves)
2897     init_caller_save ();
2898   expand_dummy_function_end ();
2899
2900   /* If auxiliary info generation is desired, open the output file.
2901      This goes in the same directory as the source file--unlike
2902      all the other output files.  */
2903   if (flag_gen_aux_info)
2904     {
2905       aux_info_file = fopen (aux_info_file_name, "w");
2906       if (aux_info_file == 0)
2907         pfatal_with_name (aux_info_file_name);
2908     }
2909
2910   /* Clear the dump files.  */
2911   if (rtl_dump)
2912     clean_dump_file (".00.rtl");
2913   if (jump_opt_dump)
2914     {
2915       clean_dump_file (".01.jump");
2916       if (graph_dump_format != no_graph)
2917         clean_graph_dump_file (dump_base_name, ".01.jump");
2918     }
2919   if (cse_dump)
2920     {
2921       clean_dump_file (".02.cse");
2922       if (graph_dump_format != no_graph)
2923         clean_graph_dump_file (dump_base_name, ".02.cse");
2924     }
2925   if (addressof_dump)
2926     {
2927       clean_dump_file (".03.addressof");
2928       if (graph_dump_format != no_graph)
2929         clean_graph_dump_file (dump_base_name, ".03.addressof");
2930     }
2931   if (gcse_dump)
2932     {
2933       clean_dump_file (".04.gcse");
2934       if (graph_dump_format != no_graph)
2935         clean_graph_dump_file (dump_base_name, ".04.gcse");
2936     }
2937   if (loop_dump)
2938     {
2939       clean_dump_file (".05.loop");
2940       if (graph_dump_format != no_graph)
2941         clean_graph_dump_file (dump_base_name, ".05.loop");
2942     }
2943   if (cse2_dump)
2944     {
2945       clean_dump_file (".06.cse2");
2946       if (graph_dump_format != no_graph)
2947         clean_graph_dump_file (dump_base_name, ".06.cse2");
2948     }
2949   if (branch_prob_dump)
2950     {
2951       clean_dump_file (".07.bp");
2952       if (graph_dump_format != no_graph)
2953         clean_graph_dump_file (dump_base_name, ".07.bp");
2954     }
2955   if (flow_dump)
2956     {
2957       clean_dump_file (".08.flow");
2958       if (graph_dump_format != no_graph)
2959         clean_graph_dump_file (dump_base_name, ".08.flow");
2960     }
2961   if (combine_dump)
2962     {
2963       clean_dump_file (".09.combine");
2964       if (graph_dump_format != no_graph)
2965         clean_graph_dump_file (dump_base_name, ".09.combine");
2966     }
2967   if (regmove_dump)
2968     {
2969       clean_dump_file (".10.regmove");
2970       if (graph_dump_format != no_graph)
2971         clean_graph_dump_file (dump_base_name, ".10.regmove");
2972     }
2973 #ifdef INSN_SCHEDULING
2974   if (sched_dump)
2975     {
2976       clean_dump_file (".11.sched");
2977       if (graph_dump_format != no_graph)
2978         clean_graph_dump_file (dump_base_name, ".11.sched");
2979     }
2980 #endif
2981   if (local_reg_dump)
2982     {
2983       clean_dump_file (".12.lreg");
2984       if (graph_dump_format != no_graph)
2985         clean_graph_dump_file (dump_base_name, ".12.lreg");
2986     }
2987   if (global_reg_dump)
2988     {
2989       clean_dump_file (".13.greg");
2990       if (graph_dump_format != no_graph)
2991         clean_graph_dump_file (dump_base_name, ".13.greg");
2992     }
2993   if (flow2_dump)
2994     {
2995       clean_dump_file (".14.flow2");
2996       if (graph_dump_format != no_graph)
2997         clean_graph_dump_file (dump_base_name, ".14.flow2");
2998     }
2999 #ifdef HAVE_peephole2
3000   if (peephole2_dump)
3001     {
3002       clean_dump_file (".15.peephole2");
3003       if (graph_dump_format != no_graph)
3004         clean_graph_dump_file (dump_base_name, ".15.peephole2");
3005     }
3006 #endif
3007 #ifdef INSN_SCHEDULING
3008   if (sched2_dump)
3009     {
3010       clean_dump_file (".16.sched2");
3011       if (graph_dump_format != no_graph)
3012         clean_graph_dump_file (dump_base_name, ".16.sched2");
3013     }
3014 #endif
3015   if (jump2_opt_dump)
3016     {
3017       clean_dump_file (".17.jump2");
3018       if (graph_dump_format != no_graph)
3019         clean_graph_dump_file (dump_base_name, ".17.jump2");
3020     }
3021 #ifdef MACHINE_DEPENDENT_REORG
3022   if (mach_dep_reorg_dump)
3023     {
3024       clean_dump_file (".18.mach");
3025       if (graph_dump_format != no_graph)
3026         clean_graph_dump_file (dump_base_name, ".18.mach");
3027     }
3028 #endif
3029 #ifdef DELAY_SLOTS
3030   if (dbr_sched_dump)
3031     {
3032       clean_dump_file (".19.dbr");
3033       if (graph_dump_format != no_graph)
3034         clean_graph_dump_file (dump_base_name, ".19.dbr");
3035     }
3036 #endif
3037 #ifdef STACK_REGS
3038   if (stack_reg_dump)
3039     {
3040       clean_dump_file (".20.stack");
3041       if (graph_dump_format != no_graph)
3042         clean_graph_dump_file (dump_base_name, ".20.stack");
3043     }
3044 #endif
3045
3046   /* Open assembler code output file.  */
3047
3048   if (flag_syntax_only)
3049     asm_out_file = NULL;
3050   else
3051     {
3052       if (! name_specified && asm_file_name == 0)
3053         asm_out_file = stdout;
3054       else
3055         {
3056           if (asm_file_name == 0)
3057             {
3058               int len = strlen (dump_base_name);
3059               char *dumpname = (char *) xmalloc (len + 6);
3060               memcpy (dumpname, dump_base_name, len + 1);
3061               strip_off_ending (dumpname, len);
3062               strcat (dumpname, ".s");
3063               asm_file_name = dumpname;
3064             }
3065           if (!strcmp (asm_file_name, "-"))
3066             asm_out_file = stdout;
3067           else
3068             asm_out_file = fopen (asm_file_name, "w");
3069           if (asm_out_file == 0)
3070             pfatal_with_name (asm_file_name);
3071         }
3072
3073 #ifdef IO_BUFFER_SIZE
3074       setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
3075                _IOFBF, IO_BUFFER_SIZE);
3076 #endif
3077     }
3078
3079   if (ggc_p)
3080     name = ggc_alloc_string (name, strlen (name));
3081   input_filename = name;
3082
3083   /* Put an entry on the input file stack for the main input file.  */
3084   input_file_stack
3085     = (struct file_stack *) xmalloc (sizeof (struct file_stack));
3086   input_file_stack->next = 0;
3087   input_file_stack->name = input_filename;
3088
3089   /* Perform language-specific initialization.
3090      This may set main_input_filename.  */
3091   lang_init ();
3092
3093   /* If the input doesn't start with a #line, use the input name
3094      as the official input file name.  */
3095   if (main_input_filename == 0)
3096     main_input_filename = name;
3097
3098   if (flag_syntax_only)
3099     {
3100       write_symbols = NO_DEBUG;
3101       profile_flag = 0;
3102       profile_block_flag = 0;
3103     }
3104   else
3105     {
3106       ASM_FILE_START (asm_out_file);
3107
3108 #ifdef ASM_COMMENT_START
3109       if (flag_verbose_asm)
3110         {
3111           /* Print the list of options in effect.  */
3112           print_version (asm_out_file, ASM_COMMENT_START);
3113           print_switch_values (asm_out_file, 0, MAX_LINE,
3114                                ASM_COMMENT_START, " ", "\n");
3115           /* Add a blank line here so it appears in assembler output but not
3116              screen output.  */
3117           fprintf (asm_out_file, "\n");
3118         }
3119 #endif
3120
3121       /* Output something to inform GDB that this compilation was by GCC.  */
3122 #ifndef ASM_IDENTIFY_GCC
3123       fprintf (asm_out_file, "gcc2_compiled.:\n");
3124 #else
3125       ASM_IDENTIFY_GCC (asm_out_file);
3126 #endif
3127
3128   /* Output something to identify which front-end produced this file.  */
3129 #ifdef ASM_IDENTIFY_LANGUAGE
3130       ASM_IDENTIFY_LANGUAGE (asm_out_file);
3131 #endif
3132     } /* ! flag_syntax_only */
3133
3134 #ifndef ASM_OUTPUT_SECTION_NAME
3135   if (flag_function_sections)
3136     {
3137       warning ("-ffunction-sections not supported for this target.");
3138       flag_function_sections = 0;
3139     }
3140   if (flag_data_sections)
3141     {
3142       warning ("-fdata-sections not supported for this target.");
3143       flag_data_sections = 0;
3144     }
3145 #endif
3146
3147   if (flag_function_sections
3148       && (profile_flag || profile_block_flag))
3149     {
3150       warning ("-ffunction-sections disabled; it makes profiling impossible.");
3151       flag_function_sections = 0;
3152     }
3153
3154 #ifndef OBJECT_FORMAT_ELF
3155   if (flag_function_sections && write_symbols != NO_DEBUG)
3156     warning ("-ffunction-sections may affect debugging on some targets.");
3157 #endif
3158
3159   /* ??? Note: There used to be a conditional here
3160       to call assemble_zeros without fail if DBX_DEBUGGING_INFO is defined.
3161       This was to guarantee separation between gcc_compiled. and
3162       the first function, for the sake of dbx on Suns.
3163       However, having the extra zero here confused the Emacs
3164       code for unexec, and might confuse other programs too.
3165       Therefore, I took out that change.
3166       In future versions we should find another way to solve
3167       that dbx problem.  -- rms, 23 May 93.  */
3168       
3169   /* Don't let the first function fall at the same address
3170      as gcc_compiled., if profiling.  */
3171   if (profile_flag || profile_block_flag)
3172     {
3173       /* It's best if we can write a nop here since some
3174          assemblers don't tolerate zeros in the text section.  */
3175       output_asm_insn (get_insn_template (CODE_FOR_nop, NULL), NULL_PTR);
3176     }
3177
3178   /* If dbx symbol table desired, initialize writing it
3179      and output the predefined types.  */
3180 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
3181   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
3182     TIMEVAR (symout_time, dbxout_init (asm_out_file, main_input_filename,
3183                                        getdecls ()));
3184 #endif
3185 #ifdef SDB_DEBUGGING_INFO
3186   if (write_symbols == SDB_DEBUG)
3187     TIMEVAR (symout_time, sdbout_init (asm_out_file, main_input_filename,
3188                                        getdecls ()));
3189 #endif
3190 #ifdef DWARF_DEBUGGING_INFO
3191   if (write_symbols == DWARF_DEBUG)
3192     TIMEVAR (symout_time, dwarfout_init (asm_out_file, main_input_filename));
3193 #endif
3194 #ifdef DWARF2_UNWIND_INFO
3195   if (dwarf2out_do_frame ())
3196     dwarf2out_frame_init ();
3197 #endif
3198 #ifdef DWARF2_DEBUGGING_INFO
3199   if (write_symbols == DWARF2_DEBUG)
3200     TIMEVAR (symout_time, dwarf2out_init (asm_out_file, main_input_filename));
3201 #endif
3202
3203   /* Initialize yet another pass.  */
3204
3205   init_final (main_input_filename);
3206   init_branch_prob (dump_base_name);
3207
3208   start_time = get_run_time ();
3209
3210   /* Call the parser, which parses the entire file
3211      (calling rest_of_compilation for each function).  */
3212
3213   if (yyparse () != 0)
3214     {
3215       if (errorcount == 0)
3216         notice ("Errors detected in input file (your bison.simple is out of date)\n");
3217
3218       /* In case there were missing closebraces,
3219          get us back to the global binding level.  */
3220       while (! global_bindings_p ())
3221         poplevel (0, 0, 0);
3222     }
3223
3224   /* Compilation is now finished except for writing
3225      what's left of the symbol table output.  */
3226
3227   parse_time += get_run_time () - start_time;
3228
3229   parse_time -= integration_time;
3230   parse_time -= varconst_time;
3231
3232   if (flag_syntax_only)
3233     goto finish_syntax;
3234
3235   globals = getdecls ();
3236
3237   /* Really define vars that have had only a tentative definition.
3238      Really output inline functions that must actually be callable
3239      and have not been output so far.  */
3240
3241   {
3242     int len = list_length (globals);
3243     tree *vec = (tree *) xmalloc (sizeof (tree) * len);
3244     int i;
3245     tree decl;
3246
3247     /* Process the decls in reverse order--earliest first.
3248        Put them into VEC from back to front, then take out from front.  */
3249
3250     for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
3251       vec[len - i - 1] = decl;
3252
3253     wrapup_global_declarations (vec, len);
3254
3255     /* This must occur after the loop to output deferred functions.  Else
3256        the profiler initializer would not be emitted if all the functions
3257        in this compilation unit were deferred.
3258
3259        output_func_start_profiler can not cause any additional functions or
3260        data to need to be output, so it need not be in the deferred function
3261        loop above.  */
3262     output_func_start_profiler ();
3263
3264     /* Now that all possible functions have been output, we can dump
3265        the exception table.  */
3266
3267     output_exception_table ();
3268
3269     check_global_declarations (vec, len);
3270
3271     /* Clean up.  */
3272     free (vec);
3273   }
3274
3275   /* Write out any pending weak symbol declarations.  */
3276
3277   weak_finish ();
3278
3279   /* Do dbx symbols */
3280 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
3281   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
3282     TIMEVAR (symout_time,
3283              {
3284                dbxout_finish (asm_out_file, main_input_filename);
3285              });
3286 #endif
3287
3288 #ifdef DWARF_DEBUGGING_INFO
3289   if (write_symbols == DWARF_DEBUG)
3290     TIMEVAR (symout_time,
3291              {
3292                dwarfout_finish ();
3293              });
3294 #endif
3295
3296 #ifdef DWARF2_UNWIND_INFO
3297   if (dwarf2out_do_frame ())
3298     dwarf2out_frame_finish ();
3299 #endif
3300
3301 #ifdef DWARF2_DEBUGGING_INFO
3302   if (write_symbols == DWARF2_DEBUG)
3303     TIMEVAR (symout_time,
3304              {
3305                dwarf2out_finish ();
3306              });
3307 #endif
3308
3309   /* Output some stuff at end of file if nec.  */
3310
3311   end_final (dump_base_name);
3312    
3313   if (branch_prob_dump)
3314     open_dump_file (".07.bp", NULL);
3315    
3316   TIMEVAR (dump_time, end_branch_prob (rtl_dump_file));
3317    
3318   if (branch_prob_dump)
3319     close_dump_file (NULL, NULL_RTX);
3320    
3321 #ifdef ASM_FILE_END
3322   ASM_FILE_END (asm_out_file);
3323 #endif
3324
3325
3326   /* Language-specific end of compilation actions.  */
3327  finish_syntax:
3328   lang_finish ();
3329
3330   /* Close the dump files.  */
3331
3332   if (flag_gen_aux_info)
3333     {
3334       fclose (aux_info_file);
3335       if (errorcount)
3336         unlink (aux_info_file_name);
3337     }
3338
3339   if (combine_dump)
3340     {
3341       open_dump_file (".09.combine", NULL);
3342       TIMEVAR (dump_time, dump_combine_total_stats (rtl_dump_file));
3343       close_dump_file (NULL, NULL_RTX);
3344     }
3345
3346   /* Close non-debugging input and output files.  Take special care to note
3347      whether fclose returns an error, since the pages might still be on the
3348      buffer chain while the file is open.  */
3349
3350   finish_parse ();
3351
3352   if (! flag_syntax_only
3353       && (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0))
3354     fatal_io_error (asm_file_name);
3355
3356   /* Do whatever is necessary to finish printing the graphs.  */
3357   if (graph_dump_format != no_graph)
3358     {
3359       if (jump_opt_dump)
3360         finish_graph_dump_file (dump_base_name, ".01.jump");
3361       if (cse_dump)
3362         finish_graph_dump_file (dump_base_name, ".02.cse");
3363       if (addressof_dump)
3364         finish_graph_dump_file (dump_base_name, ".03.addressof");
3365       if (gcse_dump)
3366         finish_graph_dump_file (dump_base_name, ".04.gcse");
3367       if (loop_dump)
3368         finish_graph_dump_file (dump_base_name, ".05.loop");
3369       if (cse2_dump)
3370         finish_graph_dump_file (dump_base_name, ".06.cse2");
3371       if (branch_prob_dump)
3372         finish_graph_dump_file (dump_base_name, ".07.bp");
3373       if (flow_dump)
3374         finish_graph_dump_file (dump_base_name, ".08.flow");
3375       if (combine_dump)
3376         finish_graph_dump_file (dump_base_name, ".09.combine");
3377       if (regmove_dump)
3378         finish_graph_dump_file (dump_base_name, ".10.regmove");
3379 #ifdef INSN_SCHEDULING
3380       if (sched_dump)
3381         finish_graph_dump_file (dump_base_name, ".11.sched");
3382 #endif
3383       if (local_reg_dump)
3384         finish_graph_dump_file (dump_base_name, ".12.lreg");
3385       if (global_reg_dump)
3386         finish_graph_dump_file (dump_base_name, ".13.greg");
3387       if (flow2_dump)
3388         finish_graph_dump_file (dump_base_name, ".14.flow2");
3389 #ifdef HAVE_peephole2
3390       if (flow2_dump)
3391         finish_graph_dump_file (dump_base_name, ".15.peephole2");
3392 #endif
3393 #ifdef INSN_SCHEDULING
3394       if (sched2_dump)
3395         finish_graph_dump_file (dump_base_name, ".16.sched2");
3396 #endif
3397       if (jump2_opt_dump)
3398         finish_graph_dump_file (dump_base_name, ".17.jump2");
3399 #ifdef MACHINE_DEPENDENT_REORG
3400       if (mach_dep_reorg_dump)
3401         finish_graph_dump_file (dump_base_name, ".18.mach");
3402 #endif
3403 #ifdef DELAY_SLOTS
3404       if (dbr_sched_dump)
3405         finish_graph_dump_file (dump_base_name, ".19.dbr");
3406 #endif
3407 #ifdef STACK_REGS
3408       if (stack_reg_dump)
3409         finish_graph_dump_file (dump_base_name, ".20.stack");
3410 #endif
3411     }
3412
3413   /* Free up memory for the benefit of leak detectors.  */
3414   free_reg_info ();
3415
3416   /* Print the times.  */
3417
3418   if (! quiet_flag)
3419     {
3420       all_time = get_run_time ();
3421
3422       fprintf (stderr,"\n");
3423
3424       print_time ("parse", parse_time);
3425       print_time ("integration", integration_time);
3426       print_time ("jump", jump_time);
3427       print_time ("cse", cse_time);
3428       print_time ("gcse", gcse_time);
3429       print_time ("loop", loop_time);
3430       print_time ("cse2", cse2_time);
3431       print_time ("branch-prob", branch_prob_time);
3432       print_time ("flow", flow_time);
3433       print_time ("combine", combine_time);
3434       print_time ("regmove", regmove_time);
3435 #ifdef INSN_SCHEDULING
3436       print_time ("sched", sched_time);
3437 #endif
3438       print_time ("local-alloc", local_alloc_time);
3439       print_time ("global-alloc", global_alloc_time);
3440       print_time ("flow2", flow2_time);
3441 #ifdef HAVE_peephole2
3442       print_time ("peephole2", peephole2_time);
3443 #endif
3444 #ifdef INSN_SCHEDULING
3445       print_time ("sched2", sched2_time);
3446 #endif
3447 #ifdef DELAY_SLOTS
3448       print_time ("dbranch", dbr_sched_time);
3449 #endif
3450       print_time ("shorten-branch", shorten_branch_time);
3451 #ifdef STACK_REGS
3452       print_time ("stack-reg", stack_reg_time);
3453 #endif
3454       print_time ("final", final_time);
3455       print_time ("varconst", varconst_time);
3456       print_time ("symout", symout_time);
3457       print_time ("dump", dump_time);
3458       if (ggc_p)
3459         print_time ("gc", gc_time);
3460     }
3461 }
3462 \f
3463 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
3464    and TYPE_DECL nodes.
3465
3466    This does nothing for local (non-static) variables, unless the
3467    variable is a register variable with an ASMSPEC.  In that case, or
3468    if the variable is not an automatice, it sets up the RTL and
3469    outputs any assembler code (label definition, storage allocation
3470    and initialization).
3471
3472    DECL is the declaration.  If ASMSPEC is nonzero, it specifies
3473    the assembler symbol name to be used.  TOP_LEVEL is nonzero
3474    if this declaration is not within a function.  */
3475
3476 void
3477 rest_of_decl_compilation (decl, asmspec, top_level, at_end)
3478      tree decl;
3479      const char *asmspec;
3480      int top_level;
3481      int at_end;
3482 {
3483   /* Declarations of variables, and of functions defined elsewhere.  */
3484
3485 /* The most obvious approach, to put an #ifndef around where
3486    this macro is used, doesn't work since it's inside a macro call.  */
3487 #ifndef ASM_FINISH_DECLARE_OBJECT
3488 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP, END)
3489 #endif
3490
3491   /* Forward declarations for nested functions are not "external",
3492      but we need to treat them as if they were.  */
3493   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
3494       || TREE_CODE (decl) == FUNCTION_DECL)
3495     TIMEVAR (varconst_time,
3496              {
3497                make_decl_rtl (decl, asmspec, top_level);
3498                /* Initialized extern variable exists to be replaced
3499                   with its value, or represents something that will be
3500                   output in another file.  */
3501                if (! (TREE_CODE (decl) == VAR_DECL
3502                       && DECL_EXTERNAL (decl) && TREE_READONLY (decl)
3503                       && DECL_INITIAL (decl) != 0
3504                       && DECL_INITIAL (decl) != error_mark_node))
3505                  /* Don't output anything
3506                     when a tentative file-scope definition is seen.
3507                     But at end of compilation, do output code for them.  */
3508                  if (! (! at_end && top_level
3509                         && (DECL_INITIAL (decl) == 0
3510                             || DECL_INITIAL (decl) == error_mark_node)))
3511                    assemble_variable (decl, top_level, at_end, 0);
3512                if (decl == last_assemble_variable_decl)
3513                  {
3514                    ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
3515                                               top_level, at_end);
3516                  }
3517              });
3518   else if (DECL_REGISTER (decl) && asmspec != 0)
3519     {
3520       if (decode_reg_name (asmspec) >= 0)
3521         {
3522           DECL_RTL (decl) = 0;
3523           make_decl_rtl (decl, asmspec, top_level);
3524         }
3525       else
3526         error ("invalid register name `%s' for register variable", asmspec);
3527     }
3528 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
3529   else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
3530            && TREE_CODE (decl) == TYPE_DECL)
3531     TIMEVAR (symout_time, dbxout_symbol (decl, 0));
3532 #endif
3533 #ifdef SDB_DEBUGGING_INFO
3534   else if (write_symbols == SDB_DEBUG && top_level
3535            && TREE_CODE (decl) == TYPE_DECL)
3536     TIMEVAR (symout_time, sdbout_symbol (decl, 0));
3537 #endif
3538 }
3539
3540 /* Called after finishing a record, union or enumeral type.  */
3541
3542 void
3543 rest_of_type_compilation (type, toplev)
3544 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO) || defined (SDB_DEBUGGING_INFO)
3545      tree type;
3546      int toplev;
3547 #else
3548      tree type ATTRIBUTE_UNUSED;
3549      int toplev ATTRIBUTE_UNUSED;
3550 #endif
3551 {
3552 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
3553   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
3554     TIMEVAR (symout_time, dbxout_symbol (TYPE_STUB_DECL (type), !toplev));
3555 #endif
3556 #ifdef SDB_DEBUGGING_INFO
3557   if (write_symbols == SDB_DEBUG)
3558     TIMEVAR (symout_time, sdbout_symbol (TYPE_STUB_DECL (type), !toplev));
3559 #endif
3560 }
3561
3562 /* This is called from finish_function (within yyparse)
3563    after each top-level definition is parsed.
3564    It is supposed to compile that function or variable
3565    and output the assembler code for it.
3566    After we return, the tree storage is freed.  */
3567
3568 void
3569 rest_of_compilation (decl)
3570      tree decl;
3571 {
3572   register rtx insns;
3573   int start_time = get_run_time ();
3574   int tem;
3575   int failure = 0;
3576   int rebuild_label_notes_after_reload;
3577
3578   /* First, remove any notes we don't need.  That will make iterating
3579      over the instruction sequence faster, and allow the garbage
3580      collector to reclaim the memory used by the notes.  */
3581   remove_unncessary_notes ();
3582
3583   /* If we are reconsidering an inline function
3584      at the end of compilation, skip the stuff for making it inline.  */
3585
3586   if (DECL_SAVED_INSNS (decl) == 0)
3587     {
3588       int inlinable = 0;
3589       tree parent;
3590       const char *lose;
3591
3592       /* If this is nested inside an inlined external function, pretend
3593          it was only declared.  Since we cannot inline such functions,
3594          generating code for this one is not only not necessary but will
3595          confuse some debugging output writers.  */
3596       for (parent = DECL_CONTEXT (current_function_decl);
3597            parent != 0; parent = DECL_CONTEXT (parent))
3598         if (TREE_CODE (parent) == FUNCTION_DECL
3599             && DECL_INLINE (parent) && DECL_EXTERNAL (parent))
3600           {
3601             DECL_INITIAL (decl) = 0;
3602             goto exit_rest_of_compilation;
3603           }
3604
3605       /* If requested, consider whether to make this function inline.  */
3606       if (DECL_INLINE (decl) || flag_inline_functions)
3607         TIMEVAR (integration_time,
3608                  {
3609                    lose = function_cannot_inline_p (decl);
3610                    if (lose || ! optimize)
3611                      {
3612                        if (warn_inline && DECL_INLINE (decl))
3613                          warning_with_decl (decl, lose);
3614                        DECL_ABSTRACT_ORIGIN (decl) = 0;
3615                        /* Don't really compile an extern inline function.
3616                           If we can't make it inline, pretend
3617                           it was only declared.  */
3618                        if (DECL_EXTERNAL (decl))
3619                          {
3620                            DECL_INITIAL (decl) = 0;
3621                            goto exit_rest_of_compilation;
3622                          }
3623                      }
3624                    else
3625                      /* ??? Note that this has the effect of making it look
3626                         like "inline" was specified for a function if we choose
3627                         to inline it.  This isn't quite right, but it's
3628                         probably not worth the trouble to fix.  */
3629                      inlinable = DECL_INLINE (decl) = 1;
3630                  });
3631
3632       insns = get_insns ();
3633
3634       /* Dump the rtl code if we are dumping rtl.  */
3635
3636       if (rtl_dump)
3637         {
3638           open_dump_file (".00.rtl", decl_printable_name (decl, 2));
3639           
3640           if (DECL_SAVED_INSNS (decl))
3641             fprintf (rtl_dump_file, ";; (integrable)\n\n");
3642           
3643           close_dump_file (print_rtl, insns);
3644         }
3645
3646       /* If function is inline, and we don't yet know whether to
3647          compile it by itself, defer decision till end of compilation.
3648          finish_compilation will call rest_of_compilation again
3649          for those functions that need to be output.  Also defer those
3650          functions that we are supposed to defer.  */
3651
3652       if (inlinable)
3653         DECL_DEFER_OUTPUT (decl) = 1;
3654
3655       if (DECL_DEFER_OUTPUT (decl)
3656           || (DECL_INLINE (decl)
3657               && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
3658                    && ! flag_keep_inline_functions)
3659                   || DECL_EXTERNAL (decl))))
3660         {
3661           DECL_DEFER_OUTPUT (decl) = 1;
3662
3663           /* If -Wreturn-type, we have to do a bit of compilation.
3664              However, if we just fall through we will call
3665              save_for_inline_copying() which results in excessive
3666              memory use.  Instead, we just want to call
3667              jump_optimize() to figure out whether or not we can fall
3668              off the end of the function; we do the minimum amount of
3669              work necessary to make that safe.  And, we set optimize
3670              to zero to keep jump_optimize from working too hard.  */
3671           if (warn_return_type)
3672             {
3673               int saved_optimize = optimize;
3674               optimize = 0;
3675               find_exception_handler_labels ();
3676               jump_optimize (get_insns(), !JUMP_CROSS_JUMP, !JUMP_NOOP_MOVES,
3677                              !JUMP_AFTER_REGSCAN);
3678               optimize = saved_optimize;
3679             }
3680
3681 #ifdef DWARF_DEBUGGING_INFO
3682           /* Generate the DWARF info for the "abstract" instance
3683              of a function which we may later generate inlined and/or
3684              out-of-line instances of.  */
3685           if (write_symbols == DWARF_DEBUG)
3686             {
3687               set_decl_abstract_flags (decl, 1);
3688               TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
3689               set_decl_abstract_flags (decl, 0);
3690             }
3691 #endif
3692 #ifdef DWARF2_DEBUGGING_INFO
3693           /* Generate the DWARF2 info for the "abstract" instance
3694              of a function which we may later generate inlined and/or
3695              out-of-line instances of.  */
3696           if (write_symbols == DWARF2_DEBUG)
3697             {
3698               set_decl_abstract_flags (decl, 1);
3699               TIMEVAR (symout_time, dwarf2out_decl (decl));
3700               set_decl_abstract_flags (decl, 0);
3701             }
3702 #endif
3703           TIMEVAR (integration_time, save_for_inline_nocopy (decl));
3704           DECL_SAVED_INSNS (decl)->inlinable = inlinable;
3705           goto exit_rest_of_compilation;
3706         }
3707
3708       /* If specified extern inline but we aren't inlining it, we are
3709          done.  This goes for anything that gets here with DECL_EXTERNAL
3710          set, not just things with DECL_INLINE.  */
3711       if (DECL_EXTERNAL (decl))
3712         goto exit_rest_of_compilation;
3713     }
3714
3715   /* Initialize some variables used by the optimizers.  */
3716   init_function_for_compilation ();
3717
3718   if (! DECL_DEFER_OUTPUT (decl))
3719     TREE_ASM_WRITTEN (decl) = 1;
3720
3721   /* Now that integrate will no longer see our rtl, we need not distinguish
3722      between the return value of this function and the return value of called
3723      functions.  */
3724   rtx_equal_function_value_matters = 0;
3725
3726   /* Don't return yet if -Wreturn-type; we need to do jump_optimize.  */
3727   if ((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
3728     {
3729       goto exit_rest_of_compilation;
3730     }
3731
3732   /* Emit code to get eh context, if needed. */
3733   emit_eh_context ();
3734
3735 #ifdef FINALIZE_PIC
3736   /* If we are doing position-independent code generation, now
3737      is the time to output special prologues and epilogues.
3738      We do not want to do this earlier, because it just clutters
3739      up inline functions with meaningless insns.  */
3740   if (flag_pic)
3741     FINALIZE_PIC;
3742 #endif
3743
3744   /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
3745      Note that that may have been done above, in save_for_inline_copying.
3746      The call to resume_temporary_allocation near the end of this function
3747      goes back to the usual state of affairs.  This must be done after
3748      we've built up any unwinders for exception handling, and done
3749      the FINALIZE_PIC work, if necessary.  */
3750
3751   rtl_in_current_obstack ();
3752
3753   insns = get_insns ();
3754
3755   /* Copy any shared structure that should not be shared.  */
3756
3757   unshare_all_rtl (insns);
3758
3759   init_EXPR_INSN_LIST_cache ();
3760
3761 #ifdef SETJMP_VIA_SAVE_AREA
3762   /* This must be performed before virutal register instantiation.  */
3763   if (current_function_calls_alloca)
3764     optimize_save_area_alloca (insns);
3765 #endif
3766
3767   /* Instantiate all virtual registers.  */
3768
3769   instantiate_virtual_regs (current_function_decl, get_insns ());
3770
3771   /* See if we have allocated stack slots that are not directly addressable.
3772      If so, scan all the insns and create explicit address computation
3773      for all references to such slots.  */
3774   /* fixup_stack_slots (); */
3775
3776   /* Find all the EH handlers.  */
3777   find_exception_handler_labels ();
3778
3779   if (jump_opt_dump)
3780     open_dump_file (".01.jump", decl_printable_name (decl, 2));
3781
3782   /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
3783      are initialized and to compute whether control can drop off the end
3784      of the function.  */
3785   TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
3786   TIMEVAR (jump_time, jump_optimize (insns, !JUMP_CROSS_JUMP, !JUMP_NOOP_MOVES,
3787                                      JUMP_AFTER_REGSCAN));
3788
3789   /* Jump optimization, and the removal of NULL pointer checks, may
3790      have reduced the number of instructions substantially.  CSE, and
3791      future passes, allocate arrays whose dimensions involve the maximum
3792      instruction UID, so if we can reduce the maximum UID we'll save big on
3793      memory.  */
3794   renumber_insns (rtl_dump_file);
3795
3796   /* Dump rtl code after jump, if we are doing that.  */
3797   if (jump_opt_dump)
3798     close_dump_file (print_rtl, insns);
3799
3800   /* Now is when we stop if -fsyntax-only and -Wreturn-type.  */
3801   if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
3802     goto exit_rest_of_compilation;
3803
3804   /* Try to identify useless null pointer tests and delete them.  */
3805   if (flag_delete_null_pointer_checks)
3806     TIMEVAR (jump_time, delete_null_pointer_checks (get_insns ()));
3807
3808   if (ggc_p)
3809     ggc_collect ();
3810
3811   /* Perform common subexpression elimination.
3812      Nonzero value from `cse_main' means that jumps were simplified
3813      and some code may now be unreachable, so do
3814      jump optimization again.  */
3815
3816   if (optimize > 0)
3817     {
3818       if (cse_dump)
3819         open_dump_file (".02.cse", decl_printable_name (decl, 2));
3820
3821       TIMEVAR (cse_time, reg_scan (insns, max_reg_num (), 1));
3822
3823       if (flag_thread_jumps)
3824         TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 1));
3825
3826       TIMEVAR (cse_time, tem = cse_main (insns, max_reg_num (),
3827                                          0, rtl_dump_file));
3828       /* If we are not running the second CSE pass, then we are no longer
3829          expecting CSE to be run.  */
3830       cse_not_expected = !flag_rerun_cse_after_loop;
3831
3832       if (tem || optimize > 1)
3833         TIMEVAR (jump_time, jump_optimize (insns, !JUMP_CROSS_JUMP,
3834                                            !JUMP_NOOP_MOVES,
3835                                            !JUMP_AFTER_REGSCAN));
3836  
3837       /* Run this after jump optmizations remove all the unreachable code
3838          so that unreachable code will not keep values live.  */
3839       TIMEVAR (cse_time, delete_trivially_dead_insns (insns, max_reg_num ()));
3840
3841       /* Try to identify useless null pointer tests and delete them.  */
3842       if (flag_delete_null_pointer_checks)
3843         TIMEVAR (jump_time, delete_null_pointer_checks (get_insns ()));
3844
3845       /* The second pass of jump optimization is likely to have
3846          removed a bunch more instructions.  */
3847       renumber_insns (rtl_dump_file);
3848
3849       /* Dump rtl code after cse, if we are doing that.  */
3850       if (cse_dump)
3851         {
3852           close_dump_file (print_rtl, insns);
3853           if (graph_dump_format != no_graph)
3854             print_rtl_graph_with_bb (dump_base_name, ".02.cse", insns);
3855         }
3856     }
3857
3858   purge_addressof (insns);
3859   reg_scan (insns, max_reg_num (), 1);
3860
3861   if (addressof_dump)
3862     {
3863       dump_rtl (".03.addressof", decl, print_rtl, insns);
3864       if (graph_dump_format != no_graph)
3865         print_rtl_graph_with_bb (dump_base_name, ".03.addressof", insns);
3866     }
3867
3868   if (ggc_p)
3869     ggc_collect ();
3870
3871   /* Perform global cse.  */
3872
3873   if (optimize > 0 && flag_gcse)
3874     {
3875       if (gcse_dump)
3876         open_dump_file (".04.gcse", decl_printable_name (decl, 2));
3877
3878       TIMEVAR (gcse_time, tem = gcse_main (insns, rtl_dump_file));
3879
3880       /* If gcse altered any jumps, rerun jump optimizations to clean
3881          things up.  */
3882       if (tem)
3883         {
3884           TIMEVAR (jump_time, jump_optimize (insns, !JUMP_CROSS_JUMP,
3885                                              !JUMP_NOOP_MOVES,
3886                                              !JUMP_AFTER_REGSCAN));
3887         }
3888
3889       if (gcse_dump)
3890         {
3891           close_dump_file (print_rtl, insns);
3892           if (graph_dump_format != no_graph)
3893             print_rtl_graph_with_bb (dump_base_name, ".04.gcse", insns);
3894         }
3895
3896       if (ggc_p)
3897         ggc_collect ();
3898     }
3899   /* Move constant computations out of loops.  */
3900
3901   if (optimize > 0)
3902     {
3903       if (loop_dump)
3904         open_dump_file (".05.loop", decl_printable_name (decl, 2));
3905         
3906       TIMEVAR
3907         (loop_time,
3908          {
3909            if (flag_rerun_loop_opt)
3910              {
3911                /* We only want to perform unrolling once.  */
3912                
3913                loop_optimize (insns, rtl_dump_file, 0, 0);
3914                
3915         
3916                /* The first call to loop_optimize makes some instructions
3917                   trivially dead.  We delete those instructions now in the
3918                   hope that doing so will make the heuristics in loop work
3919                   better and possibly speed up compilation.  */
3920                delete_trivially_dead_insns (insns, max_reg_num ());
3921
3922                /* The regscan pass is currently necessary as the alias
3923                   analysis code depends on this information.  */
3924                reg_scan (insns, max_reg_num (), 1);
3925              }
3926            loop_optimize (insns, rtl_dump_file, flag_unroll_loops, 1);
3927          });
3928
3929       /* Dump rtl code after loop opt, if we are doing that.  */
3930
3931       if (loop_dump)
3932         {
3933           close_dump_file (print_rtl, insns);
3934           if (graph_dump_format != no_graph)
3935             print_rtl_graph_with_bb (dump_base_name, ".05.loop", insns);
3936         }
3937
3938       if (ggc_p)
3939         ggc_collect ();
3940     }
3941
3942   /* ??? Well, nearly.  If HAVE_conditional_arithmetic, jump_optimize
3943      has put off all if-conversion until "after CSE".  If we put this
3944      off any longer we may miss out doing if-conversion entirely.  */
3945   cse_not_expected = 1;
3946
3947   if (optimize > 0)
3948     {
3949       if (cse2_dump)
3950         open_dump_file (".06.cse2", decl_printable_name (decl, 2));
3951
3952       if (flag_rerun_cse_after_loop)
3953         {
3954           /* Running another jump optimization pass before the second
3955              cse pass sometimes simplifies the RTL enough to allow
3956              the second CSE pass to do a better job.  Jump_optimize can change
3957              max_reg_num so we must rerun reg_scan afterwards.
3958              ??? Rework to not call reg_scan so often.  */
3959           TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
3960           TIMEVAR (jump_time, jump_optimize (insns, !JUMP_CROSS_JUMP,
3961                                              !JUMP_NOOP_MOVES,
3962                                              JUMP_AFTER_REGSCAN));
3963           
3964           TIMEVAR (cse2_time, reg_scan (insns, max_reg_num (), 0));
3965           TIMEVAR (cse2_time, tem = cse_main (insns, max_reg_num (),
3966                                               1, rtl_dump_file));
3967           if (tem)
3968             TIMEVAR (jump_time, jump_optimize (insns, !JUMP_CROSS_JUMP,
3969                                                !JUMP_NOOP_MOVES,
3970                                                !JUMP_AFTER_REGSCAN));
3971         }
3972
3973       if (flag_thread_jumps)
3974         {
3975           /* This pass of jump threading straightens out code
3976              that was kinked by loop optimization.  */
3977           TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
3978           TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 0));
3979         }
3980
3981       /* Dump rtl code after cse, if we are doing that.  */
3982       if (cse2_dump)
3983         {
3984           close_dump_file (print_rtl, insns);
3985           if (graph_dump_format != no_graph)
3986             print_rtl_graph_with_bb (dump_base_name, ".06.cse2", insns);
3987         }
3988
3989       if (ggc_p)
3990         ggc_collect ();
3991     }
3992
3993   if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
3994     {
3995       if (branch_prob_dump)
3996         open_dump_file (".07.bp", decl_printable_name (decl, 2));
3997
3998       TIMEVAR
3999         (branch_prob_time,
4000          {
4001            branch_prob (insns, rtl_dump_file);
4002          });
4003
4004       if (branch_prob_dump)
4005         {
4006           close_dump_file (print_rtl, insns);
4007           if (graph_dump_format != no_graph)
4008             print_rtl_graph_with_bb (dump_base_name, ".07.bp", insns);
4009         }
4010
4011       if (ggc_p)
4012         ggc_collect ();
4013     }
4014
4015   /* Now we choose between stupid (pcc-like) register allocation
4016      (if we got the -noreg switch and not -opt)
4017      and smart register allocation.  */
4018
4019   if (optimize > 0)             /* Stupid allocation probably won't work */
4020     obey_regdecls = 0;          /* if optimizations being done.  */
4021
4022   regclass_init ();
4023
4024   /* Print function header into flow dump now
4025      because doing the flow analysis makes some of the dump.  */
4026
4027   if (flow_dump)
4028     open_dump_file (".08.flow", decl_printable_name (decl, 2));
4029   
4030   if (obey_regdecls)
4031     {
4032       TIMEVAR (flow_time,
4033                {
4034                  regclass (insns, max_reg_num ());
4035                  stupid_life_analysis (insns, max_reg_num (),
4036                                        rtl_dump_file);
4037                });
4038     }
4039   else
4040     {
4041       /* Do control and data flow analysis,
4042          and write some of the results to dump file.  */
4043
4044       TIMEVAR
4045         (flow_time,
4046          {
4047            find_basic_blocks (insns, max_reg_num (), rtl_dump_file, 1);
4048            life_analysis (insns, max_reg_num (), rtl_dump_file, 1);
4049          });
4050
4051       if (warn_uninitialized || extra_warnings)
4052         {
4053           uninitialized_vars_warning (DECL_INITIAL (decl));
4054           if (extra_warnings)
4055             setjmp_args_warning ();
4056         }
4057     }
4058
4059   /* Dump rtl after flow analysis.  */
4060
4061   if (flow_dump)
4062     {
4063       close_dump_file (print_rtl_with_bb, insns);
4064       if (graph_dump_format != no_graph)
4065         print_rtl_graph_with_bb (dump_base_name, ".08.flow", insns);
4066     }
4067
4068   if (ggc_p)
4069     ggc_collect ();
4070
4071   /* The first life analysis pass has finished.  From now on we can not
4072      generate any new pseudos.  */
4073   no_new_pseudos = 1;
4074
4075   /* If -opt, try combining insns through substitution.  */
4076
4077   if (optimize > 0)
4078     {
4079       TIMEVAR (combine_time, combine_instructions (insns, max_reg_num ()));
4080
4081       /* Dump rtl code after insn combination.  */
4082
4083       if (combine_dump)
4084         {
4085           dump_rtl (".09.combine", decl, print_rtl_with_bb, insns);
4086           if (graph_dump_format != no_graph)
4087             print_rtl_graph_with_bb (dump_base_name, ".09.combine", insns);
4088         }
4089
4090       if (ggc_p)
4091         ggc_collect ();
4092     }
4093
4094   /* Register allocation pre-pass, to reduce number of moves
4095      necessary for two-address machines.  */
4096   if (optimize > 0 && (flag_regmove || flag_expensive_optimizations))
4097     {
4098       if (regmove_dump)
4099         open_dump_file (".10.regmove", decl_printable_name (decl, 2));
4100
4101       TIMEVAR (regmove_time, regmove_optimize (insns, max_reg_num (),
4102                                                rtl_dump_file));
4103
4104       if (regmove_dump)
4105         {
4106           close_dump_file (print_rtl_with_bb, insns);
4107           if (graph_dump_format != no_graph)
4108             print_rtl_graph_with_bb (dump_base_name, ".10.regmove", insns);
4109         }
4110
4111       if (ggc_p)
4112         ggc_collect ();
4113     }
4114
4115   /* Print function header into sched dump now
4116      because doing the sched analysis makes some of the dump.  */
4117
4118 #ifdef INSN_SCHEDULING
4119   if (optimize > 0 && flag_schedule_insns)
4120     {
4121       if (sched_dump)
4122         open_dump_file (".11.sched", decl_printable_name (decl, 2));
4123
4124       /* Do control and data sched analysis,
4125          and write some of the results to dump file.  */
4126
4127       TIMEVAR (sched_time, schedule_insns (rtl_dump_file));
4128
4129       /* Dump rtl after instruction scheduling.  */
4130
4131       if (sched_dump)
4132         {
4133           close_dump_file (print_rtl_with_bb, insns);
4134           if (graph_dump_format != no_graph)
4135             print_rtl_graph_with_bb (dump_base_name, ".11.sched", insns);
4136         }
4137
4138       if (ggc_p)
4139         ggc_collect ();
4140     }
4141 #endif
4142
4143   /* Determine if the current function is a leaf before running reload
4144      since this can impact optimizations done by the prologue and
4145      epilogue thus changing register elimination offsets.  */
4146   current_function_is_leaf = leaf_function_p ();
4147
4148   /* Unless we did stupid register allocation,
4149      allocate pseudo-regs that are used only within 1 basic block. 
4150
4151      RUN_JUMP_AFTER_RELOAD records whether or not we need to rerun the
4152      jump optimizer after register allocation and reloading are finished.  */
4153
4154   if (!obey_regdecls)
4155     TIMEVAR (local_alloc_time,
4156              {
4157                /* We recomputed reg usage as part of updating the rest
4158                   of life info during sched.  */
4159                if (! flag_schedule_insns)
4160                  recompute_reg_usage (insns, ! optimize_size);
4161                regclass (insns, max_reg_num ());
4162                rebuild_label_notes_after_reload = local_alloc ();
4163              });
4164   else
4165     rebuild_label_notes_after_reload = 0;
4166
4167   /* Dump rtl code after allocating regs within basic blocks.  */
4168
4169   if (local_reg_dump)
4170     {
4171       open_dump_file (".12.lreg", decl_printable_name (decl, 2));
4172
4173       TIMEVAR (dump_time, dump_flow_info (rtl_dump_file));
4174       TIMEVAR (dump_time, dump_local_alloc (rtl_dump_file));
4175
4176       close_dump_file (print_rtl_with_bb, insns);
4177       if (graph_dump_format != no_graph)
4178         print_rtl_graph_with_bb (dump_base_name, ".12.lreg", insns);
4179     }
4180
4181   if (ggc_p)
4182     ggc_collect ();
4183
4184   if (global_reg_dump)
4185     open_dump_file (".13.greg", decl_printable_name (decl, 2));
4186
4187   /* Unless we did stupid register allocation,
4188      allocate remaining pseudo-regs, then do the reload pass
4189      fixing up any insns that are invalid.  */
4190
4191   TIMEVAR (global_alloc_time,
4192            {
4193              if (!obey_regdecls)
4194                failure = global_alloc (rtl_dump_file);
4195              else
4196                failure = reload (insns, 0, rtl_dump_file);
4197            });
4198
4199
4200   if (failure)
4201     goto exit_rest_of_compilation;
4202
4203   if (ggc_p)
4204     ggc_collect ();
4205
4206   /* Do a very simple CSE pass over just the hard registers.  */
4207   if (optimize > 0)
4208     reload_cse_regs (insns);
4209
4210   /* Register allocation and reloading may have turned an indirect jump into
4211      a direct jump.  If so, we must rebuild the JUMP_LABEL fields of
4212      jumping instructions.  */
4213   if (rebuild_label_notes_after_reload)
4214     TIMEVAR (jump_time, rebuild_jump_labels (insns));
4215
4216   /* On some machines, the prologue and epilogue code, or parts thereof,
4217      can be represented as RTL.  Doing so lets us schedule insns between
4218      it and the rest of the code and also allows delayed branch
4219      scheduling to operate in the epilogue.  */
4220
4221   thread_prologue_and_epilogue_insns (insns);
4222
4223   /* If optimizing and we are performing instruction scheduling after
4224      reload, then go ahead and split insns now since we are about to
4225      recompute flow information anyway.
4226
4227      reload_cse_regs may expose more splitting opportunities, expecially
4228      for double-word operations.  */
4229   if (optimize > 0 && flag_schedule_insns_after_reload)
4230     split_all_insns (0);
4231
4232   if (global_reg_dump)
4233     {
4234       TIMEVAR (dump_time, dump_global_regs (rtl_dump_file));
4235       close_dump_file (print_rtl_with_bb, insns);
4236       if (graph_dump_format != no_graph)
4237         print_rtl_graph_with_bb (dump_base_name, ".13.greg", insns);
4238     }
4239
4240   /* Re-create the death notes which were deleted during reload.  */
4241   if (flow2_dump)
4242     open_dump_file (".14.flow2", decl_printable_name (decl, 2));
4243   
4244   if (optimize)
4245     {
4246       TIMEVAR
4247         (flow2_time,
4248          {
4249            find_basic_blocks (insns, max_reg_num (), rtl_dump_file, 1);
4250            life_analysis (insns, max_reg_num (), rtl_dump_file, 1);
4251          });
4252
4253       if (ggc_p)
4254         ggc_collect ();
4255     }
4256
4257   flow2_completed = 1;
4258
4259   if (flow2_dump)
4260     {
4261       close_dump_file (print_rtl_with_bb, insns);
4262       if (graph_dump_format != no_graph)
4263         print_rtl_graph_with_bb (dump_base_name, ".14.flow2", insns);
4264     }
4265
4266 #ifdef HAVE_peephole2
4267   if (optimize > 0 && flag_peephole2)
4268     {
4269       if (peephole2_dump)
4270         open_dump_file (".15.peephole2", decl_printable_name (decl, 2));
4271
4272       TIMEVAR (peephole2_time, peephole2_optimize (rtl_dump_file));
4273
4274       if (peephole2_dump)
4275         {
4276           close_dump_file (print_rtl_with_bb, insns);
4277           if (graph_dump_format != no_graph)
4278             print_rtl_graph_with_bb (dump_base_name, ".15.peephole2", insns);
4279         }
4280     }
4281 #endif
4282
4283 #ifdef INSN_SCHEDULING
4284   if (optimize > 0 && flag_schedule_insns_after_reload)
4285     {
4286       if (sched2_dump)
4287         open_dump_file (".16.sched2", decl_printable_name (decl, 2));
4288
4289       /* Do control and data sched analysis again,
4290          and write some more of the results to dump file.  */
4291
4292       TIMEVAR (sched2_time, schedule_insns (rtl_dump_file));
4293
4294       /* Dump rtl after post-reorder instruction scheduling.  */
4295
4296       if (sched2_dump)
4297         {
4298           close_dump_file (print_rtl_with_bb, insns);
4299           if (graph_dump_format != no_graph)
4300             print_rtl_graph_with_bb (dump_base_name, ".16.sched2", insns);
4301         }
4302
4303       if (ggc_p)
4304         ggc_collect ();
4305     }
4306 #endif
4307
4308 #ifdef LEAF_REGISTERS
4309   current_function_uses_only_leaf_regs
4310     = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
4311 #endif
4312
4313   /* One more attempt to remove jumps to .+1
4314      left by dead-store-elimination.
4315      Also do cross-jumping this time
4316      and delete no-op move insns.  */
4317
4318   if (optimize > 0)
4319     {
4320       TIMEVAR (jump_time, jump_optimize (insns, JUMP_CROSS_JUMP,
4321                                          JUMP_NOOP_MOVES,
4322                                          !JUMP_AFTER_REGSCAN));
4323
4324       /* Dump rtl code after jump, if we are doing that.  */
4325
4326       if (jump2_opt_dump)
4327         {
4328           dump_rtl (".17.jump2", decl, print_rtl_with_bb, insns);
4329           if (graph_dump_format != no_graph)
4330             print_rtl_graph_with_bb (dump_base_name, ".17.jump2", insns);
4331         }
4332     }
4333
4334   /* If a machine dependent reorganization is needed, call it.  */
4335 #ifdef MACHINE_DEPENDENT_REORG
4336   if (mach_dep_reorg_dump)
4337     open_dump_file (".18.mach", decl_printable_name (decl, 2));
4338
4339    MACHINE_DEPENDENT_REORG (insns);
4340
4341    if (mach_dep_reorg_dump)
4342      {
4343        close_dump_file (print_rtl_with_bb, insns);
4344        if (graph_dump_format != no_graph)
4345          print_rtl_graph_with_bb (dump_base_name, ".18.mach", insns);
4346      }
4347
4348    if (ggc_p)
4349      ggc_collect ();
4350 #endif
4351
4352   /* If a scheduling pass for delayed branches is to be done,
4353      call the scheduling code.  */
4354
4355 #ifdef DELAY_SLOTS
4356   if (optimize > 0 && flag_delayed_branch)
4357     {
4358       if (dbr_sched_dump)
4359         open_dump_file (".19.dbr", decl_printable_name (decl, 2));
4360
4361       TIMEVAR
4362         (dbr_sched_time,
4363          {
4364            dbr_schedule (insns, rtl_dump_file);
4365          });
4366
4367       if (dbr_sched_dump)
4368         {
4369           close_dump_file (print_rtl_with_bb, insns);
4370           if (graph_dump_format != no_graph)
4371             print_rtl_graph_with_bb (dump_base_name, ".19.dbr", insns);
4372         }
4373     }
4374
4375    if (ggc_p)
4376      ggc_collect ();
4377 #endif
4378
4379   /* Shorten branches.  */
4380   TIMEVAR (shorten_branch_time,
4381            {
4382              shorten_branches (get_insns ());
4383            });
4384
4385 #ifdef STACK_REGS
4386   if (stack_reg_dump)
4387     open_dump_file (".20.stack", decl_printable_name (decl, 2));
4388
4389   TIMEVAR (stack_reg_time, reg_to_stack (insns, rtl_dump_file));
4390
4391   if (stack_reg_dump)
4392     {
4393       close_dump_file (print_rtl_with_bb, insns);
4394       if (graph_dump_format != no_graph)
4395         print_rtl_graph_with_bb (dump_base_name, ".20.stack", insns);
4396     }
4397
4398    if (ggc_p)
4399      ggc_collect ();
4400 #endif
4401
4402   /* Now turn the rtl into assembler code.  */
4403
4404   TIMEVAR (final_time,
4405            {
4406              rtx x;
4407              char *fnname;
4408
4409              /* Get the function's name, as described by its RTL.
4410                 This may be different from the DECL_NAME name used
4411                 in the source file.  */
4412
4413              x = DECL_RTL (decl);
4414              if (GET_CODE (x) != MEM)
4415                abort ();
4416              x = XEXP (x, 0);
4417              if (GET_CODE (x) != SYMBOL_REF)
4418                abort ();
4419              fnname = XSTR (x, 0);
4420
4421              assemble_start_function (decl, fnname);
4422              final_start_function (insns, asm_out_file, optimize);
4423              final (insns, asm_out_file, optimize, 0);
4424              final_end_function (insns, asm_out_file, optimize);
4425              assemble_end_function (decl, fnname);
4426              if (! quiet_flag)
4427                fflush (asm_out_file);
4428
4429              /* Release all memory allocated by flow.  */
4430              free_basic_block_vars (0);
4431
4432              /* Release all memory held by regsets now */
4433              regset_release_memory ();
4434            });
4435
4436    if (ggc_p)
4437      ggc_collect ();
4438
4439   /* Write DBX symbols if requested */
4440
4441   /* Note that for those inline functions where we don't initially
4442      know for certain that we will be generating an out-of-line copy,
4443      the first invocation of this routine (rest_of_compilation) will
4444      skip over this code by doing a `goto exit_rest_of_compilation;'.
4445      Later on, finish_compilation will call rest_of_compilation again
4446      for those inline functions that need to have out-of-line copies
4447      generated.  During that call, we *will* be routed past here.  */
4448
4449 #ifdef DBX_DEBUGGING_INFO
4450   if (write_symbols == DBX_DEBUG)
4451     TIMEVAR (symout_time, dbxout_function (decl));
4452 #endif
4453
4454 #ifdef DWARF_DEBUGGING_INFO
4455   if (write_symbols == DWARF_DEBUG)
4456     TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
4457 #endif
4458
4459 #ifdef DWARF2_DEBUGGING_INFO
4460   if (write_symbols == DWARF2_DEBUG)
4461     TIMEVAR (symout_time, dwarf2out_decl (decl));
4462 #endif
4463
4464  exit_rest_of_compilation:
4465
4466   free_bb_mem ();
4467
4468   /* In case the function was not output,
4469      don't leave any temporary anonymous types
4470      queued up for sdb output.  */
4471 #ifdef SDB_DEBUGGING_INFO
4472   if (write_symbols == SDB_DEBUG)
4473     sdbout_types (NULL_TREE);
4474 #endif
4475
4476   reload_completed = 0;
4477   flow2_completed = 0;
4478   no_new_pseudos = 0;
4479
4480   TIMEVAR (final_time,
4481            {
4482               /* Clear out the insn_length contents now that they are no
4483                  longer valid.  */
4484               init_insn_lengths ();
4485
4486               /* Clear out the real_constant_chain before some of the rtx's
4487                  it runs through become garbage.  */
4488               clear_const_double_mem ();
4489
4490               /* Cancel the effect of rtl_in_current_obstack.  */
4491               resume_temporary_allocation ();
4492
4493               /* Show no temporary slots allocated.  */
4494               init_temp_slots ();
4495
4496               free_basic_block_vars (0);
4497            });
4498
4499   /* Make sure volatile mem refs aren't considered valid operands for
4500      arithmetic insns.  We must call this here if this is a nested inline
4501      function, since the above code leaves us in the init_recog state
4502      (from final.c), and the function context push/pop code does not
4503      save/restore volatile_ok.
4504
4505      ??? Maybe it isn't necessary for expand_start_function to call this
4506      anymore if we do it here?  */
4507
4508   init_recog_no_volatile ();
4509
4510   /* We're done with this function.  Free up memory if we can.  */
4511   free_after_parsing (current_function);
4512   if (! DECL_DEFER_OUTPUT (decl))
4513     free_after_compilation (current_function);
4514   current_function = 0;
4515
4516   if (ggc_p)
4517     ggc_collect ();
4518
4519   /* The parsing time is all the time spent in yyparse
4520      *except* what is spent in this function.  */
4521
4522   parse_time -= get_run_time () - start_time;
4523 }
4524 \f
4525 static void
4526 display_help ()
4527 {
4528   int    undoc;
4529   unsigned long  i;
4530   const char * lang;
4531   
4532 #ifndef USE_CPPLIB  
4533   printf ("Usage: %s input [switches]\n", progname);
4534   printf ("Switches:\n");
4535 #endif
4536   printf ("  -ffixed-<register>      Mark <register> as being unavailable to the compiler\n");
4537   printf ("  -fcall-used-<register>  Mark <register> as being corrupted by function calls\n");
4538   printf ("  -fcall-saved-<register> Mark <register> as being preserved across functions\n");
4539   printf ("  -finline-limit=<number> Limits the size of inlined functions to <number>\n");
4540
4541   for (i = NUM_ELEM (f_options); i--;)
4542     {
4543       const char * description = f_options[i].description;
4544       
4545       if (description != NULL && * description != 0)
4546         printf ("  -f%-21s %s\n",
4547                 f_options[i].string, description);
4548     }
4549   
4550   printf ("  -O[number]              Set optimisation level to [number]\n");
4551   printf ("  -Os                     Optimise for space rather than speed\n");
4552   printf ("  -pedantic               Issue warnings needed by strict compliance to ANSI C\n");
4553   printf ("  -pedantic-errors        Like -pedantic except that errors are produced\n");
4554   printf ("  -w                      Suppress warnings\n");
4555   printf ("  -W                      Enable extra warnings\n");
4556   
4557   for (i = NUM_ELEM (W_options); i--;)
4558     {
4559       const char * description = W_options[i].description;
4560       
4561       if (description != NULL && * description != 0)
4562         printf ("  -W%-21s %s\n",
4563                 W_options[i].string, description);
4564     }
4565   
4566   printf ("  -Wid-clash-<num>        Warn if 2 identifiers have the same first <num> chars\n");
4567   printf ("  -Wlarger-than-<number>  Warn if an object is larger than <number> bytes\n");
4568   printf ("  -p                      Enable function profiling\n");
4569 #if defined (BLOCK_PROFILER) || defined (FUNCTION_BLOCK_PROFILER)
4570   printf ("  -a                      Enable block profiling \n");
4571 #endif  
4572 #if defined (BLOCK_PROFILER) || defined (FUNCTION_BLOCK_PROFILER) || defined FUNCTION_BLOCK_PROFILER_EXIT
4573   printf ("  -ax                     Enable jump profiling \n");
4574 #endif  
4575   printf ("  -o <file>               Place output into <file> \n");
4576   printf ("  -G <number>             Put global and static data smaller than <number>\n");
4577   printf ("                           bytes into a special section (on some targets)\n");
4578   
4579   for (i = NUM_ELEM (debug_args); i--;)
4580     {
4581       if (debug_args[i].description != NULL)
4582         printf ("  -g%-21s %s\n", debug_args[i].arg, debug_args[i].description);
4583     }
4584   
4585   printf ("  -aux-info <file>        Emit declaration info into <file>.X\n");
4586   printf ("  -quiet                  Do not display functions compiled or elapsed time\n");
4587   printf ("  -version                Display the compiler's version\n");
4588   printf ("  -d[letters]             Enable dumps from specific passes of the compiler\n");
4589   printf ("  -dumpbase <file>        Base name to be used for dumps from specific passes\n");
4590 #if defined INSN_SCHEDULING
4591   printf ("  -sched-verbose=<number> Set the verbosity level of the scheduler\n");
4592 #endif
4593   printf ("  --help                  Display this information\n");
4594
4595   undoc = 0;
4596   lang  = "language";
4597   
4598   /* Display descriptions of language specific options.
4599      If there is no description, note that there is an undocumented option.
4600      If the description is empty, do not display anything.  (This allows
4601      options to be deliberately undocumented, for whatever reason).
4602      If the option string is missing, then this is a marker, indicating
4603      that the description string is in fact the name of a language, whose
4604      language specific options are to follow.  */
4605   
4606   if (NUM_ELEM (documented_lang_options) > 1)
4607     {
4608       printf ("\nLanguage specific options:\n");
4609
4610       for (i = 0; i < NUM_ELEM (documented_lang_options); i++)
4611         {
4612           const char * description = documented_lang_options[i].description;
4613           const char * option      = documented_lang_options[i].option;
4614
4615           if (description == NULL)
4616             {
4617               undoc = 1;
4618
4619               if (extra_warnings)
4620                 printf ("  %-23.23s [undocumented]\n", option);
4621             }
4622           else if (* description == 0)
4623             continue;
4624           else if (option == NULL)
4625             {
4626               if (undoc)
4627                 printf
4628                   ("\nThere are undocumented %s specific options as well.\n",
4629                         lang);
4630               undoc = 0;
4631               
4632               printf ("\n Options for %s:\n", description);
4633
4634               lang = description;
4635             }
4636           else
4637             printf ("  %-23.23s %s\n", option, description);
4638         }
4639     }
4640
4641   if (undoc)
4642     printf ("\nThere are undocumented %s specific options as well.\n", lang);
4643
4644   if (NUM_ELEM (target_switches) > 1
4645 #ifdef TARGET_OPTIONS
4646       || NUM_ELEM (target_options) > 1
4647 #endif
4648       )
4649     {
4650       int doc = 0;
4651       
4652       undoc = 0;
4653   
4654       printf ("\nTarget specific options:\n");
4655
4656       for (i = NUM_ELEM (target_switches); i--;)
4657         {
4658           const char * option      = target_switches[i].name;
4659           const char * description = target_switches[i].description;
4660
4661           if (option == NULL || * option == 0)
4662             continue;
4663           else if (description == NULL)
4664             {
4665               undoc = 1;
4666               
4667               if (extra_warnings)
4668                 printf ("  -m%-21.21s [undocumented]\n", option);
4669             }
4670           else if (* description != 0)
4671             doc += printf ("  -m%-21.21s %s\n", option, description);
4672         }
4673       
4674 #ifdef TARGET_OPTIONS      
4675       for (i = NUM_ELEM (target_options); i--;)
4676         {
4677           const char * option      = target_options[i].prefix;
4678           const char * description = target_options[i].description;
4679
4680           if (option == NULL || * option == 0)
4681             continue;
4682           else if (description == NULL)
4683             {
4684               undoc = 1;
4685               
4686               if (extra_warnings)
4687                 printf ("  -m%-21.21s [undocumented]\n", option);
4688             }
4689           else if (* description != 0)
4690             doc += printf ("  -m%-21.21s %s\n", option, description);
4691         }
4692 #endif
4693       if (undoc)
4694         {
4695           if (doc)
4696             printf ("\nThere are undocumented target specific options as well.\n");
4697           else
4698             printf ("  They exist, but they are not documented.\n");
4699         }
4700     }
4701 }
4702 \f
4703 /* Parse a -d... comand line switch.  */
4704
4705 static void
4706 decode_d_option (arg)
4707      const char * arg;
4708 {
4709   while (* arg)
4710     switch (* arg ++)
4711       {
4712       case 'a':
4713         branch_prob_dump = 1;
4714         combine_dump = 1;
4715 #ifdef DELAY_SLOTS
4716         dbr_sched_dump = 1;
4717 #endif
4718         flow_dump = 1;
4719         flow2_dump = 1;
4720         global_reg_dump = 1;
4721         jump_opt_dump = 1;
4722         addressof_dump = 1;
4723         jump2_opt_dump = 1;
4724         local_reg_dump = 1;
4725         loop_dump = 1;
4726         regmove_dump = 1;
4727         rtl_dump = 1;
4728         cse_dump = 1;
4729         cse2_dump = 1;
4730         gcse_dump = 1;
4731         sched_dump = 1;
4732         sched2_dump = 1;
4733 #ifdef STACK_REGS
4734         stack_reg_dump = 1;
4735 #endif
4736 #ifdef MACHINE_DEPENDENT_REORG
4737         mach_dep_reorg_dump = 1;
4738 #endif
4739         peephole2_dump = 1;
4740         break;
4741       case 'A':
4742         flag_debug_asm = 1;
4743         break;
4744       case 'b':
4745         branch_prob_dump = 1;
4746         break;
4747       case 'c':
4748         combine_dump = 1;
4749         break;
4750 #ifdef DELAY_SLOTS
4751       case 'd':
4752         dbr_sched_dump = 1;
4753         break;
4754 #endif
4755       case 'f':
4756         flow_dump = 1;
4757         break;
4758       case 'F':
4759         addressof_dump = 1;
4760         break;
4761       case 'g':
4762         global_reg_dump = 1;
4763         break;
4764       case 'G':
4765         gcse_dump = 1;
4766         break;
4767       case 'j':
4768         jump_opt_dump = 1;
4769         break;
4770       case 'J':
4771         jump2_opt_dump = 1;
4772         break;
4773 #ifdef STACK_REGS                   
4774       case 'k':
4775         stack_reg_dump = 1;
4776         break;
4777 #endif
4778       case 'l':
4779         local_reg_dump = 1;
4780         break;
4781       case 'L':
4782         loop_dump = 1;
4783         break;
4784       case 'm':
4785         flag_print_mem = 1;
4786         break;
4787 #ifdef MACHINE_DEPENDENT_REORG
4788       case 'M':
4789         mach_dep_reorg_dump = 1;
4790         break;
4791 #endif
4792       case 'p':
4793         flag_print_asm_name = 1;
4794         break;
4795       case 'r':
4796         rtl_dump = 1;
4797         break;
4798       case 'R':
4799         sched2_dump = 1;
4800         break;
4801       case 's':
4802         cse_dump = 1;
4803         break;
4804       case 'S':
4805         sched_dump = 1;
4806         break;
4807       case 't':
4808         cse2_dump = 1;
4809         break;
4810       case 'N':
4811         regmove_dump = 1;
4812         break;
4813       case 'v':
4814         graph_dump_format = vcg;
4815         break;
4816       case 'w':
4817         flow2_dump = 1;
4818         break;
4819       case 'x':
4820         rtl_dump_and_exit = 1;
4821         break;
4822       case 'y':
4823         set_yydebug (1);
4824         break;
4825       case 'z':
4826         peephole2_dump = 1;
4827         break;
4828       case 'D': /* These are handled by the preprocessor.  */
4829       case 'I':
4830         break;
4831       default:
4832         warning ("unrecognised gcc debugging option: %c", arg[-1]);
4833         break;
4834       }
4835 }
4836
4837 /* Parse a -f... comand line switch.  ARG is the value after the -f.
4838    It is safe to access 'ARG - 2' to generate the full switch name.
4839    Return the number of strings consumed.  */
4840
4841 static int
4842 decode_f_option (arg)
4843      const char * arg;
4844 {
4845   int j;
4846
4847   /* Search for the option in the table of binary f options.  */
4848   for (j = sizeof (f_options) / sizeof (f_options[0]); j--;)
4849     {
4850       if (!strcmp (arg, f_options[j].string))
4851         {
4852           *f_options[j].variable = f_options[j].on_value;
4853           return 1;
4854         }
4855     
4856       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4857           && ! strcmp (arg + 3, f_options[j].string))
4858         {
4859           *f_options[j].variable = ! f_options[j].on_value;
4860           return 1;
4861         }
4862     }
4863
4864   if (!strncmp (arg, "inline-limit-", 13)
4865       || !strncmp (arg, "inline-limit=", 13))
4866     inline_max_insns =
4867       read_integral_parameter (arg + 13, arg - 2, inline_max_insns);
4868 #ifdef INSN_SCHEDULING
4869   else if (!strncmp (arg, "sched-verbose=", 14))
4870     fix_sched_param ("verbose", (const char *)(arg + 14));
4871 #endif
4872   else if (!strncmp (arg, "fixed-", 6))
4873     fix_register ((const char *)(arg + 6), 1, 1);
4874   else if (!strncmp (arg, "call-used-", 10))
4875     fix_register ((const char *)(arg + 10), 0, 1);
4876   else if (!strncmp (arg, "call-saved-", 11))
4877     fix_register ((const char *)(arg + 11), 0, 0);
4878   else if (!strncmp (arg, "align-loops=", 12))
4879     align_loops = read_integral_parameter (arg + 12, arg - 2, align_loops);
4880   else if (!strncmp (arg, "align-functions=", 16))
4881     align_functions =
4882       read_integral_parameter (arg + 16, arg - 2, align_functions);
4883   else if (!strncmp (arg, "align-jumps=", 12))
4884     align_jumps = read_integral_parameter (arg + 12, arg - 2, align_jumps);
4885   else if (!strncmp (arg, "align-labels=", 13))
4886     align_labels = read_integral_parameter (arg + 13, arg - 2, align_labels);
4887   else if (!strcmp (arg, "preprocessed"))
4888     /* Recognise this switch but do nothing.  This prevents warnings
4889        about an unrecognised switch if cpplib has not been linked in.  */
4890     ;
4891   else
4892     return 0;
4893
4894   return 1;
4895 }
4896
4897 /* Parse a -W... comand line switch.  ARG is the value after the -W.
4898    It is safe to access 'ARG - 2' to generate the full switch name.
4899    Return the number of strings consumed.  */
4900 static int
4901 decode_W_option (arg)
4902      const char * arg;
4903 {
4904   int j;
4905   
4906   /* Search for the option in the table of binary W options.  */
4907
4908   for (j = sizeof (W_options) / sizeof (W_options[0]); j--;)
4909     {
4910       if (!strcmp (arg, W_options[j].string))
4911         {
4912           *W_options[j].variable = W_options[j].on_value;
4913           return 1;
4914         }
4915
4916       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4917           && ! strcmp (arg + 3, W_options[j].string))
4918         {
4919           *W_options[j].variable = ! W_options[j].on_value;
4920           return 1;
4921         }
4922     }
4923
4924   if (!strncmp (arg, "id-clash-", 9))
4925     {
4926       const int id_clash_val = read_integral_parameter (arg + 9, arg - 2, -1);
4927       
4928       if (id_clash_val != -1)
4929         {
4930           id_clash_len = id_clash_val;
4931           warn_id_clash = 1;
4932         }
4933     }
4934   else if (!strncmp (arg, "larger-than-", 12))
4935     {
4936       const int larger_than_val =
4937         read_integral_parameter (arg + 12, arg - 2, -1);
4938       if (larger_than_val != -1)
4939         {
4940           larger_than_size = larger_than_val;
4941           warn_larger_than = 1;
4942         }
4943     }
4944   else
4945     return 0;
4946
4947   return 1;
4948 }
4949
4950 /* Parse a -g... comand line switch.  ARG is the value after the -g.
4951    It is safe to access 'ARG - 2' to generate the full switch name.
4952    Return the number of strings consumed.  */
4953
4954 static int
4955 decode_g_option (arg)
4956      const char * arg;
4957 {
4958   unsigned level;
4959   /* A lot of code assumes write_symbols == NO_DEBUG if the
4960      debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
4961      of what debugging type has been selected).  This records the
4962      selected type.  It is an error to specify more than one
4963      debugging type.  */
4964   static enum debug_info_type selected_debug_type = NO_DEBUG;
4965   /* Non-zero if debugging format has been explicitly set.
4966      -g and -ggdb don't explicitly set the debugging format so
4967      -gdwarf -g3 is equivalent to -gdwarf3.  */
4968   static int type_explicitly_set_p = 0;
4969   /* Indexed by enum debug_info_type.  */
4970   static const char * debug_type_names[] =
4971   {
4972     "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff"
4973   };
4974   
4975   /* The maximum admissible debug level value.  */
4976   static const unsigned max_debug_level = 3;
4977   
4978   /* Look up ARG in the table.  */
4979   for (da = debug_args; da->arg; da++)
4980     {
4981       const int da_len = strlen (da->arg);
4982
4983       if (da_len == 0 || ! strncmp (arg, da->arg, da_len))
4984         {
4985           enum debug_info_type type = da->debug_type;
4986           const char * p = arg + da_len;
4987           
4988           if (*p && (*p < '0' || *p > '9'))
4989             continue;
4990           
4991           /* A debug flag without a level defaults to level 2.
4992              Note we do not want to call read_integral_parameter
4993              for that case since it will call atoi which 
4994              will return zero.
4995              
4996              ??? We may want to generalize the interface to 
4997              read_integral_parameter to better handle this case
4998              if this case shows up often.  */
4999           if (*p)
5000             level = read_integral_parameter (p, 0, max_debug_level + 1);
5001           else
5002             level = 2;
5003           
5004           if (da_len > 1 && *p && !strncmp (arg, "dwarf", da_len))
5005             {
5006               error ("use -gdwarf -g%d for DWARF v1, level %d",
5007                      level, level);
5008               if (level == 2)
5009                 error ("use -gdwarf-2   for DWARF v2");
5010             }
5011           
5012           if (level > max_debug_level)
5013             {
5014               warning ("\
5015 ignoring option `%s' due to invalid debug level specification",
5016                        arg - 2);
5017               level = debug_info_level;
5018             }
5019
5020           if (type == NO_DEBUG)
5021             {
5022               type = PREFERRED_DEBUGGING_TYPE;
5023               
5024               if (da_len > 1 && strncmp (arg, "gdb", da_len) == 0)
5025                 {
5026 #if defined (DWARF2_DEBUGGING_INFO) && !defined (LINKER_DOES_NOT_WORK_WITH_DWARF2)
5027                   type = DWARF2_DEBUG;
5028 #else
5029 #ifdef DBX_DEBUGGING_INFO
5030                   type = DBX_DEBUG;
5031 #endif
5032 #endif
5033                 }
5034             }
5035           
5036           if (type == NO_DEBUG)
5037             warning ("`%s': unknown or unsupported -g option", arg - 2);
5038
5039           /* Does it conflict with an already selected type?  */
5040           if (type_explicitly_set_p
5041               /* -g/-ggdb don't conflict with anything */
5042               && da->debug_type != NO_DEBUG
5043               && type != selected_debug_type)
5044             warning ("`%s' ignored, conflicts with `-g%s'",
5045                      arg - 2, debug_type_names[(int) selected_debug_type]);
5046           else
5047             {
5048               /* If the format has already been set, -g/-ggdb
5049                  only change the debug level.  */
5050               if (type_explicitly_set_p && da->debug_type == NO_DEBUG)
5051                 ; /* don't change debugging type */
5052               else
5053                 {
5054                   selected_debug_type = type;
5055                   type_explicitly_set_p = da->debug_type != NO_DEBUG;
5056                 }
5057               
5058               write_symbols = (level == 0
5059                                ? NO_DEBUG
5060                                : selected_debug_type);
5061               use_gnu_debug_info_extensions = da->use_extensions_p;
5062               debug_info_level = (enum debug_info_level) level;
5063             }
5064           
5065           break;
5066         }
5067     }
5068   
5069   if (! da->arg)
5070     warning ("`%s': unknown or unsupported -g option", arg - 2);
5071
5072   return 1;
5073 }
5074
5075 /* Decode the first argument in the argv as a language-independent option.
5076    Return the number of strings consumed.  'strings_processed' is the
5077    number of strings that have already been decoded in a language
5078    specific fashion before this function was invoked.  */
5079    
5080 static unsigned
5081 independent_decode_option (argc, argv, strings_processed)
5082      int argc;
5083      char ** argv;
5084      unsigned strings_processed ATTRIBUTE_UNUSED;
5085 {
5086   char * arg = argv[0];
5087   
5088   if (arg[0] != '-' || arg[1] == 0)
5089     {
5090       if (arg[0] == '+')
5091         return 0;
5092       
5093       filename = arg;
5094
5095       return 1;
5096     }
5097
5098   arg ++;
5099   
5100   if (!strcmp (arg, "-help"))
5101     {
5102       display_help ();
5103       exit (0);
5104     }
5105
5106   if (* arg == 'Y')
5107     arg ++;
5108   
5109   switch (* arg)
5110     {
5111     default:
5112       return 0;
5113       
5114     case 'O':
5115       /* Already been treated in main (). Do nothing.  */
5116       break;
5117           
5118     case 'm':
5119       set_target_switch (arg + 1);
5120       break;
5121
5122     case 'f':
5123       return decode_f_option (arg + 1);
5124             
5125     case 'g':
5126       return decode_g_option (arg + 1);
5127
5128     case 'd':
5129       if (!strcmp (arg, "dumpbase"))
5130         {
5131           if (argc == 1)
5132             return 0;
5133           
5134           dump_base_name = argv[1];
5135           return 2;
5136         }
5137       else
5138         decode_d_option (arg + 1);
5139       break;
5140
5141     case 'p':
5142       if (!strcmp (arg, "pedantic"))
5143         pedantic = 1;
5144       else if (!strcmp (arg, "pedantic-errors"))
5145         flag_pedantic_errors = pedantic = 1;
5146       else if (arg[1] == 0)
5147         profile_flag = 1;
5148       else
5149         return 0;
5150       break;
5151
5152     case 'q':
5153       if (!strcmp (arg, "quiet"))
5154         quiet_flag = 1;
5155       else
5156         return 0;
5157       break;
5158
5159     case 'v':
5160       if (!strcmp (arg, "version"))
5161         version_flag = 1;
5162       else
5163         return 0;
5164       break;
5165
5166     case 'w':
5167       if (arg[1] == 0)
5168         inhibit_warnings = 1;
5169       else
5170         return 0;
5171       break;
5172
5173     case 'W':
5174       if (arg[1] == 0)
5175         {
5176           extra_warnings = 1;
5177           /* We save the value of warn_uninitialized, since if they put
5178              -Wuninitialized on the command line, we need to generate a
5179              warning about not using it without also specifying -O.  */
5180           if (warn_uninitialized != 1)
5181             warn_uninitialized = 2;
5182         }
5183       else
5184         return decode_W_option (arg + 1);
5185       break;
5186           
5187     case 'a':
5188       if (arg[1] == 0)
5189         {
5190 #if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
5191           warning ("`-a' option (basic block profile) not supported");
5192 #else
5193           profile_block_flag = (profile_block_flag < 2) ? 1 : 3;
5194 #endif
5195         }
5196       else if (!strcmp (arg, "ax"))
5197         {
5198 #if !defined (FUNCTION_BLOCK_PROFILER_EXIT) || !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
5199           warning ("`-ax' option (jump profiling) not supported");
5200 #else
5201           profile_block_flag = (!profile_block_flag 
5202                                 || profile_block_flag == 2) ? 2 : 3;
5203 #endif
5204         }
5205       else if (!strncmp (arg, "aux-info", 8))
5206         {
5207           flag_gen_aux_info = 1;
5208           if (arg[8] == '\0')
5209             {
5210               if (argc == 1)
5211                 return 0;
5212               
5213               aux_info_file_name = argv[1];
5214               return 2;
5215             }
5216           else
5217             aux_info_file_name = arg + 8;
5218         }
5219       else
5220         return 0;
5221       break;
5222
5223     case 'o':
5224       if (arg[1] == 0)
5225         {
5226           if (argc == 1)
5227             return 0;
5228           
5229           asm_file_name = argv[1];
5230           return 2;
5231         }
5232       return 0;
5233
5234     case 'G':
5235       {
5236         int g_switch_val;
5237         int return_val;
5238             
5239         if (arg[1] == 0)
5240           {
5241             if (argc == 1)
5242               return 0;
5243             
5244             g_switch_val = read_integral_parameter (argv[1], 0, -1);
5245             return_val = 2;
5246           }
5247         else
5248           {
5249             g_switch_val = read_integral_parameter (arg + 1, 0, -1);
5250             return_val = 1;
5251           }
5252             
5253         if (g_switch_val == -1)
5254           return_val = 0;
5255         else
5256           {
5257             g_switch_set = TRUE;
5258             g_switch_value = g_switch_val;
5259           }
5260             
5261         return return_val;
5262       }
5263     }
5264   
5265   return 1;
5266 }
5267 \f
5268 /* Entry point of cc1/c++.  Decode command args, then call compile_file.
5269    Exit code is 35 if can't open files, 34 if fatal error,
5270    33 if had nonfatal errors, else success.  */
5271
5272 extern int main PROTO ((int, char **));
5273
5274 int
5275 main (argc, argv)
5276      int argc;
5277      char **argv;
5278 {
5279   register int i;
5280   char *p;
5281
5282   /* save in case md file wants to emit args as a comment.  */
5283   save_argc = argc;
5284   save_argv = argv;
5285
5286   p = argv[0] + strlen (argv[0]);
5287   while (p != argv[0] && p[-1] != '/'
5288 #ifdef DIR_SEPARATOR
5289          && p[-1] != DIR_SEPARATOR
5290 #endif
5291          )
5292     --p;
5293   progname = p;
5294
5295 #ifdef HAVE_LC_MESSAGES
5296   setlocale (LC_MESSAGES, "");
5297 #endif
5298   (void) bindtextdomain (PACKAGE, localedir);
5299   (void) textdomain (PACKAGE);
5300
5301   signal (SIGFPE, float_signal);
5302
5303 #ifdef SIGPIPE
5304   signal (SIGPIPE, pipe_closed);
5305 #endif
5306
5307   decl_printable_name = decl_name;
5308   lang_expand_expr = (lang_expand_expr_t) do_abort;
5309
5310   /* Initialize whether `char' is signed.  */
5311   flag_signed_char = DEFAULT_SIGNED_CHAR;
5312 #ifdef DEFAULT_SHORT_ENUMS
5313   /* Initialize how much space enums occupy, by default.  */
5314   flag_short_enums = DEFAULT_SHORT_ENUMS;
5315 #endif
5316
5317   /* Initialize the garbage-collector.  */
5318   init_ggc ();
5319   ggc_add_root (&input_file_stack, 1, sizeof input_file_stack,
5320                 &mark_file_stack);
5321
5322   /* Perform language-specific options intialization.  */
5323   lang_init_options ();
5324
5325   /* Scan to see what optimization level has been specified.  That will
5326      determine the default value of many flags.  */
5327   for (i = 1; i < argc; i++)
5328     {
5329       if (!strcmp (argv[i], "-O"))
5330         {
5331           optimize = 1;
5332           optimize_size = 0;
5333         }
5334       else if (argv[i][0] == '-' && argv[i][1] == 'O')
5335         {
5336           /* Handle -Os, -O2, -O3, -O69, ...  */
5337           char *p = &argv[i][2];
5338           
5339           if ((p[0] == 's') && (p[1] == 0))
5340             {
5341               optimize_size = 1;
5342               
5343               /* Optimizing for size forces optimize to be 2. */
5344               optimize = 2;
5345             }
5346           else
5347             {       
5348               const int optimize_val = read_integral_parameter (p, p - 2, -1);
5349               if (optimize_val != -1)
5350                 {
5351                   optimize = optimize_val;
5352                   optimize_size = 0;
5353                 }
5354             }
5355         }
5356     }
5357
5358   obey_regdecls = (optimize == 0);
5359
5360   if (optimize >= 1)
5361     {
5362       flag_defer_pop = 1;
5363       flag_thread_jumps = 1;
5364 #ifdef DELAY_SLOTS
5365       flag_delayed_branch = 1;
5366 #endif
5367 #ifdef CAN_DEBUG_WITHOUT_FP
5368       flag_omit_frame_pointer = 1;
5369 #endif
5370     }
5371
5372   if (optimize >= 2)
5373     {
5374       flag_cse_follow_jumps = 1;
5375       flag_cse_skip_blocks = 1;
5376       flag_gcse = 1;
5377       flag_expensive_optimizations = 1;
5378       flag_strength_reduce = 1;
5379       flag_rerun_cse_after_loop = 1;
5380       flag_rerun_loop_opt = 1;
5381       flag_caller_saves = 1;
5382       flag_force_mem = 1;
5383       flag_peephole2 = 1;
5384 #ifdef INSN_SCHEDULING
5385       flag_schedule_insns = 1;
5386       flag_schedule_insns_after_reload = 1;
5387 #endif
5388       flag_regmove = 1;
5389       flag_strict_aliasing = 1;
5390       flag_delete_null_pointer_checks = 1;
5391     }
5392
5393   if (optimize >= 3)
5394     {
5395       flag_inline_functions = 1;
5396     }
5397
5398   if (optimize < 2 || optimize_size)
5399     {
5400       align_loops = 1;
5401       align_jumps = 1;
5402       align_labels = 1;
5403       align_functions = 1;
5404     }
5405
5406   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
5407      modify it.  */
5408   target_flags = 0;
5409   set_target_switch ("");
5410
5411 #ifdef OPTIMIZATION_OPTIONS
5412   /* Allow default optimizations to be specified on a per-machine basis.  */
5413   OPTIMIZATION_OPTIONS (optimize, optimize_size);
5414 #endif
5415
5416   /* Initialize register usage now so switches may override.  */
5417   init_reg_sets ();
5418
5419   /* Perform normal command line switch decoding.  */
5420   for (i = 1; i < argc;)
5421     {
5422       unsigned lang_processed;
5423       unsigned indep_processed;
5424
5425       /* Give the language a chance to decode the option for itself.  */
5426       lang_processed = lang_decode_option (argc - i, argv + i);
5427
5428       /* Now see if the option also has a language independent meaning.
5429          Some options are both language specific and language independent,
5430          eg --help.  It is possible that there might be options that should
5431          only be decoded in a language independent way if the were not
5432          decoded in a langauge specific way, which is why 'lang_processed'
5433          is passed in.  */
5434       indep_processed = independent_decode_option (argc - i, argv + i,
5435                                                    lang_processed);
5436
5437       if (lang_processed || indep_processed)
5438         i += (lang_processed > indep_processed
5439               ? lang_processed : indep_processed);
5440       else
5441         {
5442           const char * option = NULL;
5443           const char * lang = NULL;
5444           unsigned int j;
5445           
5446           /* It is possible that the command line switch is not valid for the
5447              current language, but it is valid for another language.  In order
5448              to be compatible with previous versions of the compiler (which
5449              did not issue an error message in this case) we check for this
5450              possibilty here.  If we do find a match, then if extra_warnings
5451              is set we generate a warning message, otherwise we will just
5452              ignore the option.  */
5453           for (j = 0; j < NUM_ELEM (documented_lang_options); j++)
5454             {
5455               option = documented_lang_options[j].option;
5456               
5457               if (option == NULL)
5458                 lang = documented_lang_options[j].description;
5459               else if (! strncmp (argv[i], option, strlen (option)))
5460                 break;
5461             }
5462
5463           if (option)
5464             {
5465               if (extra_warnings)
5466                 {
5467                   warning ("Ignoring command line option '%s'", argv[i]);
5468                   if (lang)
5469                     warning ("\
5470 (It is valid for %s but not the selected langauge)", lang);
5471                 }
5472             }
5473           else
5474             error ("Unrecognised option `%s'", argv[i]);
5475           
5476           i++;
5477         }
5478     }
5479
5480   /* Checker uses the frame pointer.  */
5481   if (flag_check_memory_usage)
5482     flag_omit_frame_pointer = 0;
5483
5484   if (optimize == 0)
5485     {
5486       /* Inlining does not work if not optimizing,
5487          so force it not to be done.  */
5488       flag_no_inline = 1;
5489       warn_inline = 0;
5490
5491       /* The c_decode_option and lang_decode_option functions set
5492          this to `2' if -Wall is used, so we can avoid giving out
5493          lots of errors for people who don't realize what -Wall does.  */
5494       if (warn_uninitialized == 1)
5495         warning ("-Wuninitialized is not supported without -O");
5496     }
5497
5498 #ifdef OVERRIDE_OPTIONS
5499   /* Some machines may reject certain combinations of options.  */
5500   OVERRIDE_OPTIONS;
5501 #endif
5502
5503   if (exceptions_via_longjmp == 2)
5504     {
5505 #ifdef DWARF2_UNWIND_INFO
5506       exceptions_via_longjmp = ! DWARF2_UNWIND_INFO;
5507 #else
5508       exceptions_via_longjmp = 1;
5509 #endif
5510     }
5511
5512   /* Set up the align_*_log variables, defaulting them to 1 if they
5513      were still unset.  */
5514   if (align_loops <= 0) align_loops = 1;
5515   align_loops_log = floor_log2 (align_loops*2-1);
5516   if (align_jumps <= 0) align_jumps = 1;
5517   align_jumps_log = floor_log2 (align_jumps*2-1);
5518   if (align_labels <= 0) align_labels = 1;
5519   align_labels_log = floor_log2 (align_labels*2-1);
5520   if (align_functions <= 0) align_functions = 1;
5521   align_functions_log = floor_log2 (align_functions*2-1);
5522   
5523   if (profile_block_flag == 3)
5524     {
5525       warning ("`-ax' and `-a' are conflicting options. `-a' ignored.");
5526       profile_block_flag = 2;
5527     }
5528
5529   /* Unrolling all loops implies that standard loop unrolling must also
5530      be done.  */
5531   if (flag_unroll_all_loops)
5532     flag_unroll_loops = 1;
5533   /* Loop unrolling requires that strength_reduction be on also.  Silently
5534      turn on strength reduction here if it isn't already on.  Also, the loop
5535      unrolling code assumes that cse will be run after loop, so that must
5536      be turned on also.  */
5537   if (flag_unroll_loops)
5538     {
5539       flag_strength_reduce = 1;
5540       flag_rerun_cse_after_loop = 1;
5541     }
5542
5543   /* Warn about options that are not supported on this machine.  */
5544 #ifndef INSN_SCHEDULING
5545   if (flag_schedule_insns || flag_schedule_insns_after_reload)
5546     warning ("instruction scheduling not supported on this target machine");
5547 #endif
5548 #ifndef DELAY_SLOTS
5549   if (flag_delayed_branch)
5550     warning ("this target machine does not have delayed branches");
5551 #endif
5552
5553   user_label_prefix = USER_LABEL_PREFIX;
5554   if (flag_leading_underscore != -1)
5555     {
5556       /* If the default prefix is more complicated than "" or "_", 
5557          issue a warning and ignore this option.  */
5558       if (user_label_prefix[0] == 0 ||
5559           (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
5560         {
5561           user_label_prefix = flag_leading_underscore ? "_" : "";
5562         }
5563       else
5564         warning ("-f%sleading-underscore not supported on this target machine",
5565                  flag_leading_underscore ? "" : "no-");
5566     }
5567
5568   /* If we are in verbose mode, write out the version and maybe all the
5569      option flags in use.  */
5570   if (version_flag)
5571     {
5572       print_version (stderr, "");
5573       if (! quiet_flag)
5574         print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
5575     }
5576
5577   compile_file (filename);
5578
5579 #if !defined(OS2) && !defined(VMS) && (!defined(_WIN32) || defined (__CYGWIN__)) && !defined(__INTERIX)
5580   if (flag_print_mem)
5581     {
5582       char *lim = (char *) sbrk (0);
5583
5584       notice ("Data size %ld.\n", (long) (lim - (char *) &environ));
5585       fflush (stderr);
5586
5587 #ifndef __MSDOS__
5588 #ifdef USG
5589       system ("ps -l 1>&2");
5590 #else /* not USG */
5591       system ("ps v");
5592 #endif /* not USG */
5593 #endif
5594     }
5595 #endif /* ! OS2 && ! VMS && (! _WIN32 || CYGWIN) && ! __INTERIX */
5596
5597   if (errorcount)
5598     return (FATAL_EXIT_CODE);
5599   if (sorrycount)
5600     return (FATAL_EXIT_CODE);
5601   return (SUCCESS_EXIT_CODE);
5602 }
5603 \f
5604 /* Decode -m switches.  */
5605 /* Decode the switch -mNAME.  */
5606
5607 static void
5608 set_target_switch (name)
5609   const char *name;
5610 {
5611   register size_t j;
5612   int valid_target_option = 0;
5613
5614   for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
5615     if (!strcmp (target_switches[j].name, name))
5616       {
5617         if (target_switches[j].value < 0)
5618           target_flags &= ~-target_switches[j].value;
5619         else
5620           target_flags |= target_switches[j].value;
5621         valid_target_option = 1;
5622       }
5623
5624 #ifdef TARGET_OPTIONS
5625   if (!valid_target_option)
5626     for (j = 0; j < sizeof target_options / sizeof target_options[0]; j++)
5627       {
5628         int len = strlen (target_options[j].prefix);
5629         if (!strncmp (target_options[j].prefix, name, len))
5630           {
5631             *target_options[j].variable = name + len;
5632             valid_target_option = 1;
5633           }
5634       }
5635 #endif
5636
5637   if (!valid_target_option)
5638     error ("Invalid option `%s'", name);
5639 }
5640 \f
5641 /* Print version information to FILE.
5642    Each line begins with INDENT (for the case where FILE is the
5643    assembler output file).  */
5644
5645 static void
5646 print_version (file, indent)
5647      FILE *file;
5648      const char *indent;
5649 {
5650 #ifndef __VERSION__
5651 #define __VERSION__ "[?]"
5652 #endif
5653   fnotice (file,
5654 #ifdef __GNUC__
5655            "%s%s%s version %s (%s) compiled by GNU C version %s.\n"
5656 #else
5657            "%s%s%s version %s (%s) compiled by CC.\n"
5658 #endif
5659            , indent, *indent != 0 ? " " : "",
5660            language_string, version_string, TARGET_NAME, __VERSION__);
5661 }
5662
5663 /* Print an option value and return the adjusted position in the line.
5664    ??? We don't handle error returns from fprintf (disk full); presumably
5665    other code will catch a disk full though.  */
5666
5667 static int
5668 print_single_switch (file, pos, max, indent, sep, term, type, name)
5669      FILE *file;
5670      int pos, max;
5671      const char *indent, *sep, *term, *type, *name;
5672 {
5673   /* The ultrix fprintf returns 0 on success, so compute the result we want
5674      here since we need it for the following test.  */
5675   int len = strlen (sep) + strlen (type) + strlen (name);
5676
5677   if (pos != 0
5678       && pos + len > max)
5679     {
5680       fprintf (file, "%s", term);
5681       pos = 0;
5682     }
5683   if (pos == 0)
5684     {
5685       fprintf (file, "%s", indent);
5686       pos = strlen (indent);
5687     }
5688   fprintf (file, "%s%s%s", sep, type, name);
5689   pos += len;
5690   return pos;
5691 }
5692      
5693 /* Print active target switches to FILE.
5694    POS is the current cursor position and MAX is the size of a "line".
5695    Each line begins with INDENT and ends with TERM.
5696    Each switch is separated from the next by SEP.  */
5697
5698 static void
5699 print_switch_values (file, pos, max, indent, sep, term)
5700      FILE *file;
5701      int pos, max;
5702      const char *indent, *sep, *term;
5703 {
5704   size_t j;
5705   char **p;
5706
5707   /* Print the options as passed.  */
5708
5709   pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
5710                              _("options passed: "), "");
5711
5712   for (p = &save_argv[1]; *p != NULL; p++)
5713     if (**p == '-')
5714       {
5715         /* Ignore these.  */
5716         if (strcmp (*p, "-o") == 0)
5717           {
5718             if (p[1] != NULL)
5719               p++;
5720             continue;
5721           }
5722         if (strcmp (*p, "-quiet") == 0)
5723           continue;
5724         if (strcmp (*p, "-version") == 0)
5725           continue;
5726         if ((*p)[1] == 'd')
5727           continue;
5728
5729         pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
5730       }
5731   if (pos > 0)
5732     fprintf (file, "%s", term);
5733
5734   /* Print the -f and -m options that have been enabled.
5735      We don't handle language specific options but printing argv
5736      should suffice.  */
5737
5738   pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
5739                              _("options enabled: "), "");
5740
5741   for (j = 0; j < sizeof f_options / sizeof f_options[0]; j++)
5742     if (*f_options[j].variable == f_options[j].on_value)
5743       pos = print_single_switch (file, pos, max, indent, sep, term,
5744                                  "-f", f_options[j].string);
5745
5746   /* Print target specific options.  */
5747
5748   for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
5749     if (target_switches[j].name[0] != '\0'
5750         && target_switches[j].value > 0
5751         && ((target_switches[j].value & target_flags)
5752             == target_switches[j].value))
5753       {
5754         pos = print_single_switch (file, pos, max, indent, sep, term,
5755                                    "-m", target_switches[j].name);
5756       }
5757
5758 #ifdef TARGET_OPTIONS
5759   for (j = 0; j < sizeof target_options / sizeof target_options[0]; j++)
5760     if (*target_options[j].variable != NULL)
5761       {
5762         char prefix[256];
5763         sprintf (prefix, "-m%s", target_options[j].prefix);
5764         pos = print_single_switch (file, pos, max, indent, sep, term,
5765                                    prefix, *target_options[j].variable);
5766       }
5767 #endif
5768
5769   fprintf (file, "%s", term);
5770 }
5771
5772 /* Record the beginning of a new source file, named FILENAME.  */
5773
5774 void
5775 debug_start_source_file (filename)
5776      register char *filename ATTRIBUTE_UNUSED;
5777 {
5778 #ifdef DBX_DEBUGGING_INFO
5779   if (write_symbols == DBX_DEBUG)
5780     dbxout_start_new_source_file (filename);
5781 #endif
5782 #ifdef DWARF_DEBUGGING_INFO
5783   if (debug_info_level == DINFO_LEVEL_VERBOSE
5784       && write_symbols == DWARF_DEBUG)
5785     dwarfout_start_new_source_file (filename);
5786 #endif /* DWARF_DEBUGGING_INFO */
5787 #ifdef DWARF2_DEBUGGING_INFO
5788   if (debug_info_level == DINFO_LEVEL_VERBOSE
5789       && write_symbols == DWARF2_DEBUG)
5790     dwarf2out_start_source_file (filename);
5791 #endif /* DWARF2_DEBUGGING_INFO */  
5792 #ifdef SDB_DEBUGGING_INFO
5793   if (write_symbols == SDB_DEBUG)
5794     sdbout_start_new_source_file (filename);
5795 #endif
5796 }
5797
5798 /* Record the resumption of a source file.  LINENO is the line number in
5799    the source file we are returning to.  */
5800
5801 void
5802 debug_end_source_file (lineno)
5803      register unsigned lineno ATTRIBUTE_UNUSED;
5804 {
5805 #ifdef DBX_DEBUGGING_INFO
5806   if (write_symbols == DBX_DEBUG)
5807     dbxout_resume_previous_source_file ();
5808 #endif
5809 #ifdef DWARF_DEBUGGING_INFO
5810   if (debug_info_level == DINFO_LEVEL_VERBOSE
5811       && write_symbols == DWARF_DEBUG)
5812     dwarfout_resume_previous_source_file (lineno);
5813 #endif /* DWARF_DEBUGGING_INFO */
5814 #ifdef DWARF2_DEBUGGING_INFO
5815   if (debug_info_level == DINFO_LEVEL_VERBOSE
5816       && write_symbols == DWARF2_DEBUG)
5817     dwarf2out_end_source_file ();
5818 #endif /* DWARF2_DEBUGGING_INFO */
5819 #ifdef SDB_DEBUGGING_INFO
5820   if (write_symbols == SDB_DEBUG)
5821     sdbout_resume_previous_source_file ();
5822 #endif
5823 }
5824
5825 /* Called from check_newline in c-parse.y.  The `buffer' parameter contains
5826    the tail part of the directive line, i.e. the part which is past the
5827    initial whitespace, #, whitespace, directive-name, whitespace part.  */
5828
5829 void
5830 debug_define (lineno, buffer)
5831      register unsigned lineno ATTRIBUTE_UNUSED;
5832      register char *buffer ATTRIBUTE_UNUSED;
5833 {
5834 #ifdef DWARF_DEBUGGING_INFO
5835   if (debug_info_level == DINFO_LEVEL_VERBOSE
5836       && write_symbols == DWARF_DEBUG)
5837     dwarfout_define (lineno, buffer);
5838 #endif /* DWARF_DEBUGGING_INFO */
5839 #ifdef DWARF2_DEBUGGING_INFO
5840   if (debug_info_level == DINFO_LEVEL_VERBOSE
5841       && write_symbols == DWARF2_DEBUG)
5842     dwarf2out_define (lineno, buffer);
5843 #endif /* DWARF2_DEBUGGING_INFO */
5844 }
5845
5846 /* Called from check_newline in c-parse.y.  The `buffer' parameter contains
5847    the tail part of the directive line, i.e. the part which is past the
5848    initial whitespace, #, whitespace, directive-name, whitespace part.  */
5849
5850 void
5851 debug_undef (lineno, buffer)
5852      register unsigned lineno ATTRIBUTE_UNUSED;
5853      register char *buffer ATTRIBUTE_UNUSED;
5854 {
5855 #ifdef DWARF_DEBUGGING_INFO
5856   if (debug_info_level == DINFO_LEVEL_VERBOSE
5857       && write_symbols == DWARF_DEBUG)
5858     dwarfout_undef (lineno, buffer);
5859 #endif /* DWARF_DEBUGGING_INFO */
5860 #ifdef DWARF2_DEBUGGING_INFO
5861   if (debug_info_level == DINFO_LEVEL_VERBOSE
5862       && write_symbols == DWARF2_DEBUG)
5863     dwarf2out_undef (lineno, buffer);
5864 #endif /* DWARF2_DEBUGGING_INFO */
5865 }