OSDN Git Service

* diagnostic.c (real_abort): New.
[pf3gnuchains/gcc-fork.git] / gcc / toplev.c
1 /* Top level of GNU C compiler
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 /* This is the top level of cc1/c++.
23    It parses command args, opens files, invokes the various passes
24    in the proper order, and counts the time used by each.
25    Error messages and low-level interface to malloc also handled here.  */
26
27 #include "config.h"
28 #undef FLOAT /* This is for hpux. They should change hpux.  */
29 #undef FFS  /* Some systems define this in param.h.  */
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tm.h"
33 #include <signal.h>
34
35 #ifdef HAVE_SYS_RESOURCE_H
36 # include <sys/resource.h>
37 #endif
38
39 #ifdef HAVE_SYS_TIMES_H
40 # include <sys/times.h>
41 #endif
42
43 #include "input.h"
44 #include "tree.h"
45 #include "rtl.h"
46 #include "tm_p.h"
47 #include "flags.h"
48 #include "insn-attr.h"
49 #include "insn-config.h"
50 #include "insn-flags.h"
51 #include "hard-reg-set.h"
52 #include "recog.h"
53 #include "output.h"
54 #include "except.h"
55 #include "function.h"
56 #include "toplev.h"
57 #include "expr.h"
58 #include "basic-block.h"
59 #include "intl.h"
60 #include "ggc.h"
61 #include "graph.h"
62 #include "loop.h"
63 #include "regs.h"
64 #include "timevar.h"
65 #include "diagnostic.h"
66 #include "ssa.h"
67 #include "params.h"
68 #include "reload.h"
69 #include "dwarf2asm.h"
70 #include "integrate.h"
71 #include "real.h"
72 #include "debug.h"
73 #include "target.h"
74 #include "langhooks.h"
75 #include "cfglayout.h"
76 #include "cfgloop.h"
77 #include "hosthooks.h"
78
79 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
80 #include "dwarf2out.h"
81 #endif
82
83 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
84 #include "dbxout.h"
85 #endif
86
87 #ifdef SDB_DEBUGGING_INFO
88 #include "sdbout.h"
89 #endif
90
91 #ifdef XCOFF_DEBUGGING_INFO
92 #include "xcoffout.h"           /* Needed for external data
93                                    declarations for e.g. AIX 4.x.  */
94 #endif
95 \f
96 /* Carry information from ASM_DECLARE_OBJECT_NAME
97    to ASM_FINISH_DECLARE_OBJECT.  */
98
99 extern int size_directive_output;
100 extern tree last_assemble_variable_decl;
101
102 extern void reg_alloc PARAMS ((void));
103
104 static void general_init PARAMS ((char *));
105 static void parse_options_and_default_flags PARAMS ((int, char **));
106 static void do_compile PARAMS ((void));
107 static void process_options PARAMS ((void));
108 static void backend_init PARAMS ((void));
109 static int lang_dependent_init PARAMS ((const char *));
110 static void init_asm_output PARAMS ((const char *));
111 static void finalize PARAMS ((void));
112
113 static void set_target_switch PARAMS ((const char *));
114
115 static void crash_signal PARAMS ((int)) ATTRIBUTE_NORETURN;
116 static void setup_core_dumping PARAMS ((void));
117 static void compile_file PARAMS ((void));
118 static void display_help PARAMS ((void));
119 static void display_target_options PARAMS ((void));
120
121 static void decode_d_option PARAMS ((const char *));
122 static int decode_f_option PARAMS ((const char *));
123 static int decode_W_option PARAMS ((const char *));
124 static int decode_g_option PARAMS ((const char *));
125 static unsigned int independent_decode_option PARAMS ((int, char **));
126
127 static void print_version PARAMS ((FILE *, const char *));
128 static int print_single_switch PARAMS ((FILE *, int, int, const char *,
129                                       const char *, const char *,
130                                       const char *, const char *));
131 static void print_switch_values PARAMS ((FILE *, int, int, const char *,
132                                        const char *, const char *));
133
134 /* Nonzero to dump debug info whilst parsing (-dy option).  */
135 static int set_yydebug;
136
137 /* Length of line when printing switch values.  */
138 #define MAX_LINE 75
139
140 /* Name of program invoked, sans directories.  */
141
142 const char *progname;
143
144 /* Copy of arguments to toplev_main.  */
145 int save_argc;
146 char **save_argv;
147 \f
148 /* Name of current original source file (what was input to cpp).
149    This comes from each #-command in the actual input.  */
150
151 const char *input_filename;
152
153 /* Name of top-level original source file (what was input to cpp).
154    This comes from the #-command at the beginning of the actual input.
155    If there isn't any there, then this is the cc1 input file name.  */
156
157 const char *main_input_filename;
158
159 /* Current line number in real source file.  */
160
161 int lineno;
162
163 /* Nonzero if it is unsafe to create any new pseudo registers.  */
164 int no_new_pseudos;
165
166 /* Stack of currently pending input files.  */
167
168 struct file_stack *input_file_stack;
169
170 /* Incremented on each change to input_file_stack.  */
171 int input_file_stack_tick;
172
173 /* Name to use as base of names for dump output files.  */
174
175 const char *dump_base_name;
176
177 /* Name to use as a base for auxiliary output files.  */
178
179 const char *aux_base_name;
180
181 /* Format to use to print dumpfile index value */
182 #ifndef DUMPFILE_FORMAT
183 #define DUMPFILE_FORMAT ".%02d."
184 #endif
185
186 /* Bit flags that specify the machine subtype we are compiling for.
187    Bits are tested using macros TARGET_... defined in the tm.h file
188    and set by `-m...' switches.  Must be defined in rtlanal.c.  */
189
190 extern int target_flags;
191
192 /* A mask of target_flags that includes bit X if X was set or cleared
193    on the command line.  */
194
195 int target_flags_explicit;
196
197 /* Debug hooks - dependent upon command line options.  */
198
199 const struct gcc_debug_hooks *debug_hooks = &do_nothing_debug_hooks;
200
201 /* Describes a dump file.  */
202
203 struct dump_file_info
204 {
205   /* The unique extension to apply, e.g. ".jump".  */
206   const char *const extension;
207
208   /* The -d<c> character that enables this dump file.  */
209   char const debug_switch;
210
211   /* True if there is a corresponding graph dump file.  */
212   char const graph_dump_p;
213
214   /* True if the user selected this dump.  */
215   char enabled;
216
217   /* True if the files have been initialized (ie truncated).  */
218   char initialized;
219 };
220
221 /* Enumerate the extant dump files.  */
222
223 enum dump_file_index
224 {
225   DFI_rtl,
226   DFI_sibling,
227   DFI_eh,
228   DFI_jump,
229   DFI_ssa,
230   DFI_ssa_ccp,
231   DFI_ssa_dce,
232   DFI_ussa,
233   DFI_null,
234   DFI_cse,
235   DFI_addressof,
236   DFI_gcse,
237   DFI_loop,
238   DFI_bypass,
239   DFI_cfg,
240   DFI_bp,
241   DFI_ce1,
242   DFI_tracer,
243   DFI_loop2,
244   DFI_cse2,
245   DFI_life,
246   DFI_combine,
247   DFI_ce2,
248   DFI_regmove,
249   DFI_sched,
250   DFI_lreg,
251   DFI_greg,
252   DFI_postreload,
253   DFI_flow2,
254   DFI_peephole2,
255   DFI_rnreg,
256   DFI_ce3,
257   DFI_sched2,
258   DFI_stack,
259   DFI_bbro,
260   DFI_mach,
261   DFI_dbr,
262   DFI_MAX
263 };
264
265 /* Describes all the dump files.  Should be kept in order of the
266    pass and in sync with dump_file_index above.
267
268    Remaining -d letters:
269
270         "              o q         "
271         "       H JK   OPQ  TUV  YZ"
272 */
273
274 static struct dump_file_info dump_file[DFI_MAX] =
275 {
276   { "rtl",      'r', 0, 0, 0 },
277   { "sibling",  'i', 0, 0, 0 },
278   { "eh",       'h', 0, 0, 0 },
279   { "jump",     'j', 0, 0, 0 },
280   { "ssa",      'e', 1, 0, 0 },
281   { "ssaccp",   'W', 1, 0, 0 },
282   { "ssadce",   'X', 1, 0, 0 },
283   { "ussa",     'e', 1, 0, 0 }, /* Yes, duplicate enable switch.  */
284   { "null",     'u', 0, 0, 0 },
285   { "cse",      's', 0, 0, 0 },
286   { "addressof", 'F', 0, 0, 0 },
287   { "gcse",     'G', 1, 0, 0 },
288   { "loop",     'L', 1, 0, 0 },
289   { "bypass",   'G', 1, 0, 0 }, /* Yes, duplicate enable switch.  */
290   { "cfg",      'f', 1, 0, 0 },
291   { "bp",       'b', 1, 0, 0 },
292   { "ce1",      'C', 1, 0, 0 },
293   { "tracer",   'T', 1, 0, 0 },
294   { "loop2",    'L', 1, 0, 0 },
295   { "cse2",     't', 1, 0, 0 },
296   { "life",     'f', 1, 0, 0 }, /* Yes, duplicate enable switch.  */
297   { "combine",  'c', 1, 0, 0 },
298   { "ce2",      'C', 1, 0, 0 },
299   { "regmove",  'N', 1, 0, 0 },
300   { "sched",    'S', 1, 0, 0 },
301   { "lreg",     'l', 1, 0, 0 },
302   { "greg",     'g', 1, 0, 0 },
303   { "postreload", 'o', 1, 0, 0 },
304   { "flow2",    'w', 1, 0, 0 },
305   { "peephole2", 'z', 1, 0, 0 },
306   { "rnreg",    'n', 1, 0, 0 },
307   { "ce3",      'E', 1, 0, 0 },
308   { "sched2",   'R', 1, 0, 0 },
309   { "stack",    'k', 1, 0, 0 },
310   { "bbro",     'B', 1, 0, 0 },
311   { "mach",     'M', 1, 0, 0 },
312   { "dbr",      'd', 0, 0, 0 },
313 };
314
315 static int open_dump_file PARAMS ((enum dump_file_index, tree));
316 static void close_dump_file PARAMS ((enum dump_file_index,
317                                      void (*) (FILE *, rtx), rtx));
318
319 /* Other flags saying which kinds of debugging dump have been requested.  */
320
321 int rtl_dump_and_exit;
322 int flag_print_asm_name;
323 static int version_flag;
324 static char *filename;
325 enum graph_dump_types graph_dump_format;
326
327 /* Name for output file of assembly code, specified with -o.  */
328
329 char *asm_file_name;
330
331 /* Value of the -G xx switch, and whether it was passed or not.  */
332 int g_switch_value;
333 int g_switch_set;
334
335 /* Type(s) of debugging information we are producing (if any).
336    See flags.h for the definitions of the different possible
337    types of debugging information.  */
338 enum debug_info_type write_symbols = NO_DEBUG;
339
340 /* Level of debugging information we are producing.  See flags.h
341    for the definitions of the different possible levels.  */
342 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
343
344 /* Nonzero means use GNU-only extensions in the generated symbolic
345    debugging information.  */
346 /* Currently, this only has an effect when write_symbols is set to
347    DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
348 int use_gnu_debug_info_extensions = 0;
349
350 /* Nonzero means do optimizations.  -O.
351    Particular numeric values stand for particular amounts of optimization;
352    thus, -O2 stores 2 here.  However, the optimizations beyond the basic
353    ones are not controlled directly by this variable.  Instead, they are
354    controlled by individual `flag_...' variables that are defaulted
355    based on this variable.  */
356
357 int optimize = 0;
358
359 /* Nonzero means optimize for size.  -Os.
360    The only valid values are zero and nonzero. When optimize_size is
361    nonzero, optimize defaults to 2, but certain individual code
362    bloating optimizations are disabled.  */
363
364 int optimize_size = 0;
365
366 /* Nonzero if we should exit after parsing options.  */
367 static int exit_after_options = 0;
368
369 /* The FUNCTION_DECL for the function currently being compiled,
370    or 0 if between functions.  */
371 tree current_function_decl;
372
373 /* Set to the FUNC_BEGIN label of the current function, or NULL_TREE
374    if none.  */
375 tree current_function_func_begin_label;
376
377 /* Nonzero if doing dwarf2 duplicate elimination.  */
378
379 int flag_eliminate_dwarf2_dups = 0;
380
381 /* Nonzero if generating code to do profiling.  */
382
383 int profile_flag = 0;
384
385 /* Nonzero if generating code to profile program flow graph arcs.  */
386
387 int profile_arc_flag = 0;
388
389 /* Nonzero if generating info for gcov to calculate line test coverage.  */
390
391 int flag_test_coverage = 0;
392
393 /* Nonzero indicates that branch taken probabilities should be calculated.  */
394
395 int flag_branch_probabilities = 0;
396
397 /* Nonzero if basic blocks should be reordered.  */
398
399 int flag_reorder_blocks = 0;
400
401 /* Nonzero if functions should be reordered.  */
402
403 int flag_reorder_functions = 0;
404
405 /* Nonzero if registers should be renamed.  */
406
407 int flag_rename_registers = 0;
408 int flag_cprop_registers = 0;
409
410 /* Nonzero for -pedantic switch: warn about anything
411    that standard spec forbids.  */
412
413 int pedantic = 0;
414
415 /* Temporarily suppress certain warnings.
416    This is set while reading code from a system header file.  */
417
418 int in_system_header = 0;
419
420 /* Don't print functions as they are compiled.  -quiet.  */
421
422 int quiet_flag = 0;
423
424 /* Print times taken by the various passes.  -ftime-report.  */
425
426 int time_report = 0;
427
428 /* Print memory still in use at end of compilation (which may have little
429    to do with peak memory consumption).  -fmem-report.  */
430
431 int mem_report = 0;
432
433 /* Nonzero means to collect statistics which might be expensive
434    and to print them when we are done.  */
435 int flag_detailed_statistics = 0;
436
437 \f
438 /* -f flags.  */
439
440 /* Nonzero means `char' should be signed.  */
441
442 int flag_signed_char;
443
444 /* Nonzero means give an enum type only as many bytes as it needs.  */
445
446 int flag_short_enums;
447
448 /* Nonzero for -fcaller-saves: allocate values in regs that need to
449    be saved across function calls, if that produces overall better code.
450    Optional now, so people can test it.  */
451
452 #ifdef DEFAULT_CALLER_SAVES
453 int flag_caller_saves = 1;
454 #else
455 int flag_caller_saves = 0;
456 #endif
457
458 /* Nonzero if structures and unions should be returned in memory.
459
460    This should only be defined if compatibility with another compiler or
461    with an ABI is needed, because it results in slower code.  */
462
463 #ifndef DEFAULT_PCC_STRUCT_RETURN
464 #define DEFAULT_PCC_STRUCT_RETURN 1
465 #endif
466
467 /* Nonzero for -fpcc-struct-return: return values the same way PCC does.  */
468
469 int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
470
471 /* Nonzero for -fforce-mem: load memory value into a register
472    before arithmetic on it.  This makes better cse but slower compilation.  */
473
474 int flag_force_mem = 0;
475
476 /* Nonzero for -fforce-addr: load memory address into a register before
477    reference to memory.  This makes better cse but slower compilation.  */
478
479 int flag_force_addr = 0;
480
481 /* Nonzero for -fdefer-pop: don't pop args after each function call;
482    instead save them up to pop many calls' args with one insns.  */
483
484 int flag_defer_pop = 0;
485
486 /* Nonzero for -ffloat-store: don't allocate floats and doubles
487    in extended-precision registers.  */
488
489 int flag_float_store = 0;
490
491 /* Nonzero for -fcse-follow-jumps:
492    have cse follow jumps to do a more extensive job.  */
493
494 int flag_cse_follow_jumps;
495
496 /* Nonzero for -fcse-skip-blocks:
497    have cse follow a branch around a block.  */
498 int flag_cse_skip_blocks;
499
500 /* Nonzero for -fexpensive-optimizations:
501    perform miscellaneous relatively-expensive optimizations.  */
502 int flag_expensive_optimizations;
503
504 /* Nonzero for -fthread-jumps:
505    have jump optimize output of loop.  */
506
507 int flag_thread_jumps;
508
509 /* Nonzero enables strength-reduction in loop.c.  */
510
511 int flag_strength_reduce = 0;
512
513 /* Nonzero enables loop unrolling in unroll.c.  Only loops for which the
514    number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
515    UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
516    unrolled.  */
517
518 int flag_unroll_loops;
519
520 /* Nonzero enables loop unrolling in unroll.c.  All loops are unrolled.
521    This is generally not a win.  */
522
523 int flag_unroll_all_loops;
524
525 /* Nonzero enables loop unswitching.  */
526 int flag_unswitch_loops;
527
528 /* Nonzero enables prefetch optimizations for arrays in loops.  */
529
530 int flag_prefetch_loop_arrays;
531
532 /* Nonzero forces all invariant computations in loops to be moved
533    outside the loop.  */
534
535 int flag_move_all_movables = 0;
536
537 /* Nonzero forces all general induction variables in loops to be
538    strength reduced.  */
539
540 int flag_reduce_all_givs = 0;
541
542 /* Nonzero to perform full register move optimization passes.  This is the
543    default for -O2.  */
544
545 int flag_regmove = 0;
546
547 /* Nonzero for -fwritable-strings:
548    store string constants in data segment and don't uniquize them.  */
549
550 int flag_writable_strings = 0;
551
552 /* Nonzero means don't put addresses of constant functions in registers.
553    Used for compiling the Unix kernel, where strange substitutions are
554    done on the assembly output.  */
555
556 int flag_no_function_cse = 0;
557
558 /* Nonzero for -fomit-frame-pointer:
559    don't make a frame pointer in simple functions that don't require one.  */
560
561 int flag_omit_frame_pointer = 0;
562
563 /* Nonzero means place each function into its own section on those platforms
564    which support arbitrary section names and unlimited numbers of sections.  */
565
566 int flag_function_sections = 0;
567
568 /* ... and similar for data.  */
569
570 int flag_data_sections = 0;
571
572 /* Nonzero to inhibit use of define_optimization peephole opts.  */
573
574 int flag_no_peephole = 0;
575
576 /* Nonzero allows GCC to optimize sibling and tail recursive calls.  */
577
578 int flag_optimize_sibling_calls = 0;
579
580 /* Nonzero means the front end generally wants `errno' maintained by math
581    operations, like built-in SQRT.  */
582
583 int flag_errno_math = 1;
584
585 /* Nonzero means that unsafe floating-point math optimizations are allowed
586    for the sake of speed.  IEEE compliance is not guaranteed, and operations
587    are allowed to assume that their arguments and results are "normal"
588    (e.g., nonnegative for SQRT).  */
589
590 int flag_unsafe_math_optimizations = 0;
591
592 /* Nonzero means that no NaNs or +-Infs are expected.  */
593
594 int flag_finite_math_only = 0;
595
596 /* Zero means that floating-point math operations cannot generate a
597    (user-visible) trap.  This is the case, for example, in nonstop
598    IEEE 754 arithmetic.  Trapping conditions include division by zero,
599    overflow, underflow, invalid and inexact, but does not include 
600    operations on signaling NaNs (see below).  */
601
602 int flag_trapping_math = 1;
603
604 /* Nonzero means disable transformations observable by signaling NaNs.
605    This option implies that any operation on a IEEE signaling NaN can
606    generate a (user-visible) trap.  */
607
608 int flag_signaling_nans = 0;
609
610 /* 0 means straightforward implementation of complex divide acceptable.
611    1 means wide ranges of inputs must work for complex divide.
612    2 means C99-like requirements for complex divide (not yet implemented).  */
613
614 int flag_complex_divide_method = 0;
615
616 /* Nonzero means just do syntax checking; don't output anything.  */
617
618 int flag_syntax_only = 0;
619
620 /* Nonzero means perform loop optimizer.  */
621
622 static int flag_loop_optimize;
623
624 /* Nonzero means perform crossjumping.  */
625
626 static int flag_crossjumping;
627
628 /* Nonzero means perform if conversion.  */
629
630 static int flag_if_conversion;
631
632 /* Nonzero means perform if conversion after reload.  */
633
634 static int flag_if_conversion2;
635
636 /* Nonzero means to use global dataflow analysis to eliminate
637    useless null pointer tests.  */
638
639 static int flag_delete_null_pointer_checks;
640
641 /* Nonzero means perform global CSE.  */
642
643 int flag_gcse = 0;
644
645 /* Nonzero means to do the enhanced load motion during gcse, which trys
646    to hoist loads by not killing them when a store to the same location
647    is seen.  */
648
649 int flag_gcse_lm = 1;
650
651 /* Nonzero means to perform store motion after gcse, which will try to
652    move stores closer to the exit block.  Its not very effective without
653    flag_gcse_lm.  */
654
655 int flag_gcse_sm = 1;
656
657 /* Nonzero means to rerun cse after loop optimization.  This increases
658    compilation time about 20% and picks up a few more common expressions.  */
659
660 static int flag_rerun_cse_after_loop;
661
662 /* Nonzero means to run loop optimizations twice.  */
663
664 int flag_rerun_loop_opt;
665
666 /* Nonzero for -finline-functions: ok to inline functions that look like
667    good inline candidates.  */
668
669 int flag_inline_functions;
670
671 /* Nonzero for -fkeep-inline-functions: even if we make a function
672    go inline everywhere, keep its definition around for debugging
673    purposes.  */
674
675 int flag_keep_inline_functions;
676
677 /* Nonzero means that functions will not be inlined.  */
678
679 int flag_no_inline = 2;
680
681 /* Nonzero means that we don't want inlining by virtue of -fno-inline,
682    not just because the tree inliner turned us off.  */
683
684 int flag_really_no_inline = 2;
685
686 /* Nonzero means that we should emit static const variables
687    regardless of whether or not optimization is turned on.  */
688
689 int flag_keep_static_consts = 1;
690
691 /* Nonzero means we should be saving declaration info into a .X file.  */
692
693 int flag_gen_aux_info = 0;
694
695 /* Specified name of aux-info file.  */
696
697 static char *aux_info_file_name;
698
699 /* Nonzero means make the text shared if supported.  */
700
701 int flag_shared_data;
702
703 /* Nonzero means schedule into delayed branch slots if supported.  */
704
705 int flag_delayed_branch;
706
707 /* Nonzero if we are compiling pure (sharable) code.
708    Value is 1 if we are doing "small" pic; value is 2 if we're doing
709    "large" pic.  */
710
711 int flag_pic;
712
713 /* Set to the default thread-local storage (tls) model to use.  */
714
715 enum tls_model flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
716
717 /* Nonzero means generate extra code for exception handling and enable
718    exception handling.  */
719
720 int flag_exceptions;
721
722 /* Nonzero means generate frame unwind info table when supported.  */
723
724 int flag_unwind_tables = 0;
725
726 /* Nonzero means generate frame unwind info table exact at each insn boundary */
727
728 int flag_asynchronous_unwind_tables = 0;
729
730 /* Nonzero means don't place uninitialized global data in common storage
731    by default.  */
732
733 int flag_no_common;
734
735 /* Nonzero means change certain warnings into errors.
736    Usually these are warnings about failure to conform to some standard.  */
737
738 int flag_pedantic_errors = 0;
739
740 /* flag_schedule_insns means schedule insns within basic blocks (before
741    local_alloc).
742    flag_schedule_insns_after_reload means schedule insns after
743    global_alloc.  */
744
745 int flag_schedule_insns = 0;
746 int flag_schedule_insns_after_reload = 0;
747
748 /* The following flags have effect only for scheduling before register
749    allocation:
750
751    flag_schedule_interblock means schedule insns across basic blocks.
752    flag_schedule_speculative means allow speculative motion of non-load insns.
753    flag_schedule_speculative_load means allow speculative motion of some
754    load insns.
755    flag_schedule_speculative_load_dangerous allows speculative motion of more
756    load insns.  */
757
758 int flag_schedule_interblock = 1;
759 int flag_schedule_speculative = 1;
760 int flag_schedule_speculative_load = 0;
761 int flag_schedule_speculative_load_dangerous = 0;
762
763 int flag_single_precision_constant;
764
765 /* flag_branch_on_count_reg means try to replace add-1,compare,branch tupple
766    by a cheaper branch on a count register.  */
767 int flag_branch_on_count_reg = 1;
768
769 /* -finhibit-size-directive inhibits output of .size for ELF.
770    This is used only for compiling crtstuff.c,
771    and it may be extended to other effects
772    needed for crtstuff.c on other systems.  */
773 int flag_inhibit_size_directive = 0;
774
775 /* -fverbose-asm causes extra commentary information to be produced in
776    the generated assembly code (to make it more readable).  This option
777    is generally only of use to those who actually need to read the
778    generated assembly code (perhaps while debugging the compiler itself).
779    -fno-verbose-asm, the default, causes the extra information
780    to be omitted and is useful when comparing two assembler files.  */
781
782 int flag_verbose_asm = 0;
783
784 /* -dA causes debug commentary information to be produced in
785    the generated assembly code (to make it more readable).  This option
786    is generally only of use to those who actually need to read the
787    generated assembly code (perhaps while debugging the compiler itself).
788    Currently, this switch is only used by dwarfout.c; however, it is intended
789    to be a catchall for printing debug information in the assembler file.  */
790
791 int flag_debug_asm = 0;
792
793 /* -dP causes the rtl to be emitted as a comment in assembly.  */
794
795 int flag_dump_rtl_in_asm = 0;
796
797 /* -fgnu-linker specifies use of the GNU linker for initializations.
798    (Or, more generally, a linker that handles initializations.)
799    -fno-gnu-linker says that collect2 will be used.  */
800 #ifdef USE_COLLECT2
801 int flag_gnu_linker = 0;
802 #else
803 int flag_gnu_linker = 1;
804 #endif
805
806 /* Nonzero means put zero initialized data in the bss section.  */
807 int flag_zero_initialized_in_bss = 1;
808
809 /* Enable SSA.  */
810 int flag_ssa = 0;
811
812 /* Enable ssa conditional constant propagation.  */
813 int flag_ssa_ccp = 0;
814
815 /* Enable ssa aggressive dead code elimination.  */
816 int flag_ssa_dce = 0;
817
818 /* Tag all structures with __attribute__(packed).  */
819 int flag_pack_struct = 0;
820
821 /* Emit code to check for stack overflow; also may cause large objects
822    to be allocated dynamically.  */
823 int flag_stack_check;
824
825 /* When non-NULL, indicates that whenever space is allocated on the
826    stack, the resulting stack pointer must not pass this
827    address---that is, for stacks that grow downward, the stack pointer
828    must always be greater than or equal to this address; for stacks
829    that grow upward, the stack pointer must be less than this address.
830    At present, the rtx may be either a REG or a SYMBOL_REF, although
831    the support provided depends on the backend.  */
832 rtx stack_limit_rtx;
833
834 /* 0 if pointer arguments may alias each other.  True in C.
835    1 if pointer arguments may not alias each other but may alias
836    global variables.
837    2 if pointer arguments may not alias each other and may not
838    alias global variables.  True in Fortran.
839    This defaults to 0 for C.  */
840 int flag_argument_noalias = 0;
841
842 /* Nonzero if we should do (language-dependent) alias analysis.
843    Typically, this analysis will assume that expressions of certain
844    types do not alias expressions of certain other types.  Only used
845    if alias analysis (in general) is enabled.  */
846 int flag_strict_aliasing = 0;
847
848 /* Instrument functions with calls at entry and exit, for profiling.  */
849 int flag_instrument_function_entry_exit = 0;
850
851 /* Nonzero means ignore `#ident' directives.  0 means handle them.
852    On SVR4 targets, it also controls whether or not to emit a
853    string identifying the compiler.  */
854
855 int flag_no_ident = 0;
856
857 /* This will perform a peephole pass before sched2.  */
858 int flag_peephole2 = 0;
859
860 /* This will try to guess branch probabilities.  */
861 int flag_guess_branch_prob = 0;
862
863 /* -fcheck-bounds causes gcc to generate array bounds checks.
864    For C, C++, ObjC: defaults to off.
865    For Java: defaults to on.
866    For Fortran: defaults to off.  */
867 int flag_bounds_check = 0;
868
869 /* This will attempt to merge constant section constants, if 1 only
870    string constants and constants from constant pool, if 2 also constant
871    variables.  */
872 int flag_merge_constants = 1;
873
874 /* If one, renumber instruction UIDs to reduce the number of
875    unused UIDs if there are a lot of instructions.  If greater than
876    one, unconditionally renumber instruction UIDs.  */
877 int flag_renumber_insns = 1;
878
879 /* If nonzero, use the graph coloring register allocator.  */
880 int flag_new_regalloc = 0;
881
882 /* Nonzero if we perform superblock formation.  */
883
884 int flag_tracer = 0;
885
886 /* Values of the -falign-* flags: how much to align labels in code.
887    0 means `use default', 1 means `don't align'.
888    For each variable, there is an _log variant which is the power
889    of two not less than the variable, for .align output.  */
890
891 int align_loops;
892 int align_loops_log;
893 int align_loops_max_skip;
894 int align_jumps;
895 int align_jumps_log;
896 int align_jumps_max_skip;
897 int align_labels;
898 int align_labels_log;
899 int align_labels_max_skip;
900 int align_functions;
901 int align_functions_log;
902
903 /* Like align_functions_log above, but used by front-ends to force the
904    minimum function alignment.  Zero means no alignment is forced.  */
905 int force_align_functions_log;
906
907 /* Table of supported debugging formats.  */
908 static const struct
909 {
910   const char *const arg;
911   /* Since PREFERRED_DEBUGGING_TYPE isn't necessarily a
912      constant expression, we use NO_DEBUG in its place.  */
913   const enum debug_info_type debug_type;
914   const int use_extensions_p;
915   const char *const description;
916 } *da,
917 debug_args[] =
918 {
919   { "",       NO_DEBUG, DEFAULT_GDB_EXTENSIONS,
920     N_("Generate debugging info in default format") },
921   { "gdb",    NO_DEBUG, 1, N_("Generate debugging info in default extended format") },
922 #ifdef DBX_DEBUGGING_INFO
923   { "stabs",  DBX_DEBUG, 0, N_("Generate STABS format debug info") },
924   { "stabs+", DBX_DEBUG, 1, N_("Generate extended STABS format debug info") },
925 #endif
926 #ifdef DWARF_DEBUGGING_INFO
927   { "dwarf",  DWARF_DEBUG, 0, N_("Generate DWARF-1 format debug info") },
928   { "dwarf+", DWARF_DEBUG, 1,
929     N_("Generate extended DWARF-1 format debug info") },
930 #endif
931 #ifdef DWARF2_DEBUGGING_INFO
932   { "dwarf-2", DWARF2_DEBUG, 0, N_("Generate DWARF-2 debug info") },
933 #endif
934 #ifdef XCOFF_DEBUGGING_INFO
935   { "xcoff",  XCOFF_DEBUG, 0, N_("Generate XCOFF format debug info") },
936   { "xcoff+", XCOFF_DEBUG, 1, N_("Generate extended XCOFF format debug info") },
937 #endif
938 #ifdef SDB_DEBUGGING_INFO
939   { "coff", SDB_DEBUG, 0, N_("Generate COFF format debug info") },
940 #endif
941 #ifdef VMS_DEBUGGING_INFO
942   { "vms", VMS_DEBUG, 0, N_("Generate VMS format debug info") },
943 #endif
944   { 0, 0, 0, 0 }
945 };
946
947 typedef struct
948 {
949   const char *const string;
950   int *const variable;
951   const int on_value;
952   const char *const description;
953 }
954 lang_independent_options;
955
956 int flag_trapv = 0;
957
958 /* Add or remove a leading underscore from user symbols.  */
959 int flag_leading_underscore = -1;
960
961 /* The user symbol prefix after having resolved same.  */
962 const char *user_label_prefix;
963
964 static const param_info lang_independent_params[] = {
965 #define DEFPARAM(ENUM, OPTION, HELP, DEFAULT) \
966   { OPTION, DEFAULT, HELP },
967 #include "params.def"
968 #undef DEFPARAM
969   { NULL, 0, NULL }
970 };
971
972 /* Table of language-independent -f options.
973    STRING is the option name.  VARIABLE is the address of the variable.
974    ON_VALUE is the value to store in VARIABLE
975     if `-fSTRING' is seen as an option.
976    (If `-fno-STRING' is seen as an option, the opposite value is stored.)  */
977
978 static const lang_independent_options f_options[] =
979 {
980   {"eliminate-dwarf2-dups", &flag_eliminate_dwarf2_dups, 1,
981    N_("Perform DWARF2 duplicate elimination") },
982   {"float-store", &flag_float_store, 1,
983    N_("Do not store floats in registers") },
984   {"defer-pop", &flag_defer_pop, 1,
985    N_("Defer popping functions args from stack until later") },
986   {"omit-frame-pointer", &flag_omit_frame_pointer, 1,
987    N_("When possible do not generate stack frames") },
988   {"optimize-sibling-calls", &flag_optimize_sibling_calls, 1,
989    N_("Optimize sibling and tail recursive calls") },
990   {"tracer", &flag_tracer, 1,
991    N_("Perform superblock formation via tail duplication") },
992   {"cse-follow-jumps", &flag_cse_follow_jumps, 1,
993    N_("When running CSE, follow jumps to their targets") },
994   {"cse-skip-blocks", &flag_cse_skip_blocks, 1,
995    N_("When running CSE, follow conditional jumps") },
996   {"expensive-optimizations", &flag_expensive_optimizations, 1,
997    N_("Perform a number of minor, expensive optimizations") },
998   {"thread-jumps", &flag_thread_jumps, 1,
999    N_("Perform jump threading optimizations") },
1000   {"strength-reduce", &flag_strength_reduce, 1,
1001    N_("Perform strength reduction optimizations") },
1002   {"unroll-loops", &flag_unroll_loops, 1,
1003    N_("Perform loop unrolling when iteration count is known") },
1004   {"unroll-all-loops", &flag_unroll_all_loops, 1,
1005    N_("Perform loop unrolling for all loops") },
1006   {"unswitch-loops", &flag_unswitch_loops, 1,
1007    N_("Perform loop unswitching") },
1008   {"prefetch-loop-arrays", &flag_prefetch_loop_arrays, 1,
1009    N_("Generate prefetch instructions, if available, for arrays in loops") },
1010   {"move-all-movables", &flag_move_all_movables, 1,
1011    N_("Force all loop invariant computations out of loops") },
1012   {"reduce-all-givs", &flag_reduce_all_givs, 1,
1013    N_("Strength reduce all loop general induction variables") },
1014   {"writable-strings", &flag_writable_strings, 1,
1015    N_("Store strings in writable data section") },
1016   {"peephole", &flag_no_peephole, 0,
1017    N_("Enable machine specific peephole optimizations") },
1018   {"force-mem", &flag_force_mem, 1,
1019    N_("Copy memory operands into registers before using") },
1020   {"force-addr", &flag_force_addr, 1,
1021    N_("Copy memory address constants into regs before using") },
1022   {"function-cse", &flag_no_function_cse, 0,
1023    N_("Allow function addresses to be held in registers") },
1024   {"inline-functions", &flag_inline_functions, 1,
1025    N_("Integrate simple functions into their callers") },
1026   {"keep-inline-functions", &flag_keep_inline_functions, 1,
1027    N_("Generate code for funcs even if they are fully inlined") },
1028   {"inline", &flag_no_inline, 0,
1029    N_("Pay attention to the 'inline' keyword") },
1030   {"keep-static-consts", &flag_keep_static_consts, 1,
1031    N_("Emit static const variables even if they are not used") },
1032   {"syntax-only", &flag_syntax_only, 1,
1033    N_("Check for syntax errors, then stop") },
1034   {"shared-data", &flag_shared_data, 1,
1035    N_("Mark data as shared rather than private") },
1036   {"caller-saves", &flag_caller_saves, 1,
1037    N_("Enable saving registers around function calls") },
1038   {"pcc-struct-return", &flag_pcc_struct_return, 1,
1039    N_("Return 'short' aggregates in memory, not registers") },
1040   {"reg-struct-return", &flag_pcc_struct_return, 0,
1041    N_("Return 'short' aggregates in registers") },
1042   {"delayed-branch", &flag_delayed_branch, 1,
1043    N_("Attempt to fill delay slots of branch instructions") },
1044   {"gcse", &flag_gcse, 1,
1045    N_("Perform the global common subexpression elimination") },
1046   {"gcse-lm", &flag_gcse_lm, 1,
1047    N_("Perform enhanced load motion during global subexpression elimination") },
1048   {"gcse-sm", &flag_gcse_sm, 1,
1049    N_("Perform store motion after global subexpression elimination") },
1050   {"loop-optimize", &flag_loop_optimize, 1,
1051    N_("Perform the loop optimizations") },
1052   {"crossjumping", &flag_crossjumping, 1,
1053    N_("Perform cross-jumping optimization") },
1054   {"if-conversion", &flag_if_conversion, 1,
1055    N_("Perform conversion of conditional jumps to branchless equivalents") },
1056   {"if-conversion2", &flag_if_conversion2, 1,
1057    N_("Perform conversion of conditional jumps to conditional execution") },
1058   {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1,
1059    N_("Run CSE pass after loop optimizations") },
1060   {"rerun-loop-opt", &flag_rerun_loop_opt, 1,
1061    N_("Run the loop optimizer twice") },
1062   {"delete-null-pointer-checks", &flag_delete_null_pointer_checks, 1,
1063    N_("Delete useless null pointer checks") },
1064   {"schedule-insns", &flag_schedule_insns, 1,
1065    N_("Reschedule instructions before register allocation") },
1066   {"schedule-insns2", &flag_schedule_insns_after_reload, 1,
1067    N_("Reschedule instructions after register allocation") },
1068   {"sched-interblock",&flag_schedule_interblock, 1,
1069    N_("Enable scheduling across basic blocks") },
1070   {"sched-spec",&flag_schedule_speculative, 1,
1071    N_("Allow speculative motion of non-loads") },
1072   {"sched-spec-load",&flag_schedule_speculative_load, 1,
1073    N_("Allow speculative motion of some loads") },
1074   {"sched-spec-load-dangerous",&flag_schedule_speculative_load_dangerous, 1,
1075    N_("Allow speculative motion of more loads") },
1076   {"branch-count-reg",&flag_branch_on_count_reg, 1,
1077    N_("Replace add,compare,branch with branch on count reg") },
1078   {"pic", &flag_pic, 1,
1079    N_("Generate position independent code, if possible") },
1080   {"PIC", &flag_pic, 2, ""},
1081   {"exceptions", &flag_exceptions, 1,
1082    N_("Enable exception handling") },
1083   {"unwind-tables", &flag_unwind_tables, 1,
1084    N_("Just generate unwind tables for exception handling") },
1085   {"asynchronous-unwind-tables", &flag_asynchronous_unwind_tables, 1,
1086    N_("Generate unwind tables exact at each instruction boundary") },
1087   {"non-call-exceptions", &flag_non_call_exceptions, 1,
1088    N_("Support synchronous non-call exceptions") },
1089   {"profile-arcs", &profile_arc_flag, 1,
1090    N_("Insert arc based program profiling code") },
1091   {"test-coverage", &flag_test_coverage, 1,
1092    N_("Create data files needed by gcov") },
1093   {"branch-probabilities", &flag_branch_probabilities, 1,
1094    N_("Use profiling information for branch probabilities") },
1095   {"profile", &profile_flag, 1,
1096    N_("Enable basic program profiling code") },
1097   {"reorder-blocks", &flag_reorder_blocks, 1,
1098    N_("Reorder basic blocks to improve code placement") },
1099   {"reorder-functions", &flag_reorder_functions, 1,
1100    N_("Reorder functions to improve code placement") },
1101   {"rename-registers", &flag_rename_registers, 1,
1102    N_("Do the register renaming optimization pass") },
1103   {"cprop-registers", &flag_cprop_registers, 1,
1104    N_("Do the register copy-propagation optimization pass") },
1105   {"common", &flag_no_common, 0,
1106    N_("Do not put uninitialized globals in the common section") },
1107   {"inhibit-size-directive", &flag_inhibit_size_directive, 1,
1108    N_("Do not generate .size directives") },
1109   {"function-sections", &flag_function_sections, 1,
1110    N_("place each function into its own section") },
1111   {"data-sections", &flag_data_sections, 1,
1112    N_("place data items into their own section") },
1113   {"verbose-asm", &flag_verbose_asm, 1,
1114    N_("Add extra commentry to assembler output") },
1115   {"gnu-linker", &flag_gnu_linker, 1,
1116    N_("Output GNU ld formatted global initializers") },
1117   {"regmove", &flag_regmove, 1,
1118    N_("Enables a register move optimization") },
1119   {"optimize-register-move", &flag_regmove, 1,
1120    N_("Do the full regmove optimization pass") },
1121   {"pack-struct", &flag_pack_struct, 1,
1122    N_("Pack structure members together without holes") },
1123   {"stack-check", &flag_stack_check, 1,
1124    N_("Insert stack checking code into the program") },
1125   {"argument-alias", &flag_argument_noalias, 0,
1126    N_("Specify that arguments may alias each other & globals") },
1127   {"argument-noalias", &flag_argument_noalias, 1,
1128    N_("Assume arguments may alias globals but not each other") },
1129   {"argument-noalias-global", &flag_argument_noalias, 2,
1130    N_("Assume arguments do not alias each other or globals") },
1131   {"strict-aliasing", &flag_strict_aliasing, 1,
1132    N_("Assume strict aliasing rules apply") },
1133   {"align-loops", &align_loops, 0,
1134    N_("Align the start of loops") },
1135   {"align-jumps", &align_jumps, 0,
1136    N_("Align labels which are only reached by jumping") },
1137   {"align-labels", &align_labels, 0,
1138    N_("Align all labels") },
1139   {"align-functions", &align_functions, 0,
1140    N_("Align the start of functions") },
1141   {"merge-constants", &flag_merge_constants, 1,
1142    N_("Attempt to merge identical constants accross compilation units") },
1143   {"merge-all-constants", &flag_merge_constants, 2,
1144    N_("Attempt to merge identical constants and constant variables") },
1145   {"dump-unnumbered", &flag_dump_unnumbered, 1,
1146    N_("Suppress output of instruction numbers and line number notes in debugging dumps") },
1147   {"instrument-functions", &flag_instrument_function_entry_exit, 1,
1148    N_("Instrument function entry/exit with profiling calls") },
1149   {"zero-initialized-in-bss", &flag_zero_initialized_in_bss, 1,
1150    N_("Put zero initialized data in the bss section") },
1151   {"ssa", &flag_ssa, 1,
1152    N_("Enable SSA optimizations") },
1153   {"ssa-ccp", &flag_ssa_ccp, 1,
1154    N_("Enable SSA conditional constant propagation") },
1155   {"ssa-dce", &flag_ssa_dce, 1,
1156    N_("Enable aggressive SSA dead code elimination") },
1157   {"leading-underscore", &flag_leading_underscore, 1,
1158    N_("External symbols have a leading underscore") },
1159   {"ident", &flag_no_ident, 0,
1160    N_("Process #ident directives") },
1161   { "peephole2", &flag_peephole2, 1,
1162    N_("Enables an rtl peephole pass run before sched2") },
1163   {"finite-math-only", &flag_finite_math_only, 1,
1164    N_("Assume no NaNs or +-Infs are generated") },
1165   { "guess-branch-probability", &flag_guess_branch_prob, 1,
1166    N_("Enables guessing of branch probabilities") },
1167   {"math-errno", &flag_errno_math, 1,
1168    N_("Set errno after built-in math functions") },
1169   {"trapping-math", &flag_trapping_math, 1,
1170    N_("Floating-point operations can trap") },
1171   {"unsafe-math-optimizations", &flag_unsafe_math_optimizations, 1,
1172    N_("Allow math optimizations that may violate IEEE or ANSI standards") },
1173   {"signaling-nans", &flag_signaling_nans, 1,
1174    N_("Disable optimizations observable by IEEE signaling NaNs") },
1175   {"bounds-check", &flag_bounds_check, 1,
1176    N_("Generate code to check bounds before indexing arrays") },
1177   {"single-precision-constant", &flag_single_precision_constant, 1,
1178    N_("Convert floating point constant to single precision constant") },
1179   {"time-report", &time_report, 1,
1180    N_("Report time taken by each compiler pass at end of run") },
1181   {"mem-report", &mem_report, 1,
1182    N_("Report on permanent memory allocation at end of run") },
1183   { "trapv", &flag_trapv, 1,
1184    N_("Trap for signed overflow in addition / subtraction / multiplication") },
1185   { "new-ra", &flag_new_regalloc, 1,
1186    N_("Use graph coloring register allocation.") },
1187 };
1188
1189 /* Table of language-specific options.  */
1190
1191 static const struct lang_opt
1192 {
1193   const char *const option;
1194   const char *const description;
1195 }
1196 documented_lang_options[] =
1197 {
1198   /* In order not to overload the --help output, the convention
1199      used here is to only describe those options which are not
1200      enabled by default.  */
1201
1202   { "-ansi",
1203     N_("Compile just for ISO C90") },
1204   { "-std= ",
1205     N_("Determine language standard") },
1206
1207   { "-fsigned-bitfields", "" },
1208   { "-funsigned-bitfields",
1209     N_("Make bit-fields by unsigned by default") },
1210   { "-fno-signed-bitfields", "" },
1211   { "-fno-unsigned-bitfields","" },
1212   { "-fsigned-char",
1213     N_("Make 'char' be signed by default") },
1214   { "-funsigned-char",
1215     N_("Make 'char' be unsigned by default") },
1216   { "-fno-signed-char", "" },
1217   { "-fno-unsigned-char", "" },
1218
1219   { "-fasm", "" },
1220   { "-fno-asm",
1221     N_("Do not recognize the 'asm' keyword") },
1222   { "-fbuiltin", "" },
1223   { "-fno-builtin",
1224     N_("Do not recognize any built in functions") },
1225   { "-fhosted",
1226     N_("Assume normal C execution environment") },
1227   { "-fno-hosted", "" },
1228   { "-ffreestanding",
1229     N_("Assume that standard libraries & main might not exist") },
1230   { "-fno-freestanding", "" },
1231   { "-fcond-mismatch",
1232     N_("Allow different types as args of ? operator") },
1233   { "-fno-cond-mismatch", "" },
1234   { "-fdollars-in-identifiers",
1235     N_("Allow the use of $ inside identifiers") },
1236   { "-fno-dollars-in-identifiers", "" },
1237   { "-fpreprocessed", "" },
1238   { "-fno-preprocessed", "" },
1239   { "-fshort-double",
1240     N_("Use the same size for double as for float") },
1241   { "-fno-short-double", "" },
1242   { "-fshort-enums",
1243     N_("Use the smallest fitting integer to hold enums") },
1244   { "-fno-short-enums", "" },
1245   { "-fshort-wchar",
1246     N_("Override the underlying type for wchar_t to `unsigned short'") },
1247   { "-fno-short-wchar", "" },
1248
1249   { "-Wall",
1250     N_("Enable most warning messages") },
1251   { "-Wbad-function-cast",
1252     N_("Warn about casting functions to incompatible types") },
1253   { "-Wno-bad-function-cast", "" },
1254   { "-Wmissing-format-attribute",
1255     N_("Warn about functions which might be candidates for format attributes") },
1256   { "-Wno-missing-format-attribute", "" },
1257   { "-Wcast-qual",
1258     N_("Warn about casts which discard qualifiers") },
1259   { "-Wno-cast-qual", "" },
1260   { "-Wchar-subscripts",
1261     N_("Warn about subscripts whose type is 'char'") },
1262   { "-Wno-char-subscripts", "" },
1263   { "-Wcomment",
1264     N_("Warn if nested comments are detected") },
1265   { "-Wno-comment", "" },
1266   { "-Wcomments",
1267     N_("Warn if nested comments are detected") },
1268   { "-Wno-comments", "" },
1269   { "-Wconversion",
1270     N_("Warn about possibly confusing type conversions") },
1271   { "-Wno-conversion", "" },
1272   { "-Wdiv-by-zero", "" },
1273   { "-Wno-div-by-zero",
1274     N_("Do not warn about compile-time integer division by zero") },
1275   { "-Wfloat-equal",
1276     N_("Warn about testing equality of floating point numbers") },
1277   { "-Wno-float-equal", "" },
1278   { "-Wformat",
1279     N_("Warn about printf/scanf/strftime/strfmon format anomalies") },
1280   { "-Wno-format", "" },
1281   { "-Wformat-extra-args", "" },
1282   { "-Wno-format-extra-args",
1283     N_("Don't warn about too many arguments to format functions") },
1284   { "-Wformat-nonliteral",
1285     N_("Warn about non-string-literal format strings") },
1286   { "-Wno-format-nonliteral", "" },
1287   { "-Wformat-security",
1288     N_("Warn about possible security problems with format functions") },
1289   { "-Wno-format-security", "" },
1290   { "-Wformat-y2k", "" },
1291   { "-Wno-format-y2k",
1292     N_("Don't warn about strftime formats yielding 2 digit years") },
1293   { "-Wimplicit-function-declaration",
1294     N_("Warn about implicit function declarations") },
1295   { "-Wno-implicit-function-declaration", "" },
1296   { "-Werror-implicit-function-declaration", "" },
1297   { "-Wimplicit-int",
1298     N_("Warn when a declaration does not specify a type") },
1299   { "-Wno-implicit-int", "" },
1300   { "-Wimplicit", "" },
1301   { "-Wno-implicit", "" },
1302   { "-Wimport",
1303     N_("Warn about the use of the #import directive") },
1304   { "-Wno-import", "" },
1305   { "-Winvalid-pch",
1306     N_("Warn about PCH files that are found but not used") },
1307   { "-Wlong-long","" },
1308   { "-Wno-long-long",
1309     N_("Do not warn about using 'long long' when -pedantic") },
1310   { "-Wmain",
1311     N_("Warn about suspicious declarations of main") },
1312   { "-Wno-main", "" },
1313   { "-Wmissing-braces",
1314     N_("Warn about possibly missing braces around initializers") },
1315   { "-Wno-missing-braces", "" },
1316   { "-Wmissing-declarations",
1317     N_("Warn about global funcs without previous declarations") },
1318   { "-Wno-missing-declarations", "" },
1319   { "-Wmissing-prototypes",
1320     N_("Warn about global funcs without prototypes") },
1321   { "-Wno-missing-prototypes", "" },
1322   { "-Wmultichar",
1323     N_("Warn about use of multicharacter literals") },
1324   { "-Wno-multichar", "" },
1325   { "-Wnested-externs",
1326     N_("Warn about externs not at file scope level") },
1327   { "-Wno-nested-externs", "" },
1328   { "-Wparentheses",
1329     N_("Warn about possible missing parentheses") },
1330   { "-Wno-parentheses", "" },
1331   { "-Wpointer-arith",
1332     N_("Warn about function pointer arithmetic") },
1333   { "-Wno-pointer-arith", "" },
1334   { "-Wredundant-decls",
1335     N_("Warn about multiple declarations of the same object") },
1336   { "-Wno-redundant-decls", "" },
1337   { "-Wreturn-type",
1338     N_("Warn whenever a function's return-type defaults to int") },
1339   { "-Wno-return-type", "" },
1340   { "-Wsequence-point",
1341     N_("Warn about possible violations of sequence point rules") },
1342   { "-Wno-sequence-point", "" },
1343   { "-Wsign-compare",
1344     N_("Warn about signed/unsigned comparisons") },
1345   { "-Wno-sign-compare", "" },
1346   { "-Wstrict-prototypes",
1347     N_("Warn about non-prototyped function decls") },
1348   { "-Wno-strict-prototypes", "" },
1349   { "-Wtraditional",
1350     N_("Warn about constructs whose meanings change in ISO C") },
1351   { "-Wno-traditional", "" },
1352   { "-Wtrigraphs",
1353     N_("Warn when trigraphs are encountered") },
1354   { "-Wno-trigraphs", "" },
1355   { "-Wundef", "" },
1356   { "-Wno-undef", "" },
1357   { "-Wunknown-pragmas",
1358     N_("Warn about unrecognized pragmas") },
1359   { "-Wno-unknown-pragmas", "" },
1360   { "-Wwrite-strings",
1361     N_("Mark strings as 'const char *'") },
1362   { "-Wno-write-strings", "" },
1363
1364 #define DEFINE_LANG_NAME(NAME) { NULL, NAME },
1365
1366 #include "options.h"
1367
1368 };
1369
1370 /* Here is a table, controlled by the tm.h file, listing each -m switch
1371    and which bits in `target_switches' it should set or clear.
1372    If VALUE is positive, it is bits to set.
1373    If VALUE is negative, -VALUE is bits to clear.
1374    (The sign bit is not used so there is no confusion.)  */
1375
1376 static const struct
1377 {
1378   const char *const name;
1379   const int value;
1380   const char *const description;
1381 }
1382 target_switches[] = TARGET_SWITCHES;
1383
1384 /* This table is similar, but allows the switch to have a value.  */
1385
1386 #ifdef TARGET_OPTIONS
1387 static const struct
1388 {
1389   const char *const prefix;
1390   const char **const variable;
1391   const char *const description;
1392 }
1393 target_options[] = TARGET_OPTIONS;
1394 #endif
1395 \f
1396 /* Options controlling warnings.  */
1397
1398 /* Don't print warning messages.  -w.  */
1399
1400 int inhibit_warnings = 0;
1401
1402 /* Don't suppress warnings from system headers.  -Wsystem-headers.  */
1403
1404 int warn_system_headers = 0;
1405
1406 /* Print various extra warnings.  -W/-Wextra.  */
1407
1408 int extra_warnings = 0;
1409
1410 /* Treat warnings as errors.  -Werror.  */
1411
1412 int warnings_are_errors = 0;
1413
1414 /* Nonzero to warn about unused variables, functions et.al.  */
1415
1416 int warn_unused_function;
1417 int warn_unused_label;
1418 int warn_unused_parameter;
1419 int warn_unused_variable;
1420 int warn_unused_value;
1421
1422 /* Nonzero to warn about code which is never reached.  */
1423
1424 int warn_notreached;
1425
1426 /* Nonzero to warn about variables used before they are initialized.  */
1427
1428 int warn_uninitialized;
1429
1430 /* Nonzero means warn about all declarations which shadow others.  */
1431
1432 int warn_shadow;
1433
1434 /* Warn if a switch on an enum, that does not have a default case,
1435    fails to have a case for every enum value.  */
1436
1437 int warn_switch;
1438
1439 /* Warn if a switch does not have a default case.  */
1440
1441 int warn_switch_default;
1442
1443 /* Warn if a switch on an enum fails to have a case for every enum
1444    value (regardless of the presence or otherwise of a default case).  */
1445
1446 int warn_switch_enum;
1447
1448 /* Nonzero means warn about function definitions that default the return type
1449    or that use a null return and have a return-type other than void.  */
1450
1451 int warn_return_type;
1452
1453 /* Nonzero means warn about pointer casts that increase the required
1454    alignment of the target type (and might therefore lead to a crash
1455    due to a misaligned access).  */
1456
1457 int warn_cast_align;
1458
1459 /* Nonzero means warn about any objects definitions whose size is larger
1460    than N bytes.  Also want about function definitions whose returned
1461    values are larger than N bytes. The value N is in `larger_than_size'.  */
1462
1463 int warn_larger_than;
1464 HOST_WIDE_INT larger_than_size;
1465
1466 /* Nonzero means warn if inline function is too large.  */
1467
1468 int warn_inline;
1469
1470 /* Warn if a function returns an aggregate,
1471    since there are often incompatible calling conventions for doing this.  */
1472
1473 int warn_aggregate_return;
1474
1475 /* Warn if packed attribute on struct is unnecessary and inefficient.  */
1476
1477 int warn_packed;
1478
1479 /* Warn when gcc pads a structure to an alignment boundary.  */
1480
1481 int warn_padded;
1482
1483 /* Warn when an optimization pass is disabled.  */
1484
1485 int warn_disabled_optimization;
1486
1487 /* Warn about functions which might be candidates for attribute noreturn.  */
1488
1489 int warn_missing_noreturn;
1490
1491 /* Nonzero means warn about uses of __attribute__((deprecated))
1492    declarations.  */
1493
1494 int warn_deprecated_decl = 1;
1495
1496 /* Nonzero means warn about constructs which might not be
1497    strict-aliasing safe.  */
1498
1499 int warn_strict_aliasing;
1500
1501 /* Like f_options, but for -W.  */
1502
1503 static const lang_independent_options W_options[] =
1504 {
1505   {"unused-function", &warn_unused_function, 1,
1506    N_("Warn when a function is unused") },
1507   {"unused-label", &warn_unused_label, 1,
1508    N_("Warn when a label is unused") },
1509   {"unused-parameter", &warn_unused_parameter, 1,
1510    N_("Warn when a function parameter is unused") },
1511   {"unused-variable", &warn_unused_variable, 1,
1512    N_("Warn when a variable is unused") },
1513   {"unused-value", &warn_unused_value, 1,
1514    N_("Warn when an expression value is unused") },
1515   {"system-headers", &warn_system_headers, 1,
1516    N_("Do not suppress warnings from system headers") },
1517   {"error", &warnings_are_errors, 1,
1518    N_("Treat all warnings as errors") },
1519   {"shadow", &warn_shadow, 1,
1520    N_("Warn when one local variable shadows another") },
1521   {"switch", &warn_switch, 1,
1522    N_("Warn about enumerated switches, with no default, missing a case") },
1523   {"switch-default", &warn_switch_default, 1,
1524    N_("Warn about enumerated switches missing a default case") },
1525   {"switch-enum", &warn_switch_enum, 1,
1526    N_("Warn about all enumerated switches missing a specific case") },
1527   {"aggregate-return", &warn_aggregate_return, 1,
1528    N_("Warn about returning structures, unions or arrays") },
1529   {"cast-align", &warn_cast_align, 1,
1530    N_("Warn about pointer casts which increase alignment") },
1531   {"unreachable-code", &warn_notreached, 1,
1532    N_("Warn about code that will never be executed") },
1533   {"uninitialized", &warn_uninitialized, 1,
1534    N_("Warn about uninitialized automatic variables") },
1535   {"inline", &warn_inline, 1,
1536    N_("Warn when an inlined function cannot be inlined") },
1537   {"packed", &warn_packed, 1,
1538    N_("Warn when the packed attribute has no effect on struct layout") },
1539   {"padded", &warn_padded, 1,
1540    N_("Warn when padding is required to align struct members") },
1541   {"disabled-optimization", &warn_disabled_optimization, 1,
1542    N_("Warn when an optimization pass is disabled") },
1543   {"deprecated-declarations", &warn_deprecated_decl, 1,
1544    N_("Warn about uses of __attribute__((deprecated)) declarations") },
1545   {"extra", &extra_warnings, 1,
1546    N_("Print extra (possibly unwanted) warnings") },
1547   {"missing-noreturn", &warn_missing_noreturn, 1,
1548    N_("Warn about functions which might be candidates for attribute noreturn") },
1549   {"strict-aliasing", &warn_strict_aliasing, 1,
1550    N_ ("Warn about code which might break the strict aliasing rules") }
1551 };
1552
1553 void
1554 set_Wunused (setting)
1555      int setting;
1556 {
1557   warn_unused_function = setting;
1558   warn_unused_label = setting;
1559   /* Unused function parameter warnings are reported when either ``-W
1560      -Wunused'' or ``-Wunused-parameter'' is specified.  Differentiate
1561      -Wunused by setting WARN_UNUSED_PARAMETER to -1.  */
1562   if (!setting)
1563     warn_unused_parameter = 0;
1564   else if (!warn_unused_parameter)
1565     warn_unused_parameter = -1;
1566   warn_unused_variable = setting;
1567   warn_unused_value = setting;
1568 }
1569
1570 /* The following routines are useful in setting all the flags that
1571    -ffast-math and -fno-fast-math imply.  */
1572
1573 void
1574 set_fast_math_flags (set)
1575      int set;
1576 {
1577   flag_trapping_math = !set;
1578   flag_unsafe_math_optimizations = set;
1579   flag_finite_math_only = set;
1580   flag_errno_math = !set;
1581   if (set)
1582     flag_signaling_nans = 0;
1583 }
1584
1585 /* Return true iff flags are set as if -ffast-math.  */
1586 bool
1587 fast_math_flags_set_p ()
1588 {
1589   return (!flag_trapping_math
1590           && flag_unsafe_math_optimizations
1591           && flag_finite_math_only
1592           && !flag_errno_math);
1593 }
1594
1595 \f
1596 /* Output files for assembler code (real compiler output)
1597    and debugging dumps.  */
1598
1599 FILE *asm_out_file;
1600 FILE *aux_info_file;
1601 FILE *rtl_dump_file = NULL;
1602
1603 /* Decode the string P as an integral parameter.
1604    If the string is indeed an integer return its numeric value else
1605    issue an Invalid Option error for the option PNAME and return DEFVAL.
1606    If PNAME is zero just return DEFVAL, do not call error.  */
1607
1608 int
1609 read_integral_parameter (p, pname, defval)
1610      const char *p;
1611      const char *pname;
1612      const int  defval;
1613 {
1614   const char *endp = p;
1615
1616   while (*endp)
1617     {
1618       if (ISDIGIT (*endp))
1619         endp++;
1620       else
1621         break;
1622     }
1623
1624   if (*endp != 0)
1625     {
1626       if (pname != 0)
1627         error ("invalid option `%s'", pname);
1628       return defval;
1629     }
1630
1631   return atoi (p);
1632 }
1633 \f
1634 /* This calls abort and is used to avoid problems when abort is a macro.
1635    It is used when we need to pass the address of abort.  */
1636
1637 void
1638 do_abort ()
1639 {
1640   abort ();
1641 }
1642
1643 /* When `malloc.c' is compiled with `rcheck' defined,
1644    it calls this function to report clobberage.  */
1645
1646 void
1647 botch (s)
1648      const char *s ATTRIBUTE_UNUSED;
1649 {
1650   abort ();
1651 }
1652 \f
1653 /* Return the logarithm of X, base 2, considering X unsigned,
1654    if X is a power of 2.  Otherwise, returns -1.
1655
1656    This should be used via the `exact_log2' macro.  */
1657
1658 int
1659 exact_log2_wide (x)
1660      unsigned HOST_WIDE_INT x;
1661 {
1662   int log = 0;
1663   /* Test for 0 or a power of 2.  */
1664   if (x == 0 || x != (x & -x))
1665     return -1;
1666   while ((x >>= 1) != 0)
1667     log++;
1668   return log;
1669 }
1670
1671 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
1672    If X is 0, return -1.
1673
1674    This should be used via the floor_log2 macro.  */
1675
1676 int
1677 floor_log2_wide (x)
1678      unsigned HOST_WIDE_INT x;
1679 {
1680   int log = -1;
1681   while (x != 0)
1682     log++,
1683     x >>= 1;
1684   return log;
1685 }
1686
1687 /* Handler for fatal signals, such as SIGSEGV.  These are transformed
1688    into ICE messages, which is much more user friendly.  */
1689
1690 static void
1691 crash_signal (signo)
1692      int signo;
1693 {
1694   internal_error ("%s", strsignal (signo));
1695 }
1696
1697 /* Arrange to dump core on error.  (The regular error message is still
1698    printed first, except in the case of abort().)  */
1699
1700 static void
1701 setup_core_dumping ()
1702 {
1703 #ifdef SIGABRT
1704   signal (SIGABRT, SIG_DFL);
1705 #endif
1706 #if defined(HAVE_SETRLIMIT)
1707   {
1708     struct rlimit rlim;
1709     if (getrlimit (RLIMIT_CORE, &rlim) != 0)
1710       fatal_io_error ("getting core file size maximum limit");
1711     rlim.rlim_cur = rlim.rlim_max;
1712     if (setrlimit (RLIMIT_CORE, &rlim) != 0)
1713       fatal_io_error ("setting core file size limit to maximum");
1714   }
1715 #endif
1716   diagnostic_abort_on_error (global_dc);
1717 }
1718
1719
1720 /* Strip off a legitimate source ending from the input string NAME of
1721    length LEN.  Rather than having to know the names used by all of
1722    our front ends, we strip off an ending of a period followed by
1723    up to five characters.  (Java uses ".class".)  */
1724
1725 void
1726 strip_off_ending (name, len)
1727      char *name;
1728      int len;
1729 {
1730   int i;
1731   for (i = 2; i < 6 && len > i; i++)
1732     {
1733       if (name[len - i] == '.')
1734         {
1735           name[len - i] = '\0';
1736           break;
1737         }
1738     }
1739 }
1740
1741 /* Output a quoted string.  */
1742
1743 void
1744 output_quoted_string (asm_file, string)
1745      FILE *asm_file;
1746      const char *string;
1747 {
1748 #ifdef OUTPUT_QUOTED_STRING
1749   OUTPUT_QUOTED_STRING (asm_file, string);
1750 #else
1751   char c;
1752
1753   putc ('\"', asm_file);
1754   while ((c = *string++) != 0)
1755     {
1756       if (ISPRINT (c))
1757         {
1758           if (c == '\"' || c == '\\')
1759             putc ('\\', asm_file);
1760           putc (c, asm_file);
1761         }
1762       else
1763         fprintf (asm_file, "\\%03o", (unsigned char) c);
1764     }
1765   putc ('\"', asm_file);
1766 #endif
1767 }
1768
1769 /* Output NAME into FILE after having turned it into something
1770    usable as an identifier in a target's assembly file.  */
1771 void
1772 output_clean_symbol_name (file, name)
1773      FILE *file;
1774      const char *name;
1775 {
1776   /* Make a copy of NAME.  */
1777   char *id = xstrdup (name);
1778
1779   /* Make it look like a valid identifier for an assembler.  */
1780   clean_symbol_name (id);
1781
1782   fputs (id, file);
1783   free (id);
1784 }
1785
1786
1787 /* Output a file name in the form wanted by System V.  */
1788
1789 void
1790 output_file_directive (asm_file, input_name)
1791      FILE *asm_file;
1792      const char *input_name;
1793 {
1794   int len = strlen (input_name);
1795   const char *na = input_name + len;
1796
1797   /* NA gets INPUT_NAME sans directory names.  */
1798   while (na > input_name)
1799     {
1800       if (IS_DIR_SEPARATOR (na[-1]))
1801         break;
1802       na--;
1803     }
1804
1805 #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
1806   ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
1807 #else
1808 #ifdef ASM_OUTPUT_SOURCE_FILENAME
1809   ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
1810 #else
1811   fprintf (asm_file, "\t.file\t");
1812   output_quoted_string (asm_file, na);
1813   fputc ('\n', asm_file);
1814 #endif
1815 #endif
1816 }
1817 \f
1818 /* Routine to open a dump file.  Return true if the dump file is enabled.  */
1819
1820 static int
1821 open_dump_file (index, decl)
1822      enum dump_file_index index;
1823      tree decl;
1824 {
1825   char *dump_name;
1826   const char *open_arg;
1827   char seq[16];
1828
1829   if (! dump_file[index].enabled)
1830     return 0;
1831
1832   timevar_push (TV_DUMP);
1833   if (rtl_dump_file != NULL)
1834     fclose (rtl_dump_file);
1835
1836   sprintf (seq, DUMPFILE_FORMAT, index);
1837
1838   if (! dump_file[index].initialized)
1839     {
1840       /* If we've not initialized the files, do so now.  */
1841       if (graph_dump_format != no_graph
1842           && dump_file[index].graph_dump_p)
1843         {
1844           dump_name = concat (seq, dump_file[index].extension, NULL);
1845           clean_graph_dump_file (dump_base_name, dump_name);
1846           free (dump_name);
1847         }
1848       dump_file[index].initialized = 1;
1849       open_arg = "w";
1850     }
1851   else
1852     open_arg = "a";
1853
1854   dump_name = concat (dump_base_name, seq,
1855                       dump_file[index].extension, NULL);
1856
1857   rtl_dump_file = fopen (dump_name, open_arg);
1858   if (rtl_dump_file == NULL)
1859     fatal_io_error ("can't open %s", dump_name);
1860
1861   free (dump_name);
1862
1863   if (decl)
1864     fprintf (rtl_dump_file, "\n;; Function %s%s\n\n",
1865              (*lang_hooks.decl_printable_name) (decl, 2),
1866              cfun->function_frequency == FUNCTION_FREQUENCY_HOT
1867              ? " (hot)"
1868              : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
1869              ? " (unlikely executed)"
1870              : "");
1871
1872   timevar_pop (TV_DUMP);
1873   return 1;
1874 }
1875
1876 /* Routine to close a dump file.  */
1877
1878 static void
1879 close_dump_file (index, func, insns)
1880      enum dump_file_index index;
1881      void (*func) PARAMS ((FILE *, rtx));
1882      rtx insns;
1883 {
1884   if (! rtl_dump_file)
1885     return;
1886
1887   timevar_push (TV_DUMP);
1888   if (insns
1889       && graph_dump_format != no_graph
1890       && dump_file[index].graph_dump_p)
1891     {
1892       char seq[16];
1893       char *suffix;
1894
1895       sprintf (seq, DUMPFILE_FORMAT, index);
1896       suffix = concat (seq, dump_file[index].extension, NULL);
1897       print_rtl_graph_with_bb (dump_base_name, suffix, insns);
1898       free (suffix);
1899     }
1900
1901   if (func && insns)
1902     func (rtl_dump_file, insns);
1903
1904   fflush (rtl_dump_file);
1905   fclose (rtl_dump_file);
1906
1907   rtl_dump_file = NULL;
1908   timevar_pop (TV_DUMP);
1909 }
1910
1911 /* Do any final processing required for the declarations in VEC, of
1912    which there are LEN.  We write out inline functions and variables
1913    that have been deferred until this point, but which are required.
1914    Returns nonzero if anything was put out.  */
1915
1916 int
1917 wrapup_global_declarations (vec, len)
1918      tree *vec;
1919      int len;
1920 {
1921   tree decl;
1922   int i;
1923   int reconsider;
1924   int output_something = 0;
1925
1926   for (i = 0; i < len; i++)
1927     {
1928       decl = vec[i];
1929
1930       /* We're not deferring this any longer.  */
1931       DECL_DEFER_OUTPUT (decl) = 0;
1932
1933       if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0)
1934         (*lang_hooks.finish_incomplete_decl) (decl);
1935     }
1936
1937   /* Now emit any global variables or functions that we have been
1938      putting off.  We need to loop in case one of the things emitted
1939      here references another one which comes earlier in the list.  */
1940   do
1941     {
1942       reconsider = 0;
1943       for (i = 0; i < len; i++)
1944         {
1945           decl = vec[i];
1946
1947           if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
1948             continue;
1949
1950           /* Don't write out static consts, unless we still need them.
1951
1952              We also keep static consts if not optimizing (for debugging),
1953              unless the user specified -fno-keep-static-consts.
1954              ??? They might be better written into the debug information.
1955              This is possible when using DWARF.
1956
1957              A language processor that wants static constants to be always
1958              written out (even if it is not used) is responsible for
1959              calling rest_of_decl_compilation itself.  E.g. the C front-end
1960              calls rest_of_decl_compilation from finish_decl.
1961              One motivation for this is that is conventional in some
1962              environments to write things like:
1963              static const char rcsid[] = "... version string ...";
1964              intending to force the string to be in the executable.
1965
1966              A language processor that would prefer to have unneeded
1967              static constants "optimized away" would just defer writing
1968              them out until here.  E.g. C++ does this, because static
1969              constants are often defined in header files.
1970
1971              ??? A tempting alternative (for both C and C++) would be
1972              to force a constant to be written if and only if it is
1973              defined in a main file, as opposed to an include file.  */
1974
1975           if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
1976             {
1977               bool needed = 1;
1978
1979               if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
1980                 /* needed */;
1981               else if (DECL_COMDAT (decl))
1982                 needed = 0;
1983               else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
1984                        && (optimize || !flag_keep_static_consts
1985                            || DECL_ARTIFICIAL (decl)))
1986                 needed = 0;
1987
1988               if (needed)
1989                 {
1990                   reconsider = 1;
1991                   rest_of_decl_compilation (decl, NULL, 1, 1);
1992                 }
1993             }
1994
1995           if (TREE_CODE (decl) == FUNCTION_DECL
1996               && DECL_INITIAL (decl) != 0
1997               && DECL_SAVED_INSNS (decl) != 0
1998               && (flag_keep_inline_functions
1999                   || (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
2000                   || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2001             {
2002               reconsider = 1;
2003               output_inline_function (decl);
2004             }
2005         }
2006
2007       if (reconsider)
2008         output_something = 1;
2009     }
2010   while (reconsider);
2011
2012   return output_something;
2013 }
2014
2015 /* Issue appropriate warnings for the global declarations in VEC (of
2016    which there are LEN).  Output debugging information for them.  */
2017
2018 void
2019 check_global_declarations (vec, len)
2020      tree *vec;
2021      int len;
2022 {
2023   tree decl;
2024   int i;
2025
2026   for (i = 0; i < len; i++)
2027     {
2028       decl = vec[i];
2029
2030       if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2031           && ! TREE_ASM_WRITTEN (decl))
2032         /* Cancel the RTL for this decl so that, if debugging info
2033            output for global variables is still to come,
2034            this one will be omitted.  */
2035         SET_DECL_RTL (decl, NULL_RTX);
2036
2037       /* Warn about any function
2038          declared static but not defined.
2039          We don't warn about variables,
2040          because many programs have static variables
2041          that exist only to get some text into the object file.  */
2042       if (TREE_CODE (decl) == FUNCTION_DECL
2043           && (warn_unused_function
2044               || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2045           && DECL_INITIAL (decl) == 0
2046           && DECL_EXTERNAL (decl)
2047           && ! DECL_ARTIFICIAL (decl)
2048           && ! TREE_PUBLIC (decl))
2049         {
2050           if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2051             pedwarn_with_decl (decl,
2052                                "`%s' used but never defined");
2053           else
2054             warning_with_decl (decl,
2055                                "`%s' declared `static' but never defined");
2056           /* This symbol is effectively an "extern" declaration now.  */
2057           TREE_PUBLIC (decl) = 1;
2058           assemble_external (decl);
2059         }
2060
2061       /* Warn about static fns or vars defined but not used.  */
2062       if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
2063            || (warn_unused_variable && TREE_CODE (decl) == VAR_DECL))
2064           && ! TREE_USED (decl)
2065           /* The TREE_USED bit for file-scope decls is kept in the identifier,
2066              to handle multiple external decls in different scopes.  */
2067           && ! TREE_USED (DECL_NAME (decl))
2068           && ! DECL_EXTERNAL (decl)
2069           && ! TREE_PUBLIC (decl)
2070           /* Global register variables must be declared to reserve them.  */
2071           && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
2072           /* Otherwise, ask the language.  */
2073           && (*lang_hooks.decls.warn_unused_global) (decl))
2074         warning_with_decl (decl, "`%s' defined but not used");
2075
2076       /* Avoid confusing the debug information machinery when there are
2077          errors.  */
2078       if (errorcount == 0 && sorrycount == 0)
2079         {
2080           timevar_push (TV_SYMOUT);
2081           (*debug_hooks->global_decl) (decl);
2082           timevar_pop (TV_SYMOUT);
2083         }
2084     }
2085 }
2086
2087 /* Save the current INPUT_FILENAME and LINENO on the top entry in the
2088    INPUT_FILE_STACK.  Push a new entry for FILE and LINE, and set the
2089    INPUT_FILENAME and LINENO accordingly.  */
2090
2091 void
2092 push_srcloc (file, line)
2093      const char *file;
2094      int line;
2095 {
2096   struct file_stack *fs;
2097
2098   if (input_file_stack)
2099     {
2100       input_file_stack->name = input_filename;
2101       input_file_stack->line = lineno;
2102     }
2103
2104   fs = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2105   fs->name = input_filename = file;
2106   fs->line = lineno = line;
2107   fs->next = input_file_stack;
2108   input_file_stack = fs;
2109   input_file_stack_tick++;
2110 }
2111
2112 /* Pop the top entry off the stack of presently open source files.
2113    Restore the INPUT_FILENAME and LINENO from the new topmost entry on
2114    the stack.  */
2115
2116 void
2117 pop_srcloc ()
2118 {
2119   struct file_stack *fs;
2120
2121   fs = input_file_stack;
2122   input_file_stack = fs->next;
2123   free (fs);
2124   input_file_stack_tick++;
2125   /* The initial source file is never popped.  */
2126   if (!input_file_stack)
2127     abort ();
2128   input_filename = input_file_stack->name;
2129   lineno = input_file_stack->line;
2130 }
2131
2132 /* Compile an entire translation unit.  Write a file of assembly
2133    output and various debugging dumps.  */
2134
2135 static void
2136 compile_file ()
2137 {
2138   tree globals;
2139
2140   /* Initialize yet another pass.  */
2141
2142   init_final (main_input_filename);
2143   init_branch_prob (aux_base_name);
2144
2145   timevar_push (TV_PARSE);
2146
2147   /* Call the parser, which parses the entire file (calling
2148      rest_of_compilation for each function).  */
2149   (*lang_hooks.parse_file) (set_yydebug);
2150
2151   /* In case there were missing block closers,
2152      get us back to the global binding level.  */
2153   (*lang_hooks.clear_binding_stack) ();
2154
2155   /* Compilation is now finished except for writing
2156      what's left of the symbol table output.  */
2157   timevar_pop (TV_PARSE);
2158
2159   if (flag_syntax_only)
2160     return;
2161
2162   globals = (*lang_hooks.decls.getdecls) ();
2163
2164   /* Really define vars that have had only a tentative definition.
2165      Really output inline functions that must actually be callable
2166      and have not been output so far.  */
2167
2168   {
2169     int len = list_length (globals);
2170     tree *vec = (tree *) xmalloc (sizeof (tree) * len);
2171     int i;
2172     tree decl;
2173
2174     /* Process the decls in reverse order--earliest first.
2175        Put them into VEC from back to front, then take out from front.  */
2176
2177     for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
2178       vec[len - i - 1] = decl;
2179
2180     wrapup_global_declarations (vec, len);
2181
2182     if (profile_arc_flag)
2183       /* This must occur after the loop to output deferred functions.
2184          Else the profiler initializer would not be emitted if all the
2185          functions in this compilation unit were deferred.  */
2186       create_profiler ();
2187
2188     check_global_declarations (vec, len);
2189
2190     /* Clean up.  */
2191     free (vec);
2192   }
2193
2194   /* Write out any pending weak symbol declarations.  */
2195
2196   weak_finish ();
2197
2198   /* Do dbx symbols.  */
2199   timevar_push (TV_SYMOUT);
2200
2201 #ifdef DWARF2_UNWIND_INFO
2202   if (dwarf2out_do_frame ())
2203     dwarf2out_frame_finish ();
2204 #endif
2205
2206   (*debug_hooks->finish) (main_input_filename);
2207   timevar_pop (TV_SYMOUT);
2208
2209   /* Output some stuff at end of file if nec.  */
2210
2211   dw2_output_indirect_constants ();
2212
2213   if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
2214     {
2215       timevar_push (TV_DUMP);
2216       open_dump_file (DFI_bp, NULL);
2217
2218       end_branch_prob ();
2219
2220       close_dump_file (DFI_bp, NULL, NULL_RTX);
2221       timevar_pop (TV_DUMP);
2222     }
2223
2224 #ifdef ASM_FILE_END
2225   ASM_FILE_END (asm_out_file);
2226 #endif
2227
2228   /* Attach a special .ident directive to the end of the file to identify
2229      the version of GCC which compiled this code.  The format of the .ident
2230      string is patterned after the ones produced by native SVR4 compilers.  */
2231 #ifdef IDENT_ASM_OP
2232   if (!flag_no_ident)
2233     fprintf (asm_out_file, "%s\"GCC: (GNU) %s\"\n",
2234              IDENT_ASM_OP, version_string);
2235 #endif
2236
2237   if (optimize > 0 && open_dump_file (DFI_combine, NULL))
2238     {
2239       timevar_push (TV_DUMP);
2240       dump_combine_total_stats (rtl_dump_file);
2241       close_dump_file (DFI_combine, NULL, NULL_RTX);
2242       timevar_pop (TV_DUMP);
2243     }
2244 }
2245 \f
2246 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
2247    and TYPE_DECL nodes.
2248
2249    This does nothing for local (non-static) variables, unless the
2250    variable is a register variable with an ASMSPEC.  In that case, or
2251    if the variable is not an automatic, it sets up the RTL and
2252    outputs any assembler code (label definition, storage allocation
2253    and initialization).
2254
2255    DECL is the declaration.  If ASMSPEC is nonzero, it specifies
2256    the assembler symbol name to be used.  TOP_LEVEL is nonzero
2257    if this declaration is not within a function.  */
2258
2259 void
2260 rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2261      tree decl;
2262      const char *asmspec;
2263      int top_level;
2264      int at_end;
2265 {
2266   /* We deferred calling assemble_alias so that we could collect
2267      other attributes such as visibility.  Emit the alias now.  */
2268   {
2269     tree alias;
2270     alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
2271     if (alias)
2272       {
2273         alias = TREE_VALUE (TREE_VALUE (alias));
2274         alias = get_identifier (TREE_STRING_POINTER (alias));
2275         assemble_alias (decl, alias);
2276       }
2277   }
2278
2279   /* Forward declarations for nested functions are not "external",
2280      but we need to treat them as if they were.  */
2281   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
2282       || TREE_CODE (decl) == FUNCTION_DECL)
2283     {
2284       timevar_push (TV_VARCONST);
2285
2286       if (asmspec)
2287         make_decl_rtl (decl, asmspec);
2288
2289       /* Don't output anything when a tentative file-scope definition
2290          is seen.  But at end of compilation, do output code for them.  */
2291       if (at_end || !DECL_DEFER_OUTPUT (decl))
2292         assemble_variable (decl, top_level, at_end, 0);
2293
2294 #ifdef ASM_FINISH_DECLARE_OBJECT
2295       if (decl == last_assemble_variable_decl)
2296         {
2297           ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2298                                      top_level, at_end);
2299         }
2300 #endif
2301
2302       timevar_pop (TV_VARCONST);
2303     }
2304   else if (DECL_REGISTER (decl) && asmspec != 0)
2305     {
2306       if (decode_reg_name (asmspec) >= 0)
2307         {
2308           SET_DECL_RTL (decl, NULL_RTX);
2309           make_decl_rtl (decl, asmspec);
2310         }
2311       else
2312         {
2313           error ("invalid register name `%s' for register variable", asmspec);
2314           DECL_REGISTER (decl) = 0;
2315           if (!top_level)
2316             expand_decl (decl);
2317         }
2318     }
2319 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2320   else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2321            && TREE_CODE (decl) == TYPE_DECL)
2322     {
2323       timevar_push (TV_SYMOUT);
2324       dbxout_symbol (decl, 0);
2325       timevar_pop (TV_SYMOUT);
2326     }
2327 #endif
2328 #ifdef SDB_DEBUGGING_INFO
2329   else if (write_symbols == SDB_DEBUG && top_level
2330            && TREE_CODE (decl) == TYPE_DECL)
2331     {
2332       timevar_push (TV_SYMOUT);
2333       sdbout_symbol (decl, 0);
2334       timevar_pop (TV_SYMOUT);
2335     }
2336 #endif
2337 #ifdef DWARF2_DEBUGGING_INFO
2338   else if ((write_symbols == DWARF2_DEBUG
2339            || write_symbols == VMS_AND_DWARF2_DEBUG)
2340            && top_level
2341            && TREE_CODE (decl) == TYPE_DECL)
2342     {
2343       timevar_push (TV_SYMOUT);
2344       dwarf2out_decl (decl);
2345       timevar_pop (TV_SYMOUT);
2346     }
2347 #endif
2348 }
2349
2350 /* Called after finishing a record, union or enumeral type.  */
2351
2352 void
2353 rest_of_type_compilation (type, toplev)
2354 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)      \
2355     || defined (SDB_DEBUGGING_INFO) || defined (DWARF2_DEBUGGING_INFO)
2356      tree type;
2357      int toplev;
2358 #else
2359      tree type ATTRIBUTE_UNUSED;
2360      int toplev ATTRIBUTE_UNUSED;
2361 #endif
2362 {
2363   /* Avoid confusing the debug information machinery when there are
2364      errors.  */
2365   if (errorcount != 0 || sorrycount != 0)
2366     return;
2367
2368   timevar_push (TV_SYMOUT);
2369 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2370   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2371     dbxout_symbol (TYPE_STUB_DECL (type), !toplev);
2372 #endif
2373 #ifdef SDB_DEBUGGING_INFO
2374   if (write_symbols == SDB_DEBUG)
2375     sdbout_symbol (TYPE_STUB_DECL (type), !toplev);
2376 #endif
2377 #ifdef DWARF2_DEBUGGING_INFO
2378   if ((write_symbols == DWARF2_DEBUG
2379        || write_symbols == VMS_AND_DWARF2_DEBUG)
2380       && toplev)
2381     dwarf2out_decl (TYPE_STUB_DECL (type));
2382 #endif
2383   timevar_pop (TV_SYMOUT);
2384 }
2385
2386 /* This is called from finish_function (within langhooks.parse_file)
2387    after each top-level definition is parsed.
2388    It is supposed to compile that function or variable
2389    and output the assembler code for it.
2390    After we return, the tree storage is freed.  */
2391
2392 void
2393 rest_of_compilation (decl)
2394      tree decl;
2395 {
2396   rtx insns;
2397   int tem;
2398   int failure = 0;
2399   int rebuild_label_notes_after_reload;
2400
2401   timevar_push (TV_REST_OF_COMPILATION);
2402
2403   /* Now that we're out of the frontend, we shouldn't have any more
2404      CONCATs anywhere.  */
2405   generating_concat_p = 0;
2406
2407   /* When processing delayed functions, prepare_function_start() won't
2408      have been run to re-initialize it.  */
2409   cse_not_expected = ! optimize;
2410
2411   /* First, make sure that NOTE_BLOCK is set correctly for each
2412      NOTE_INSN_BLOCK_BEG/NOTE_INSN_BLOCK_END note.  */
2413   if (!cfun->x_whole_function_mode_p)
2414     identify_blocks ();
2415
2416   /* In function-at-a-time mode, we do not attempt to keep the BLOCK
2417      tree in sensible shape.  So, we just recalculate it here.  */
2418   if (cfun->x_whole_function_mode_p)
2419     reorder_blocks ();
2420
2421   init_flow ();
2422
2423   /* If we are reconsidering an inline function
2424      at the end of compilation, skip the stuff for making it inline.  */
2425
2426   if (DECL_SAVED_INSNS (decl) == 0)
2427     {
2428       int inlinable = 0;
2429       tree parent;
2430       const char *lose;
2431
2432       /* If this is nested inside an inlined external function, pretend
2433          it was only declared.  Since we cannot inline such functions,
2434          generating code for this one is not only not necessary but will
2435          confuse some debugging output writers.  */
2436       for (parent = DECL_CONTEXT (current_function_decl);
2437            parent != NULL_TREE;
2438            parent = get_containing_scope (parent))
2439         if (TREE_CODE (parent) == FUNCTION_DECL
2440             && DECL_INLINE (parent) && DECL_EXTERNAL (parent))
2441           {
2442             DECL_INITIAL (decl) = 0;
2443             goto exit_rest_of_compilation;
2444           }
2445         else if (TYPE_P (parent))
2446           /* A function in a local class should be treated normally.  */
2447           break;
2448
2449       /* If requested, consider whether to make this function inline.  */
2450       if ((DECL_INLINE (decl) && !flag_no_inline)
2451           || flag_inline_functions)
2452         {
2453           timevar_push (TV_INTEGRATION);
2454           lose = function_cannot_inline_p (decl);
2455           timevar_pop (TV_INTEGRATION);
2456           if (lose || ! optimize)
2457             {
2458               if (warn_inline && DECL_INLINE (decl))
2459                 warning_with_decl (decl, lose);
2460               DECL_ABSTRACT_ORIGIN (decl) = 0;
2461               /* Don't really compile an extern inline function.
2462                  If we can't make it inline, pretend
2463                  it was only declared.  */
2464               if (DECL_EXTERNAL (decl))
2465                 {
2466                   DECL_INITIAL (decl) = 0;
2467                   goto exit_rest_of_compilation;
2468                 }
2469             }
2470           else
2471             /* ??? Note that this has the effect of making it look
2472                  like "inline" was specified for a function if we choose
2473                  to inline it.  This isn't quite right, but it's
2474                  probably not worth the trouble to fix.  */
2475             inlinable = DECL_INLINE (decl) = 1;
2476         }
2477
2478       insns = get_insns ();
2479
2480       /* Dump the rtl code if we are dumping rtl.  */
2481
2482       if (open_dump_file (DFI_rtl, decl))
2483         {
2484           if (DECL_SAVED_INSNS (decl))
2485             fprintf (rtl_dump_file, ";; (integrable)\n\n");
2486           close_dump_file (DFI_rtl, print_rtl, insns);
2487         }
2488
2489       /* Convert from NOTE_INSN_EH_REGION style notes, and do other
2490          sorts of eh initialization.  Delay this until after the
2491          initial rtl dump so that we can see the original nesting.  */
2492       convert_from_eh_region_ranges ();
2493
2494       /* If function is inline, and we don't yet know whether to
2495          compile it by itself, defer decision till end of compilation.
2496          wrapup_global_declarations will (indirectly) call
2497          rest_of_compilation again for those functions that need to
2498          be output.  Also defer those functions that we are supposed
2499          to defer.  */
2500
2501       if (inlinable
2502           || (DECL_INLINE (decl)
2503               && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
2504                    && ! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
2505                    && ! flag_keep_inline_functions)
2506                   || DECL_EXTERNAL (decl))))
2507         DECL_DEFER_OUTPUT (decl) = 1;
2508
2509       if (DECL_INLINE (decl))
2510         /* DWARF wants separate debugging info for abstract and
2511            concrete instances of all inline functions, including those
2512            declared inline but not inlined, and those inlined even
2513            though they weren't declared inline.  Conveniently, that's
2514            what DECL_INLINE means at this point.  */
2515         (*debug_hooks->deferred_inline_function) (decl);
2516
2517       if (DECL_DEFER_OUTPUT (decl))
2518         {
2519           /* If -Wreturn-type, we have to do a bit of compilation.  We just
2520              want to call cleanup the cfg to figure out whether or not we can
2521              fall off the end of the function; we do the minimum amount of
2522              work necessary to make that safe.  */
2523           if (warn_return_type)
2524             {
2525               int saved_optimize = optimize;
2526
2527               optimize = 0;
2528               rebuild_jump_labels (insns);
2529               find_exception_handler_labels ();
2530               find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2531               cleanup_cfg (CLEANUP_PRE_SIBCALL | CLEANUP_PRE_LOOP);
2532               optimize = saved_optimize;
2533
2534               /* CFG is no longer maintained up-to-date.  */
2535               free_bb_for_insn ();
2536             }
2537
2538           set_nothrow_function_flags ();
2539           if (current_function_nothrow)
2540             /* Now we know that this can't throw; set the flag for the benefit
2541                of other functions later in this translation unit.  */
2542             TREE_NOTHROW (current_function_decl) = 1;
2543
2544           timevar_push (TV_INTEGRATION);
2545           save_for_inline (decl);
2546           timevar_pop (TV_INTEGRATION);
2547           DECL_SAVED_INSNS (decl)->inlinable = inlinable;
2548           goto exit_rest_of_compilation;
2549         }
2550
2551       /* If specified extern inline but we aren't inlining it, we are
2552          done.  This goes for anything that gets here with DECL_EXTERNAL
2553          set, not just things with DECL_INLINE.  */
2554       if (DECL_EXTERNAL (decl))
2555         goto exit_rest_of_compilation;
2556     }
2557
2558   /* If we're emitting a nested function, make sure its parent gets
2559      emitted as well.  Doing otherwise confuses debug info.  */
2560   {
2561     tree parent;
2562     for (parent = DECL_CONTEXT (current_function_decl);
2563          parent != NULL_TREE;
2564          parent = get_containing_scope (parent))
2565       if (TREE_CODE (parent) == FUNCTION_DECL)
2566         TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
2567   }
2568
2569   /* We are now committed to emitting code for this function.  Do any
2570      preparation, such as emitting abstract debug info for the inline
2571      before it gets mangled by optimization.  */
2572   if (DECL_INLINE (decl))
2573     (*debug_hooks->outlining_inline_function) (decl);
2574
2575   /* Remove any notes we don't need.  That will make iterating
2576      over the instruction sequence faster, and allow the garbage
2577      collector to reclaim the memory used by the notes.  */
2578   remove_unnecessary_notes ();
2579   reorder_blocks ();
2580
2581   ggc_collect ();
2582
2583   /* Initialize some variables used by the optimizers.  */
2584   init_function_for_compilation ();
2585
2586   if (! DECL_DEFER_OUTPUT (decl))
2587     TREE_ASM_WRITTEN (decl) = 1;
2588
2589   /* Now that integrate will no longer see our rtl, we need not
2590      distinguish between the return value of this function and the
2591      return value of called functions.  Also, we can remove all SETs
2592      of subregs of hard registers; they are only here because of
2593      integrate.  Also, we can now initialize pseudos intended to
2594      carry magic hard reg data throughout the function.  */
2595   rtx_equal_function_value_matters = 0;
2596   purge_hard_subreg_sets (get_insns ());
2597
2598   /* Early return if there were errors.  We can run afoul of our
2599      consistency checks, and there's not really much point in fixing them.
2600      Don't return yet if -Wreturn-type; we need to do cleanup_cfg.  */
2601   if (((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
2602       || errorcount || sorrycount)
2603     goto exit_rest_of_compilation;
2604
2605   timevar_push (TV_JUMP);
2606   open_dump_file (DFI_sibling, decl);
2607   insns = get_insns ();
2608   rebuild_jump_labels (insns);
2609   find_exception_handler_labels ();
2610   find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2611
2612   delete_unreachable_blocks ();
2613
2614   /* Turn NOTE_INSN_PREDICTIONs into branch predictions.  */
2615   timevar_push (TV_BRANCH_PROB);
2616   note_prediction_to_br_prob ();
2617   timevar_pop (TV_BRANCH_PROB);
2618
2619   /* We may have potential sibling or tail recursion sites.  Select one
2620      (of possibly multiple) methods of performing the call.  */
2621   if (flag_optimize_sibling_calls)
2622     {
2623       rtx insn;
2624       optimize_sibling_and_tail_recursive_calls ();
2625
2626       /* Recompute the CFG as sibling optimization clobbers it randomly.  */
2627       free_bb_for_insn ();
2628       find_exception_handler_labels ();
2629       rebuild_jump_labels (insns);
2630       find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2631
2632       /* There is pass ordering problem - we must lower NOTE_INSN_PREDICTION
2633          notes before simplifying cfg and we must do lowering after sibcall
2634          that unhides parts of RTL chain and cleans up the CFG.
2635
2636          Until sibcall is replaced by tree-level optimizer, lets just
2637          sweep away the NOTE_INSN_PREDICTION notes that leaked out.  */
2638       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2639         if (GET_CODE (insn) == NOTE
2640             && NOTE_LINE_NUMBER (insn) == NOTE_INSN_PREDICTION)
2641           delete_insn (insn);
2642     }
2643   close_dump_file (DFI_sibling, print_rtl, get_insns ());
2644   timevar_pop (TV_JUMP);
2645
2646   scope_to_insns_initialize ();
2647   /* Complete generation of exception handling code.  */
2648   if (doing_eh (0))
2649     {
2650       timevar_push (TV_JUMP);
2651       open_dump_file (DFI_eh, decl);
2652
2653       finish_eh_generation ();
2654
2655       close_dump_file (DFI_eh, print_rtl, get_insns ());
2656       timevar_pop (TV_JUMP);
2657     }
2658
2659   /* Delay emitting hard_reg_initial_value sets until after EH landing pad
2660      generation, which might create new sets.  */
2661   emit_initial_value_sets ();
2662
2663 #ifdef FINALIZE_PIC
2664   /* If we are doing position-independent code generation, now
2665      is the time to output special prologues and epilogues.
2666      We do not want to do this earlier, because it just clutters
2667      up inline functions with meaningless insns.  */
2668   if (flag_pic)
2669     FINALIZE_PIC;
2670 #endif
2671
2672   insns = get_insns ();
2673
2674   /* Copy any shared structure that should not be shared.  */
2675   unshare_all_rtl (current_function_decl, insns);
2676
2677 #ifdef SETJMP_VIA_SAVE_AREA
2678   /* This must be performed before virtual register instantiation.
2679      Please be aware the everything in the compiler that can look
2680      at the RTL up to this point must understand that REG_SAVE_AREA
2681      is just like a use of the REG contained inside.  */
2682   if (current_function_calls_alloca)
2683     optimize_save_area_alloca (insns);
2684 #endif
2685
2686   /* Instantiate all virtual registers.  */
2687   instantiate_virtual_regs (current_function_decl, insns);
2688
2689   open_dump_file (DFI_jump, decl);
2690
2691   /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
2692      are initialized and to compute whether control can drop off the end
2693      of the function.  */
2694
2695   timevar_push (TV_JUMP);
2696   /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB.  Do this
2697      before jump optimization switches branch directions.  */
2698   expected_value_to_br_prob ();
2699
2700   reg_scan (insns, max_reg_num (), 0);
2701   rebuild_jump_labels (insns);
2702   find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2703   if (rtl_dump_file)
2704     dump_flow_info (rtl_dump_file);
2705   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_PRE_LOOP
2706                | (flag_thread_jumps ? CLEANUP_THREADING : 0));
2707
2708   /* CFG is no longer maintained up-to-date.  */
2709   free_bb_for_insn ();
2710   copy_loop_headers (insns);
2711   purge_line_number_notes (insns);
2712   find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2713
2714   timevar_pop (TV_JUMP);
2715   close_dump_file (DFI_jump, print_rtl, insns);
2716
2717   /* Now is when we stop if -fsyntax-only and -Wreturn-type.  */
2718   if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
2719     {
2720       goto exit_rest_of_compilation;
2721     }
2722
2723   /* Long term, this should probably move before the jump optimizer too,
2724      but I didn't want to disturb the rtl_dump_and_exit and related
2725      stuff at this time.  */
2726   if (optimize > 0 && flag_ssa)
2727     {
2728       /* Convert to SSA form.  */
2729
2730       timevar_push (TV_TO_SSA);
2731       open_dump_file (DFI_ssa, decl);
2732
2733       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2734       convert_to_ssa ();
2735
2736       close_dump_file (DFI_ssa, print_rtl_with_bb, insns);
2737       timevar_pop (TV_TO_SSA);
2738
2739       /* Perform sparse conditional constant propagation, if requested.  */
2740       if (flag_ssa_ccp)
2741         {
2742           timevar_push (TV_SSA_CCP);
2743           open_dump_file (DFI_ssa_ccp, decl);
2744
2745           ssa_const_prop ();
2746
2747           close_dump_file (DFI_ssa_ccp, print_rtl_with_bb, get_insns ());
2748           timevar_pop (TV_SSA_CCP);
2749         }
2750
2751       /* It would be useful to cleanup the CFG at this point, but block
2752          merging and possibly other transformations might leave a PHI
2753          node in the middle of a basic block, which is a strict no-no.  */
2754
2755       /* The SSA implementation uses basic block numbers in its phi
2756          nodes.  Thus, changing the control-flow graph or the basic
2757          blocks, e.g., calling find_basic_blocks () or cleanup_cfg (),
2758          may cause problems.  */
2759
2760       if (flag_ssa_dce)
2761         {
2762           /* Remove dead code.  */
2763
2764           timevar_push (TV_SSA_DCE);
2765           open_dump_file (DFI_ssa_dce, decl);
2766
2767           insns = get_insns ();
2768           ssa_eliminate_dead_code ();
2769
2770           close_dump_file (DFI_ssa_dce, print_rtl_with_bb, insns);
2771           timevar_pop (TV_SSA_DCE);
2772         }
2773
2774       /* Convert from SSA form.  */
2775
2776       timevar_push (TV_FROM_SSA);
2777       open_dump_file (DFI_ussa, decl);
2778
2779       convert_from_ssa ();
2780       /* New registers have been created.  Rescan their usage.  */
2781       reg_scan (insns, max_reg_num (), 1);
2782
2783       close_dump_file (DFI_ussa, print_rtl_with_bb, insns);
2784       timevar_pop (TV_FROM_SSA);
2785
2786       ggc_collect ();
2787     }
2788
2789   timevar_push (TV_JUMP);
2790   cleanup_cfg (optimize ? CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP: 0);
2791
2792   /* Try to identify useless null pointer tests and delete them.  */
2793   if (flag_delete_null_pointer_checks)
2794     {
2795       open_dump_file (DFI_null, decl);
2796       if (rtl_dump_file)
2797         dump_flow_info (rtl_dump_file);
2798
2799       if (delete_null_pointer_checks (insns))
2800         cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2801
2802       close_dump_file (DFI_null, print_rtl_with_bb, insns);
2803     }
2804
2805   /* Jump optimization, and the removal of NULL pointer checks, may
2806      have reduced the number of instructions substantially.  CSE, and
2807      future passes, allocate arrays whose dimensions involve the
2808      maximum instruction UID, so if we can reduce the maximum UID
2809      we'll save big on memory.  */
2810   renumber_insns (rtl_dump_file);
2811   timevar_pop (TV_JUMP);
2812
2813   close_dump_file (DFI_jump, print_rtl_with_bb, insns);
2814
2815   ggc_collect ();
2816
2817   /* Perform common subexpression elimination.
2818      Nonzero value from `cse_main' means that jumps were simplified
2819      and some code may now be unreachable, so do
2820      jump optimization again.  */
2821
2822   if (optimize > 0)
2823     {
2824       open_dump_file (DFI_cse, decl);
2825       if (rtl_dump_file)
2826         dump_flow_info (rtl_dump_file);
2827       timevar_push (TV_CSE);
2828
2829       reg_scan (insns, max_reg_num (), 1);
2830
2831       tem = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2832       if (tem)
2833         rebuild_jump_labels (insns);
2834       purge_all_dead_edges (0);
2835
2836       delete_trivially_dead_insns (insns, max_reg_num ());
2837
2838       /* If we are not running more CSE passes, then we are no longer
2839          expecting CSE to be run.  But always rerun it in a cheap mode.  */
2840       cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
2841
2842       if (tem || optimize > 1)
2843         cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2844       /* Try to identify useless null pointer tests and delete them.  */
2845       if (flag_delete_null_pointer_checks)
2846         {
2847           timevar_push (TV_JUMP);
2848
2849           if (delete_null_pointer_checks (insns))
2850             cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2851           timevar_pop (TV_JUMP);
2852         }
2853
2854       /* The second pass of jump optimization is likely to have
2855          removed a bunch more instructions.  */
2856       renumber_insns (rtl_dump_file);
2857
2858       timevar_pop (TV_CSE);
2859       close_dump_file (DFI_cse, print_rtl_with_bb, insns);
2860     }
2861
2862   open_dump_file (DFI_addressof, decl);
2863
2864   purge_addressof (insns);
2865   if (optimize)
2866     purge_all_dead_edges (0);
2867   reg_scan (insns, max_reg_num (), 1);
2868
2869   close_dump_file (DFI_addressof, print_rtl, insns);
2870
2871   ggc_collect ();
2872
2873   /* Perform global cse.  */
2874
2875   if (optimize > 0 && flag_gcse)
2876     {
2877       int save_csb, save_cfj;
2878       int tem2 = 0;
2879
2880       timevar_push (TV_GCSE);
2881       open_dump_file (DFI_gcse, decl);
2882
2883       tem = gcse_main (insns, rtl_dump_file);
2884       rebuild_jump_labels (insns);
2885       delete_trivially_dead_insns (insns, max_reg_num ());
2886
2887       save_csb = flag_cse_skip_blocks;
2888       save_cfj = flag_cse_follow_jumps;
2889       flag_cse_skip_blocks = flag_cse_follow_jumps = 0;
2890
2891       /* If -fexpensive-optimizations, re-run CSE to clean up things done
2892          by gcse.  */
2893       if (flag_expensive_optimizations)
2894         {
2895           timevar_push (TV_CSE);
2896           reg_scan (insns, max_reg_num (), 1);
2897           tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2898           purge_all_dead_edges (0);
2899           delete_trivially_dead_insns (insns, max_reg_num ());
2900           timevar_pop (TV_CSE);
2901           cse_not_expected = !flag_rerun_cse_after_loop;
2902         }
2903
2904       /* If gcse or cse altered any jumps, rerun jump optimizations to clean
2905          things up.  Then possibly re-run CSE again.  */
2906       while (tem || tem2)
2907         {
2908           tem = tem2 = 0;
2909           timevar_push (TV_JUMP);
2910           rebuild_jump_labels (insns);
2911           cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2912           timevar_pop (TV_JUMP);
2913
2914           if (flag_expensive_optimizations)
2915             {
2916               timevar_push (TV_CSE);
2917               reg_scan (insns, max_reg_num (), 1);
2918               tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2919               purge_all_dead_edges (0);
2920               delete_trivially_dead_insns (insns, max_reg_num ());
2921               timevar_pop (TV_CSE);
2922             }
2923         }
2924
2925       close_dump_file (DFI_gcse, print_rtl_with_bb, insns);
2926       timevar_pop (TV_GCSE);
2927
2928       ggc_collect ();
2929       flag_cse_skip_blocks = save_csb;
2930       flag_cse_follow_jumps = save_cfj;
2931 #ifdef ENABLE_CHECKING
2932       verify_flow_info ();
2933 #endif
2934     }
2935
2936   /* Instantiate any remaining CONSTANT_P_RTX nodes.  */
2937   if (optimize > 0 && flag_gcse && current_function_calls_constant_p)
2938     purge_builtin_constant_p ();
2939
2940   /* Move constant computations out of loops.  */
2941
2942   if (optimize > 0 && flag_loop_optimize)
2943     {
2944       int do_unroll, do_prefetch;
2945
2946       timevar_push (TV_LOOP);
2947       delete_dead_jumptables ();
2948       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2949       open_dump_file (DFI_loop, decl);
2950       /* CFG is no longer maintained up-to-date.  */
2951       free_bb_for_insn ();
2952
2953       do_unroll = flag_unroll_loops ? LOOP_UNROLL : LOOP_AUTO_UNROLL;
2954       do_prefetch = flag_prefetch_loop_arrays ? LOOP_PREFETCH : 0;
2955       if (flag_rerun_loop_opt)
2956         {
2957           cleanup_barriers ();
2958
2959           /* We only want to perform unrolling once.  */
2960           loop_optimize (insns, rtl_dump_file, do_unroll);
2961           do_unroll = 0;
2962
2963           /* The first call to loop_optimize makes some instructions
2964              trivially dead.  We delete those instructions now in the
2965              hope that doing so will make the heuristics in loop work
2966              better and possibly speed up compilation.  */
2967           delete_trivially_dead_insns (insns, max_reg_num ());
2968
2969           /* The regscan pass is currently necessary as the alias
2970                   analysis code depends on this information.  */
2971           reg_scan (insns, max_reg_num (), 1);
2972         }
2973       cleanup_barriers ();
2974       loop_optimize (insns, rtl_dump_file, do_unroll | LOOP_BCT | do_prefetch);
2975
2976       /* Loop can create trivially dead instructions.  */
2977       delete_trivially_dead_insns (insns, max_reg_num ());
2978       close_dump_file (DFI_loop, print_rtl, insns);
2979       timevar_pop (TV_LOOP);
2980       find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2981
2982       ggc_collect ();
2983     }
2984
2985   /* Perform jump bypassing and control flow optimizations.  */
2986   if (optimize > 0 && flag_gcse)
2987     {
2988       timevar_push (TV_BYPASS);
2989       open_dump_file (DFI_bypass, decl);
2990
2991       cleanup_cfg (CLEANUP_EXPENSIVE);
2992       tem = bypass_jumps (rtl_dump_file);
2993
2994       if (tem)
2995         {
2996           rebuild_jump_labels (insns);
2997           cleanup_cfg (CLEANUP_EXPENSIVE);
2998           delete_trivially_dead_insns (insns, max_reg_num ());
2999         }
3000
3001       close_dump_file (DFI_bypass, print_rtl_with_bb, insns);
3002       timevar_pop (TV_BYPASS);
3003
3004       ggc_collect ();
3005
3006 #ifdef ENABLE_CHECKING
3007       verify_flow_info ();
3008 #endif
3009     }
3010
3011   /* Do control and data flow analysis; wrote some of the results to
3012      the dump file.  */
3013
3014   timevar_push (TV_FLOW);
3015   open_dump_file (DFI_cfg, decl);
3016   if (rtl_dump_file)
3017     dump_flow_info (rtl_dump_file);
3018   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
3019                | (flag_thread_jumps ? CLEANUP_THREADING : 0));
3020
3021   /* It may make more sense to mark constant functions after dead code is
3022      eliminated by life_analysis, but we need to do it early, as -fprofile-arcs
3023      may insert code making function non-constant, but we still must consider
3024      it as constant, otherwise -fbranch-probabilities will not read data back.
3025
3026      life_analysis rarely eliminates modification of external memory.
3027    */
3028   if (optimize)
3029     mark_constant_function ();
3030
3031   close_dump_file (DFI_cfg, print_rtl_with_bb, insns);
3032
3033   /* Do branch profiling and static profile estimation passes.  */
3034   if (optimize > 0 || cfun->arc_profile || flag_branch_probabilities)
3035     {
3036       struct loops loops;
3037
3038       timevar_push (TV_BRANCH_PROB);
3039       open_dump_file (DFI_bp, decl);
3040       if (cfun->arc_profile || flag_branch_probabilities)
3041         branch_prob ();
3042
3043       /* Discover and record the loop depth at the head of each basic
3044          block.  The loop infrastructure does the real job for us.  */
3045       flow_loops_find (&loops, LOOP_TREE);
3046
3047       if (rtl_dump_file)
3048         flow_loops_dump (&loops, rtl_dump_file, NULL, 0);
3049
3050       /* Estimate using heuristics if no profiling info is available.  */
3051       if (flag_guess_branch_prob)
3052         estimate_probability (&loops);
3053
3054       flow_loops_free (&loops);
3055       close_dump_file (DFI_bp, print_rtl_with_bb, insns);
3056       timevar_pop (TV_BRANCH_PROB);
3057     }
3058   if (optimize >= 0)
3059     {
3060       open_dump_file (DFI_ce1, decl);
3061       if (flag_if_conversion)
3062         {
3063           timevar_push (TV_IFCVT);
3064           if (rtl_dump_file)
3065             dump_flow_info (rtl_dump_file);
3066           cleanup_cfg (CLEANUP_EXPENSIVE);
3067           reg_scan (insns, max_reg_num (), 0);
3068           if_convert (0);
3069           timevar_pop (TV_IFCVT);
3070         }
3071       timevar_push (TV_JUMP);
3072       cleanup_cfg (CLEANUP_EXPENSIVE);
3073       reg_scan (insns, max_reg_num (), 0);
3074       timevar_pop (TV_JUMP);
3075       close_dump_file (DFI_ce1, print_rtl_with_bb, get_insns ());
3076     }
3077   if (flag_tracer)
3078     {
3079       timevar_push (TV_TRACER);
3080       open_dump_file (DFI_tracer, decl);
3081       if (rtl_dump_file)
3082         dump_flow_info (rtl_dump_file);
3083       tracer ();
3084       cleanup_cfg (CLEANUP_EXPENSIVE);
3085       reg_scan (insns, max_reg_num (), 0);
3086       close_dump_file (DFI_tracer, print_rtl_with_bb, get_insns ());
3087       timevar_pop (TV_TRACER);
3088     }
3089
3090   /* Perform loop optimalizations.  It might be better to do them a bit
3091      sooner, but we want the profile feedback to work more efficiently.  */
3092   if (optimize > 0
3093       && flag_unswitch_loops)
3094     {
3095       struct loops *loops;
3096       timevar_push (TV_LOOP);
3097       open_dump_file (DFI_loop2, decl);
3098       if (rtl_dump_file)
3099         dump_flow_info (rtl_dump_file);
3100
3101       loops = loop_optimizer_init (rtl_dump_file);
3102
3103       if (loops)
3104         {
3105           /* The optimalizations:  */
3106           if (flag_unswitch_loops)
3107             unswitch_loops (loops);
3108
3109           loop_optimizer_finalize (loops, rtl_dump_file);
3110         }
3111
3112       cleanup_cfg (CLEANUP_EXPENSIVE);
3113       delete_trivially_dead_insns (insns, max_reg_num ());
3114       reg_scan (insns, max_reg_num (), 0);
3115       if (rtl_dump_file)
3116         dump_flow_info (rtl_dump_file);
3117       close_dump_file (DFI_loop2, print_rtl_with_bb, get_insns ());
3118       timevar_pop (TV_LOOP);
3119       ggc_collect ();
3120     }
3121
3122   if (flag_rerun_cse_after_loop)
3123     {
3124       timevar_push (TV_CSE2);
3125       open_dump_file (DFI_cse2, decl);
3126       if (rtl_dump_file)
3127         dump_flow_info (rtl_dump_file);
3128       /* CFG is no longer maintained up-to-date.  */
3129       tem = cse_main (insns, max_reg_num (), 1, rtl_dump_file);
3130       purge_all_dead_edges (0);
3131       delete_trivially_dead_insns (insns, max_reg_num ());
3132
3133       if (tem)
3134         {
3135           timevar_push (TV_JUMP);
3136           rebuild_jump_labels (insns);
3137           cleanup_cfg (CLEANUP_EXPENSIVE);
3138           timevar_pop (TV_JUMP);
3139         }
3140       reg_scan (insns, max_reg_num (), 0);
3141       close_dump_file (DFI_cse2, print_rtl_with_bb, insns);
3142       ggc_collect ();
3143       timevar_pop (TV_CSE2);
3144     }
3145
3146   cse_not_expected = 1;
3147
3148   open_dump_file (DFI_life, decl);
3149   regclass_init ();
3150
3151   check_function_return_warnings ();
3152
3153 #ifdef ENABLE_CHECKING
3154   verify_flow_info ();
3155 #endif
3156   life_analysis (insns, rtl_dump_file, PROP_FINAL);
3157   if (optimize)
3158     cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_UPDATE_LIFE
3159                  | (flag_thread_jumps ? CLEANUP_THREADING : 0));
3160   timevar_pop (TV_FLOW);
3161
3162   no_new_pseudos = 1;
3163
3164   if (warn_uninitialized || extra_warnings)
3165     {
3166       uninitialized_vars_warning (DECL_INITIAL (decl));
3167       if (extra_warnings)
3168         setjmp_args_warning ();
3169     }
3170
3171   if (optimize)
3172     {
3173       clear_bb_flags ();
3174       if (!flag_new_regalloc && initialize_uninitialized_subregs ())
3175         {
3176           /* Insns were inserted, so things might look a bit different.  */
3177           insns = get_insns ();
3178           update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
3179                                             PROP_LOG_LINKS | PROP_REG_INFO
3180                                             | PROP_DEATH_NOTES);
3181         }
3182     }
3183
3184   close_dump_file (DFI_life, print_rtl_with_bb, insns);
3185
3186   ggc_collect ();
3187
3188   /* If -opt, try combining insns through substitution.  */
3189
3190   if (optimize > 0)
3191     {
3192       int rebuild_jump_labels_after_combine = 0;
3193
3194       timevar_push (TV_COMBINE);
3195       open_dump_file (DFI_combine, decl);
3196
3197       rebuild_jump_labels_after_combine
3198         = combine_instructions (insns, max_reg_num ());
3199
3200       /* Combining insns may have turned an indirect jump into a
3201          direct jump.  Rebuild the JUMP_LABEL fields of jumping
3202          instructions.  */
3203       if (rebuild_jump_labels_after_combine)
3204         {
3205           timevar_push (TV_JUMP);
3206           rebuild_jump_labels (insns);
3207           timevar_pop (TV_JUMP);
3208
3209           cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
3210         }
3211
3212       close_dump_file (DFI_combine, print_rtl_with_bb, insns);
3213       timevar_pop (TV_COMBINE);
3214
3215       ggc_collect ();
3216     }
3217
3218   /* Rerun if-conversion, as combine may have simplified things enough to
3219      now meet sequence length restrictions.  */
3220   if (flag_if_conversion)
3221     {
3222       timevar_push (TV_IFCVT);
3223       open_dump_file (DFI_ce2, decl);
3224
3225       no_new_pseudos = 0;
3226       if_convert (1);
3227       no_new_pseudos = 1;
3228
3229       close_dump_file (DFI_ce2, print_rtl_with_bb, insns);
3230       timevar_pop (TV_IFCVT);
3231     }
3232
3233   /* Register allocation pre-pass, to reduce number of moves
3234      necessary for two-address machines.  */
3235   if (optimize > 0 && (flag_regmove || flag_expensive_optimizations))
3236     {
3237       timevar_push (TV_REGMOVE);
3238       open_dump_file (DFI_regmove, decl);
3239
3240       regmove_optimize (insns, max_reg_num (), rtl_dump_file);
3241
3242       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
3243       close_dump_file (DFI_regmove, print_rtl_with_bb, insns);
3244       timevar_pop (TV_REGMOVE);
3245
3246       ggc_collect ();
3247     }
3248
3249   /* Do unconditional splitting before register allocation to allow machine
3250      description to add extra information not needed previously.  */
3251   split_all_insns (1);
3252
3253 #ifdef OPTIMIZE_MODE_SWITCHING
3254   timevar_push (TV_MODE_SWITCH);
3255
3256   no_new_pseudos = 0;
3257   optimize_mode_switching (NULL);
3258   no_new_pseudos = 1;
3259
3260   timevar_pop (TV_MODE_SWITCH);
3261 #endif
3262
3263   /* Any of the several passes since flow1 will have munged register
3264      lifetime data a bit.  We need it to be up to date for scheduling
3265      (see handling of reg_known_equiv in init_alias_analysis).  */
3266   recompute_reg_usage (insns, !optimize_size);
3267
3268   timevar_push (TV_SCHED);
3269
3270 #ifdef INSN_SCHEDULING
3271
3272   /* Print function header into sched dump now
3273      because doing the sched analysis makes some of the dump.  */
3274   if (optimize > 0 && flag_schedule_insns)
3275     {
3276       open_dump_file (DFI_sched, decl);
3277
3278       /* Do control and data sched analysis,
3279          and write some of the results to dump file.  */
3280
3281       schedule_insns (rtl_dump_file);
3282
3283       close_dump_file (DFI_sched, print_rtl_with_bb, insns);
3284     }
3285 #endif
3286   timevar_pop (TV_SCHED);
3287
3288   ggc_collect ();
3289
3290   /* Determine if the current function is a leaf before running reload
3291      since this can impact optimizations done by the prologue and
3292      epilogue thus changing register elimination offsets.  */
3293   current_function_is_leaf = leaf_function_p ();
3294
3295   timevar_push (TV_LOCAL_ALLOC);
3296   open_dump_file (DFI_lreg, decl);
3297
3298   /* Allocate pseudo-regs that are used only within 1 basic block.
3299
3300      RUN_JUMP_AFTER_RELOAD records whether or not we need to rerun the
3301      jump optimizer after register allocation and reloading are finished.  */
3302
3303   if (flag_new_regalloc)
3304     {
3305       delete_trivially_dead_insns (insns, max_reg_num ());
3306       reg_alloc ();
3307
3308       timevar_pop (TV_LOCAL_ALLOC);
3309       if (dump_file[DFI_lreg].enabled)
3310         {
3311           timevar_push (TV_DUMP);
3312
3313           close_dump_file (DFI_lreg, NULL, NULL);
3314           timevar_pop (TV_DUMP);
3315         }
3316
3317       /* XXX clean up the whole mess to bring live info in shape again.  */
3318       timevar_push (TV_GLOBAL_ALLOC);
3319       open_dump_file (DFI_greg, decl);
3320
3321       build_insn_chain (insns);
3322       failure = reload (insns, 0);
3323
3324       timevar_pop (TV_GLOBAL_ALLOC);
3325
3326       if (dump_file[DFI_greg].enabled)
3327         {
3328           timevar_push (TV_DUMP);
3329
3330           dump_global_regs (rtl_dump_file);
3331
3332           close_dump_file (DFI_greg, print_rtl_with_bb, insns);
3333           timevar_pop (TV_DUMP);
3334         }
3335
3336       if (failure)
3337         goto exit_rest_of_compilation;
3338       reload_completed = 1;
3339       rebuild_label_notes_after_reload = 0;
3340     }
3341   else
3342     {
3343       /* Allocate the reg_renumber array.  */
3344       allocate_reg_info (max_regno, FALSE, TRUE);
3345
3346       /* And the reg_equiv_memory_loc array.  */
3347       reg_equiv_memory_loc = (rtx *) xcalloc (max_regno, sizeof (rtx));
3348
3349       allocate_initial_values (reg_equiv_memory_loc);
3350
3351       regclass (insns, max_reg_num (), rtl_dump_file);
3352       rebuild_label_notes_after_reload = local_alloc ();
3353
3354       timevar_pop (TV_LOCAL_ALLOC);
3355
3356       if (dump_file[DFI_lreg].enabled)
3357         {
3358           timevar_push (TV_DUMP);
3359
3360           dump_flow_info (rtl_dump_file);
3361           dump_local_alloc (rtl_dump_file);
3362
3363           close_dump_file (DFI_lreg, print_rtl_with_bb, insns);
3364           timevar_pop (TV_DUMP);
3365         }
3366
3367       ggc_collect ();
3368
3369       timevar_push (TV_GLOBAL_ALLOC);
3370       open_dump_file (DFI_greg, decl);
3371
3372       /* If optimizing, allocate remaining pseudo-regs.  Do the reload
3373          pass fixing up any insns that are invalid.  */
3374
3375       if (optimize)
3376         failure = global_alloc (rtl_dump_file);
3377       else
3378         {
3379           build_insn_chain (insns);
3380           failure = reload (insns, 0);
3381         }
3382
3383       timevar_pop (TV_GLOBAL_ALLOC);
3384
3385       if (dump_file[DFI_greg].enabled)
3386         {
3387           timevar_push (TV_DUMP);
3388
3389           dump_global_regs (rtl_dump_file);
3390
3391           close_dump_file (DFI_greg, print_rtl_with_bb, insns);
3392           timevar_pop (TV_DUMP);
3393         }
3394
3395       if (failure)
3396         goto exit_rest_of_compilation;
3397     }
3398
3399   ggc_collect ();
3400
3401   open_dump_file (DFI_postreload, decl);
3402
3403   /* Do a very simple CSE pass over just the hard registers.  */
3404   if (optimize > 0)
3405     {
3406       timevar_push (TV_RELOAD_CSE_REGS);
3407       reload_cse_regs (insns);
3408       timevar_pop (TV_RELOAD_CSE_REGS);
3409     }
3410
3411   /* Register allocation and reloading may have turned an indirect jump into
3412      a direct jump.  If so, we must rebuild the JUMP_LABEL fields of
3413      jumping instructions.  */
3414   if (rebuild_label_notes_after_reload)
3415     {
3416       timevar_push (TV_JUMP);
3417
3418       rebuild_jump_labels (insns);
3419       purge_all_dead_edges (0);
3420
3421       timevar_pop (TV_JUMP);
3422     }
3423
3424   close_dump_file (DFI_postreload, print_rtl_with_bb, insns);
3425
3426   /* Re-create the death notes which were deleted during reload.  */
3427   timevar_push (TV_FLOW2);
3428   open_dump_file (DFI_flow2, decl);
3429
3430 #ifdef ENABLE_CHECKING
3431   verify_flow_info ();
3432 #endif
3433
3434   /* If optimizing, then go ahead and split insns now.  */
3435   if (optimize > 0)
3436     split_all_insns (0);
3437
3438   cleanup_cfg (optimize ? CLEANUP_EXPENSIVE : 0);
3439
3440   /* On some machines, the prologue and epilogue code, or parts thereof,
3441      can be represented as RTL.  Doing so lets us schedule insns between
3442      it and the rest of the code and also allows delayed branch
3443      scheduling to operate in the epilogue.  */
3444   thread_prologue_and_epilogue_insns (insns);
3445
3446   if (optimize)
3447     {
3448       life_analysis (insns, rtl_dump_file, PROP_FINAL);
3449       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE
3450                    | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
3451
3452       /* This is kind of a heuristic.  We need to run combine_stack_adjustments
3453          even for machines with possibly nonzero RETURN_POPS_ARGS
3454          and ACCUMULATE_OUTGOING_ARGS.  We expect that only ports having
3455          push instructions will have popping returns.  */
3456 #ifndef PUSH_ROUNDING
3457       if (!ACCUMULATE_OUTGOING_ARGS)
3458 #endif
3459         combine_stack_adjustments ();
3460
3461       ggc_collect ();
3462     }
3463
3464   flow2_completed = 1;
3465
3466   close_dump_file (DFI_flow2, print_rtl_with_bb, insns);
3467   timevar_pop (TV_FLOW2);
3468
3469 #ifdef HAVE_peephole2
3470   if (optimize > 0 && flag_peephole2)
3471     {
3472       timevar_push (TV_PEEPHOLE2);
3473       open_dump_file (DFI_peephole2, decl);
3474
3475       peephole2_optimize (rtl_dump_file);
3476
3477       close_dump_file (DFI_peephole2, print_rtl_with_bb, insns);
3478       timevar_pop (TV_PEEPHOLE2);
3479     }
3480 #endif
3481
3482   if (optimize > 0 && (flag_rename_registers || flag_cprop_registers))
3483     {
3484       timevar_push (TV_RENAME_REGISTERS);
3485       open_dump_file (DFI_rnreg, decl);
3486
3487       if (flag_rename_registers)
3488         regrename_optimize ();
3489       if (flag_cprop_registers)
3490         copyprop_hardreg_forward ();
3491
3492       close_dump_file (DFI_rnreg, print_rtl_with_bb, insns);
3493       timevar_pop (TV_RENAME_REGISTERS);
3494     }
3495
3496   if (flag_if_conversion2)
3497     {
3498       timevar_push (TV_IFCVT2);
3499       open_dump_file (DFI_ce3, decl);
3500
3501       if_convert (1);
3502
3503       close_dump_file (DFI_ce3, print_rtl_with_bb, insns);
3504       timevar_pop (TV_IFCVT2);
3505     }
3506 #ifdef STACK_REGS
3507   if (optimize)
3508     split_all_insns (1);
3509 #endif
3510
3511 #ifdef INSN_SCHEDULING
3512   if (optimize > 0 && flag_schedule_insns_after_reload)
3513     {
3514       timevar_push (TV_SCHED2);
3515       open_dump_file (DFI_sched2, decl);
3516
3517       /* Do control and data sched analysis again,
3518          and write some more of the results to dump file.  */
3519
3520       split_all_insns (1);
3521
3522       schedule_insns (rtl_dump_file);
3523
3524       close_dump_file (DFI_sched2, print_rtl_with_bb, insns);
3525       timevar_pop (TV_SCHED2);
3526
3527       ggc_collect ();
3528     }
3529 #endif
3530
3531 #ifdef LEAF_REGISTERS
3532   current_function_uses_only_leaf_regs
3533     = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
3534 #endif
3535
3536 #ifdef STACK_REGS
3537   timevar_push (TV_REG_STACK);
3538   open_dump_file (DFI_stack, decl);
3539
3540   reg_to_stack (insns, rtl_dump_file);
3541
3542   close_dump_file (DFI_stack, print_rtl_with_bb, insns);
3543   timevar_pop (TV_REG_STACK);
3544
3545   ggc_collect ();
3546 #endif
3547   if (optimize > 0)
3548     {
3549       timevar_push (TV_REORDER_BLOCKS);
3550       open_dump_file (DFI_bbro, decl);
3551
3552       /* Last attempt to optimize CFG, as scheduling, peepholing and insn
3553          splitting possibly introduced more crossjumping opportunities.
3554          Except that we can't actually run crossjumping without running
3555          another DCE pass, which we can't do after reg-stack.  */
3556       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK
3557                    | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
3558       if (flag_reorder_blocks)
3559         {
3560           reorder_basic_blocks ();
3561           cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK);
3562         }
3563
3564       close_dump_file (DFI_bbro, print_rtl_with_bb, insns);
3565       timevar_pop (TV_REORDER_BLOCKS);
3566     }
3567   compute_alignments ();
3568
3569   /* CFG is no longer maintained up-to-date.  */
3570   free_bb_for_insn ();
3571
3572   /* If a machine dependent reorganization is needed, call it.  */
3573 #ifdef MACHINE_DEPENDENT_REORG
3574   timevar_push (TV_MACH_DEP);
3575   open_dump_file (DFI_mach, decl);
3576
3577   MACHINE_DEPENDENT_REORG (insns);
3578
3579   close_dump_file (DFI_mach, print_rtl, insns);
3580   timevar_pop (TV_MACH_DEP);
3581
3582   ggc_collect ();
3583 #endif
3584
3585   purge_line_number_notes (insns);
3586   cleanup_barriers ();
3587
3588   /* If a scheduling pass for delayed branches is to be done,
3589      call the scheduling code.  */
3590
3591 #ifdef DELAY_SLOTS
3592   if (optimize > 0 && flag_delayed_branch)
3593     {
3594       timevar_push (TV_DBR_SCHED);
3595       open_dump_file (DFI_dbr, decl);
3596
3597       dbr_schedule (insns, rtl_dump_file);
3598
3599       close_dump_file (DFI_dbr, print_rtl, insns);
3600       timevar_pop (TV_DBR_SCHED);
3601
3602       ggc_collect ();
3603     }
3604 #endif
3605
3606 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
3607   timevar_push (TV_SHORTEN_BRANCH);
3608   split_all_insns_noflow ();
3609   timevar_pop (TV_SHORTEN_BRANCH);
3610 #endif
3611
3612   convert_to_eh_region_ranges ();
3613
3614   /* Shorten branches.  */
3615   timevar_push (TV_SHORTEN_BRANCH);
3616   shorten_branches (get_insns ());
3617   timevar_pop (TV_SHORTEN_BRANCH);
3618
3619   set_nothrow_function_flags ();
3620   if (current_function_nothrow)
3621     /* Now we know that this can't throw; set the flag for the benefit
3622        of other functions later in this translation unit.  */
3623     TREE_NOTHROW (current_function_decl) = 1;
3624
3625   /* Now turn the rtl into assembler code.  */
3626
3627   timevar_push (TV_FINAL);
3628   {
3629     rtx x;
3630     const char *fnname;
3631
3632     /* Get the function's name, as described by its RTL.  This may be
3633        different from the DECL_NAME name used in the source file.  */
3634
3635     x = DECL_RTL (decl);
3636     if (GET_CODE (x) != MEM)
3637       abort ();
3638     x = XEXP (x, 0);
3639     if (GET_CODE (x) != SYMBOL_REF)
3640       abort ();
3641     fnname = XSTR (x, 0);
3642
3643     assemble_start_function (decl, fnname);
3644     final_start_function (insns, asm_out_file, optimize);
3645     final (insns, asm_out_file, optimize, 0);
3646     final_end_function ();
3647
3648 #ifdef IA64_UNWIND_INFO
3649     /* ??? The IA-64 ".handlerdata" directive must be issued before
3650        the ".endp" directive that closes the procedure descriptor.  */
3651     output_function_exception_table ();
3652 #endif
3653
3654     assemble_end_function (decl, fnname);
3655
3656 #ifndef IA64_UNWIND_INFO
3657     /* Otherwise, it feels unclean to switch sections in the middle.  */
3658     output_function_exception_table ();
3659 #endif
3660
3661     if (! quiet_flag)
3662       fflush (asm_out_file);
3663
3664     /* Release all memory allocated by flow.  */
3665     free_basic_block_vars (0);
3666
3667     /* Release all memory held by regsets now.  */
3668     regset_release_memory ();
3669   }
3670   timevar_pop (TV_FINAL);
3671
3672   ggc_collect ();
3673
3674   /* Write DBX symbols if requested.  */
3675
3676   /* Note that for those inline functions where we don't initially
3677      know for certain that we will be generating an out-of-line copy,
3678      the first invocation of this routine (rest_of_compilation) will
3679      skip over this code by doing a `goto exit_rest_of_compilation;'.
3680      Later on, wrapup_global_declarations will (indirectly) call
3681      rest_of_compilation again for those inline functions that need
3682      to have out-of-line copies generated.  During that call, we
3683      *will* be routed past here.  */
3684
3685   timevar_push (TV_SYMOUT);
3686   (*debug_hooks->function_decl) (decl);
3687   timevar_pop (TV_SYMOUT);
3688
3689  exit_rest_of_compilation:
3690
3691   /* In case the function was not output,
3692      don't leave any temporary anonymous types
3693      queued up for sdb output.  */
3694 #ifdef SDB_DEBUGGING_INFO
3695   if (write_symbols == SDB_DEBUG)
3696     sdbout_types (NULL_TREE);
3697 #endif
3698
3699   reload_completed = 0;
3700   flow2_completed = 0;
3701   no_new_pseudos = 0;
3702
3703   timevar_push (TV_FINAL);
3704
3705   /* Clear out the insn_length contents now that they are no
3706      longer valid.  */
3707   init_insn_lengths ();
3708
3709   /* Show no temporary slots allocated.  */
3710   init_temp_slots ();
3711
3712   free_basic_block_vars (0);
3713   free_bb_for_insn ();
3714
3715   timevar_pop (TV_FINAL);
3716
3717   /* Make sure volatile mem refs aren't considered valid operands for
3718      arithmetic insns.  We must call this here if this is a nested inline
3719      function, since the above code leaves us in the init_recog state
3720      (from final.c), and the function context push/pop code does not
3721      save/restore volatile_ok.
3722
3723      ??? Maybe it isn't necessary for expand_start_function to call this
3724      anymore if we do it here?  */
3725
3726   init_recog_no_volatile ();
3727
3728   /* We're done with this function.  Free up memory if we can.  */
3729   free_after_parsing (cfun);
3730   if (! DECL_DEFER_OUTPUT (decl))
3731     {
3732       free_after_compilation (cfun);
3733
3734       /* Clear integrate.c's pointer to the cfun structure we just
3735          destroyed.  */
3736       DECL_SAVED_INSNS (decl) = 0;
3737     }
3738   cfun = 0;
3739
3740   ggc_collect ();
3741
3742   timevar_pop (TV_REST_OF_COMPILATION);
3743 }
3744 \f
3745 static void
3746 display_help ()
3747 {
3748   int undoc;
3749   unsigned long i;
3750   const char *lang;
3751
3752   printf (_("  -ffixed-<register>      Mark <register> as being unavailable to the compiler\n"));
3753   printf (_("  -fcall-used-<register>  Mark <register> as being corrupted by function calls\n"));
3754   printf (_("  -fcall-saved-<register> Mark <register> as being preserved across functions\n"));
3755   printf (_("  -finline-limit=<number> Limits the size of inlined functions to <number>\n"));
3756   printf (_("  -fmessage-length=<number> Limits diagnostics messages lengths to <number> characters per line.  0 suppresses line-wrapping\n"));
3757   printf (_("  -fdiagnostics-show-location=[once | every-line] Indicates how often source location information should be emitted, as prefix, at the beginning of diagnostics when line-wrapping\n"));
3758   printf (_("  -ftls-model=[global-dynamic | local-dynamic | initial-exec | local-exec] Indicates the default thread-local storage code generation model\n"));
3759
3760   for (i = ARRAY_SIZE (f_options); i--;)
3761     {
3762       const char *description = f_options[i].description;
3763
3764       if (description != NULL && *description != 0)
3765         printf ("  -f%-21s %s\n",
3766                 f_options[i].string, _(description));
3767     }
3768
3769   printf (_("  -O[number]              Set optimization level to [number]\n"));
3770   printf (_("  -Os                     Optimize for space rather than speed\n"));
3771   for (i = LAST_PARAM; i--;)
3772     {
3773       const char *description = compiler_params[i].help;
3774       const int length = 21 - strlen (compiler_params[i].option);
3775
3776       if (description != NULL && *description != 0)
3777         printf ("  --param %s=<value>%.*s%s\n",
3778                 compiler_params[i].option,
3779                 length > 0 ? length : 1, "                     ",
3780                 _(description));
3781     }
3782   printf (_("  -pedantic               Issue warnings needed by strict compliance to ISO C\n"));
3783   printf (_("  -pedantic-errors        Like -pedantic except that errors are produced\n"));
3784   printf (_("  -w                      Suppress warnings\n"));
3785
3786   for (i = ARRAY_SIZE (W_options); i--;)
3787     {
3788       const char *description = W_options[i].description;
3789
3790       if (description != NULL && *description != 0)
3791         printf ("  -W%-21s %s\n",
3792                 W_options[i].string, _(description));
3793     }
3794
3795   printf (_("  -Wunused                Enable unused warnings\n"));
3796   printf (_("  -Wlarger-than-<number>  Warn if an object is larger than <number> bytes\n"));
3797   printf (_("  -p                      Enable function profiling\n"));
3798   printf (_("  -o <file>               Place output into <file> \n"));
3799   printf (_("\
3800   -G <number>             Put global and static data smaller than <number>\n\
3801                           bytes into a special section (on some targets)\n"));
3802
3803   for (i = ARRAY_SIZE (debug_args); i--;)
3804     {
3805       if (debug_args[i].description != NULL)
3806         printf ("  -g%-21s %s\n",
3807                 debug_args[i].arg, _(debug_args[i].description));
3808     }
3809
3810   printf (_("  -aux-info <file>        Emit declaration info into <file>\n"));
3811   printf (_("  -quiet                  Do not display functions compiled or elapsed time\n"));
3812   printf (_("  -version                Display the compiler's version\n"));
3813   printf (_("  -d[letters]             Enable dumps from specific passes of the compiler\n"));
3814   printf (_("  -dumpbase <file>        Base name to be used for dumps from specific passes\n"));
3815 #if defined INSN_SCHEDULING
3816   printf (_("  -fsched-verbose=<number> Set the verbosity level of the scheduler\n"));
3817 #endif
3818   printf (_("  --help                  Display this information\n"));
3819
3820   undoc = 0;
3821   lang  = "language";
3822
3823   /* Display descriptions of language specific options.
3824      If there is no description, note that there is an undocumented option.
3825      If the description is empty, do not display anything.  (This allows
3826      options to be deliberately undocumented, for whatever reason).
3827      If the option string is missing, then this is a marker, indicating
3828      that the description string is in fact the name of a language, whose
3829      language specific options are to follow.  */
3830
3831   if (ARRAY_SIZE (documented_lang_options) > 1)
3832     {
3833       printf (_("\nLanguage specific options:\n"));
3834
3835       for (i = 0; i < ARRAY_SIZE (documented_lang_options); i++)
3836         {
3837           const char *description = documented_lang_options[i].description;
3838           const char *option      = documented_lang_options[i].option;
3839
3840           if (description == NULL)
3841             {
3842               undoc = 1;
3843
3844               if (extra_warnings)
3845                 printf (_("  %-23.23s [undocumented]\n"), option);
3846             }
3847           else if (*description == 0)
3848             continue;
3849           else if (option == NULL)
3850             {
3851               if (undoc)
3852                 printf
3853                   (_("\nThere are undocumented %s specific options as well.\n"),
3854                         lang);
3855               undoc = 0;
3856
3857               printf (_("\n Options for %s:\n"), description);
3858
3859               lang = description;
3860             }
3861           else
3862             printf ("  %-23.23s %s\n", option, _(description));
3863         }
3864     }
3865
3866   if (undoc)
3867     printf (_("\nThere are undocumented %s specific options as well.\n"),
3868             lang);
3869
3870   display_target_options ();
3871 }
3872
3873 static void
3874 display_target_options ()
3875 {
3876   int undoc, i;
3877   static bool displayed = false;
3878
3879   /* Avoid double printing for --help --target-help.  */
3880   if (displayed)
3881     return;
3882   displayed = true;
3883
3884   if (ARRAY_SIZE (target_switches) > 1
3885 #ifdef TARGET_OPTIONS
3886       || ARRAY_SIZE (target_options) > 1
3887 #endif
3888       )
3889     {
3890       int doc = 0;
3891
3892       undoc = 0;
3893
3894       printf (_("\nTarget specific options:\n"));
3895
3896       for (i = ARRAY_SIZE (target_switches); i--;)
3897         {
3898           const char *option      = target_switches[i].name;
3899           const char *description = target_switches[i].description;
3900
3901           if (option == NULL || *option == 0)
3902             continue;
3903           else if (description == NULL)
3904             {
3905               undoc = 1;
3906
3907               if (extra_warnings)
3908                 printf (_("  -m%-23.23s [undocumented]\n"), option);
3909             }
3910           else if (*description != 0)
3911             doc += printf ("  -m%-23.23s %s\n", option, _(description));
3912         }
3913
3914 #ifdef TARGET_OPTIONS
3915       for (i = ARRAY_SIZE (target_options); i--;)
3916         {
3917           const char *option      = target_options[i].prefix;
3918           const char *description = target_options[i].description;
3919
3920           if (option == NULL || *option == 0)
3921             continue;
3922           else if (description == NULL)
3923             {
3924               undoc = 1;
3925
3926               if (extra_warnings)
3927                 printf (_("  -m%-23.23s [undocumented]\n"), option);
3928             }
3929           else if (*description != 0)
3930             doc += printf ("  -m%-23.23s %s\n", option, _(description));
3931         }
3932 #endif
3933       if (undoc)
3934         {
3935           if (doc)
3936             printf (_("\nThere are undocumented target specific options as well.\n"));
3937           else
3938             printf (_("  They exist, but they are not documented.\n"));
3939         }
3940     }
3941 }
3942 \f
3943 /* Parse a -d... command line switch.  */
3944
3945 static void
3946 decode_d_option (arg)
3947      const char *arg;
3948 {
3949   int i, c, matched;
3950
3951   while (*arg)
3952     switch (c = *arg++)
3953       {
3954       case 'a':
3955         for (i = 0; i < (int) DFI_MAX; ++i)
3956           dump_file[i].enabled = 1;
3957         break;
3958       case 'A':
3959         flag_debug_asm = 1;
3960         break;
3961       case 'p':
3962         flag_print_asm_name = 1;
3963         break;
3964       case 'P':
3965         flag_dump_rtl_in_asm = 1;
3966         flag_print_asm_name = 1;
3967         break;
3968       case 'v':
3969         graph_dump_format = vcg;
3970         break;
3971       case 'x':
3972         rtl_dump_and_exit = 1;
3973         break;
3974       case 'y':
3975         set_yydebug = 1;
3976         break;
3977       case 'D': /* These are handled by the preprocessor.  */
3978       case 'I':
3979         break;
3980       case 'H':
3981         setup_core_dumping();
3982         break;
3983
3984       default:
3985         matched = 0;
3986         for (i = 0; i < (int) DFI_MAX; ++i)
3987           if (c == dump_file[i].debug_switch)
3988             {
3989               dump_file[i].enabled = 1;
3990               matched = 1;
3991             }
3992
3993         if (! matched)
3994           warning ("unrecognized gcc debugging option: %c", c);
3995         break;
3996       }
3997 }
3998
3999 /* Parse a -f... command line switch.  ARG is the value after the -f.
4000    It is safe to access 'ARG - 2' to generate the full switch name.
4001    Return the number of strings consumed.  */
4002
4003 static int
4004 decode_f_option (arg)
4005      const char *arg;
4006 {
4007   int j;
4008   const char *option_value = NULL;
4009
4010   /* Search for the option in the table of binary f options.  */
4011   for (j = ARRAY_SIZE (f_options); j--;)
4012     {
4013       if (!strcmp (arg, f_options[j].string))
4014         {
4015           *f_options[j].variable = f_options[j].on_value;
4016           return 1;
4017         }
4018
4019       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4020           && ! strcmp (arg + 3, f_options[j].string))
4021         {
4022           *f_options[j].variable = ! f_options[j].on_value;
4023           return 1;
4024         }
4025     }
4026
4027   if (!strcmp (arg, "fast-math"))
4028     set_fast_math_flags (1);
4029   else if (!strcmp (arg, "no-fast-math"))
4030     set_fast_math_flags (0);
4031   else if ((option_value = skip_leading_substring (arg, "inline-limit-"))
4032            || (option_value = skip_leading_substring (arg, "inline-limit=")))
4033     {
4034       int val =
4035         read_integral_parameter (option_value, arg - 2,
4036                                  MAX_INLINE_INSNS);
4037       set_param_value ("max-inline-insns", val);
4038     }
4039   else if ((option_value = skip_leading_substring (arg, "tls-model=")))
4040     {
4041       if (strcmp (option_value, "global-dynamic") == 0)
4042         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
4043       else if (strcmp (option_value, "local-dynamic") == 0)
4044         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
4045       else if (strcmp (option_value, "initial-exec") == 0)
4046         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
4047       else if (strcmp (option_value, "local-exec") == 0)
4048         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
4049       else
4050         warning ("`%s': unknown tls-model option", arg - 2);
4051     }
4052 #ifdef INSN_SCHEDULING
4053   else if ((option_value = skip_leading_substring (arg, "sched-verbose=")))
4054     fix_sched_param ("verbose", option_value);
4055 #endif
4056   else if ((option_value = skip_leading_substring (arg, "fixed-")))
4057     fix_register (option_value, 1, 1);
4058   else if ((option_value = skip_leading_substring (arg, "call-used-")))
4059     fix_register (option_value, 0, 1);
4060   else if ((option_value = skip_leading_substring (arg, "call-saved-")))
4061     fix_register (option_value, 0, 0);
4062   else if ((option_value = skip_leading_substring (arg, "align-loops=")))
4063     align_loops = read_integral_parameter (option_value, arg - 2, align_loops);
4064   else if ((option_value = skip_leading_substring (arg, "align-functions=")))
4065     align_functions
4066       = read_integral_parameter (option_value, arg - 2, align_functions);
4067   else if ((option_value = skip_leading_substring (arg, "align-jumps=")))
4068     align_jumps = read_integral_parameter (option_value, arg - 2, align_jumps);
4069   else if ((option_value = skip_leading_substring (arg, "align-labels=")))
4070     align_labels
4071       = read_integral_parameter (option_value, arg - 2, align_labels);
4072   else if ((option_value
4073             = skip_leading_substring (arg, "stack-limit-register=")))
4074     {
4075       int reg = decode_reg_name (option_value);
4076       if (reg < 0)
4077         error ("unrecognized register name `%s'", option_value);
4078       else
4079         stack_limit_rtx = gen_rtx_REG (Pmode, reg);
4080     }
4081   else if ((option_value
4082             = skip_leading_substring (arg, "stack-limit-symbol=")))
4083     {
4084       const char *nm;
4085       nm = ggc_strdup (option_value);
4086       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, nm);
4087     }
4088   else if ((option_value
4089             = skip_leading_substring (arg, "message-length=")))
4090     output_set_maximum_length
4091       (&global_dc->buffer, read_integral_parameter
4092        (option_value, arg - 2, diagnostic_line_cutoff (global_dc)));
4093   else if ((option_value
4094             = skip_leading_substring (arg, "diagnostics-show-location=")))
4095     {
4096       if (!strcmp (option_value, "once"))
4097         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
4098       else if (!strcmp (option_value, "every-line"))
4099         diagnostic_prefixing_rule (global_dc)
4100           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
4101       else
4102         error ("unrecognized option `%s'", arg - 2);
4103     }
4104   else if (!strcmp (arg, "no-stack-limit"))
4105     stack_limit_rtx = NULL_RTX;
4106   else if (!strcmp (arg, "preprocessed"))
4107     /* Recognize this switch but do nothing.  This prevents warnings
4108        about an unrecognized switch if cpplib has not been linked in.  */
4109     ;
4110   else
4111     return 0;
4112
4113   return 1;
4114 }
4115
4116 /* Parse a -W... command line switch.  ARG is the value after the -W.
4117    It is safe to access 'ARG - 2' to generate the full switch name.
4118    Return the number of strings consumed.  */
4119
4120 static int
4121 decode_W_option (arg)
4122      const char *arg;
4123 {
4124   const char *option_value = NULL;
4125   int j;
4126
4127   /* Search for the option in the table of binary W options.  */
4128
4129   for (j = ARRAY_SIZE (W_options); j--;)
4130     {
4131       if (!strcmp (arg, W_options[j].string))
4132         {
4133           *W_options[j].variable = W_options[j].on_value;
4134           return 1;
4135         }
4136
4137       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4138           && ! strcmp (arg + 3, W_options[j].string))
4139         {
4140           *W_options[j].variable = ! W_options[j].on_value;
4141           return 1;
4142         }
4143     }
4144
4145   if ((option_value = skip_leading_substring (arg, "id-clash-")))
4146     warning ("-Wid-clash-LEN is no longer supported");
4147   else if ((option_value = skip_leading_substring (arg, "larger-than-")))
4148     {
4149       larger_than_size = read_integral_parameter (option_value, arg - 2, -1);
4150
4151       warn_larger_than = larger_than_size != -1;
4152     }
4153   else if (!strcmp (arg, "unused"))
4154     {
4155       set_Wunused (1);
4156     }
4157   else if (!strcmp (arg, "no-unused"))
4158     {
4159       set_Wunused (0);
4160     }
4161   else if (!strcmp (arg, "extra"))
4162     {
4163       /* We save the value of warn_uninitialized, since if they put
4164          -Wuninitialized on the command line, we need to generate a
4165          warning about not using it without also specifying -O.  */
4166       if (warn_uninitialized != 1)
4167         warn_uninitialized = 2;
4168     }
4169   else
4170     return 0;
4171
4172   return 1;
4173 }
4174
4175 /* Parse a -g... command line switch.  ARG is the value after the -g.
4176    It is safe to access 'ARG - 2' to generate the full switch name.
4177    Return the number of strings consumed.  */
4178
4179 static int
4180 decode_g_option (arg)
4181      const char *arg;
4182 {
4183   static unsigned level = 0;
4184   /* A lot of code assumes write_symbols == NO_DEBUG if the
4185      debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
4186      of what debugging type has been selected).  This records the
4187      selected type.  It is an error to specify more than one
4188      debugging type.  */
4189   static enum debug_info_type selected_debug_type = NO_DEBUG;
4190   /* Nonzero if debugging format has been explicitly set.
4191      -g and -ggdb don't explicitly set the debugging format so
4192      -gdwarf -g3 is equivalent to -gdwarf3.  */
4193   static int type_explicitly_set_p = 0;
4194   /* Indexed by enum debug_info_type.  */
4195   static const char *const debug_type_names[] =
4196   {
4197     "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff", "vms"
4198   };
4199
4200   /* The maximum admissible debug level value.  */
4201   static const unsigned max_debug_level = 3;
4202
4203   /* Look up ARG in the table.  */
4204   for (da = debug_args; da->arg; da++)
4205     {
4206       const int da_len = strlen (da->arg);
4207
4208       if (da_len == 0 || ! strncmp (arg, da->arg, da_len))
4209         {
4210           enum debug_info_type type = da->debug_type;
4211           const char *p = arg + da_len;
4212
4213           if (*p && ! ISDIGIT (*p))
4214             continue;
4215
4216           /* A debug flag without a level defaults to level 2.
4217              Note we do not want to call read_integral_parameter
4218              for that case since it will call atoi which
4219              will return zero.
4220
4221              ??? We may want to generalize the interface to
4222              read_integral_parameter to better handle this case
4223              if this case shows up often.  */
4224           if (*p)
4225             level = read_integral_parameter (p, 0, max_debug_level + 1);
4226           else
4227             level = (level == 0) ? 2 : level;
4228
4229           if (da_len > 1 && *p && !strncmp (arg, "dwarf", da_len))
4230             {
4231               error ("use -gdwarf -g%d for DWARF v1, level %d",
4232                      level, level);
4233               if (level == 2)
4234                 error ("use -gdwarf-2   for DWARF v2");
4235             }
4236
4237           if (level > max_debug_level)
4238             {
4239               warning ("\
4240 ignoring option `%s' due to invalid debug level specification",
4241                        arg - 2);
4242               level = debug_info_level;
4243             }
4244
4245           if (type == NO_DEBUG)
4246             {
4247               type = PREFERRED_DEBUGGING_TYPE;
4248
4249               if (da_len > 1 && strncmp (arg, "gdb", da_len) == 0)
4250                 {
4251 #ifdef DWARF2_DEBUGGING_INFO
4252                   type = DWARF2_DEBUG;
4253 #else
4254 #ifdef DBX_DEBUGGING_INFO
4255                   type = DBX_DEBUG;
4256 #endif
4257 #endif
4258                 }
4259             }
4260
4261           if (type == NO_DEBUG)
4262             warning ("`%s': unknown or unsupported -g option", arg - 2);
4263
4264           /* Does it conflict with an already selected type?  */
4265           if (type_explicitly_set_p
4266               /* -g/-ggdb don't conflict with anything.  */
4267               && da->debug_type != NO_DEBUG
4268               && type != selected_debug_type)
4269             warning ("`%s' ignored, conflicts with `-g%s'",
4270                      arg - 2, debug_type_names[(int) selected_debug_type]);
4271           else
4272             {
4273               /* If the format has already been set, -g/-ggdb
4274                  only change the debug level.  */
4275               if (type_explicitly_set_p && da->debug_type == NO_DEBUG)
4276                 /* Don't change debugging type.  */
4277                 ;
4278               else
4279                 {
4280                   selected_debug_type = type;
4281                   type_explicitly_set_p = da->debug_type != NO_DEBUG;
4282                 }
4283
4284               write_symbols = (level == 0
4285                                ? NO_DEBUG
4286                                : selected_debug_type);
4287               use_gnu_debug_info_extensions = da->use_extensions_p;
4288               debug_info_level = (enum debug_info_level) level;
4289             }
4290
4291           break;
4292         }
4293     }
4294
4295   if (! da->arg)
4296     return 0;
4297
4298   return 1;
4299 }
4300
4301 /* Decode the first argument in the argv as a language-independent option.
4302    Return the number of strings consumed.  */
4303
4304 static unsigned int
4305 independent_decode_option (argc, argv)
4306      int argc;
4307      char **argv;
4308 {
4309   char *arg = argv[0];
4310
4311   if (arg[0] != '-' || arg[1] == 0)
4312     {
4313       if (arg[0] == '+')
4314         return 0;
4315
4316       filename = arg;
4317
4318       return 1;
4319     }
4320
4321   arg++;
4322
4323   if (!strcmp (arg, "-help"))
4324     {
4325       display_help ();
4326       exit_after_options = 1;
4327     }
4328
4329   if (!strcmp (arg, "-target-help"))
4330     {
4331       display_target_options ();
4332       exit_after_options = 1;
4333     }
4334
4335   if (!strcmp (arg, "-version"))
4336     {
4337       print_version (stderr, "");
4338       exit_after_options = 1;
4339     }
4340
4341   /* Handle '--param <name>=<value>'.  */
4342   if (strcmp (arg, "-param") == 0)
4343     {
4344       char *equal;
4345
4346       if (argc == 1)
4347         {
4348           error ("-param option missing argument");
4349           return 1;
4350         }
4351
4352       /* Get the '<name>=<value>' parameter.  */
4353       arg = argv[1];
4354       /* Look for the `='.  */
4355       equal = strchr (arg, '=');
4356       if (!equal)
4357         error ("invalid --param option: %s", arg);
4358       else
4359         {
4360           int val;
4361
4362           /* Zero out the `=' sign so that we get two separate strings.  */
4363           *equal = '\0';
4364           /* Figure out what value is specified.  */
4365           val = read_integral_parameter (equal + 1, NULL, INVALID_PARAM_VAL);
4366           if (val != INVALID_PARAM_VAL)
4367             set_param_value (arg, val);
4368           else
4369             error ("invalid parameter value `%s'", equal + 1);
4370         }
4371
4372       return 2;
4373     }
4374
4375   if (*arg == 'Y')
4376     arg++;
4377
4378   switch (*arg)
4379     {
4380     default:
4381       return 0;
4382
4383     case 'O':
4384       /* Already been treated in main (). Do nothing.  */
4385       break;
4386
4387     case 'm':
4388       set_target_switch (arg + 1);
4389       break;
4390
4391     case 'f':
4392       return decode_f_option (arg + 1);
4393
4394     case 'g':
4395       return decode_g_option (arg + 1);
4396
4397     case 'd':
4398       if (!strcmp (arg, "dumpbase"))
4399         {
4400           if (argc == 1)
4401             return 0;
4402
4403           if (argv[1][0])
4404             dump_base_name = argv[1];
4405           
4406           return 2;
4407         }
4408       else
4409         decode_d_option (arg + 1);
4410       break;
4411
4412     case 'p':
4413       if (!strcmp (arg, "pedantic"))
4414         pedantic = 1;
4415       else if (!strcmp (arg, "pedantic-errors"))
4416         flag_pedantic_errors = pedantic = 1;
4417       else if (arg[1] == 0)
4418         profile_flag = 1;
4419       else
4420         return 0;
4421       break;
4422
4423     case 'q':
4424       if (!strcmp (arg, "quiet"))
4425         quiet_flag = 1;
4426       else
4427         return 0;
4428       break;
4429
4430     case 'v':
4431       if (!strcmp (arg, "version"))
4432         version_flag = 1;
4433       else
4434         return 0;
4435       break;
4436
4437     case 'w':
4438       if (arg[1] == 0)
4439         inhibit_warnings = 1;
4440       else
4441         return 0;
4442       break;
4443
4444     case 'W':
4445       if (arg[1] == 0)
4446         {
4447           extra_warnings = 1;
4448           /* We save the value of warn_uninitialized, since if they put
4449              -Wuninitialized on the command line, we need to generate a
4450              warning about not using it without also specifying -O.  */
4451           if (warn_uninitialized != 1)
4452             warn_uninitialized = 2;
4453         }
4454       else
4455         return decode_W_option (arg + 1);
4456       break;
4457
4458     case 'a':
4459       if (!strncmp (arg, "aux-info", 8))
4460         {
4461           if (arg[8] == '\0')
4462             {
4463               if (argc == 1)
4464                 return 0;
4465
4466               aux_info_file_name = argv[1];
4467               flag_gen_aux_info = 1;
4468               return 2;
4469             }
4470           else if (arg[8] == '=')
4471             {
4472               aux_info_file_name = arg + 9;
4473               flag_gen_aux_info = 1;
4474             }
4475           else
4476             return 0;
4477         }
4478       else if (!strcmp (arg, "auxbase"))
4479         {
4480           if (argc == 1)
4481             return 0;
4482
4483           if (argv[1][0])
4484             aux_base_name = argv[1];
4485           
4486           return 2;
4487         }
4488       else if (!strcmp (arg, "auxbase-strip"))
4489         {
4490           if (argc == 1)
4491             return 0;
4492
4493           if (argv[1][0])
4494             {
4495               strip_off_ending (argv[1], strlen (argv[1]));
4496               if (argv[1][0])
4497                 aux_base_name = argv[1];
4498             }
4499           
4500           return 2;
4501         }
4502       else
4503         return 0;
4504       break;
4505
4506     case 'o':
4507       if (arg[1] == 0)
4508         {
4509           if (argc == 1)
4510             return 0;
4511
4512           asm_file_name = argv[1];
4513           return 2;
4514         }
4515       return 0;
4516
4517     case 'G':
4518       {
4519         int g_switch_val;
4520         int return_val;
4521
4522         if (arg[1] == 0)
4523           {
4524             if (argc == 1)
4525               return 0;
4526
4527             g_switch_val = read_integral_parameter (argv[1], 0, -1);
4528             return_val = 2;
4529           }
4530         else
4531           {
4532             g_switch_val = read_integral_parameter (arg + 1, 0, -1);
4533             return_val = 1;
4534           }
4535
4536         if (g_switch_val == -1)
4537           return_val = 0;
4538         else
4539           {
4540             g_switch_set = TRUE;
4541             g_switch_value = g_switch_val;
4542           }
4543
4544         return return_val;
4545       }
4546     }
4547
4548   return 1;
4549 }
4550 \f
4551 /* Decode -m switches.  */
4552 /* Decode the switch -mNAME.  */
4553
4554 static void
4555 set_target_switch (name)
4556      const char *name;
4557 {
4558   size_t j;
4559   int valid_target_option = 0;
4560
4561   for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4562     if (!strcmp (target_switches[j].name, name))
4563       {
4564         if (target_switches[j].value < 0)
4565           target_flags &= ~-target_switches[j].value;
4566         else
4567           target_flags |= target_switches[j].value;
4568         if (name[0] != 0)
4569           {
4570             if (target_switches[j].value < 0)
4571               target_flags_explicit |= -target_switches[j].value;
4572             else
4573               target_flags_explicit |= target_switches[j].value;
4574           }
4575         valid_target_option = 1;
4576       }
4577
4578 #ifdef TARGET_OPTIONS
4579   if (!valid_target_option)
4580     for (j = 0; j < ARRAY_SIZE (target_options); j++)
4581       {
4582         int len = strlen (target_options[j].prefix);
4583         if (!strncmp (target_options[j].prefix, name, len))
4584           {
4585             *target_options[j].variable = name + len;
4586             valid_target_option = 1;
4587           }
4588       }
4589 #endif
4590
4591   if (!valid_target_option)
4592     error ("invalid option `%s'", name);
4593 }
4594 \f
4595 /* Print version information to FILE.
4596    Each line begins with INDENT (for the case where FILE is the
4597    assembler output file).  */
4598
4599 static void
4600 print_version (file, indent)
4601      FILE *file;
4602      const char *indent;
4603 {
4604 #ifndef __VERSION__
4605 #define __VERSION__ "[?]"
4606 #endif
4607   fnotice (file,
4608 #ifdef __GNUC__
4609            "%s%s%s version %s (%s)\n%s\tcompiled by GNU C version %s.\n"
4610 #else
4611            "%s%s%s version %s (%s) compiled by CC.\n"
4612 #endif
4613            , indent, *indent != 0 ? " " : "",
4614            lang_hooks.name, version_string, TARGET_NAME,
4615            indent, __VERSION__);
4616 }
4617
4618 /* Print an option value and return the adjusted position in the line.
4619    ??? We don't handle error returns from fprintf (disk full); presumably
4620    other code will catch a disk full though.  */
4621
4622 static int
4623 print_single_switch (file, pos, max, indent, sep, term, type, name)
4624      FILE *file;
4625      int pos, max;
4626      const char *indent, *sep, *term, *type, *name;
4627 {
4628   /* The ultrix fprintf returns 0 on success, so compute the result we want
4629      here since we need it for the following test.  */
4630   int len = strlen (sep) + strlen (type) + strlen (name);
4631
4632   if (pos != 0
4633       && pos + len > max)
4634     {
4635       fprintf (file, "%s", term);
4636       pos = 0;
4637     }
4638   if (pos == 0)
4639     {
4640       fprintf (file, "%s", indent);
4641       pos = strlen (indent);
4642     }
4643   fprintf (file, "%s%s%s", sep, type, name);
4644   pos += len;
4645   return pos;
4646 }
4647
4648 /* Print active target switches to FILE.
4649    POS is the current cursor position and MAX is the size of a "line".
4650    Each line begins with INDENT and ends with TERM.
4651    Each switch is separated from the next by SEP.  */
4652
4653 static void
4654 print_switch_values (file, pos, max, indent, sep, term)
4655      FILE *file;
4656      int pos, max;
4657      const char *indent, *sep, *term;
4658 {
4659   size_t j;
4660   char **p;
4661
4662   /* Print the options as passed.  */
4663
4664   pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
4665                              _("options passed: "), "");
4666
4667   for (p = &save_argv[1]; *p != NULL; p++)
4668     if (**p == '-')
4669       {
4670         /* Ignore these.  */
4671         if (strcmp (*p, "-o") == 0)
4672           {
4673             if (p[1] != NULL)
4674               p++;
4675             continue;
4676           }
4677         if (strcmp (*p, "-quiet") == 0)
4678           continue;
4679         if (strcmp (*p, "-version") == 0)
4680           continue;
4681         if ((*p)[1] == 'd')
4682           continue;
4683
4684         pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
4685       }
4686   if (pos > 0)
4687     fprintf (file, "%s", term);
4688
4689   /* Print the -f and -m options that have been enabled.
4690      We don't handle language specific options but printing argv
4691      should suffice.  */
4692
4693   pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
4694                              _("options enabled: "), "");
4695
4696   for (j = 0; j < ARRAY_SIZE (f_options); j++)
4697     if (*f_options[j].variable == f_options[j].on_value)
4698       pos = print_single_switch (file, pos, max, indent, sep, term,
4699                                  "-f", f_options[j].string);
4700
4701   /* Print target specific options.  */
4702
4703   for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4704     if (target_switches[j].name[0] != '\0'
4705         && target_switches[j].value > 0
4706         && ((target_switches[j].value & target_flags)
4707             == target_switches[j].value))
4708       {
4709         pos = print_single_switch (file, pos, max, indent, sep, term,
4710                                    "-m", target_switches[j].name);
4711       }
4712
4713 #ifdef TARGET_OPTIONS
4714   for (j = 0; j < ARRAY_SIZE (target_options); j++)
4715     if (*target_options[j].variable != NULL)
4716       {
4717         char prefix[256];
4718         sprintf (prefix, "-m%s", target_options[j].prefix);
4719         pos = print_single_switch (file, pos, max, indent, sep, term,
4720                                    prefix, *target_options[j].variable);
4721       }
4722 #endif
4723
4724   fprintf (file, "%s", term);
4725 }
4726 \f
4727 /* Open assembly code output file.  Do this even if -fsyntax-only is
4728    on, because then the driver will have provided the name of a
4729    temporary file or bit bucket for us.  NAME is the file specified on
4730    the command line, possibly NULL.  */
4731 static void
4732 init_asm_output (name)
4733      const char *name;
4734 {
4735   if (name == NULL && asm_file_name == 0)
4736     asm_out_file = stdout;
4737   else
4738     {
4739       if (asm_file_name == 0)
4740         {
4741           int len = strlen (dump_base_name);
4742           char *dumpname = (char *) xmalloc (len + 6);
4743           memcpy (dumpname, dump_base_name, len + 1);
4744           strip_off_ending (dumpname, len);
4745           strcat (dumpname, ".s");
4746           asm_file_name = dumpname;
4747         }
4748       if (!strcmp (asm_file_name, "-"))
4749         asm_out_file = stdout;
4750       else
4751         asm_out_file = fopen (asm_file_name, "w+");
4752       if (asm_out_file == 0)
4753         fatal_io_error ("can't open %s for writing", asm_file_name);
4754     }
4755
4756 #ifdef IO_BUFFER_SIZE
4757   setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
4758            _IOFBF, IO_BUFFER_SIZE);
4759 #endif
4760
4761   if (!flag_syntax_only)
4762     {
4763 #ifdef ASM_FILE_START
4764       ASM_FILE_START (asm_out_file);
4765 #endif
4766
4767 #ifdef ASM_COMMENT_START
4768       if (flag_verbose_asm)
4769         {
4770           /* Print the list of options in effect.  */
4771           print_version (asm_out_file, ASM_COMMENT_START);
4772           print_switch_values (asm_out_file, 0, MAX_LINE,
4773                                ASM_COMMENT_START, " ", "\n");
4774           /* Add a blank line here so it appears in assembler output but not
4775              screen output.  */
4776           fprintf (asm_out_file, "\n");
4777         }
4778 #endif
4779     }
4780 }
4781 \f
4782 /* Initialization of the front end environment, before command line
4783    options are parsed.  Signal handlers, internationalization etc.
4784    ARGV0 is main's argv[0].  */
4785 static void
4786 general_init (argv0)
4787      char *argv0;
4788 {
4789   char *p;
4790
4791   p = argv0 + strlen (argv0);
4792   while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
4793     --p;
4794   progname = p;
4795
4796   xmalloc_set_program_name (progname);
4797
4798   hex_init ();
4799
4800   gcc_init_libintl ();
4801
4802   /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
4803 #ifdef SIGSEGV
4804   signal (SIGSEGV, crash_signal);
4805 #endif
4806 #ifdef SIGILL
4807   signal (SIGILL, crash_signal);
4808 #endif
4809 #ifdef SIGBUS
4810   signal (SIGBUS, crash_signal);
4811 #endif
4812 #ifdef SIGABRT
4813   signal (SIGABRT, crash_signal);
4814 #endif
4815 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
4816   signal (SIGIOT, crash_signal);
4817 #endif
4818 #ifdef SIGFPE
4819   signal (SIGFPE, crash_signal);
4820 #endif
4821
4822   /* Other host-specific signal setup.  */
4823   (*host_hooks.extra_signals)();
4824
4825   /* Initialize the diagnostics reporting machinery, so option parsing
4826      can give warnings and errors.  */
4827   diagnostic_initialize (global_dc);
4828
4829   /* Initialize the garbage-collector, string pools and tree type hash
4830      table.  */
4831   init_ggc ();
4832   init_stringpool ();
4833   init_ttree ();
4834 }
4835 \f
4836 /* Parse command line options and set default flag values, called
4837    after language-independent option-independent initialization.  Do
4838    minimal options processing.  Outputting diagnostics is OK, but GC
4839    and identifier hashtables etc. are not initialized yet.
4840
4841    Return nonzero to suppress compiler back end initialization.  */
4842 static void
4843 parse_options_and_default_flags (argc, argv)
4844      int argc;
4845      char **argv;
4846 {
4847   int i;
4848
4849   /* Save in case md file wants to emit args as a comment.  */
4850   save_argc = argc;
4851   save_argv = argv;
4852
4853   /* Initialize register usage now so switches may override.  */
4854   init_reg_sets ();
4855
4856   /* Register the language-independent parameters.  */
4857   add_params (lang_independent_params, LAST_PARAM);
4858
4859   /* Perform language-specific options initialization.  */
4860   (*lang_hooks.init_options) ();
4861
4862   /* Scan to see what optimization level has been specified.  That will
4863      determine the default value of many flags.  */
4864   for (i = 1; i < argc; i++)
4865     {
4866       if (!strcmp (argv[i], "-O"))
4867         {
4868           optimize = 1;
4869           optimize_size = 0;
4870         }
4871       else if (argv[i][0] == '-' && argv[i][1] == 'O')
4872         {
4873           /* Handle -Os, -O2, -O3, -O69, ...  */
4874           char *p = &argv[i][2];
4875
4876           if ((p[0] == 's') && (p[1] == 0))
4877             {
4878               optimize_size = 1;
4879
4880               /* Optimizing for size forces optimize to be 2.  */
4881               optimize = 2;
4882             }
4883           else
4884             {
4885               const int optimize_val = read_integral_parameter (p, p - 2, -1);
4886               if (optimize_val != -1)
4887                 {
4888                   optimize = optimize_val;
4889                   optimize_size = 0;
4890                 }
4891             }
4892         }
4893     }
4894
4895   if (!optimize)
4896     {
4897       flag_merge_constants = 0;
4898     }
4899
4900   if (optimize >= 1)
4901     {
4902       flag_defer_pop = 1;
4903       flag_thread_jumps = 1;
4904 #ifdef DELAY_SLOTS
4905       flag_delayed_branch = 1;
4906 #endif
4907 #ifdef CAN_DEBUG_WITHOUT_FP
4908       flag_omit_frame_pointer = 1;
4909 #endif
4910       flag_guess_branch_prob = 1;
4911       flag_cprop_registers = 1;
4912       flag_loop_optimize = 1;
4913       flag_crossjumping = 1;
4914       flag_if_conversion = 1;
4915       flag_if_conversion2 = 1;
4916     }
4917
4918   if (optimize >= 2)
4919     {
4920       flag_optimize_sibling_calls = 1;
4921       flag_cse_follow_jumps = 1;
4922       flag_cse_skip_blocks = 1;
4923       flag_gcse = 1;
4924       flag_expensive_optimizations = 1;
4925       flag_strength_reduce = 1;
4926       flag_rerun_cse_after_loop = 1;
4927       flag_rerun_loop_opt = 1;
4928       flag_caller_saves = 1;
4929       flag_force_mem = 1;
4930       flag_peephole2 = 1;
4931 #ifdef INSN_SCHEDULING
4932       flag_schedule_insns = 1;
4933       flag_schedule_insns_after_reload = 1;
4934 #endif
4935       flag_regmove = 1;
4936       flag_strict_aliasing = 1;
4937       flag_delete_null_pointer_checks = 1;
4938       flag_reorder_blocks = 1;
4939       flag_reorder_functions = 1;
4940     }
4941
4942   if (optimize >= 3)
4943     {
4944       flag_inline_functions = 1;
4945       flag_rename_registers = 1;
4946       flag_unswitch_loops = 1;
4947     }
4948
4949   if (optimize < 2 || optimize_size)
4950     {
4951       align_loops = 1;
4952       align_jumps = 1;
4953       align_labels = 1;
4954       align_functions = 1;
4955
4956       /* Don't reorder blocks when optimizing for size because extra
4957          jump insns may be created; also barrier may create extra padding.
4958
4959          More correctly we should have a block reordering mode that tried
4960          to minimize the combined size of all the jumps.  This would more
4961          or less automatically remove extra jumps, but would also try to
4962          use more short jumps instead of long jumps.  */
4963       flag_reorder_blocks = 0;
4964     }
4965
4966   /* Initialize whether `char' is signed.  */
4967   flag_signed_char = DEFAULT_SIGNED_CHAR;
4968 #ifdef DEFAULT_SHORT_ENUMS
4969   /* Initialize how much space enums occupy, by default.  */
4970   flag_short_enums = DEFAULT_SHORT_ENUMS;
4971 #endif
4972
4973   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
4974      modify it.  */
4975   target_flags = 0;
4976   set_target_switch ("");
4977
4978   /* Unwind tables are always present in an ABI-conformant IA-64
4979      object file, so the default should be ON.  */
4980 #ifdef IA64_UNWIND_INFO
4981   flag_unwind_tables = IA64_UNWIND_INFO;
4982 #endif
4983
4984 #ifdef OPTIMIZATION_OPTIONS
4985   /* Allow default optimizations to be specified on a per-machine basis.  */
4986   OPTIMIZATION_OPTIONS (optimize, optimize_size);
4987 #endif
4988
4989   /* Perform normal command line switch decoding.  */
4990   for (i = 1; i < argc;)
4991     {
4992       int lang_processed;
4993       int indep_processed;
4994
4995       /* Give the language a chance to decode the option for itself.  */
4996       lang_processed = (*lang_hooks.decode_option) (argc - i, argv + i);
4997
4998       if (lang_processed >= 0)
4999         /* Now see if the option also has a language independent meaning.
5000            Some options are both language specific and language independent,
5001            eg --help.  */
5002         indep_processed = independent_decode_option (argc - i, argv + i);
5003       else
5004         {
5005           lang_processed = -lang_processed;
5006           indep_processed = 0;
5007         }
5008
5009       if (lang_processed || indep_processed)
5010         i += MAX (lang_processed, indep_processed);
5011       else
5012         {
5013           const char *option = NULL;
5014           const char *lang = NULL;
5015           unsigned int j;
5016
5017           /* It is possible that the command line switch is not valid for the
5018              current language, but it is valid for another language.  In order
5019              to be compatible with previous versions of the compiler (which
5020              did not issue an error message in this case) we check for this
5021              possibility here.  If we do find a match, then if extra_warnings
5022              is set we generate a warning message, otherwise we will just
5023              ignore the option.  */
5024           for (j = 0; j < ARRAY_SIZE (documented_lang_options); j++)
5025             {
5026               option = documented_lang_options[j].option;
5027
5028               if (option == NULL)
5029                 lang = documented_lang_options[j].description;
5030               else if (! strncmp (argv[i], option, strlen (option)))
5031                 break;
5032             }
5033
5034           if (j != ARRAY_SIZE (documented_lang_options))
5035             {
5036               if (extra_warnings)
5037                 {
5038                   warning ("ignoring command line option '%s'", argv[i]);
5039                   if (lang)
5040                     warning
5041                       ("(it is valid for %s but not the selected language)",
5042                        lang);
5043                 }
5044             }
5045           else if (argv[i][0] == '-' && argv[i][1] == 'g')
5046             warning ("`%s': unknown or unsupported -g option", &argv[i][2]);
5047           else
5048             error ("unrecognized option `%s'", argv[i]);
5049
5050           i++;
5051         }
5052     }
5053
5054   if (flag_no_inline == 2)
5055     flag_no_inline = 0;
5056   else
5057     flag_really_no_inline = flag_no_inline;
5058
5059   /* Set flag_no_inline before the post_options () hook.  The C front
5060      ends use it to determine tree inlining defaults.  FIXME: such
5061      code should be lang-independent when all front ends use tree
5062      inlining, in which case it, and this condition, should be moved
5063      to the top of process_options() instead.  */
5064   if (optimize == 0)
5065     {
5066       /* Inlining does not work if not optimizing,
5067          so force it not to be done.  */
5068       flag_no_inline = 1;
5069       warn_inline = 0;
5070
5071       /* The c_decode_option function and decode_option hook set
5072          this to `2' if -Wall is used, so we can avoid giving out
5073          lots of errors for people who don't realize what -Wall does.  */
5074       if (warn_uninitialized == 1)
5075         warning ("-Wuninitialized is not supported without -O");
5076     }
5077
5078   if (flag_really_no_inline == 2)
5079     flag_really_no_inline = flag_no_inline;
5080 }
5081 \f
5082 /* Process the options that have been parsed.  */
5083 static void
5084 process_options ()
5085 {
5086 #ifdef OVERRIDE_OPTIONS
5087   /* Some machines may reject certain combinations of options.  */
5088   OVERRIDE_OPTIONS;
5089 #endif
5090
5091   /* Set up the align_*_log variables, defaulting them to 1 if they
5092      were still unset.  */
5093   if (align_loops <= 0) align_loops = 1;
5094   if (align_loops_max_skip > align_loops || !align_loops)
5095     align_loops_max_skip = align_loops - 1;
5096   align_loops_log = floor_log2 (align_loops * 2 - 1);
5097   if (align_jumps <= 0) align_jumps = 1;
5098   if (align_jumps_max_skip > align_jumps || !align_jumps)
5099     align_jumps_max_skip = align_jumps - 1;
5100   align_jumps_log = floor_log2 (align_jumps * 2 - 1);
5101   if (align_labels <= 0) align_labels = 1;
5102   align_labels_log = floor_log2 (align_labels * 2 - 1);
5103   if (align_labels_max_skip > align_labels || !align_labels)
5104     align_labels_max_skip = align_labels - 1;
5105   if (align_functions <= 0) align_functions = 1;
5106   align_functions_log = floor_log2 (align_functions * 2 - 1);
5107
5108   /* Unrolling all loops implies that standard loop unrolling must also
5109      be done.  */
5110   if (flag_unroll_all_loops)
5111     flag_unroll_loops = 1;
5112   /* Loop unrolling requires that strength_reduction be on also.  Silently
5113      turn on strength reduction here if it isn't already on.  Also, the loop
5114      unrolling code assumes that cse will be run after loop, so that must
5115      be turned on also.  */
5116   if (flag_unroll_loops)
5117     {
5118       flag_strength_reduce = 1;
5119       flag_rerun_cse_after_loop = 1;
5120     }
5121
5122   if (flag_non_call_exceptions)
5123     flag_asynchronous_unwind_tables = 1;
5124   if (flag_asynchronous_unwind_tables)
5125     flag_unwind_tables = 1;
5126
5127   /* Warn about options that are not supported on this machine.  */
5128 #ifndef INSN_SCHEDULING
5129   if (flag_schedule_insns || flag_schedule_insns_after_reload)
5130     warning ("instruction scheduling not supported on this target machine");
5131 #endif
5132 #ifndef DELAY_SLOTS
5133   if (flag_delayed_branch)
5134     warning ("this target machine does not have delayed branches");
5135 #endif
5136
5137   user_label_prefix = USER_LABEL_PREFIX;
5138   if (flag_leading_underscore != -1)
5139     {
5140       /* If the default prefix is more complicated than "" or "_",
5141          issue a warning and ignore this option.  */
5142       if (user_label_prefix[0] == 0 ||
5143           (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
5144         {
5145           user_label_prefix = flag_leading_underscore ? "_" : "";
5146         }
5147       else
5148         warning ("-f%sleading-underscore not supported on this target machine",
5149                  flag_leading_underscore ? "" : "no-");
5150     }
5151
5152   /* If we are in verbose mode, write out the version and maybe all the
5153      option flags in use.  */
5154   if (version_flag)
5155     {
5156       print_version (stderr, "");
5157       if (! quiet_flag)
5158         print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
5159     }
5160
5161   if (! quiet_flag)
5162     time_report = 1;
5163
5164   if (flag_syntax_only)
5165     {
5166       write_symbols = NO_DEBUG;
5167       profile_flag = 0;
5168     }
5169
5170   /* Now we know write_symbols, set up the debug hooks based on it.
5171      By default we do nothing for debug output.  */
5172 #if defined(DBX_DEBUGGING_INFO)
5173   if (write_symbols == DBX_DEBUG)
5174     debug_hooks = &dbx_debug_hooks;
5175 #endif
5176 #if defined(XCOFF_DEBUGGING_INFO)
5177   if (write_symbols == XCOFF_DEBUG)
5178     debug_hooks = &xcoff_debug_hooks;
5179 #endif
5180 #ifdef SDB_DEBUGGING_INFO
5181   if (write_symbols == SDB_DEBUG)
5182     debug_hooks = &sdb_debug_hooks;
5183 #endif
5184 #ifdef DWARF_DEBUGGING_INFO
5185   if (write_symbols == DWARF_DEBUG)
5186     debug_hooks = &dwarf_debug_hooks;
5187 #endif
5188 #ifdef DWARF2_DEBUGGING_INFO
5189   if (write_symbols == DWARF2_DEBUG)
5190     debug_hooks = &dwarf2_debug_hooks;
5191 #endif
5192 #ifdef VMS_DEBUGGING_INFO
5193   if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
5194     debug_hooks = &vmsdbg_debug_hooks;
5195 #endif
5196
5197   /* If auxiliary info generation is desired, open the output file.
5198      This goes in the same directory as the source file--unlike
5199      all the other output files.  */
5200   if (flag_gen_aux_info)
5201     {
5202       aux_info_file = fopen (aux_info_file_name, "w");
5203       if (aux_info_file == 0)
5204         fatal_io_error ("can't open %s", aux_info_file_name);
5205     }
5206
5207   if (! targetm.have_named_sections)
5208     {
5209       if (flag_function_sections)
5210         {
5211           warning ("-ffunction-sections not supported for this target");
5212           flag_function_sections = 0;
5213         }
5214       if (flag_data_sections)
5215         {
5216           warning ("-fdata-sections not supported for this target");
5217           flag_data_sections = 0;
5218         }
5219     }
5220
5221   if (flag_function_sections && profile_flag)
5222     {
5223       warning ("-ffunction-sections disabled; it makes profiling impossible");
5224       flag_function_sections = 0;
5225     }
5226
5227 #ifndef HAVE_prefetch
5228   if (flag_prefetch_loop_arrays)
5229     {
5230       warning ("-fprefetch-loop-arrays not supported for this target");
5231       flag_prefetch_loop_arrays = 0;
5232     }
5233 #else
5234   if (flag_prefetch_loop_arrays && !HAVE_prefetch)
5235     {
5236       warning ("-fprefetch-loop-arrays not supported for this target (try -march switches)");
5237       flag_prefetch_loop_arrays = 0;
5238     }
5239 #endif
5240
5241   /* This combination of options isn't handled for i386 targets and doesn't
5242      make much sense anyway, so don't allow it.  */
5243   if (flag_prefetch_loop_arrays && optimize_size)
5244     {
5245       warning ("-fprefetch-loop-arrays is not supported with -Os");
5246       flag_prefetch_loop_arrays = 0;
5247     }
5248
5249 #ifndef OBJECT_FORMAT_ELF
5250   if (flag_function_sections && write_symbols != NO_DEBUG)
5251     warning ("-ffunction-sections may affect debugging on some targets");
5252 #endif
5253
5254     /* The presence of IEEE signaling NaNs, implies all math can trap.  */
5255     if (flag_signaling_nans)
5256       flag_trapping_math = 1;
5257 }
5258 \f
5259 /* Initialize the compiler back end.  */
5260 static void
5261 backend_init ()
5262 {
5263   /* init_emit_once uses reg_raw_mode and therefore must be called
5264      after init_regs which initialized reg_raw_mode.  */
5265   init_regs ();
5266   init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
5267                   || debug_info_level == DINFO_LEVEL_VERBOSE
5268 #ifdef VMS_DEBUGGING_INFO
5269                     /* Enable line number info for traceback */
5270                     || debug_info_level > DINFO_LEVEL_NONE
5271 #endif
5272                     || flag_test_coverage
5273                     || warn_notreached);
5274   init_fake_stack_mems ();
5275   init_alias_once ();
5276   init_loop ();
5277   init_reload ();
5278   init_function_once ();
5279   init_varasm_once ();
5280
5281   /* The following initialization functions need to generate rtl, so
5282      provide a dummy function context for them.  */
5283   init_dummy_function_start ();
5284   init_expmed ();
5285   if (flag_caller_saves)
5286     init_caller_save ();
5287   expand_dummy_function_end ();
5288 }
5289 \f
5290 /* Language-dependent initialization.  Returns nonzero on success.  */
5291 static int
5292 lang_dependent_init (name)
5293      const char *name;
5294 {
5295   if (dump_base_name == 0)
5296     dump_base_name = name ? name : "gccdump";
5297   
5298   /* Front-end initialization.  This hook can assume that GC,
5299      identifier hashes etc. are set up, but debug initialization is
5300      not done yet.  This routine must return the original filename
5301      (e.g. foo.i -> foo.c) so can correctly initialize debug output.  */
5302   name = (*lang_hooks.init) (name);
5303   if (name == NULL)
5304     return 0;
5305
5306   /* Is this duplication necessary?  */
5307   name = ggc_strdup (name);
5308   main_input_filename = input_filename = name;
5309   init_asm_output (name);
5310
5311   /* These create various _DECL nodes, so need to be called after the
5312      front end is initialized.  */
5313   init_eh ();
5314   init_optabs ();
5315
5316   /* The following initialization functions need to generate rtl, so
5317      provide a dummy function context for them.  */
5318   init_dummy_function_start ();
5319   init_expr_once ();
5320   expand_dummy_function_end ();
5321
5322   /* Put an entry on the input file stack for the main input file.  */
5323   push_srcloc (input_filename, 0);
5324
5325   /* If dbx symbol table desired, initialize writing it and output the
5326      predefined types.  */
5327   timevar_push (TV_SYMOUT);
5328
5329 #ifdef DWARF2_UNWIND_INFO
5330   if (dwarf2out_do_frame ())
5331     dwarf2out_frame_init ();
5332 #endif
5333
5334   /* Now we have the correct original filename, we can initialize
5335      debug output.  */
5336   (*debug_hooks->init) (name);
5337
5338   timevar_pop (TV_SYMOUT);
5339
5340   return 1;
5341 }
5342 \f
5343 /* Clean up: close opened files, etc.  */
5344
5345 static void
5346 finalize ()
5347 {
5348   /* Close the dump files.  */
5349   if (flag_gen_aux_info)
5350     {
5351       fclose (aux_info_file);
5352       if (errorcount)
5353         unlink (aux_info_file_name);
5354     }
5355
5356   /* Close non-debugging input and output files.  Take special care to note
5357      whether fclose returns an error, since the pages might still be on the
5358      buffer chain while the file is open.  */
5359
5360   if (asm_out_file)
5361     {
5362       if (ferror (asm_out_file) != 0)
5363         fatal_io_error ("error writing to %s", asm_file_name);
5364       if (fclose (asm_out_file) != 0)
5365         fatal_io_error ("error closing %s", asm_file_name);
5366     }
5367
5368   /* Do whatever is necessary to finish printing the graphs.  */
5369   if (graph_dump_format != no_graph)
5370     {
5371       int i;
5372
5373       for (i = 0; i < (int) DFI_MAX; ++i)
5374         if (dump_file[i].initialized && dump_file[i].graph_dump_p)
5375           {
5376             char seq[16];
5377             char *suffix;
5378
5379             sprintf (seq, DUMPFILE_FORMAT, i);
5380             suffix = concat (seq, dump_file[i].extension, NULL);
5381             finish_graph_dump_file (dump_base_name, suffix);
5382             free (suffix);
5383           }
5384     }
5385
5386   if (mem_report)
5387     {
5388       ggc_print_statistics ();
5389       stringpool_statistics ();
5390       dump_tree_statistics ();
5391     }
5392
5393   /* Free up memory for the benefit of leak detectors.  */
5394   free_reg_info ();
5395
5396   /* Language-specific end of compilation actions.  */
5397   (*lang_hooks.finish) ();
5398 }
5399 \f
5400 /* Initialize the compiler, and compile the input file.  */
5401 static void
5402 do_compile ()
5403 {
5404   /* All command line options have been parsed; allow the front end to
5405      perform consistency checks, etc.  */
5406   bool no_backend = (*lang_hooks.post_options) ();
5407
5408   /* The bulk of command line switch processing.  */
5409   process_options ();
5410
5411   /* If an error has already occurred, give up.  */
5412   if (errorcount)
5413     return;
5414
5415   if (aux_base_name)
5416     /*NOP*/;
5417   else if (filename)
5418     {
5419       char *name = xstrdup (lbasename (filename));
5420       
5421       aux_base_name = name;
5422       strip_off_ending (name, strlen (name));
5423     }
5424   else
5425     aux_base_name = "gccaux";
5426
5427   /* We cannot start timing until after options are processed since that
5428      says if we run timers or not.  */
5429   init_timevar ();
5430   timevar_start (TV_TOTAL);
5431
5432   /* Set up the back-end if requested.  */
5433   if (!no_backend)
5434     backend_init ();
5435
5436   /* Language-dependent initialization.  Returns true on success.  */
5437   if (lang_dependent_init (filename))
5438     compile_file ();
5439
5440   finalize ();
5441
5442   /* Stop timing and print the times.  */
5443   timevar_stop (TV_TOTAL);
5444   timevar_print (stderr);
5445 }
5446 \f
5447 /* Entry point of cc1, cc1plus, jc1, f771, etc.
5448    Decode command args, then call compile_file.
5449    Exit code is FATAL_EXIT_CODE if can't open files or if there were
5450    any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
5451
5452    It is not safe to call this function more than once.  */
5453
5454 int
5455 toplev_main (argc, argv)
5456      int argc;
5457      char **argv;
5458 {
5459   /* Initialization of GCC's environment, and diagnostics.  */
5460   general_init (argv[0]);
5461
5462   /* Parse the options and do minimal processing; basically just
5463      enough to default flags appropriately.  */
5464   parse_options_and_default_flags (argc, argv);
5465
5466   /* Exit early if we can (e.g. -help).  */
5467   if (!exit_after_options)
5468     do_compile ();
5469
5470   if (errorcount || sorrycount)
5471     return (FATAL_EXIT_CODE);
5472
5473   return (SUCCESS_EXIT_CODE);
5474 }