OSDN Git Service

* expmed.c (expand_divmod): Undo sign extensions for unsigned operands
[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_bbro,
258   DFI_sched2,
259   DFI_stack,
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   { "bbro",     'B', 1, 0, 0 },
309   { "sched2",   'R', 1, 0, 0 },
310   { "stack",    'k', 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 /* When flag_schedule_insns_after_reload is set, use EBB scheduler.  */
749 int flag_sched2_use_superblocks = 0;
750
751 /* When flag_schedule_insns_after_reload is set, construct traces and EBB
752    scheduler.  */
753 int flag_sched2_use_traces = 0;
754
755 /* The following flags have effect only for scheduling before register
756    allocation:
757
758    flag_schedule_interblock means schedule insns across basic blocks.
759    flag_schedule_speculative means allow speculative motion of non-load insns.
760    flag_schedule_speculative_load means allow speculative motion of some
761    load insns.
762    flag_schedule_speculative_load_dangerous allows speculative motion of more
763    load insns.  */
764
765 int flag_schedule_interblock = 1;
766 int flag_schedule_speculative = 1;
767 int flag_schedule_speculative_load = 0;
768 int flag_schedule_speculative_load_dangerous = 0;
769
770 int flag_single_precision_constant;
771
772 /* flag_branch_on_count_reg means try to replace add-1,compare,branch tupple
773    by a cheaper branch on a count register.  */
774 int flag_branch_on_count_reg = 1;
775
776 /* -finhibit-size-directive inhibits output of .size for ELF.
777    This is used only for compiling crtstuff.c,
778    and it may be extended to other effects
779    needed for crtstuff.c on other systems.  */
780 int flag_inhibit_size_directive = 0;
781
782 /* -fverbose-asm causes extra commentary information to be produced in
783    the generated assembly code (to make it more readable).  This option
784    is generally only of use to those who actually need to read the
785    generated assembly code (perhaps while debugging the compiler itself).
786    -fno-verbose-asm, the default, causes the extra information
787    to be omitted and is useful when comparing two assembler files.  */
788
789 int flag_verbose_asm = 0;
790
791 /* -dA causes debug commentary information to be produced in
792    the generated assembly code (to make it more readable).  This option
793    is generally only of use to those who actually need to read the
794    generated assembly code (perhaps while debugging the compiler itself).
795    Currently, this switch is only used by dwarfout.c; however, it is intended
796    to be a catchall for printing debug information in the assembler file.  */
797
798 int flag_debug_asm = 0;
799
800 /* -dP causes the rtl to be emitted as a comment in assembly.  */
801
802 int flag_dump_rtl_in_asm = 0;
803
804 /* -fgnu-linker specifies use of the GNU linker for initializations.
805    (Or, more generally, a linker that handles initializations.)
806    -fno-gnu-linker says that collect2 will be used.  */
807 #ifdef USE_COLLECT2
808 int flag_gnu_linker = 0;
809 #else
810 int flag_gnu_linker = 1;
811 #endif
812
813 /* Nonzero means put zero initialized data in the bss section.  */
814 int flag_zero_initialized_in_bss = 1;
815
816 /* Enable SSA.  */
817 int flag_ssa = 0;
818
819 /* Enable ssa conditional constant propagation.  */
820 int flag_ssa_ccp = 0;
821
822 /* Enable ssa aggressive dead code elimination.  */
823 int flag_ssa_dce = 0;
824
825 /* Tag all structures with __attribute__(packed).  */
826 int flag_pack_struct = 0;
827
828 /* Emit code to check for stack overflow; also may cause large objects
829    to be allocated dynamically.  */
830 int flag_stack_check;
831
832 /* When non-NULL, indicates that whenever space is allocated on the
833    stack, the resulting stack pointer must not pass this
834    address---that is, for stacks that grow downward, the stack pointer
835    must always be greater than or equal to this address; for stacks
836    that grow upward, the stack pointer must be less than this address.
837    At present, the rtx may be either a REG or a SYMBOL_REF, although
838    the support provided depends on the backend.  */
839 rtx stack_limit_rtx;
840
841 /* 0 if pointer arguments may alias each other.  True in C.
842    1 if pointer arguments may not alias each other but may alias
843    global variables.
844    2 if pointer arguments may not alias each other and may not
845    alias global variables.  True in Fortran.
846    This defaults to 0 for C.  */
847 int flag_argument_noalias = 0;
848
849 /* Nonzero if we should do (language-dependent) alias analysis.
850    Typically, this analysis will assume that expressions of certain
851    types do not alias expressions of certain other types.  Only used
852    if alias analysis (in general) is enabled.  */
853 int flag_strict_aliasing = 0;
854
855 /* Instrument functions with calls at entry and exit, for profiling.  */
856 int flag_instrument_function_entry_exit = 0;
857
858 /* Nonzero means ignore `#ident' directives.  0 means handle them.
859    On SVR4 targets, it also controls whether or not to emit a
860    string identifying the compiler.  */
861
862 int flag_no_ident = 0;
863
864 /* This will perform a peephole pass before sched2.  */
865 int flag_peephole2 = 0;
866
867 /* This will try to guess branch probabilities.  */
868 int flag_guess_branch_prob = 0;
869
870 /* -fcheck-bounds causes gcc to generate array bounds checks.
871    For C, C++, ObjC: defaults to off.
872    For Java: defaults to on.
873    For Fortran: defaults to off.  */
874 int flag_bounds_check = 0;
875
876 /* This will attempt to merge constant section constants, if 1 only
877    string constants and constants from constant pool, if 2 also constant
878    variables.  */
879 int flag_merge_constants = 1;
880
881 /* If one, renumber instruction UIDs to reduce the number of
882    unused UIDs if there are a lot of instructions.  If greater than
883    one, unconditionally renumber instruction UIDs.  */
884 int flag_renumber_insns = 1;
885
886 /* If nonzero, use the graph coloring register allocator.  */
887 int flag_new_regalloc = 0;
888
889 /* Nonzero if we perform superblock formation.  */
890
891 int flag_tracer = 0;
892
893 /* Nonzero if we perform whole unit at a time compilation.  */
894
895 int flag_unit_at_a_time = 0;
896
897 /* Values of the -falign-* flags: how much to align labels in code.
898    0 means `use default', 1 means `don't align'.
899    For each variable, there is an _log variant which is the power
900    of two not less than the variable, for .align output.  */
901
902 int align_loops;
903 int align_loops_log;
904 int align_loops_max_skip;
905 int align_jumps;
906 int align_jumps_log;
907 int align_jumps_max_skip;
908 int align_labels;
909 int align_labels_log;
910 int align_labels_max_skip;
911 int align_functions;
912 int align_functions_log;
913
914 /* Like align_functions_log above, but used by front-ends to force the
915    minimum function alignment.  Zero means no alignment is forced.  */
916 int force_align_functions_log;
917
918 /* Table of supported debugging formats.  */
919 static const struct
920 {
921   const char *const arg;
922   /* Since PREFERRED_DEBUGGING_TYPE isn't necessarily a
923      constant expression, we use NO_DEBUG in its place.  */
924   const enum debug_info_type debug_type;
925   const int use_extensions_p;
926   const char *const description;
927 } *da,
928 debug_args[] =
929 {
930   { "",       NO_DEBUG, DEFAULT_GDB_EXTENSIONS,
931     N_("Generate debugging info in default format") },
932   { "gdb",    NO_DEBUG, 1, N_("Generate debugging info in default extended format") },
933 #ifdef DBX_DEBUGGING_INFO
934   { "stabs",  DBX_DEBUG, 0, N_("Generate STABS format debug info") },
935   { "stabs+", DBX_DEBUG, 1, N_("Generate extended STABS format debug info") },
936 #endif
937 #ifdef DWARF_DEBUGGING_INFO
938   { "dwarf",  DWARF_DEBUG, 0, N_("Generate DWARF-1 format debug info") },
939   { "dwarf+", DWARF_DEBUG, 1,
940     N_("Generate extended DWARF-1 format debug info") },
941 #endif
942 #ifdef DWARF2_DEBUGGING_INFO
943   { "dwarf-2", DWARF2_DEBUG, 0, N_("Generate DWARF-2 debug info") },
944 #endif
945 #ifdef XCOFF_DEBUGGING_INFO
946   { "xcoff",  XCOFF_DEBUG, 0, N_("Generate XCOFF format debug info") },
947   { "xcoff+", XCOFF_DEBUG, 1, N_("Generate extended XCOFF format debug info") },
948 #endif
949 #ifdef SDB_DEBUGGING_INFO
950   { "coff", SDB_DEBUG, 0, N_("Generate COFF format debug info") },
951 #endif
952 #ifdef VMS_DEBUGGING_INFO
953   { "vms", VMS_DEBUG, 0, N_("Generate VMS format debug info") },
954 #endif
955   { 0, 0, 0, 0 }
956 };
957
958 typedef struct
959 {
960   const char *const string;
961   int *const variable;
962   const int on_value;
963   const char *const description;
964 }
965 lang_independent_options;
966
967 int flag_trapv = 0;
968
969 /* Add or remove a leading underscore from user symbols.  */
970 int flag_leading_underscore = -1;
971
972 /* The user symbol prefix after having resolved same.  */
973 const char *user_label_prefix;
974
975 static const param_info lang_independent_params[] = {
976 #define DEFPARAM(ENUM, OPTION, HELP, DEFAULT) \
977   { OPTION, DEFAULT, HELP },
978 #include "params.def"
979 #undef DEFPARAM
980   { NULL, 0, NULL }
981 };
982
983 /* Table of language-independent -f options.
984    STRING is the option name.  VARIABLE is the address of the variable.
985    ON_VALUE is the value to store in VARIABLE
986     if `-fSTRING' is seen as an option.
987    (If `-fno-STRING' is seen as an option, the opposite value is stored.)  */
988
989 static const lang_independent_options f_options[] =
990 {
991   {"eliminate-dwarf2-dups", &flag_eliminate_dwarf2_dups, 1,
992    N_("Perform DWARF2 duplicate elimination") },
993   {"float-store", &flag_float_store, 1,
994    N_("Do not store floats in registers") },
995   {"defer-pop", &flag_defer_pop, 1,
996    N_("Defer popping functions args from stack until later") },
997   {"omit-frame-pointer", &flag_omit_frame_pointer, 1,
998    N_("When possible do not generate stack frames") },
999   {"optimize-sibling-calls", &flag_optimize_sibling_calls, 1,
1000    N_("Optimize sibling and tail recursive calls") },
1001   {"tracer", &flag_tracer, 1,
1002    N_("Perform superblock formation via tail duplication") },
1003   {"unit-at-a-time", &flag_unit_at_a_time, 1,
1004    N_("Compile whole compilation unit at a time") },
1005   {"cse-follow-jumps", &flag_cse_follow_jumps, 1,
1006    N_("When running CSE, follow jumps to their targets") },
1007   {"cse-skip-blocks", &flag_cse_skip_blocks, 1,
1008    N_("When running CSE, follow conditional jumps") },
1009   {"expensive-optimizations", &flag_expensive_optimizations, 1,
1010    N_("Perform a number of minor, expensive optimizations") },
1011   {"thread-jumps", &flag_thread_jumps, 1,
1012    N_("Perform jump threading optimizations") },
1013   {"strength-reduce", &flag_strength_reduce, 1,
1014    N_("Perform strength reduction optimizations") },
1015   {"unroll-loops", &flag_unroll_loops, 1,
1016    N_("Perform loop unrolling when iteration count is known") },
1017   {"unroll-all-loops", &flag_unroll_all_loops, 1,
1018    N_("Perform loop unrolling for all loops") },
1019   {"unswitch-loops", &flag_unswitch_loops, 1,
1020    N_("Perform loop unswitching") },
1021   {"prefetch-loop-arrays", &flag_prefetch_loop_arrays, 1,
1022    N_("Generate prefetch instructions, if available, for arrays in loops") },
1023   {"move-all-movables", &flag_move_all_movables, 1,
1024    N_("Force all loop invariant computations out of loops") },
1025   {"reduce-all-givs", &flag_reduce_all_givs, 1,
1026    N_("Strength reduce all loop general induction variables") },
1027   {"writable-strings", &flag_writable_strings, 1,
1028    N_("Store strings in writable data section") },
1029   {"peephole", &flag_no_peephole, 0,
1030    N_("Enable machine specific peephole optimizations") },
1031   {"force-mem", &flag_force_mem, 1,
1032    N_("Copy memory operands into registers before using") },
1033   {"force-addr", &flag_force_addr, 1,
1034    N_("Copy memory address constants into regs before using") },
1035   {"function-cse", &flag_no_function_cse, 0,
1036    N_("Allow function addresses to be held in registers") },
1037   {"inline-functions", &flag_inline_functions, 1,
1038    N_("Integrate simple functions into their callers") },
1039   {"keep-inline-functions", &flag_keep_inline_functions, 1,
1040    N_("Generate code for funcs even if they are fully inlined") },
1041   {"inline", &flag_no_inline, 0,
1042    N_("Pay attention to the 'inline' keyword") },
1043   {"keep-static-consts", &flag_keep_static_consts, 1,
1044    N_("Emit static const variables even if they are not used") },
1045   {"syntax-only", &flag_syntax_only, 1,
1046    N_("Check for syntax errors, then stop") },
1047   {"shared-data", &flag_shared_data, 1,
1048    N_("Mark data as shared rather than private") },
1049   {"caller-saves", &flag_caller_saves, 1,
1050    N_("Enable saving registers around function calls") },
1051   {"pcc-struct-return", &flag_pcc_struct_return, 1,
1052    N_("Return 'short' aggregates in memory, not registers") },
1053   {"reg-struct-return", &flag_pcc_struct_return, 0,
1054    N_("Return 'short' aggregates in registers") },
1055   {"delayed-branch", &flag_delayed_branch, 1,
1056    N_("Attempt to fill delay slots of branch instructions") },
1057   {"gcse", &flag_gcse, 1,
1058    N_("Perform the global common subexpression elimination") },
1059   {"gcse-lm", &flag_gcse_lm, 1,
1060    N_("Perform enhanced load motion during global subexpression elimination") },
1061   {"gcse-sm", &flag_gcse_sm, 1,
1062    N_("Perform store motion after global subexpression elimination") },
1063   {"loop-optimize", &flag_loop_optimize, 1,
1064    N_("Perform the loop optimizations") },
1065   {"crossjumping", &flag_crossjumping, 1,
1066    N_("Perform cross-jumping optimization") },
1067   {"if-conversion", &flag_if_conversion, 1,
1068    N_("Perform conversion of conditional jumps to branchless equivalents") },
1069   {"if-conversion2", &flag_if_conversion2, 1,
1070    N_("Perform conversion of conditional jumps to conditional execution") },
1071   {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1,
1072    N_("Run CSE pass after loop optimizations") },
1073   {"rerun-loop-opt", &flag_rerun_loop_opt, 1,
1074    N_("Run the loop optimizer twice") },
1075   {"delete-null-pointer-checks", &flag_delete_null_pointer_checks, 1,
1076    N_("Delete useless null pointer checks") },
1077   {"schedule-insns", &flag_schedule_insns, 1,
1078    N_("Reschedule instructions before register allocation") },
1079   {"schedule-insns2", &flag_schedule_insns_after_reload, 1,
1080    N_("Reschedule instructions after register allocation") },
1081   {"sched-interblock",&flag_schedule_interblock, 1,
1082    N_("Enable scheduling across basic blocks") },
1083   {"sched-spec",&flag_schedule_speculative, 1,
1084    N_("Allow speculative motion of non-loads") },
1085   {"sched-spec-load",&flag_schedule_speculative_load, 1,
1086    N_("Allow speculative motion of some loads") },
1087   {"sched-spec-load-dangerous",&flag_schedule_speculative_load_dangerous, 1,
1088    N_("Allow speculative motion of more loads") },
1089   {"sched2-use-superblocks", &flag_sched2_use_superblocks, 1,
1090    N_("If scheduling post reload, do superblock sheduling") },
1091   {"sched2-use-traces", &flag_sched2_use_traces, 1,
1092    N_("If scheduling post reload, do trace sheduling") },
1093   {"branch-count-reg",&flag_branch_on_count_reg, 1,
1094    N_("Replace add,compare,branch with branch on count reg") },
1095   {"pic", &flag_pic, 1,
1096    N_("Generate position independent code, if possible") },
1097   {"PIC", &flag_pic, 2, ""},
1098   {"exceptions", &flag_exceptions, 1,
1099    N_("Enable exception handling") },
1100   {"unwind-tables", &flag_unwind_tables, 1,
1101    N_("Just generate unwind tables for exception handling") },
1102   {"asynchronous-unwind-tables", &flag_asynchronous_unwind_tables, 1,
1103    N_("Generate unwind tables exact at each instruction boundary") },
1104   {"non-call-exceptions", &flag_non_call_exceptions, 1,
1105    N_("Support synchronous non-call exceptions") },
1106   {"profile-arcs", &profile_arc_flag, 1,
1107    N_("Insert arc based program profiling code") },
1108   {"test-coverage", &flag_test_coverage, 1,
1109    N_("Create data files needed by gcov") },
1110   {"branch-probabilities", &flag_branch_probabilities, 1,
1111    N_("Use profiling information for branch probabilities") },
1112   {"profile", &profile_flag, 1,
1113    N_("Enable basic program profiling code") },
1114   {"reorder-blocks", &flag_reorder_blocks, 1,
1115    N_("Reorder basic blocks to improve code placement") },
1116   {"reorder-functions", &flag_reorder_functions, 1,
1117    N_("Reorder functions to improve code placement") },
1118   {"rename-registers", &flag_rename_registers, 1,
1119    N_("Do the register renaming optimization pass") },
1120   {"cprop-registers", &flag_cprop_registers, 1,
1121    N_("Do the register copy-propagation optimization pass") },
1122   {"common", &flag_no_common, 0,
1123    N_("Do not put uninitialized globals in the common section") },
1124   {"inhibit-size-directive", &flag_inhibit_size_directive, 1,
1125    N_("Do not generate .size directives") },
1126   {"function-sections", &flag_function_sections, 1,
1127    N_("place each function into its own section") },
1128   {"data-sections", &flag_data_sections, 1,
1129    N_("place data items into their own section") },
1130   {"verbose-asm", &flag_verbose_asm, 1,
1131    N_("Add extra commentry to assembler output") },
1132   {"gnu-linker", &flag_gnu_linker, 1,
1133    N_("Output GNU ld formatted global initializers") },
1134   {"regmove", &flag_regmove, 1,
1135    N_("Enables a register move optimization") },
1136   {"optimize-register-move", &flag_regmove, 1,
1137    N_("Do the full regmove optimization pass") },
1138   {"pack-struct", &flag_pack_struct, 1,
1139    N_("Pack structure members together without holes") },
1140   {"stack-check", &flag_stack_check, 1,
1141    N_("Insert stack checking code into the program") },
1142   {"argument-alias", &flag_argument_noalias, 0,
1143    N_("Specify that arguments may alias each other & globals") },
1144   {"argument-noalias", &flag_argument_noalias, 1,
1145    N_("Assume arguments may alias globals but not each other") },
1146   {"argument-noalias-global", &flag_argument_noalias, 2,
1147    N_("Assume arguments do not alias each other or globals") },
1148   {"strict-aliasing", &flag_strict_aliasing, 1,
1149    N_("Assume strict aliasing rules apply") },
1150   {"align-loops", &align_loops, 0,
1151    N_("Align the start of loops") },
1152   {"align-jumps", &align_jumps, 0,
1153    N_("Align labels which are only reached by jumping") },
1154   {"align-labels", &align_labels, 0,
1155    N_("Align all labels") },
1156   {"align-functions", &align_functions, 0,
1157    N_("Align the start of functions") },
1158   {"merge-constants", &flag_merge_constants, 1,
1159    N_("Attempt to merge identical constants accross compilation units") },
1160   {"merge-all-constants", &flag_merge_constants, 2,
1161    N_("Attempt to merge identical constants and constant variables") },
1162   {"dump-unnumbered", &flag_dump_unnumbered, 1,
1163    N_("Suppress output of instruction numbers and line number notes in debugging dumps") },
1164   {"instrument-functions", &flag_instrument_function_entry_exit, 1,
1165    N_("Instrument function entry/exit with profiling calls") },
1166   {"zero-initialized-in-bss", &flag_zero_initialized_in_bss, 1,
1167    N_("Put zero initialized data in the bss section") },
1168   {"ssa", &flag_ssa, 1,
1169    N_("Enable SSA optimizations") },
1170   {"ssa-ccp", &flag_ssa_ccp, 1,
1171    N_("Enable SSA conditional constant propagation") },
1172   {"ssa-dce", &flag_ssa_dce, 1,
1173    N_("Enable aggressive SSA dead code elimination") },
1174   {"leading-underscore", &flag_leading_underscore, 1,
1175    N_("External symbols have a leading underscore") },
1176   {"ident", &flag_no_ident, 0,
1177    N_("Process #ident directives") },
1178   { "peephole2", &flag_peephole2, 1,
1179    N_("Enables an rtl peephole pass run before sched2") },
1180   {"finite-math-only", &flag_finite_math_only, 1,
1181    N_("Assume no NaNs or +-Infs are generated") },
1182   { "guess-branch-probability", &flag_guess_branch_prob, 1,
1183    N_("Enables guessing of branch probabilities") },
1184   {"math-errno", &flag_errno_math, 1,
1185    N_("Set errno after built-in math functions") },
1186   {"trapping-math", &flag_trapping_math, 1,
1187    N_("Floating-point operations can trap") },
1188   {"unsafe-math-optimizations", &flag_unsafe_math_optimizations, 1,
1189    N_("Allow math optimizations that may violate IEEE or ANSI standards") },
1190   {"signaling-nans", &flag_signaling_nans, 1,
1191    N_("Disable optimizations observable by IEEE signaling NaNs") },
1192   {"bounds-check", &flag_bounds_check, 1,
1193    N_("Generate code to check bounds before indexing arrays") },
1194   {"single-precision-constant", &flag_single_precision_constant, 1,
1195    N_("Convert floating point constant to single precision constant") },
1196   {"time-report", &time_report, 1,
1197    N_("Report time taken by each compiler pass at end of run") },
1198   {"mem-report", &mem_report, 1,
1199    N_("Report on permanent memory allocation at end of run") },
1200   { "trapv", &flag_trapv, 1,
1201    N_("Trap for signed overflow in addition / subtraction / multiplication") },
1202   { "new-ra", &flag_new_regalloc, 1,
1203    N_("Use graph coloring register allocation.") },
1204 };
1205
1206 /* Table of language-specific options.  */
1207
1208 static const struct lang_opt
1209 {
1210   const char *const option;
1211   const char *const description;
1212 }
1213 documented_lang_options[] =
1214 {
1215   /* In order not to overload the --help output, the convention
1216      used here is to only describe those options which are not
1217      enabled by default.  */
1218
1219   { "-ansi",
1220     N_("Compile just for ISO C90") },
1221   { "-std= ",
1222     N_("Determine language standard") },
1223
1224   { "-fsigned-bitfields", "" },
1225   { "-funsigned-bitfields",
1226     N_("Make bit-fields by unsigned by default") },
1227   { "-fno-signed-bitfields", "" },
1228   { "-fno-unsigned-bitfields","" },
1229   { "-fsigned-char",
1230     N_("Make 'char' be signed by default") },
1231   { "-funsigned-char",
1232     N_("Make 'char' be unsigned by default") },
1233   { "-fno-signed-char", "" },
1234   { "-fno-unsigned-char", "" },
1235
1236   { "-fasm", "" },
1237   { "-fno-asm",
1238     N_("Do not recognize the 'asm' keyword") },
1239   { "-fbuiltin", "" },
1240   { "-fno-builtin",
1241     N_("Do not recognize any built in functions") },
1242   { "-fhosted",
1243     N_("Assume normal C execution environment") },
1244   { "-fno-hosted", "" },
1245   { "-ffreestanding",
1246     N_("Assume that standard libraries & main might not exist") },
1247   { "-fno-freestanding", "" },
1248   { "-fcond-mismatch",
1249     N_("Allow different types as args of ? operator") },
1250   { "-fno-cond-mismatch", "" },
1251   { "-fdollars-in-identifiers",
1252     N_("Allow the use of $ inside identifiers") },
1253   { "-fno-dollars-in-identifiers", "" },
1254   { "-fpreprocessed", "" },
1255   { "-fno-preprocessed", "" },
1256   { "-fshort-double",
1257     N_("Use the same size for double as for float") },
1258   { "-fno-short-double", "" },
1259   { "-fshort-enums",
1260     N_("Use the smallest fitting integer to hold enums") },
1261   { "-fno-short-enums", "" },
1262   { "-fshort-wchar",
1263     N_("Override the underlying type for wchar_t to `unsigned short'") },
1264   { "-fno-short-wchar", "" },
1265
1266   { "-Wall",
1267     N_("Enable most warning messages") },
1268   { "-Wbad-function-cast",
1269     N_("Warn about casting functions to incompatible types") },
1270   { "-Wno-bad-function-cast", "" },
1271   { "-Wmissing-format-attribute",
1272     N_("Warn about functions which might be candidates for format attributes") },
1273   { "-Wno-missing-format-attribute", "" },
1274   { "-Wcast-qual",
1275     N_("Warn about casts which discard qualifiers") },
1276   { "-Wno-cast-qual", "" },
1277   { "-Wchar-subscripts",
1278     N_("Warn about subscripts whose type is 'char'") },
1279   { "-Wno-char-subscripts", "" },
1280   { "-Wcomment",
1281     N_("Warn if nested comments are detected") },
1282   { "-Wno-comment", "" },
1283   { "-Wcomments",
1284     N_("Warn if nested comments are detected") },
1285   { "-Wno-comments", "" },
1286   { "-Wconversion",
1287     N_("Warn about possibly confusing type conversions") },
1288   { "-Wno-conversion", "" },
1289   { "-Wdiv-by-zero", "" },
1290   { "-Wno-div-by-zero",
1291     N_("Do not warn about compile-time integer division by zero") },
1292   { "-Wfloat-equal",
1293     N_("Warn about testing equality of floating point numbers") },
1294   { "-Wno-float-equal", "" },
1295   { "-Wformat",
1296     N_("Warn about printf/scanf/strftime/strfmon format anomalies") },
1297   { "-Wno-format", "" },
1298   { "-Wformat-extra-args", "" },
1299   { "-Wno-format-extra-args",
1300     N_("Don't warn about too many arguments to format functions") },
1301   { "-Wformat-nonliteral",
1302     N_("Warn about non-string-literal format strings") },
1303   { "-Wno-format-nonliteral", "" },
1304   { "-Wformat-security",
1305     N_("Warn about possible security problems with format functions") },
1306   { "-Wno-format-security", "" },
1307   { "-Wformat-y2k", "" },
1308   { "-Wno-format-y2k",
1309     N_("Don't warn about strftime formats yielding 2 digit years") },
1310   { "-Wimplicit-function-declaration",
1311     N_("Warn about implicit function declarations") },
1312   { "-Wno-implicit-function-declaration", "" },
1313   { "-Werror-implicit-function-declaration", "" },
1314   { "-Wimplicit-int",
1315     N_("Warn when a declaration does not specify a type") },
1316   { "-Wno-implicit-int", "" },
1317   { "-Wimplicit", "" },
1318   { "-Wno-implicit", "" },
1319   { "-Wimport",
1320     N_("Warn about the use of the #import directive") },
1321   { "-Wno-import", "" },
1322   { "-Winvalid-pch",
1323     N_("Warn about PCH files that are found but not used") },
1324   { "-Wlong-long","" },
1325   { "-Wno-long-long",
1326     N_("Do not warn about using 'long long' when -pedantic") },
1327   { "-Wmain",
1328     N_("Warn about suspicious declarations of main") },
1329   { "-Wno-main", "" },
1330   { "-Wmissing-braces",
1331     N_("Warn about possibly missing braces around initializers") },
1332   { "-Wno-missing-braces", "" },
1333   { "-Wmissing-declarations",
1334     N_("Warn about global funcs without previous declarations") },
1335   { "-Wno-missing-declarations", "" },
1336   { "-Wmissing-prototypes",
1337     N_("Warn about global funcs without prototypes") },
1338   { "-Wno-missing-prototypes", "" },
1339   { "-Wmultichar",
1340     N_("Warn about use of multicharacter literals") },
1341   { "-Wno-multichar", "" },
1342   { "-Wnested-externs",
1343     N_("Warn about externs not at file scope level") },
1344   { "-Wno-nested-externs", "" },
1345   { "-Wparentheses",
1346     N_("Warn about possible missing parentheses") },
1347   { "-Wno-parentheses", "" },
1348   { "-Wpointer-arith",
1349     N_("Warn about function pointer arithmetic") },
1350   { "-Wno-pointer-arith", "" },
1351   { "-Wredundant-decls",
1352     N_("Warn about multiple declarations of the same object") },
1353   { "-Wno-redundant-decls", "" },
1354   { "-Wreturn-type",
1355     N_("Warn whenever a function's return-type defaults to int") },
1356   { "-Wno-return-type", "" },
1357   { "-Wsequence-point",
1358     N_("Warn about possible violations of sequence point rules") },
1359   { "-Wno-sequence-point", "" },
1360   { "-Wsign-compare",
1361     N_("Warn about signed/unsigned comparisons") },
1362   { "-Wno-sign-compare", "" },
1363   { "-Wstrict-prototypes",
1364     N_("Warn about non-prototyped function decls") },
1365   { "-Wno-strict-prototypes", "" },
1366   { "-Wtraditional",
1367     N_("Warn about constructs whose meanings change in ISO C") },
1368   { "-Wno-traditional", "" },
1369   { "-Wtrigraphs",
1370     N_("Warn when trigraphs are encountered") },
1371   { "-Wno-trigraphs", "" },
1372   { "-Wundef", "" },
1373   { "-Wno-undef", "" },
1374   { "-Wunknown-pragmas",
1375     N_("Warn about unrecognized pragmas") },
1376   { "-Wno-unknown-pragmas", "" },
1377   { "-Wwrite-strings",
1378     N_("Mark strings as 'const char *'") },
1379   { "-Wno-write-strings", "" },
1380
1381 #define DEFINE_LANG_NAME(NAME) { NULL, NAME },
1382
1383 #include "options.h"
1384
1385 };
1386
1387 /* Here is a table, controlled by the tm.h file, listing each -m switch
1388    and which bits in `target_switches' it should set or clear.
1389    If VALUE is positive, it is bits to set.
1390    If VALUE is negative, -VALUE is bits to clear.
1391    (The sign bit is not used so there is no confusion.)  */
1392
1393 static const struct
1394 {
1395   const char *const name;
1396   const int value;
1397   const char *const description;
1398 }
1399 target_switches[] = TARGET_SWITCHES;
1400
1401 /* This table is similar, but allows the switch to have a value.  */
1402
1403 #ifdef TARGET_OPTIONS
1404 static const struct
1405 {
1406   const char *const prefix;
1407   const char **const variable;
1408   const char *const description;
1409 }
1410 target_options[] = TARGET_OPTIONS;
1411 #endif
1412 \f
1413 /* Options controlling warnings.  */
1414
1415 /* Don't print warning messages.  -w.  */
1416
1417 int inhibit_warnings = 0;
1418
1419 /* Don't suppress warnings from system headers.  -Wsystem-headers.  */
1420
1421 int warn_system_headers = 0;
1422
1423 /* Print various extra warnings.  -W/-Wextra.  */
1424
1425 int extra_warnings = 0;
1426
1427 /* Treat warnings as errors.  -Werror.  */
1428
1429 int warnings_are_errors = 0;
1430
1431 /* Nonzero to warn about unused variables, functions et.al.  */
1432
1433 int warn_unused_function;
1434 int warn_unused_label;
1435 int warn_unused_parameter;
1436 int warn_unused_variable;
1437 int warn_unused_value;
1438
1439 /* Nonzero to warn about code which is never reached.  */
1440
1441 int warn_notreached;
1442
1443 /* Nonzero to warn about variables used before they are initialized.  */
1444
1445 int warn_uninitialized;
1446
1447 /* Nonzero means warn about all declarations which shadow others.  */
1448
1449 int warn_shadow;
1450
1451 /* Warn if a switch on an enum, that does not have a default case,
1452    fails to have a case for every enum value.  */
1453
1454 int warn_switch;
1455
1456 /* Warn if a switch does not have a default case.  */
1457
1458 int warn_switch_default;
1459
1460 /* Warn if a switch on an enum fails to have a case for every enum
1461    value (regardless of the presence or otherwise of a default case).  */
1462
1463 int warn_switch_enum;
1464
1465 /* Nonzero means warn about function definitions that default the return type
1466    or that use a null return and have a return-type other than void.  */
1467
1468 int warn_return_type;
1469
1470 /* Nonzero means warn about pointer casts that increase the required
1471    alignment of the target type (and might therefore lead to a crash
1472    due to a misaligned access).  */
1473
1474 int warn_cast_align;
1475
1476 /* Nonzero means warn about any objects definitions whose size is larger
1477    than N bytes.  Also want about function definitions whose returned
1478    values are larger than N bytes. The value N is in `larger_than_size'.  */
1479
1480 int warn_larger_than;
1481 HOST_WIDE_INT larger_than_size;
1482
1483 /* Nonzero means warn if inline function is too large.  */
1484
1485 int warn_inline;
1486
1487 /* Warn if a function returns an aggregate,
1488    since there are often incompatible calling conventions for doing this.  */
1489
1490 int warn_aggregate_return;
1491
1492 /* Warn if packed attribute on struct is unnecessary and inefficient.  */
1493
1494 int warn_packed;
1495
1496 /* Warn when gcc pads a structure to an alignment boundary.  */
1497
1498 int warn_padded;
1499
1500 /* Warn when an optimization pass is disabled.  */
1501
1502 int warn_disabled_optimization;
1503
1504 /* Warn about functions which might be candidates for attribute noreturn.  */
1505
1506 int warn_missing_noreturn;
1507
1508 /* Nonzero means warn about uses of __attribute__((deprecated))
1509    declarations.  */
1510
1511 int warn_deprecated_decl = 1;
1512
1513 /* Nonzero means warn about constructs which might not be
1514    strict-aliasing safe.  */
1515
1516 int warn_strict_aliasing;
1517
1518 /* Like f_options, but for -W.  */
1519
1520 static const lang_independent_options W_options[] =
1521 {
1522   {"unused-function", &warn_unused_function, 1,
1523    N_("Warn when a function is unused") },
1524   {"unused-label", &warn_unused_label, 1,
1525    N_("Warn when a label is unused") },
1526   {"unused-parameter", &warn_unused_parameter, 1,
1527    N_("Warn when a function parameter is unused") },
1528   {"unused-variable", &warn_unused_variable, 1,
1529    N_("Warn when a variable is unused") },
1530   {"unused-value", &warn_unused_value, 1,
1531    N_("Warn when an expression value is unused") },
1532   {"system-headers", &warn_system_headers, 1,
1533    N_("Do not suppress warnings from system headers") },
1534   {"error", &warnings_are_errors, 1,
1535    N_("Treat all warnings as errors") },
1536   {"shadow", &warn_shadow, 1,
1537    N_("Warn when one local variable shadows another") },
1538   {"switch", &warn_switch, 1,
1539    N_("Warn about enumerated switches, with no default, missing a case") },
1540   {"switch-default", &warn_switch_default, 1,
1541    N_("Warn about enumerated switches missing a default case") },
1542   {"switch-enum", &warn_switch_enum, 1,
1543    N_("Warn about all enumerated switches missing a specific case") },
1544   {"aggregate-return", &warn_aggregate_return, 1,
1545    N_("Warn about returning structures, unions or arrays") },
1546   {"cast-align", &warn_cast_align, 1,
1547    N_("Warn about pointer casts which increase alignment") },
1548   {"unreachable-code", &warn_notreached, 1,
1549    N_("Warn about code that will never be executed") },
1550   {"uninitialized", &warn_uninitialized, 1,
1551    N_("Warn about uninitialized automatic variables") },
1552   {"inline", &warn_inline, 1,
1553    N_("Warn when an inlined function cannot be inlined") },
1554   {"packed", &warn_packed, 1,
1555    N_("Warn when the packed attribute has no effect on struct layout") },
1556   {"padded", &warn_padded, 1,
1557    N_("Warn when padding is required to align struct members") },
1558   {"disabled-optimization", &warn_disabled_optimization, 1,
1559    N_("Warn when an optimization pass is disabled") },
1560   {"deprecated-declarations", &warn_deprecated_decl, 1,
1561    N_("Warn about uses of __attribute__((deprecated)) declarations") },
1562   {"extra", &extra_warnings, 1,
1563    N_("Print extra (possibly unwanted) warnings") },
1564   {"missing-noreturn", &warn_missing_noreturn, 1,
1565    N_("Warn about functions which might be candidates for attribute noreturn") },
1566   {"strict-aliasing", &warn_strict_aliasing, 1,
1567    N_ ("Warn about code which might break the strict aliasing rules") }
1568 };
1569
1570 void
1571 set_Wunused (setting)
1572      int setting;
1573 {
1574   warn_unused_function = setting;
1575   warn_unused_label = setting;
1576   /* Unused function parameter warnings are reported when either ``-W
1577      -Wunused'' or ``-Wunused-parameter'' is specified.  Differentiate
1578      -Wunused by setting WARN_UNUSED_PARAMETER to -1.  */
1579   if (!setting)
1580     warn_unused_parameter = 0;
1581   else if (!warn_unused_parameter)
1582     warn_unused_parameter = -1;
1583   warn_unused_variable = setting;
1584   warn_unused_value = setting;
1585 }
1586
1587 /* The following routines are useful in setting all the flags that
1588    -ffast-math and -fno-fast-math imply.  */
1589
1590 void
1591 set_fast_math_flags (set)
1592      int set;
1593 {
1594   flag_trapping_math = !set;
1595   flag_unsafe_math_optimizations = set;
1596   flag_finite_math_only = set;
1597   flag_errno_math = !set;
1598   if (set)
1599     flag_signaling_nans = 0;
1600 }
1601
1602 /* Return true iff flags are set as if -ffast-math.  */
1603 bool
1604 fast_math_flags_set_p ()
1605 {
1606   return (!flag_trapping_math
1607           && flag_unsafe_math_optimizations
1608           && flag_finite_math_only
1609           && !flag_errno_math);
1610 }
1611
1612 \f
1613 /* Output files for assembler code (real compiler output)
1614    and debugging dumps.  */
1615
1616 FILE *asm_out_file;
1617 FILE *aux_info_file;
1618 FILE *rtl_dump_file = NULL;
1619
1620 /* Decode the string P as an integral parameter.
1621    If the string is indeed an integer return its numeric value else
1622    issue an Invalid Option error for the option PNAME and return DEFVAL.
1623    If PNAME is zero just return DEFVAL, do not call error.  */
1624
1625 int
1626 read_integral_parameter (p, pname, defval)
1627      const char *p;
1628      const char *pname;
1629      const int  defval;
1630 {
1631   const char *endp = p;
1632
1633   while (*endp)
1634     {
1635       if (ISDIGIT (*endp))
1636         endp++;
1637       else
1638         break;
1639     }
1640
1641   if (*endp != 0)
1642     {
1643       if (pname != 0)
1644         error ("invalid option `%s'", pname);
1645       return defval;
1646     }
1647
1648   return atoi (p);
1649 }
1650 \f
1651 /* This calls abort and is used to avoid problems when abort is a macro.
1652    It is used when we need to pass the address of abort.  */
1653
1654 void
1655 do_abort ()
1656 {
1657   abort ();
1658 }
1659
1660 /* When `malloc.c' is compiled with `rcheck' defined,
1661    it calls this function to report clobberage.  */
1662
1663 void
1664 botch (s)
1665      const char *s ATTRIBUTE_UNUSED;
1666 {
1667   abort ();
1668 }
1669 \f
1670 /* Return the logarithm of X, base 2, considering X unsigned,
1671    if X is a power of 2.  Otherwise, returns -1.
1672
1673    This should be used via the `exact_log2' macro.  */
1674
1675 int
1676 exact_log2_wide (x)
1677      unsigned HOST_WIDE_INT x;
1678 {
1679   int log = 0;
1680   /* Test for 0 or a power of 2.  */
1681   if (x == 0 || x != (x & -x))
1682     return -1;
1683   while ((x >>= 1) != 0)
1684     log++;
1685   return log;
1686 }
1687
1688 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
1689    If X is 0, return -1.
1690
1691    This should be used via the floor_log2 macro.  */
1692
1693 int
1694 floor_log2_wide (x)
1695      unsigned HOST_WIDE_INT x;
1696 {
1697   int log = -1;
1698   while (x != 0)
1699     log++,
1700     x >>= 1;
1701   return log;
1702 }
1703
1704 /* Handler for fatal signals, such as SIGSEGV.  These are transformed
1705    into ICE messages, which is much more user friendly.  */
1706
1707 static void
1708 crash_signal (signo)
1709      int signo;
1710 {
1711   internal_error ("%s", strsignal (signo));
1712 }
1713
1714 /* Arrange to dump core on error.  (The regular error message is still
1715    printed first, except in the case of abort().)  */
1716
1717 static void
1718 setup_core_dumping ()
1719 {
1720 #ifdef SIGABRT
1721   signal (SIGABRT, SIG_DFL);
1722 #endif
1723 #if defined(HAVE_SETRLIMIT)
1724   {
1725     struct rlimit rlim;
1726     if (getrlimit (RLIMIT_CORE, &rlim) != 0)
1727       fatal_io_error ("getting core file size maximum limit");
1728     rlim.rlim_cur = rlim.rlim_max;
1729     if (setrlimit (RLIMIT_CORE, &rlim) != 0)
1730       fatal_io_error ("setting core file size limit to maximum");
1731   }
1732 #endif
1733   diagnostic_abort_on_error (global_dc);
1734 }
1735
1736
1737 /* Strip off a legitimate source ending from the input string NAME of
1738    length LEN.  Rather than having to know the names used by all of
1739    our front ends, we strip off an ending of a period followed by
1740    up to five characters.  (Java uses ".class".)  */
1741
1742 void
1743 strip_off_ending (name, len)
1744      char *name;
1745      int len;
1746 {
1747   int i;
1748   for (i = 2; i < 6 && len > i; i++)
1749     {
1750       if (name[len - i] == '.')
1751         {
1752           name[len - i] = '\0';
1753           break;
1754         }
1755     }
1756 }
1757
1758 /* Output a quoted string.  */
1759
1760 void
1761 output_quoted_string (asm_file, string)
1762      FILE *asm_file;
1763      const char *string;
1764 {
1765 #ifdef OUTPUT_QUOTED_STRING
1766   OUTPUT_QUOTED_STRING (asm_file, string);
1767 #else
1768   char c;
1769
1770   putc ('\"', asm_file);
1771   while ((c = *string++) != 0)
1772     {
1773       if (ISPRINT (c))
1774         {
1775           if (c == '\"' || c == '\\')
1776             putc ('\\', asm_file);
1777           putc (c, asm_file);
1778         }
1779       else
1780         fprintf (asm_file, "\\%03o", (unsigned char) c);
1781     }
1782   putc ('\"', asm_file);
1783 #endif
1784 }
1785
1786 /* Output NAME into FILE after having turned it into something
1787    usable as an identifier in a target's assembly file.  */
1788 void
1789 output_clean_symbol_name (file, name)
1790      FILE *file;
1791      const char *name;
1792 {
1793   /* Make a copy of NAME.  */
1794   char *id = xstrdup (name);
1795
1796   /* Make it look like a valid identifier for an assembler.  */
1797   clean_symbol_name (id);
1798
1799   fputs (id, file);
1800   free (id);
1801 }
1802
1803
1804 /* Output a file name in the form wanted by System V.  */
1805
1806 void
1807 output_file_directive (asm_file, input_name)
1808      FILE *asm_file;
1809      const char *input_name;
1810 {
1811   int len = strlen (input_name);
1812   const char *na = input_name + len;
1813
1814   /* NA gets INPUT_NAME sans directory names.  */
1815   while (na > input_name)
1816     {
1817       if (IS_DIR_SEPARATOR (na[-1]))
1818         break;
1819       na--;
1820     }
1821
1822 #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
1823   ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
1824 #else
1825 #ifdef ASM_OUTPUT_SOURCE_FILENAME
1826   ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
1827 #else
1828   fprintf (asm_file, "\t.file\t");
1829   output_quoted_string (asm_file, na);
1830   fputc ('\n', asm_file);
1831 #endif
1832 #endif
1833 }
1834 \f
1835 /* Routine to open a dump file.  Return true if the dump file is enabled.  */
1836
1837 static int
1838 open_dump_file (index, decl)
1839      enum dump_file_index index;
1840      tree decl;
1841 {
1842   char *dump_name;
1843   const char *open_arg;
1844   char seq[16];
1845
1846   if (! dump_file[index].enabled)
1847     return 0;
1848
1849   timevar_push (TV_DUMP);
1850   if (rtl_dump_file != NULL)
1851     fclose (rtl_dump_file);
1852
1853   sprintf (seq, DUMPFILE_FORMAT, index);
1854
1855   if (! dump_file[index].initialized)
1856     {
1857       /* If we've not initialized the files, do so now.  */
1858       if (graph_dump_format != no_graph
1859           && dump_file[index].graph_dump_p)
1860         {
1861           dump_name = concat (seq, dump_file[index].extension, NULL);
1862           clean_graph_dump_file (dump_base_name, dump_name);
1863           free (dump_name);
1864         }
1865       dump_file[index].initialized = 1;
1866       open_arg = "w";
1867     }
1868   else
1869     open_arg = "a";
1870
1871   dump_name = concat (dump_base_name, seq,
1872                       dump_file[index].extension, NULL);
1873
1874   rtl_dump_file = fopen (dump_name, open_arg);
1875   if (rtl_dump_file == NULL)
1876     fatal_io_error ("can't open %s", dump_name);
1877
1878   free (dump_name);
1879
1880   if (decl)
1881     fprintf (rtl_dump_file, "\n;; Function %s%s\n\n",
1882              (*lang_hooks.decl_printable_name) (decl, 2),
1883              cfun->function_frequency == FUNCTION_FREQUENCY_HOT
1884              ? " (hot)"
1885              : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
1886              ? " (unlikely executed)"
1887              : "");
1888
1889   timevar_pop (TV_DUMP);
1890   return 1;
1891 }
1892
1893 /* Routine to close a dump file.  */
1894
1895 static void
1896 close_dump_file (index, func, insns)
1897      enum dump_file_index index;
1898      void (*func) PARAMS ((FILE *, rtx));
1899      rtx insns;
1900 {
1901   if (! rtl_dump_file)
1902     return;
1903
1904   timevar_push (TV_DUMP);
1905   if (insns
1906       && graph_dump_format != no_graph
1907       && dump_file[index].graph_dump_p)
1908     {
1909       char seq[16];
1910       char *suffix;
1911
1912       sprintf (seq, DUMPFILE_FORMAT, index);
1913       suffix = concat (seq, dump_file[index].extension, NULL);
1914       print_rtl_graph_with_bb (dump_base_name, suffix, insns);
1915       free (suffix);
1916     }
1917
1918   if (func && insns)
1919     func (rtl_dump_file, insns);
1920
1921   fflush (rtl_dump_file);
1922   fclose (rtl_dump_file);
1923
1924   rtl_dump_file = NULL;
1925   timevar_pop (TV_DUMP);
1926 }
1927
1928 /* Do any final processing required for the declarations in VEC, of
1929    which there are LEN.  We write out inline functions and variables
1930    that have been deferred until this point, but which are required.
1931    Returns nonzero if anything was put out.  */
1932
1933 int
1934 wrapup_global_declarations (vec, len)
1935      tree *vec;
1936      int len;
1937 {
1938   tree decl;
1939   int i;
1940   int reconsider;
1941   int output_something = 0;
1942
1943   for (i = 0; i < len; i++)
1944     {
1945       decl = vec[i];
1946
1947       /* We're not deferring this any longer.  Assignment is
1948          conditional to avoid needlessly dirtying PCH pages. */
1949       if (DECL_DEFER_OUTPUT (decl) != 0)
1950         DECL_DEFER_OUTPUT (decl) = 0;
1951
1952       if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0)
1953         (*lang_hooks.finish_incomplete_decl) (decl);
1954     }
1955
1956   /* Now emit any global variables or functions that we have been
1957      putting off.  We need to loop in case one of the things emitted
1958      here references another one which comes earlier in the list.  */
1959   do
1960     {
1961       reconsider = 0;
1962       for (i = 0; i < len; i++)
1963         {
1964           decl = vec[i];
1965
1966           if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
1967             continue;
1968
1969           /* Don't write out static consts, unless we still need them.
1970
1971              We also keep static consts if not optimizing (for debugging),
1972              unless the user specified -fno-keep-static-consts.
1973              ??? They might be better written into the debug information.
1974              This is possible when using DWARF.
1975
1976              A language processor that wants static constants to be always
1977              written out (even if it is not used) is responsible for
1978              calling rest_of_decl_compilation itself.  E.g. the C front-end
1979              calls rest_of_decl_compilation from finish_decl.
1980              One motivation for this is that is conventional in some
1981              environments to write things like:
1982              static const char rcsid[] = "... version string ...";
1983              intending to force the string to be in the executable.
1984
1985              A language processor that would prefer to have unneeded
1986              static constants "optimized away" would just defer writing
1987              them out until here.  E.g. C++ does this, because static
1988              constants are often defined in header files.
1989
1990              ??? A tempting alternative (for both C and C++) would be
1991              to force a constant to be written if and only if it is
1992              defined in a main file, as opposed to an include file.  */
1993
1994           if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
1995             {
1996               bool needed = 1;
1997
1998               if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
1999                 /* needed */;
2000               else if (DECL_COMDAT (decl))
2001                 needed = 0;
2002               else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
2003                        && (optimize || !flag_keep_static_consts
2004                            || DECL_ARTIFICIAL (decl)))
2005                 needed = 0;
2006
2007               if (needed)
2008                 {
2009                   reconsider = 1;
2010                   rest_of_decl_compilation (decl, NULL, 1, 1);
2011                 }
2012             }
2013
2014           if (TREE_CODE (decl) == FUNCTION_DECL
2015               && DECL_INITIAL (decl) != 0
2016               && DECL_SAVED_INSNS (decl) != 0
2017               && (flag_keep_inline_functions
2018                   || (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
2019                   || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2020             {
2021               reconsider = 1;
2022               output_inline_function (decl);
2023             }
2024         }
2025
2026       if (reconsider)
2027         output_something = 1;
2028     }
2029   while (reconsider);
2030
2031   return output_something;
2032 }
2033
2034 /* Issue appropriate warnings for the global declarations in VEC (of
2035    which there are LEN).  Output debugging information for them.  */
2036
2037 void
2038 check_global_declarations (vec, len)
2039      tree *vec;
2040      int len;
2041 {
2042   tree decl;
2043   int i;
2044
2045   for (i = 0; i < len; i++)
2046     {
2047       decl = vec[i];
2048
2049       if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2050           && ! TREE_ASM_WRITTEN (decl))
2051         /* Cancel the RTL for this decl so that, if debugging info
2052            output for global variables is still to come,
2053            this one will be omitted.  */
2054         SET_DECL_RTL (decl, NULL_RTX);
2055
2056       /* Warn about any function
2057          declared static but not defined.
2058          We don't warn about variables,
2059          because many programs have static variables
2060          that exist only to get some text into the object file.  */
2061       if (TREE_CODE (decl) == FUNCTION_DECL
2062           && (warn_unused_function
2063               || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2064           && DECL_INITIAL (decl) == 0
2065           && DECL_EXTERNAL (decl)
2066           && ! DECL_ARTIFICIAL (decl)
2067           && ! TREE_PUBLIC (decl))
2068         {
2069           if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2070             pedwarn_with_decl (decl,
2071                                "`%s' used but never defined");
2072           else
2073             warning_with_decl (decl,
2074                                "`%s' declared `static' but never defined");
2075           /* This symbol is effectively an "extern" declaration now.  */
2076           TREE_PUBLIC (decl) = 1;
2077           assemble_external (decl);
2078         }
2079
2080       /* Warn about static fns or vars defined but not used.  */
2081       if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
2082            || (warn_unused_variable && TREE_CODE (decl) == VAR_DECL))
2083           && ! TREE_USED (decl)
2084           /* The TREE_USED bit for file-scope decls is kept in the identifier,
2085              to handle multiple external decls in different scopes.  */
2086           && ! TREE_USED (DECL_NAME (decl))
2087           && ! DECL_EXTERNAL (decl)
2088           && ! TREE_PUBLIC (decl)
2089           /* Global register variables must be declared to reserve them.  */
2090           && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
2091           /* Otherwise, ask the language.  */
2092           && (*lang_hooks.decls.warn_unused_global) (decl))
2093         warning_with_decl (decl, "`%s' defined but not used");
2094
2095       /* Avoid confusing the debug information machinery when there are
2096          errors.  */
2097       if (errorcount == 0 && sorrycount == 0)
2098         {
2099           timevar_push (TV_SYMOUT);
2100           (*debug_hooks->global_decl) (decl);
2101           timevar_pop (TV_SYMOUT);
2102         }
2103     }
2104 }
2105
2106 /* Save the current INPUT_FILENAME and LINENO on the top entry in the
2107    INPUT_FILE_STACK.  Push a new entry for FILE and LINE, and set the
2108    INPUT_FILENAME and LINENO accordingly.  */
2109
2110 void
2111 push_srcloc (file, line)
2112      const char *file;
2113      int line;
2114 {
2115   struct file_stack *fs;
2116
2117   if (input_file_stack)
2118     {
2119       input_file_stack->name = input_filename;
2120       input_file_stack->line = lineno;
2121     }
2122
2123   fs = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2124   fs->name = input_filename = file;
2125   fs->line = lineno = line;
2126   fs->next = input_file_stack;
2127   input_file_stack = fs;
2128   input_file_stack_tick++;
2129 }
2130
2131 /* Pop the top entry off the stack of presently open source files.
2132    Restore the INPUT_FILENAME and LINENO from the new topmost entry on
2133    the stack.  */
2134
2135 void
2136 pop_srcloc ()
2137 {
2138   struct file_stack *fs;
2139
2140   fs = input_file_stack;
2141   input_file_stack = fs->next;
2142   free (fs);
2143   input_file_stack_tick++;
2144   /* The initial source file is never popped.  */
2145   if (!input_file_stack)
2146     abort ();
2147   input_filename = input_file_stack->name;
2148   lineno = input_file_stack->line;
2149 }
2150
2151 /* Compile an entire translation unit.  Write a file of assembly
2152    output and various debugging dumps.  */
2153
2154 static void
2155 compile_file ()
2156 {
2157   /* Initialize yet another pass.  */
2158
2159   init_final (main_input_filename);
2160   init_branch_prob (aux_base_name);
2161
2162   timevar_push (TV_PARSE);
2163
2164   /* Call the parser, which parses the entire file (calling
2165      rest_of_compilation for each function).  */
2166   (*lang_hooks.parse_file) (set_yydebug);
2167
2168   /* In case there were missing block closers,
2169      get us back to the global binding level.  */
2170   (*lang_hooks.clear_binding_stack) ();
2171
2172   /* Compilation is now finished except for writing
2173      what's left of the symbol table output.  */
2174   timevar_pop (TV_PARSE);
2175
2176   if (flag_syntax_only)
2177     return;
2178
2179   (*lang_hooks.decls.final_write_globals)();
2180
2181     if (profile_arc_flag)
2182       /* This must occur after the loop to output deferred functions.
2183          Else the profiler initializer would not be emitted if all the
2184          functions in this compilation unit were deferred.  */
2185       create_profiler ();
2186
2187   /* Write out any pending weak symbol declarations.  */
2188
2189   weak_finish ();
2190
2191   /* Do dbx symbols.  */
2192   timevar_push (TV_SYMOUT);
2193
2194 #ifdef DWARF2_UNWIND_INFO
2195   if (dwarf2out_do_frame ())
2196     dwarf2out_frame_finish ();
2197 #endif
2198
2199   (*debug_hooks->finish) (main_input_filename);
2200   timevar_pop (TV_SYMOUT);
2201
2202   /* Output some stuff at end of file if nec.  */
2203
2204   dw2_output_indirect_constants ();
2205
2206   if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
2207     {
2208       timevar_push (TV_DUMP);
2209       open_dump_file (DFI_bp, NULL);
2210
2211       end_branch_prob ();
2212
2213       close_dump_file (DFI_bp, NULL, NULL_RTX);
2214       timevar_pop (TV_DUMP);
2215     }
2216
2217 #ifdef ASM_FILE_END
2218   ASM_FILE_END (asm_out_file);
2219 #endif
2220
2221   /* Attach a special .ident directive to the end of the file to identify
2222      the version of GCC which compiled this code.  The format of the .ident
2223      string is patterned after the ones produced by native SVR4 compilers.  */
2224 #ifdef IDENT_ASM_OP
2225   if (!flag_no_ident)
2226     fprintf (asm_out_file, "%s\"GCC: (GNU) %s\"\n",
2227              IDENT_ASM_OP, version_string);
2228 #endif
2229
2230   if (optimize > 0 && open_dump_file (DFI_combine, NULL))
2231     {
2232       timevar_push (TV_DUMP);
2233       dump_combine_total_stats (rtl_dump_file);
2234       close_dump_file (DFI_combine, NULL, NULL_RTX);
2235       timevar_pop (TV_DUMP);
2236     }
2237 }
2238 \f
2239 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
2240    and TYPE_DECL nodes.
2241
2242    This does nothing for local (non-static) variables, unless the
2243    variable is a register variable with an ASMSPEC.  In that case, or
2244    if the variable is not an automatic, it sets up the RTL and
2245    outputs any assembler code (label definition, storage allocation
2246    and initialization).
2247
2248    DECL is the declaration.  If ASMSPEC is nonzero, it specifies
2249    the assembler symbol name to be used.  TOP_LEVEL is nonzero
2250    if this declaration is not within a function.  */
2251
2252 void
2253 rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2254      tree decl;
2255      const char *asmspec;
2256      int top_level;
2257      int at_end;
2258 {
2259   /* We deferred calling assemble_alias so that we could collect
2260      other attributes such as visibility.  Emit the alias now.  */
2261   {
2262     tree alias;
2263     alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
2264     if (alias)
2265       {
2266         alias = TREE_VALUE (TREE_VALUE (alias));
2267         alias = get_identifier (TREE_STRING_POINTER (alias));
2268         assemble_alias (decl, alias);
2269       }
2270   }
2271
2272   /* Forward declarations for nested functions are not "external",
2273      but we need to treat them as if they were.  */
2274   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
2275       || TREE_CODE (decl) == FUNCTION_DECL)
2276     {
2277       timevar_push (TV_VARCONST);
2278
2279       if (asmspec)
2280         make_decl_rtl (decl, asmspec);
2281
2282       /* Don't output anything when a tentative file-scope definition
2283          is seen.  But at end of compilation, do output code for them.  */
2284       if (at_end || !DECL_DEFER_OUTPUT (decl))
2285         assemble_variable (decl, top_level, at_end, 0);
2286
2287 #ifdef ASM_FINISH_DECLARE_OBJECT
2288       if (decl == last_assemble_variable_decl)
2289         {
2290           ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2291                                      top_level, at_end);
2292         }
2293 #endif
2294
2295       timevar_pop (TV_VARCONST);
2296     }
2297   else if (DECL_REGISTER (decl) && asmspec != 0)
2298     {
2299       if (decode_reg_name (asmspec) >= 0)
2300         {
2301           SET_DECL_RTL (decl, NULL_RTX);
2302           make_decl_rtl (decl, asmspec);
2303         }
2304       else
2305         {
2306           error ("invalid register name `%s' for register variable", asmspec);
2307           DECL_REGISTER (decl) = 0;
2308           if (!top_level)
2309             expand_decl (decl);
2310         }
2311     }
2312 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2313   else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2314            && TREE_CODE (decl) == TYPE_DECL)
2315     {
2316       timevar_push (TV_SYMOUT);
2317       dbxout_symbol (decl, 0);
2318       timevar_pop (TV_SYMOUT);
2319     }
2320 #endif
2321 #ifdef SDB_DEBUGGING_INFO
2322   else if (write_symbols == SDB_DEBUG && top_level
2323            && TREE_CODE (decl) == TYPE_DECL)
2324     {
2325       timevar_push (TV_SYMOUT);
2326       sdbout_symbol (decl, 0);
2327       timevar_pop (TV_SYMOUT);
2328     }
2329 #endif
2330 #ifdef DWARF2_DEBUGGING_INFO
2331   else if ((write_symbols == DWARF2_DEBUG
2332            || write_symbols == VMS_AND_DWARF2_DEBUG)
2333            && top_level
2334            && TREE_CODE (decl) == TYPE_DECL)
2335     {
2336       timevar_push (TV_SYMOUT);
2337       dwarf2out_decl (decl);
2338       timevar_pop (TV_SYMOUT);
2339     }
2340 #endif
2341 }
2342
2343 /* Called after finishing a record, union or enumeral type.  */
2344
2345 void
2346 rest_of_type_compilation (type, toplev)
2347 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)      \
2348     || defined (SDB_DEBUGGING_INFO) || defined (DWARF2_DEBUGGING_INFO)
2349      tree type;
2350      int toplev;
2351 #else
2352      tree type ATTRIBUTE_UNUSED;
2353      int toplev ATTRIBUTE_UNUSED;
2354 #endif
2355 {
2356   /* Avoid confusing the debug information machinery when there are
2357      errors.  */
2358   if (errorcount != 0 || sorrycount != 0)
2359     return;
2360
2361   timevar_push (TV_SYMOUT);
2362 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2363   if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2364     dbxout_symbol (TYPE_STUB_DECL (type), !toplev);
2365 #endif
2366 #ifdef SDB_DEBUGGING_INFO
2367   if (write_symbols == SDB_DEBUG)
2368     sdbout_symbol (TYPE_STUB_DECL (type), !toplev);
2369 #endif
2370 #ifdef DWARF2_DEBUGGING_INFO
2371   if ((write_symbols == DWARF2_DEBUG
2372        || write_symbols == VMS_AND_DWARF2_DEBUG)
2373       && toplev)
2374     dwarf2out_decl (TYPE_STUB_DECL (type));
2375 #endif
2376   timevar_pop (TV_SYMOUT);
2377 }
2378
2379 /* This is called from finish_function (within langhooks.parse_file)
2380    after each top-level definition is parsed.
2381    It is supposed to compile that function or variable
2382    and output the assembler code for it.
2383    After we return, the tree storage is freed.  */
2384
2385 void
2386 rest_of_compilation (decl)
2387      tree decl;
2388 {
2389   rtx insns;
2390   int tem;
2391   int failure = 0;
2392   int rebuild_label_notes_after_reload;
2393
2394   timevar_push (TV_REST_OF_COMPILATION);
2395
2396   /* Now that we're out of the frontend, we shouldn't have any more
2397      CONCATs anywhere.  */
2398   generating_concat_p = 0;
2399
2400   /* When processing delayed functions, prepare_function_start() won't
2401      have been run to re-initialize it.  */
2402   cse_not_expected = ! optimize;
2403
2404   /* First, make sure that NOTE_BLOCK is set correctly for each
2405      NOTE_INSN_BLOCK_BEG/NOTE_INSN_BLOCK_END note.  */
2406   if (!cfun->x_whole_function_mode_p)
2407     identify_blocks ();
2408
2409   /* In function-at-a-time mode, we do not attempt to keep the BLOCK
2410      tree in sensible shape.  So, we just recalculate it here.  */
2411   if (cfun->x_whole_function_mode_p)
2412     reorder_blocks ();
2413
2414   init_flow ();
2415
2416   /* If we are reconsidering an inline function
2417      at the end of compilation, skip the stuff for making it inline.  */
2418
2419   if (DECL_SAVED_INSNS (decl) == 0)
2420     {
2421       int inlinable = 0;
2422       tree parent;
2423       const char *lose;
2424
2425       /* If this is nested inside an inlined external function, pretend
2426          it was only declared.  Since we cannot inline such functions,
2427          generating code for this one is not only not necessary but will
2428          confuse some debugging output writers.  */
2429       for (parent = DECL_CONTEXT (current_function_decl);
2430            parent != NULL_TREE;
2431            parent = get_containing_scope (parent))
2432         if (TREE_CODE (parent) == FUNCTION_DECL
2433             && DECL_INLINE (parent) && DECL_EXTERNAL (parent))
2434           {
2435             DECL_INITIAL (decl) = 0;
2436             goto exit_rest_of_compilation;
2437           }
2438         else if (TYPE_P (parent))
2439           /* A function in a local class should be treated normally.  */
2440           break;
2441
2442       /* If requested, consider whether to make this function inline.  */
2443       if ((DECL_INLINE (decl) && !flag_no_inline)
2444           || flag_inline_functions)
2445         {
2446           timevar_push (TV_INTEGRATION);
2447           lose = function_cannot_inline_p (decl);
2448           timevar_pop (TV_INTEGRATION);
2449           if (lose || ! optimize)
2450             {
2451               if (warn_inline && DECL_INLINE (decl))
2452                 warning_with_decl (decl, lose);
2453               DECL_ABSTRACT_ORIGIN (decl) = 0;
2454               /* Don't really compile an extern inline function.
2455                  If we can't make it inline, pretend
2456                  it was only declared.  */
2457               if (DECL_EXTERNAL (decl))
2458                 {
2459                   DECL_INITIAL (decl) = 0;
2460                   goto exit_rest_of_compilation;
2461                 }
2462             }
2463           else
2464             /* ??? Note that this has the effect of making it look
2465                  like "inline" was specified for a function if we choose
2466                  to inline it.  This isn't quite right, but it's
2467                  probably not worth the trouble to fix.  */
2468             inlinable = DECL_INLINE (decl) = 1;
2469         }
2470
2471       insns = get_insns ();
2472
2473       /* Dump the rtl code if we are dumping rtl.  */
2474
2475       if (open_dump_file (DFI_rtl, decl))
2476         {
2477           if (DECL_SAVED_INSNS (decl))
2478             fprintf (rtl_dump_file, ";; (integrable)\n\n");
2479           close_dump_file (DFI_rtl, print_rtl, insns);
2480         }
2481
2482       /* Convert from NOTE_INSN_EH_REGION style notes, and do other
2483          sorts of eh initialization.  Delay this until after the
2484          initial rtl dump so that we can see the original nesting.  */
2485       convert_from_eh_region_ranges ();
2486
2487       /* If function is inline, and we don't yet know whether to
2488          compile it by itself, defer decision till end of compilation.
2489          wrapup_global_declarations will (indirectly) call
2490          rest_of_compilation again for those functions that need to
2491          be output.  Also defer those functions that we are supposed
2492          to defer.  */
2493
2494       if (inlinable
2495           || (DECL_INLINE (decl)
2496               && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
2497                    && ! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
2498                    && ! flag_keep_inline_functions)
2499                   || DECL_EXTERNAL (decl))))
2500         DECL_DEFER_OUTPUT (decl) = 1;
2501
2502       if (DECL_INLINE (decl))
2503         /* DWARF wants separate debugging info for abstract and
2504            concrete instances of all inline functions, including those
2505            declared inline but not inlined, and those inlined even
2506            though they weren't declared inline.  Conveniently, that's
2507            what DECL_INLINE means at this point.  */
2508         (*debug_hooks->deferred_inline_function) (decl);
2509
2510       if (DECL_DEFER_OUTPUT (decl))
2511         {
2512           /* If -Wreturn-type, we have to do a bit of compilation.  We just
2513              want to call cleanup the cfg to figure out whether or not we can
2514              fall off the end of the function; we do the minimum amount of
2515              work necessary to make that safe.  */
2516           if (warn_return_type)
2517             {
2518               int saved_optimize = optimize;
2519
2520               optimize = 0;
2521               rebuild_jump_labels (insns);
2522               find_exception_handler_labels ();
2523               find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2524               cleanup_cfg (CLEANUP_PRE_SIBCALL | CLEANUP_PRE_LOOP);
2525               optimize = saved_optimize;
2526
2527               /* CFG is no longer maintained up-to-date.  */
2528               free_bb_for_insn ();
2529             }
2530
2531           set_nothrow_function_flags ();
2532           if (current_function_nothrow)
2533             /* Now we know that this can't throw; set the flag for the benefit
2534                of other functions later in this translation unit.  */
2535             TREE_NOTHROW (current_function_decl) = 1;
2536
2537           timevar_push (TV_INTEGRATION);
2538           save_for_inline (decl);
2539           timevar_pop (TV_INTEGRATION);
2540           DECL_SAVED_INSNS (decl)->inlinable = inlinable;
2541           goto exit_rest_of_compilation;
2542         }
2543
2544       /* If specified extern inline but we aren't inlining it, we are
2545          done.  This goes for anything that gets here with DECL_EXTERNAL
2546          set, not just things with DECL_INLINE.  */
2547       if (DECL_EXTERNAL (decl))
2548         goto exit_rest_of_compilation;
2549     }
2550
2551   /* If we're emitting a nested function, make sure its parent gets
2552      emitted as well.  Doing otherwise confuses debug info.  */
2553   {
2554     tree parent;
2555     for (parent = DECL_CONTEXT (current_function_decl);
2556          parent != NULL_TREE;
2557          parent = get_containing_scope (parent))
2558       if (TREE_CODE (parent) == FUNCTION_DECL)
2559         TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
2560   }
2561
2562   /* We are now committed to emitting code for this function.  Do any
2563      preparation, such as emitting abstract debug info for the inline
2564      before it gets mangled by optimization.  */
2565   if (DECL_INLINE (decl))
2566     (*debug_hooks->outlining_inline_function) (decl);
2567
2568   /* Remove any notes we don't need.  That will make iterating
2569      over the instruction sequence faster, and allow the garbage
2570      collector to reclaim the memory used by the notes.  */
2571   remove_unnecessary_notes ();
2572   reorder_blocks ();
2573
2574   ggc_collect ();
2575
2576   /* Initialize some variables used by the optimizers.  */
2577   init_function_for_compilation ();
2578
2579   if (! DECL_DEFER_OUTPUT (decl))
2580     TREE_ASM_WRITTEN (decl) = 1;
2581
2582   /* Now that integrate will no longer see our rtl, we need not
2583      distinguish between the return value of this function and the
2584      return value of called functions.  Also, we can remove all SETs
2585      of subregs of hard registers; they are only here because of
2586      integrate.  Also, we can now initialize pseudos intended to
2587      carry magic hard reg data throughout the function.  */
2588   rtx_equal_function_value_matters = 0;
2589   purge_hard_subreg_sets (get_insns ());
2590
2591   /* Early return if there were errors.  We can run afoul of our
2592      consistency checks, and there's not really much point in fixing them.
2593      Don't return yet if -Wreturn-type; we need to do cleanup_cfg.  */
2594   if (((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
2595       || errorcount || sorrycount)
2596     goto exit_rest_of_compilation;
2597
2598   timevar_push (TV_JUMP);
2599   open_dump_file (DFI_sibling, decl);
2600   insns = get_insns ();
2601   rebuild_jump_labels (insns);
2602   find_exception_handler_labels ();
2603   find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2604
2605   delete_unreachable_blocks ();
2606
2607   /* Turn NOTE_INSN_PREDICTIONs into branch predictions.  */
2608   if (flag_guess_branch_prob)
2609     {
2610       timevar_push (TV_BRANCH_PROB);
2611       note_prediction_to_br_prob ();
2612       timevar_pop (TV_BRANCH_PROB);
2613     }
2614
2615   /* We may have potential sibling or tail recursion sites.  Select one
2616      (of possibly multiple) methods of performing the call.  */
2617   if (flag_optimize_sibling_calls)
2618     {
2619       rtx insn;
2620       optimize_sibling_and_tail_recursive_calls ();
2621
2622       /* Recompute the CFG as sibling optimization clobbers it randomly.  */
2623       free_bb_for_insn ();
2624       find_exception_handler_labels ();
2625       rebuild_jump_labels (insns);
2626       find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2627
2628       /* There is pass ordering problem - we must lower NOTE_INSN_PREDICTION
2629          notes before simplifying cfg and we must do lowering after sibcall
2630          that unhides parts of RTL chain and cleans up the CFG.
2631
2632          Until sibcall is replaced by tree-level optimizer, lets just
2633          sweep away the NOTE_INSN_PREDICTION notes that leaked out.  */
2634       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2635         if (GET_CODE (insn) == NOTE
2636             && NOTE_LINE_NUMBER (insn) == NOTE_INSN_PREDICTION)
2637           delete_insn (insn);
2638     }
2639   close_dump_file (DFI_sibling, print_rtl, get_insns ());
2640   timevar_pop (TV_JUMP);
2641
2642   scope_to_insns_initialize ();
2643   /* Complete generation of exception handling code.  */
2644   if (doing_eh (0))
2645     {
2646       timevar_push (TV_JUMP);
2647       open_dump_file (DFI_eh, decl);
2648
2649       finish_eh_generation ();
2650
2651       close_dump_file (DFI_eh, print_rtl, get_insns ());
2652       timevar_pop (TV_JUMP);
2653     }
2654
2655   /* Delay emitting hard_reg_initial_value sets until after EH landing pad
2656      generation, which might create new sets.  */
2657   emit_initial_value_sets ();
2658
2659 #ifdef FINALIZE_PIC
2660   /* If we are doing position-independent code generation, now
2661      is the time to output special prologues and epilogues.
2662      We do not want to do this earlier, because it just clutters
2663      up inline functions with meaningless insns.  */
2664   if (flag_pic)
2665     FINALIZE_PIC;
2666 #endif
2667
2668   insns = get_insns ();
2669
2670   /* Copy any shared structure that should not be shared.  */
2671   unshare_all_rtl (current_function_decl, insns);
2672
2673 #ifdef SETJMP_VIA_SAVE_AREA
2674   /* This must be performed before virtual register instantiation.
2675      Please be aware the everything in the compiler that can look
2676      at the RTL up to this point must understand that REG_SAVE_AREA
2677      is just like a use of the REG contained inside.  */
2678   if (current_function_calls_alloca)
2679     optimize_save_area_alloca (insns);
2680 #endif
2681
2682   /* Instantiate all virtual registers.  */
2683   instantiate_virtual_regs (current_function_decl, insns);
2684
2685   open_dump_file (DFI_jump, decl);
2686
2687   /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
2688      are initialized and to compute whether control can drop off the end
2689      of the function.  */
2690
2691   timevar_push (TV_JUMP);
2692   /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB.  Do this
2693      before jump optimization switches branch directions.  */
2694   if (flag_guess_branch_prob)
2695     expected_value_to_br_prob ();
2696
2697   reg_scan (insns, max_reg_num (), 0);
2698   rebuild_jump_labels (insns);
2699   find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2700   delete_trivially_dead_insns (insns, max_reg_num ());
2701   if (rtl_dump_file)
2702     dump_flow_info (rtl_dump_file);
2703   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_PRE_LOOP
2704                | (flag_thread_jumps ? CLEANUP_THREADING : 0));
2705
2706   if (optimize)
2707     {
2708       free_bb_for_insn ();
2709       copy_loop_headers (insns);
2710       find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2711     }
2712   purge_line_number_notes (insns);
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   if (optimize > 0)
3512     {
3513       timevar_push (TV_REORDER_BLOCKS);
3514       open_dump_file (DFI_bbro, decl);
3515
3516       /* Last attempt to optimize CFG, as scheduling, peepholing and insn
3517          splitting possibly introduced more crossjumping opportunities. */
3518       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE
3519                    | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
3520
3521       if (flag_sched2_use_traces && flag_schedule_insns_after_reload)
3522         tracer ();
3523       if (flag_reorder_blocks)
3524         reorder_basic_blocks ();
3525       if (flag_reorder_blocks
3526           || (flag_sched2_use_traces && flag_schedule_insns_after_reload))
3527           cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
3528
3529       close_dump_file (DFI_bbro, print_rtl_with_bb, insns);
3530       timevar_pop (TV_REORDER_BLOCKS);
3531     }
3532
3533 #ifdef INSN_SCHEDULING
3534   if (optimize > 0 && flag_schedule_insns_after_reload)
3535     {
3536       timevar_push (TV_SCHED2);
3537       open_dump_file (DFI_sched2, decl);
3538
3539       /* Do control and data sched analysis again,
3540          and write some more of the results to dump file.  */
3541
3542       split_all_insns (1);
3543
3544       if (flag_sched2_use_superblocks || flag_sched2_use_traces)
3545         {
3546           schedule_ebbs (rtl_dump_file);
3547           /* No liveness updating code yet, but it should be easy to do.
3548              reg-stack recompute the liveness when needed for now.  */
3549           count_or_remove_death_notes (NULL, 1);
3550           cleanup_cfg (CLEANUP_EXPENSIVE);
3551         }
3552       else
3553         schedule_insns (rtl_dump_file);
3554
3555       close_dump_file (DFI_sched2, print_rtl_with_bb, insns);
3556       timevar_pop (TV_SCHED2);
3557
3558       ggc_collect ();
3559     }
3560 #endif
3561
3562 #ifdef LEAF_REGISTERS
3563   current_function_uses_only_leaf_regs
3564     = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
3565 #endif
3566
3567 #ifdef STACK_REGS
3568   timevar_push (TV_REG_STACK);
3569   open_dump_file (DFI_stack, decl);
3570
3571   if (reg_to_stack (insns, rtl_dump_file) && optimize)
3572     {
3573       if (cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK
3574                        | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0))
3575           && flag_reorder_blocks)
3576         {
3577           reorder_basic_blocks ();
3578           cleanup_cfg (CLEANUP_EXPENSIVE);
3579         }
3580     }
3581
3582   close_dump_file (DFI_stack, print_rtl_with_bb, insns);
3583   timevar_pop (TV_REG_STACK);
3584
3585   ggc_collect ();
3586 #endif
3587   if (optimize > 0)
3588     {
3589       timevar_push (TV_REORDER_BLOCKS);
3590       open_dump_file (DFI_bbro, decl);
3591
3592       /* Last attempt to optimize CFG, as scheduling, peepholing and insn
3593          splitting possibly introduced more crossjumping opportunities.
3594          Except that we can't actually run crossjumping without running
3595          another DCE pass, which we can't do after reg-stack.  */
3596       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK
3597                    | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
3598       if (flag_reorder_blocks)
3599         {
3600           reorder_basic_blocks ();
3601           cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK);
3602         }
3603
3604       close_dump_file (DFI_bbro, print_rtl_with_bb, insns);
3605       timevar_pop (TV_REORDER_BLOCKS);
3606     }
3607   compute_alignments ();
3608
3609   /* CFG is no longer maintained up-to-date.  */
3610   free_bb_for_insn ();
3611
3612   /* If a machine dependent reorganization is needed, call it.  */
3613 #ifdef MACHINE_DEPENDENT_REORG
3614   timevar_push (TV_MACH_DEP);
3615   open_dump_file (DFI_mach, decl);
3616
3617   MACHINE_DEPENDENT_REORG (insns);
3618
3619   close_dump_file (DFI_mach, print_rtl, insns);
3620   timevar_pop (TV_MACH_DEP);
3621
3622   ggc_collect ();
3623 #endif
3624
3625   purge_line_number_notes (insns);
3626   cleanup_barriers ();
3627
3628   /* If a scheduling pass for delayed branches is to be done,
3629      call the scheduling code.  */
3630
3631 #ifdef DELAY_SLOTS
3632   if (optimize > 0 && flag_delayed_branch)
3633     {
3634       timevar_push (TV_DBR_SCHED);
3635       open_dump_file (DFI_dbr, decl);
3636
3637       dbr_schedule (insns, rtl_dump_file);
3638
3639       close_dump_file (DFI_dbr, print_rtl, insns);
3640       timevar_pop (TV_DBR_SCHED);
3641
3642       ggc_collect ();
3643     }
3644 #endif
3645
3646 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
3647   timevar_push (TV_SHORTEN_BRANCH);
3648   split_all_insns_noflow ();
3649   timevar_pop (TV_SHORTEN_BRANCH);
3650 #endif
3651
3652   convert_to_eh_region_ranges ();
3653
3654   /* Shorten branches.  */
3655   timevar_push (TV_SHORTEN_BRANCH);
3656   shorten_branches (get_insns ());
3657   timevar_pop (TV_SHORTEN_BRANCH);
3658
3659   set_nothrow_function_flags ();
3660   if (current_function_nothrow)
3661     /* Now we know that this can't throw; set the flag for the benefit
3662        of other functions later in this translation unit.  */
3663     TREE_NOTHROW (current_function_decl) = 1;
3664
3665   /* Now turn the rtl into assembler code.  */
3666
3667   timevar_push (TV_FINAL);
3668   {
3669     rtx x;
3670     const char *fnname;
3671
3672     /* Get the function's name, as described by its RTL.  This may be
3673        different from the DECL_NAME name used in the source file.  */
3674
3675     x = DECL_RTL (decl);
3676     if (GET_CODE (x) != MEM)
3677       abort ();
3678     x = XEXP (x, 0);
3679     if (GET_CODE (x) != SYMBOL_REF)
3680       abort ();
3681     fnname = XSTR (x, 0);
3682
3683     assemble_start_function (decl, fnname);
3684     final_start_function (insns, asm_out_file, optimize);
3685     final (insns, asm_out_file, optimize, 0);
3686     final_end_function ();
3687
3688 #ifdef IA64_UNWIND_INFO
3689     /* ??? The IA-64 ".handlerdata" directive must be issued before
3690        the ".endp" directive that closes the procedure descriptor.  */
3691     output_function_exception_table ();
3692 #endif
3693
3694     assemble_end_function (decl, fnname);
3695
3696 #ifndef IA64_UNWIND_INFO
3697     /* Otherwise, it feels unclean to switch sections in the middle.  */
3698     output_function_exception_table ();
3699 #endif
3700
3701     if (! quiet_flag)
3702       fflush (asm_out_file);
3703
3704     /* Release all memory allocated by flow.  */
3705     free_basic_block_vars (0);
3706
3707     /* Release all memory held by regsets now.  */
3708     regset_release_memory ();
3709   }
3710   timevar_pop (TV_FINAL);
3711
3712   ggc_collect ();
3713
3714   /* Write DBX symbols if requested.  */
3715
3716   /* Note that for those inline functions where we don't initially
3717      know for certain that we will be generating an out-of-line copy,
3718      the first invocation of this routine (rest_of_compilation) will
3719      skip over this code by doing a `goto exit_rest_of_compilation;'.
3720      Later on, wrapup_global_declarations will (indirectly) call
3721      rest_of_compilation again for those inline functions that need
3722      to have out-of-line copies generated.  During that call, we
3723      *will* be routed past here.  */
3724
3725   timevar_push (TV_SYMOUT);
3726   (*debug_hooks->function_decl) (decl);
3727   timevar_pop (TV_SYMOUT);
3728
3729  exit_rest_of_compilation:
3730
3731   /* In case the function was not output,
3732      don't leave any temporary anonymous types
3733      queued up for sdb output.  */
3734 #ifdef SDB_DEBUGGING_INFO
3735   if (write_symbols == SDB_DEBUG)
3736     sdbout_types (NULL_TREE);
3737 #endif
3738
3739   reload_completed = 0;
3740   flow2_completed = 0;
3741   no_new_pseudos = 0;
3742
3743   timevar_push (TV_FINAL);
3744
3745   /* Clear out the insn_length contents now that they are no
3746      longer valid.  */
3747   init_insn_lengths ();
3748
3749   /* Show no temporary slots allocated.  */
3750   init_temp_slots ();
3751
3752   free_basic_block_vars (0);
3753   free_bb_for_insn ();
3754
3755   timevar_pop (TV_FINAL);
3756
3757   /* Make sure volatile mem refs aren't considered valid operands for
3758      arithmetic insns.  We must call this here if this is a nested inline
3759      function, since the above code leaves us in the init_recog state
3760      (from final.c), and the function context push/pop code does not
3761      save/restore volatile_ok.
3762
3763      ??? Maybe it isn't necessary for expand_start_function to call this
3764      anymore if we do it here?  */
3765
3766   init_recog_no_volatile ();
3767
3768   /* We're done with this function.  Free up memory if we can.  */
3769   free_after_parsing (cfun);
3770   if (! DECL_DEFER_OUTPUT (decl))
3771     {
3772       free_after_compilation (cfun);
3773
3774       /* Clear integrate.c's pointer to the cfun structure we just
3775          destroyed.  */
3776       DECL_SAVED_INSNS (decl) = 0;
3777     }
3778   cfun = 0;
3779
3780   ggc_collect ();
3781
3782   timevar_pop (TV_REST_OF_COMPILATION);
3783 }
3784 \f
3785 static void
3786 display_help ()
3787 {
3788   int undoc;
3789   unsigned long i;
3790   const char *lang;
3791
3792   printf (_("  -ffixed-<register>      Mark <register> as being unavailable to the compiler\n"));
3793   printf (_("  -fcall-used-<register>  Mark <register> as being corrupted by function calls\n"));
3794   printf (_("  -fcall-saved-<register> Mark <register> as being preserved across functions\n"));
3795   printf (_("  -finline-limit=<number> Limits the size of inlined functions to <number>\n"));
3796   printf (_("  -fmessage-length=<number> Limits diagnostics messages lengths to <number> characters per line.  0 suppresses line-wrapping\n"));
3797   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"));
3798   printf (_("  -ftls-model=[global-dynamic | local-dynamic | initial-exec | local-exec] Indicates the default thread-local storage code generation model\n"));
3799
3800   for (i = ARRAY_SIZE (f_options); i--;)
3801     {
3802       const char *description = f_options[i].description;
3803
3804       if (description != NULL && *description != 0)
3805         printf ("  -f%-21s %s\n",
3806                 f_options[i].string, _(description));
3807     }
3808
3809   printf (_("  -O[number]              Set optimization level to [number]\n"));
3810   printf (_("  -Os                     Optimize for space rather than speed\n"));
3811   for (i = LAST_PARAM; i--;)
3812     {
3813       const char *description = compiler_params[i].help;
3814       const int length = 21 - strlen (compiler_params[i].option);
3815
3816       if (description != NULL && *description != 0)
3817         printf ("  --param %s=<value>%.*s%s\n",
3818                 compiler_params[i].option,
3819                 length > 0 ? length : 1, "                     ",
3820                 _(description));
3821     }
3822   printf (_("  -pedantic               Issue warnings needed by strict compliance to ISO C\n"));
3823   printf (_("  -pedantic-errors        Like -pedantic except that errors are produced\n"));
3824   printf (_("  -w                      Suppress warnings\n"));
3825
3826   for (i = ARRAY_SIZE (W_options); i--;)
3827     {
3828       const char *description = W_options[i].description;
3829
3830       if (description != NULL && *description != 0)
3831         printf ("  -W%-21s %s\n",
3832                 W_options[i].string, _(description));
3833     }
3834
3835   printf (_("  -Wunused                Enable unused warnings\n"));
3836   printf (_("  -Wlarger-than-<number>  Warn if an object is larger than <number> bytes\n"));
3837   printf (_("  -p                      Enable function profiling\n"));
3838   printf (_("  -o <file>               Place output into <file> \n"));
3839   printf (_("\
3840   -G <number>             Put global and static data smaller than <number>\n\
3841                           bytes into a special section (on some targets)\n"));
3842
3843   for (i = ARRAY_SIZE (debug_args); i--;)
3844     {
3845       if (debug_args[i].description != NULL)
3846         printf ("  -g%-21s %s\n",
3847                 debug_args[i].arg, _(debug_args[i].description));
3848     }
3849
3850   printf (_("  -aux-info <file>        Emit declaration info into <file>\n"));
3851   printf (_("  -quiet                  Do not display functions compiled or elapsed time\n"));
3852   printf (_("  -version                Display the compiler's version\n"));
3853   printf (_("  -d[letters]             Enable dumps from specific passes of the compiler\n"));
3854   printf (_("  -dumpbase <file>        Base name to be used for dumps from specific passes\n"));
3855 #if defined INSN_SCHEDULING
3856   printf (_("  -fsched-verbose=<number> Set the verbosity level of the scheduler\n"));
3857 #endif
3858   printf (_("  --help                  Display this information\n"));
3859
3860   undoc = 0;
3861   lang  = "language";
3862
3863   /* Display descriptions of language specific options.
3864      If there is no description, note that there is an undocumented option.
3865      If the description is empty, do not display anything.  (This allows
3866      options to be deliberately undocumented, for whatever reason).
3867      If the option string is missing, then this is a marker, indicating
3868      that the description string is in fact the name of a language, whose
3869      language specific options are to follow.  */
3870
3871   if (ARRAY_SIZE (documented_lang_options) > 1)
3872     {
3873       printf (_("\nLanguage specific options:\n"));
3874
3875       for (i = 0; i < ARRAY_SIZE (documented_lang_options); i++)
3876         {
3877           const char *description = documented_lang_options[i].description;
3878           const char *option      = documented_lang_options[i].option;
3879
3880           if (description == NULL)
3881             {
3882               undoc = 1;
3883
3884               if (extra_warnings)
3885                 printf (_("  %-23.23s [undocumented]\n"), option);
3886             }
3887           else if (*description == 0)
3888             continue;
3889           else if (option == NULL)
3890             {
3891               if (undoc)
3892                 printf
3893                   (_("\nThere are undocumented %s specific options as well.\n"),
3894                         lang);
3895               undoc = 0;
3896
3897               printf (_("\n Options for %s:\n"), description);
3898
3899               lang = description;
3900             }
3901           else
3902             printf ("  %-23.23s %s\n", option, _(description));
3903         }
3904     }
3905
3906   if (undoc)
3907     printf (_("\nThere are undocumented %s specific options as well.\n"),
3908             lang);
3909
3910   display_target_options ();
3911 }
3912
3913 static void
3914 display_target_options ()
3915 {
3916   int undoc, i;
3917   static bool displayed = false;
3918
3919   /* Avoid double printing for --help --target-help.  */
3920   if (displayed)
3921     return;
3922   displayed = true;
3923
3924   if (ARRAY_SIZE (target_switches) > 1
3925 #ifdef TARGET_OPTIONS
3926       || ARRAY_SIZE (target_options) > 1
3927 #endif
3928       )
3929     {
3930       int doc = 0;
3931
3932       undoc = 0;
3933
3934       printf (_("\nTarget specific options:\n"));
3935
3936       for (i = ARRAY_SIZE (target_switches); i--;)
3937         {
3938           const char *option      = target_switches[i].name;
3939           const char *description = target_switches[i].description;
3940
3941           if (option == NULL || *option == 0)
3942             continue;
3943           else if (description == NULL)
3944             {
3945               undoc = 1;
3946
3947               if (extra_warnings)
3948                 printf (_("  -m%-23.23s [undocumented]\n"), option);
3949             }
3950           else if (*description != 0)
3951             doc += printf ("  -m%-23.23s %s\n", option, _(description));
3952         }
3953
3954 #ifdef TARGET_OPTIONS
3955       for (i = ARRAY_SIZE (target_options); i--;)
3956         {
3957           const char *option      = target_options[i].prefix;
3958           const char *description = target_options[i].description;
3959
3960           if (option == NULL || *option == 0)
3961             continue;
3962           else if (description == NULL)
3963             {
3964               undoc = 1;
3965
3966               if (extra_warnings)
3967                 printf (_("  -m%-23.23s [undocumented]\n"), option);
3968             }
3969           else if (*description != 0)
3970             doc += printf ("  -m%-23.23s %s\n", option, _(description));
3971         }
3972 #endif
3973       if (undoc)
3974         {
3975           if (doc)
3976             printf (_("\nThere are undocumented target specific options as well.\n"));
3977           else
3978             printf (_("  They exist, but they are not documented.\n"));
3979         }
3980     }
3981 }
3982 \f
3983 /* Parse a -d... command line switch.  */
3984
3985 static void
3986 decode_d_option (arg)
3987      const char *arg;
3988 {
3989   int i, c, matched;
3990
3991   while (*arg)
3992     switch (c = *arg++)
3993       {
3994       case 'a':
3995         for (i = 0; i < (int) DFI_MAX; ++i)
3996           dump_file[i].enabled = 1;
3997         break;
3998       case 'A':
3999         flag_debug_asm = 1;
4000         break;
4001       case 'p':
4002         flag_print_asm_name = 1;
4003         break;
4004       case 'P':
4005         flag_dump_rtl_in_asm = 1;
4006         flag_print_asm_name = 1;
4007         break;
4008       case 'v':
4009         graph_dump_format = vcg;
4010         break;
4011       case 'x':
4012         rtl_dump_and_exit = 1;
4013         break;
4014       case 'y':
4015         set_yydebug = 1;
4016         break;
4017       case 'D': /* These are handled by the preprocessor.  */
4018       case 'I':
4019         break;
4020       case 'H':
4021         setup_core_dumping();
4022         break;
4023
4024       default:
4025         matched = 0;
4026         for (i = 0; i < (int) DFI_MAX; ++i)
4027           if (c == dump_file[i].debug_switch)
4028             {
4029               dump_file[i].enabled = 1;
4030               matched = 1;
4031             }
4032
4033         if (! matched)
4034           warning ("unrecognized gcc debugging option: %c", c);
4035         break;
4036       }
4037 }
4038
4039 /* Parse a -f... command line switch.  ARG is the value after the -f.
4040    It is safe to access 'ARG - 2' to generate the full switch name.
4041    Return the number of strings consumed.  */
4042
4043 static int
4044 decode_f_option (arg)
4045      const char *arg;
4046 {
4047   int j;
4048   const char *option_value = NULL;
4049
4050   /* Search for the option in the table of binary f options.  */
4051   for (j = ARRAY_SIZE (f_options); j--;)
4052     {
4053       if (!strcmp (arg, f_options[j].string))
4054         {
4055           *f_options[j].variable = f_options[j].on_value;
4056           return 1;
4057         }
4058
4059       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4060           && ! strcmp (arg + 3, f_options[j].string))
4061         {
4062           *f_options[j].variable = ! f_options[j].on_value;
4063           return 1;
4064         }
4065     }
4066
4067   if (!strcmp (arg, "fast-math"))
4068     set_fast_math_flags (1);
4069   else if (!strcmp (arg, "no-fast-math"))
4070     set_fast_math_flags (0);
4071   else if ((option_value = skip_leading_substring (arg, "inline-limit-"))
4072            || (option_value = skip_leading_substring (arg, "inline-limit=")))
4073     {
4074       int val =
4075         read_integral_parameter (option_value, arg - 2,
4076                                  MAX_INLINE_INSNS);
4077       set_param_value ("max-inline-insns", val);
4078     }
4079   else if ((option_value = skip_leading_substring (arg, "tls-model=")))
4080     {
4081       if (strcmp (option_value, "global-dynamic") == 0)
4082         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
4083       else if (strcmp (option_value, "local-dynamic") == 0)
4084         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
4085       else if (strcmp (option_value, "initial-exec") == 0)
4086         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
4087       else if (strcmp (option_value, "local-exec") == 0)
4088         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
4089       else
4090         warning ("`%s': unknown tls-model option", arg - 2);
4091     }
4092 #ifdef INSN_SCHEDULING
4093   else if ((option_value = skip_leading_substring (arg, "sched-verbose=")))
4094     fix_sched_param ("verbose", option_value);
4095 #endif
4096   else if ((option_value = skip_leading_substring (arg, "fixed-")))
4097     fix_register (option_value, 1, 1);
4098   else if ((option_value = skip_leading_substring (arg, "call-used-")))
4099     fix_register (option_value, 0, 1);
4100   else if ((option_value = skip_leading_substring (arg, "call-saved-")))
4101     fix_register (option_value, 0, 0);
4102   else if ((option_value = skip_leading_substring (arg, "align-loops=")))
4103     align_loops = read_integral_parameter (option_value, arg - 2, align_loops);
4104   else if ((option_value = skip_leading_substring (arg, "align-functions=")))
4105     align_functions
4106       = read_integral_parameter (option_value, arg - 2, align_functions);
4107   else if ((option_value = skip_leading_substring (arg, "align-jumps=")))
4108     align_jumps = read_integral_parameter (option_value, arg - 2, align_jumps);
4109   else if ((option_value = skip_leading_substring (arg, "align-labels=")))
4110     align_labels
4111       = read_integral_parameter (option_value, arg - 2, align_labels);
4112   else if ((option_value
4113             = skip_leading_substring (arg, "stack-limit-register=")))
4114     {
4115       int reg = decode_reg_name (option_value);
4116       if (reg < 0)
4117         error ("unrecognized register name `%s'", option_value);
4118       else
4119         stack_limit_rtx = gen_rtx_REG (Pmode, reg);
4120     }
4121   else if ((option_value
4122             = skip_leading_substring (arg, "stack-limit-symbol=")))
4123     {
4124       const char *nm;
4125       nm = ggc_strdup (option_value);
4126       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, nm);
4127     }
4128   else if ((option_value
4129             = skip_leading_substring (arg, "message-length=")))
4130     output_set_maximum_length
4131       (&global_dc->buffer, read_integral_parameter
4132        (option_value, arg - 2, diagnostic_line_cutoff (global_dc)));
4133   else if ((option_value
4134             = skip_leading_substring (arg, "diagnostics-show-location=")))
4135     {
4136       if (!strcmp (option_value, "once"))
4137         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
4138       else if (!strcmp (option_value, "every-line"))
4139         diagnostic_prefixing_rule (global_dc)
4140           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
4141       else
4142         error ("unrecognized option `%s'", arg - 2);
4143     }
4144   else if (!strcmp (arg, "no-stack-limit"))
4145     stack_limit_rtx = NULL_RTX;
4146   else if (!strcmp (arg, "preprocessed"))
4147     /* Recognize this switch but do nothing.  This prevents warnings
4148        about an unrecognized switch if cpplib has not been linked in.  */
4149     ;
4150   else
4151     return 0;
4152
4153   return 1;
4154 }
4155
4156 /* Parse a -W... command line switch.  ARG is the value after the -W.
4157    It is safe to access 'ARG - 2' to generate the full switch name.
4158    Return the number of strings consumed.  */
4159
4160 static int
4161 decode_W_option (arg)
4162      const char *arg;
4163 {
4164   const char *option_value = NULL;
4165   int j;
4166
4167   /* Search for the option in the table of binary W options.  */
4168
4169   for (j = ARRAY_SIZE (W_options); j--;)
4170     {
4171       if (!strcmp (arg, W_options[j].string))
4172         {
4173           *W_options[j].variable = W_options[j].on_value;
4174           return 1;
4175         }
4176
4177       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4178           && ! strcmp (arg + 3, W_options[j].string))
4179         {
4180           *W_options[j].variable = ! W_options[j].on_value;
4181           return 1;
4182         }
4183     }
4184
4185   if ((option_value = skip_leading_substring (arg, "id-clash-")))
4186     warning ("-Wid-clash-LEN is no longer supported");
4187   else if ((option_value = skip_leading_substring (arg, "larger-than-")))
4188     {
4189       larger_than_size = read_integral_parameter (option_value, arg - 2, -1);
4190
4191       warn_larger_than = larger_than_size != -1;
4192     }
4193   else if (!strcmp (arg, "unused"))
4194     {
4195       set_Wunused (1);
4196     }
4197   else if (!strcmp (arg, "no-unused"))
4198     {
4199       set_Wunused (0);
4200     }
4201   else if (!strcmp (arg, "extra"))
4202     {
4203       /* We save the value of warn_uninitialized, since if they put
4204          -Wuninitialized on the command line, we need to generate a
4205          warning about not using it without also specifying -O.  */
4206       if (warn_uninitialized != 1)
4207         warn_uninitialized = 2;
4208     }
4209   else
4210     return 0;
4211
4212   return 1;
4213 }
4214
4215 /* Parse a -g... command line switch.  ARG is the value after the -g.
4216    It is safe to access 'ARG - 2' to generate the full switch name.
4217    Return the number of strings consumed.  */
4218
4219 static int
4220 decode_g_option (arg)
4221      const char *arg;
4222 {
4223   static unsigned level = 0;
4224   /* A lot of code assumes write_symbols == NO_DEBUG if the
4225      debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
4226      of what debugging type has been selected).  This records the
4227      selected type.  It is an error to specify more than one
4228      debugging type.  */
4229   static enum debug_info_type selected_debug_type = NO_DEBUG;
4230   /* Nonzero if debugging format has been explicitly set.
4231      -g and -ggdb don't explicitly set the debugging format so
4232      -gdwarf -g3 is equivalent to -gdwarf3.  */
4233   static int type_explicitly_set_p = 0;
4234   /* Indexed by enum debug_info_type.  */
4235   static const char *const debug_type_names[] =
4236   {
4237     "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff", "vms"
4238   };
4239
4240   /* The maximum admissible debug level value.  */
4241   static const unsigned max_debug_level = 3;
4242
4243   /* Look up ARG in the table.  */
4244   for (da = debug_args; da->arg; da++)
4245     {
4246       const int da_len = strlen (da->arg);
4247
4248       if (da_len == 0 || ! strncmp (arg, da->arg, da_len))
4249         {
4250           enum debug_info_type type = da->debug_type;
4251           const char *p = arg + da_len;
4252
4253           if (*p && ! ISDIGIT (*p))
4254             continue;
4255
4256           /* A debug flag without a level defaults to level 2.
4257              Note we do not want to call read_integral_parameter
4258              for that case since it will call atoi which
4259              will return zero.
4260
4261              ??? We may want to generalize the interface to
4262              read_integral_parameter to better handle this case
4263              if this case shows up often.  */
4264           if (*p)
4265             level = read_integral_parameter (p, 0, max_debug_level + 1);
4266           else
4267             level = (level == 0) ? 2 : level;
4268
4269           if (da_len > 1 && *p && !strncmp (arg, "dwarf", da_len))
4270             {
4271               error ("use -gdwarf -g%d for DWARF v1, level %d",
4272                      level, level);
4273               if (level == 2)
4274                 error ("use -gdwarf-2   for DWARF v2");
4275             }
4276
4277           if (level > max_debug_level)
4278             {
4279               warning ("\
4280 ignoring option `%s' due to invalid debug level specification",
4281                        arg - 2);
4282               level = debug_info_level;
4283             }
4284
4285           if (type == NO_DEBUG)
4286             {
4287               type = PREFERRED_DEBUGGING_TYPE;
4288
4289               if (da_len > 1 && strncmp (arg, "gdb", da_len) == 0)
4290                 {
4291 #ifdef DWARF2_DEBUGGING_INFO
4292                   type = DWARF2_DEBUG;
4293 #else
4294 #ifdef DBX_DEBUGGING_INFO
4295                   type = DBX_DEBUG;
4296 #endif
4297 #endif
4298                 }
4299             }
4300
4301           if (type == NO_DEBUG)
4302             warning ("`%s': unknown or unsupported -g option", arg - 2);
4303
4304           /* Does it conflict with an already selected type?  */
4305           if (type_explicitly_set_p
4306               /* -g/-ggdb don't conflict with anything.  */
4307               && da->debug_type != NO_DEBUG
4308               && type != selected_debug_type)
4309             warning ("`%s' ignored, conflicts with `-g%s'",
4310                      arg - 2, debug_type_names[(int) selected_debug_type]);
4311           else
4312             {
4313               /* If the format has already been set, -g/-ggdb
4314                  only change the debug level.  */
4315               if (type_explicitly_set_p && da->debug_type == NO_DEBUG)
4316                 /* Don't change debugging type.  */
4317                 ;
4318               else
4319                 {
4320                   selected_debug_type = type;
4321                   type_explicitly_set_p = da->debug_type != NO_DEBUG;
4322                 }
4323
4324               write_symbols = (level == 0
4325                                ? NO_DEBUG
4326                                : selected_debug_type);
4327               use_gnu_debug_info_extensions = da->use_extensions_p;
4328               debug_info_level = (enum debug_info_level) level;
4329             }
4330
4331           break;
4332         }
4333     }
4334
4335   if (! da->arg)
4336     return 0;
4337
4338   return 1;
4339 }
4340
4341 /* Decode the first argument in the argv as a language-independent option.
4342    Return the number of strings consumed.  */
4343
4344 static unsigned int
4345 independent_decode_option (argc, argv)
4346      int argc;
4347      char **argv;
4348 {
4349   char *arg = argv[0];
4350
4351   if (arg[0] != '-' || arg[1] == 0)
4352     {
4353       if (arg[0] == '+')
4354         return 0;
4355
4356       filename = arg;
4357
4358       return 1;
4359     }
4360
4361   arg++;
4362
4363   if (!strcmp (arg, "-help"))
4364     {
4365       display_help ();
4366       exit_after_options = 1;
4367     }
4368
4369   if (!strcmp (arg, "-target-help"))
4370     {
4371       display_target_options ();
4372       exit_after_options = 1;
4373     }
4374
4375   if (!strcmp (arg, "-version"))
4376     {
4377       print_version (stderr, "");
4378       exit_after_options = 1;
4379     }
4380
4381   /* Handle '--param <name>=<value>'.  */
4382   if (strcmp (arg, "-param") == 0)
4383     {
4384       char *equal;
4385
4386       if (argc == 1)
4387         {
4388           error ("-param option missing argument");
4389           return 1;
4390         }
4391
4392       /* Get the '<name>=<value>' parameter.  */
4393       arg = argv[1];
4394       /* Look for the `='.  */
4395       equal = strchr (arg, '=');
4396       if (!equal)
4397         error ("invalid --param option: %s", arg);
4398       else
4399         {
4400           int val;
4401
4402           /* Zero out the `=' sign so that we get two separate strings.  */
4403           *equal = '\0';
4404           /* Figure out what value is specified.  */
4405           val = read_integral_parameter (equal + 1, NULL, INVALID_PARAM_VAL);
4406           if (val != INVALID_PARAM_VAL)
4407             set_param_value (arg, val);
4408           else
4409             error ("invalid parameter value `%s'", equal + 1);
4410         }
4411
4412       return 2;
4413     }
4414
4415   if (*arg == 'Y')
4416     arg++;
4417
4418   switch (*arg)
4419     {
4420     default:
4421       return 0;
4422
4423     case 'O':
4424       /* Already been treated in main (). Do nothing.  */
4425       break;
4426
4427     case 'm':
4428       set_target_switch (arg + 1);
4429       break;
4430
4431     case 'f':
4432       return decode_f_option (arg + 1);
4433
4434     case 'g':
4435       return decode_g_option (arg + 1);
4436
4437     case 'd':
4438       if (!strcmp (arg, "dumpbase"))
4439         {
4440           if (argc == 1)
4441             return 0;
4442
4443           if (argv[1][0])
4444             dump_base_name = argv[1];
4445
4446           return 2;
4447         }
4448       else
4449         decode_d_option (arg + 1);
4450       break;
4451
4452     case 'p':
4453       if (!strcmp (arg, "pedantic"))
4454         pedantic = 1;
4455       else if (!strcmp (arg, "pedantic-errors"))
4456         flag_pedantic_errors = pedantic = 1;
4457       else if (arg[1] == 0)
4458         profile_flag = 1;
4459       else
4460         return 0;
4461       break;
4462
4463     case 'q':
4464       if (!strcmp (arg, "quiet"))
4465         quiet_flag = 1;
4466       else
4467         return 0;
4468       break;
4469
4470     case 'v':
4471       if (!strcmp (arg, "version"))
4472         version_flag = 1;
4473       else
4474         return 0;
4475       break;
4476
4477     case 'w':
4478       if (arg[1] == 0)
4479         inhibit_warnings = 1;
4480       else
4481         return 0;
4482       break;
4483
4484     case 'W':
4485       if (arg[1] == 0)
4486         {
4487           extra_warnings = 1;
4488           /* We save the value of warn_uninitialized, since if they put
4489              -Wuninitialized on the command line, we need to generate a
4490              warning about not using it without also specifying -O.  */
4491           if (warn_uninitialized != 1)
4492             warn_uninitialized = 2;
4493         }
4494       else
4495         return decode_W_option (arg + 1);
4496       break;
4497
4498     case 'a':
4499       if (!strncmp (arg, "aux-info", 8))
4500         {
4501           if (arg[8] == '\0')
4502             {
4503               if (argc == 1)
4504                 return 0;
4505
4506               aux_info_file_name = argv[1];
4507               flag_gen_aux_info = 1;
4508               return 2;
4509             }
4510           else if (arg[8] == '=')
4511             {
4512               aux_info_file_name = arg + 9;
4513               flag_gen_aux_info = 1;
4514             }
4515           else
4516             return 0;
4517         }
4518       else if (!strcmp (arg, "auxbase"))
4519         {
4520           if (argc == 1)
4521             return 0;
4522
4523           if (argv[1][0])
4524             aux_base_name = argv[1];
4525
4526           return 2;
4527         }
4528       else if (!strcmp (arg, "auxbase-strip"))
4529         {
4530           if (argc == 1)
4531             return 0;
4532
4533           if (argv[1][0])
4534             {
4535               strip_off_ending (argv[1], strlen (argv[1]));
4536               if (argv[1][0])
4537                 aux_base_name = argv[1];
4538             }
4539
4540           return 2;
4541         }
4542       else
4543         return 0;
4544       break;
4545
4546     case 'o':
4547       if (arg[1] == 0)
4548         {
4549           if (argc == 1)
4550             return 0;
4551
4552           asm_file_name = argv[1];
4553           return 2;
4554         }
4555       return 0;
4556
4557     case 'G':
4558       {
4559         int g_switch_val;
4560         int return_val;
4561
4562         if (arg[1] == 0)
4563           {
4564             if (argc == 1)
4565               return 0;
4566
4567             g_switch_val = read_integral_parameter (argv[1], 0, -1);
4568             return_val = 2;
4569           }
4570         else
4571           {
4572             g_switch_val = read_integral_parameter (arg + 1, 0, -1);
4573             return_val = 1;
4574           }
4575
4576         if (g_switch_val == -1)
4577           return_val = 0;
4578         else
4579           {
4580             g_switch_set = TRUE;
4581             g_switch_value = g_switch_val;
4582           }
4583
4584         return return_val;
4585       }
4586     }
4587
4588   return 1;
4589 }
4590 \f
4591 /* Decode -m switches.  */
4592 /* Decode the switch -mNAME.  */
4593
4594 static void
4595 set_target_switch (name)
4596      const char *name;
4597 {
4598   size_t j;
4599   int valid_target_option = 0;
4600
4601   for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4602     if (!strcmp (target_switches[j].name, name))
4603       {
4604         if (target_switches[j].value < 0)
4605           target_flags &= ~-target_switches[j].value;
4606         else
4607           target_flags |= target_switches[j].value;
4608         if (name[0] != 0)
4609           {
4610             if (target_switches[j].value < 0)
4611               target_flags_explicit |= -target_switches[j].value;
4612             else
4613               target_flags_explicit |= target_switches[j].value;
4614           }
4615         valid_target_option = 1;
4616       }
4617
4618 #ifdef TARGET_OPTIONS
4619   if (!valid_target_option)
4620     for (j = 0; j < ARRAY_SIZE (target_options); j++)
4621       {
4622         int len = strlen (target_options[j].prefix);
4623         if (!strncmp (target_options[j].prefix, name, len))
4624           {
4625             *target_options[j].variable = name + len;
4626             valid_target_option = 1;
4627           }
4628       }
4629 #endif
4630
4631   if (!valid_target_option)
4632     error ("invalid option `%s'", name);
4633 }
4634 \f
4635 /* Print version information to FILE.
4636    Each line begins with INDENT (for the case where FILE is the
4637    assembler output file).  */
4638
4639 static void
4640 print_version (file, indent)
4641      FILE *file;
4642      const char *indent;
4643 {
4644   fnotice (file, "GGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n",
4645            PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
4646 #ifndef __VERSION__
4647 #define __VERSION__ "[?]"
4648 #endif
4649   fnotice (file,
4650 #ifdef __GNUC__
4651            "%s%s%s version %s (%s)\n%s\tcompiled by GNU C version %s.\n"
4652 #else
4653            "%s%s%s version %s (%s) compiled by CC.\n"
4654 #endif
4655            , indent, *indent != 0 ? " " : "",
4656            lang_hooks.name, version_string, TARGET_NAME,
4657            indent, __VERSION__);
4658 }
4659
4660 /* Print an option value and return the adjusted position in the line.
4661    ??? We don't handle error returns from fprintf (disk full); presumably
4662    other code will catch a disk full though.  */
4663
4664 static int
4665 print_single_switch (file, pos, max, indent, sep, term, type, name)
4666      FILE *file;
4667      int pos, max;
4668      const char *indent, *sep, *term, *type, *name;
4669 {
4670   /* The ultrix fprintf returns 0 on success, so compute the result we want
4671      here since we need it for the following test.  */
4672   int len = strlen (sep) + strlen (type) + strlen (name);
4673
4674   if (pos != 0
4675       && pos + len > max)
4676     {
4677       fprintf (file, "%s", term);
4678       pos = 0;
4679     }
4680   if (pos == 0)
4681     {
4682       fprintf (file, "%s", indent);
4683       pos = strlen (indent);
4684     }
4685   fprintf (file, "%s%s%s", sep, type, name);
4686   pos += len;
4687   return pos;
4688 }
4689
4690 /* Print active target switches to FILE.
4691    POS is the current cursor position and MAX is the size of a "line".
4692    Each line begins with INDENT and ends with TERM.
4693    Each switch is separated from the next by SEP.  */
4694
4695 static void
4696 print_switch_values (file, pos, max, indent, sep, term)
4697      FILE *file;
4698      int pos, max;
4699      const char *indent, *sep, *term;
4700 {
4701   size_t j;
4702   char **p;
4703
4704   /* Print the options as passed.  */
4705
4706   pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
4707                              _("options passed: "), "");
4708
4709   for (p = &save_argv[1]; *p != NULL; p++)
4710     if (**p == '-')
4711       {
4712         /* Ignore these.  */
4713         if (strcmp (*p, "-o") == 0)
4714           {
4715             if (p[1] != NULL)
4716               p++;
4717             continue;
4718           }
4719         if (strcmp (*p, "-quiet") == 0)
4720           continue;
4721         if (strcmp (*p, "-version") == 0)
4722           continue;
4723         if ((*p)[1] == 'd')
4724           continue;
4725
4726         pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
4727       }
4728   if (pos > 0)
4729     fprintf (file, "%s", term);
4730
4731   /* Print the -f and -m options that have been enabled.
4732      We don't handle language specific options but printing argv
4733      should suffice.  */
4734
4735   pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
4736                              _("options enabled: "), "");
4737
4738   for (j = 0; j < ARRAY_SIZE (f_options); j++)
4739     if (*f_options[j].variable == f_options[j].on_value)
4740       pos = print_single_switch (file, pos, max, indent, sep, term,
4741                                  "-f", f_options[j].string);
4742
4743   /* Print target specific options.  */
4744
4745   for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4746     if (target_switches[j].name[0] != '\0'
4747         && target_switches[j].value > 0
4748         && ((target_switches[j].value & target_flags)
4749             == target_switches[j].value))
4750       {
4751         pos = print_single_switch (file, pos, max, indent, sep, term,
4752                                    "-m", target_switches[j].name);
4753       }
4754
4755 #ifdef TARGET_OPTIONS
4756   for (j = 0; j < ARRAY_SIZE (target_options); j++)
4757     if (*target_options[j].variable != NULL)
4758       {
4759         char prefix[256];
4760         sprintf (prefix, "-m%s", target_options[j].prefix);
4761         pos = print_single_switch (file, pos, max, indent, sep, term,
4762                                    prefix, *target_options[j].variable);
4763       }
4764 #endif
4765
4766   fprintf (file, "%s", term);
4767 }
4768 \f
4769 /* Open assembly code output file.  Do this even if -fsyntax-only is
4770    on, because then the driver will have provided the name of a
4771    temporary file or bit bucket for us.  NAME is the file specified on
4772    the command line, possibly NULL.  */
4773 static void
4774 init_asm_output (name)
4775      const char *name;
4776 {
4777   if (name == NULL && asm_file_name == 0)
4778     asm_out_file = stdout;
4779   else
4780     {
4781       if (asm_file_name == 0)
4782         {
4783           int len = strlen (dump_base_name);
4784           char *dumpname = (char *) xmalloc (len + 6);
4785           memcpy (dumpname, dump_base_name, len + 1);
4786           strip_off_ending (dumpname, len);
4787           strcat (dumpname, ".s");
4788           asm_file_name = dumpname;
4789         }
4790       if (!strcmp (asm_file_name, "-"))
4791         asm_out_file = stdout;
4792       else
4793         asm_out_file = fopen (asm_file_name, "w+");
4794       if (asm_out_file == 0)
4795         fatal_io_error ("can't open %s for writing", asm_file_name);
4796     }
4797
4798 #ifdef IO_BUFFER_SIZE
4799   setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
4800            _IOFBF, IO_BUFFER_SIZE);
4801 #endif
4802
4803   if (!flag_syntax_only)
4804     {
4805 #ifdef ASM_FILE_START
4806       ASM_FILE_START (asm_out_file);
4807 #endif
4808
4809 #ifdef ASM_COMMENT_START
4810       if (flag_verbose_asm)
4811         {
4812           /* Print the list of options in effect.  */
4813           print_version (asm_out_file, ASM_COMMENT_START);
4814           print_switch_values (asm_out_file, 0, MAX_LINE,
4815                                ASM_COMMENT_START, " ", "\n");
4816           /* Add a blank line here so it appears in assembler output but not
4817              screen output.  */
4818           fprintf (asm_out_file, "\n");
4819         }
4820 #endif
4821     }
4822 }
4823 \f
4824 /* Initialization of the front end environment, before command line
4825    options are parsed.  Signal handlers, internationalization etc.
4826    ARGV0 is main's argv[0].  */
4827 static void
4828 general_init (argv0)
4829      char *argv0;
4830 {
4831   char *p;
4832
4833   p = argv0 + strlen (argv0);
4834   while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
4835     --p;
4836   progname = p;
4837
4838   xmalloc_set_program_name (progname);
4839
4840   hex_init ();
4841
4842   gcc_init_libintl ();
4843
4844   /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
4845 #ifdef SIGSEGV
4846   signal (SIGSEGV, crash_signal);
4847 #endif
4848 #ifdef SIGILL
4849   signal (SIGILL, crash_signal);
4850 #endif
4851 #ifdef SIGBUS
4852   signal (SIGBUS, crash_signal);
4853 #endif
4854 #ifdef SIGABRT
4855   signal (SIGABRT, crash_signal);
4856 #endif
4857 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
4858   signal (SIGIOT, crash_signal);
4859 #endif
4860 #ifdef SIGFPE
4861   signal (SIGFPE, crash_signal);
4862 #endif
4863
4864   /* Other host-specific signal setup.  */
4865   (*host_hooks.extra_signals)();
4866
4867   /* Initialize the diagnostics reporting machinery, so option parsing
4868      can give warnings and errors.  */
4869   diagnostic_initialize (global_dc);
4870
4871   /* Initialize the garbage-collector, string pools and tree type hash
4872      table.  */
4873   init_ggc ();
4874   init_stringpool ();
4875   init_ttree ();
4876 }
4877 \f
4878 /* Parse command line options and set default flag values, called
4879    after language-independent option-independent initialization.  Do
4880    minimal options processing.  Outputting diagnostics is OK, but GC
4881    and identifier hashtables etc. are not initialized yet.
4882
4883    Return nonzero to suppress compiler back end initialization.  */
4884 static void
4885 parse_options_and_default_flags (argc, argv)
4886      int argc;
4887      char **argv;
4888 {
4889   int i;
4890
4891   /* Save in case md file wants to emit args as a comment.  */
4892   save_argc = argc;
4893   save_argv = argv;
4894
4895   /* Initialize register usage now so switches may override.  */
4896   init_reg_sets ();
4897
4898   /* Register the language-independent parameters.  */
4899   add_params (lang_independent_params, LAST_PARAM);
4900
4901   /* This must be done after add_params but before argument processing.  */
4902   init_ggc_heuristics();
4903
4904   /* Perform language-specific options initialization.  */
4905   (*lang_hooks.init_options) ();
4906
4907   /* Scan to see what optimization level has been specified.  That will
4908      determine the default value of many flags.  */
4909   for (i = 1; i < argc; i++)
4910     {
4911       if (!strcmp (argv[i], "-O"))
4912         {
4913           optimize = 1;
4914           optimize_size = 0;
4915         }
4916       else if (argv[i][0] == '-' && argv[i][1] == 'O')
4917         {
4918           /* Handle -Os, -O2, -O3, -O69, ...  */
4919           char *p = &argv[i][2];
4920
4921           if ((p[0] == 's') && (p[1] == 0))
4922             {
4923               optimize_size = 1;
4924
4925               /* Optimizing for size forces optimize to be 2.  */
4926               optimize = 2;
4927             }
4928           else
4929             {
4930               const int optimize_val = read_integral_parameter (p, p - 2, -1);
4931               if (optimize_val != -1)
4932                 {
4933                   optimize = optimize_val;
4934                   optimize_size = 0;
4935                 }
4936             }
4937         }
4938     }
4939
4940   if (!optimize)
4941     {
4942       flag_merge_constants = 0;
4943     }
4944
4945   if (optimize >= 1)
4946     {
4947       flag_defer_pop = 1;
4948       flag_thread_jumps = 1;
4949 #ifdef DELAY_SLOTS
4950       flag_delayed_branch = 1;
4951 #endif
4952 #ifdef CAN_DEBUG_WITHOUT_FP
4953       flag_omit_frame_pointer = 1;
4954 #endif
4955       flag_guess_branch_prob = 1;
4956       flag_cprop_registers = 1;
4957       flag_loop_optimize = 1;
4958       flag_crossjumping = 1;
4959       flag_if_conversion = 1;
4960       flag_if_conversion2 = 1;
4961     }
4962
4963   if (optimize >= 2)
4964     {
4965       flag_optimize_sibling_calls = 1;
4966       flag_cse_follow_jumps = 1;
4967       flag_cse_skip_blocks = 1;
4968       flag_gcse = 1;
4969       flag_expensive_optimizations = 1;
4970       flag_strength_reduce = 1;
4971       flag_rerun_cse_after_loop = 1;
4972       flag_rerun_loop_opt = 1;
4973       flag_caller_saves = 1;
4974       flag_force_mem = 1;
4975       flag_peephole2 = 1;
4976 #ifdef INSN_SCHEDULING
4977       flag_schedule_insns = 1;
4978       flag_schedule_insns_after_reload = 1;
4979 #endif
4980       flag_regmove = 1;
4981       flag_strict_aliasing = 1;
4982       flag_delete_null_pointer_checks = 1;
4983       flag_reorder_blocks = 1;
4984       flag_reorder_functions = 1;
4985     }
4986
4987   if (optimize >= 3)
4988     {
4989       flag_inline_functions = 1;
4990       flag_rename_registers = 1;
4991       flag_unswitch_loops = 1;
4992     }
4993
4994   if (optimize < 2 || optimize_size)
4995     {
4996       align_loops = 1;
4997       align_jumps = 1;
4998       align_labels = 1;
4999       align_functions = 1;
5000
5001       /* Don't reorder blocks when optimizing for size because extra
5002          jump insns may be created; also barrier may create extra padding.
5003
5004          More correctly we should have a block reordering mode that tried
5005          to minimize the combined size of all the jumps.  This would more
5006          or less automatically remove extra jumps, but would also try to
5007          use more short jumps instead of long jumps.  */
5008       flag_reorder_blocks = 0;
5009     }
5010
5011   /* Initialize whether `char' is signed.  */
5012   flag_signed_char = DEFAULT_SIGNED_CHAR;
5013 #ifdef DEFAULT_SHORT_ENUMS
5014   /* Initialize how much space enums occupy, by default.  */
5015   flag_short_enums = DEFAULT_SHORT_ENUMS;
5016 #endif
5017
5018   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
5019      modify it.  */
5020   target_flags = 0;
5021   set_target_switch ("");
5022
5023   /* Unwind tables are always present in an ABI-conformant IA-64
5024      object file, so the default should be ON.  */
5025 #ifdef IA64_UNWIND_INFO
5026   flag_unwind_tables = IA64_UNWIND_INFO;
5027 #endif
5028
5029 #ifdef OPTIMIZATION_OPTIONS
5030   /* Allow default optimizations to be specified on a per-machine basis.  */
5031   OPTIMIZATION_OPTIONS (optimize, optimize_size);
5032 #endif
5033
5034   /* Perform normal command line switch decoding.  */
5035   for (i = 1; i < argc;)
5036     {
5037       int lang_processed;
5038       int indep_processed;
5039
5040       /* Give the language a chance to decode the option for itself.  */
5041       lang_processed = (*lang_hooks.decode_option) (argc - i, argv + i);
5042
5043       if (lang_processed >= 0)
5044         /* Now see if the option also has a language independent meaning.
5045            Some options are both language specific and language independent,
5046            eg --help.  */
5047         indep_processed = independent_decode_option (argc - i, argv + i);
5048       else
5049         {
5050           lang_processed = -lang_processed;
5051           indep_processed = 0;
5052         }
5053
5054       if (lang_processed || indep_processed)
5055         i += MAX (lang_processed, indep_processed);
5056       else
5057         {
5058           const char *option = NULL;
5059           const char *lang = NULL;
5060           unsigned int j;
5061
5062           /* It is possible that the command line switch is not valid for the
5063              current language, but it is valid for another language.  In order
5064              to be compatible with previous versions of the compiler (which
5065              did not issue an error message in this case) we check for this
5066              possibility here.  If we do find a match, then if extra_warnings
5067              is set we generate a warning message, otherwise we will just
5068              ignore the option.  */
5069           for (j = 0; j < ARRAY_SIZE (documented_lang_options); j++)
5070             {
5071               option = documented_lang_options[j].option;
5072
5073               if (option == NULL)
5074                 lang = documented_lang_options[j].description;
5075               else if (! strncmp (argv[i], option, strlen (option)))
5076                 break;
5077             }
5078
5079           if (j != ARRAY_SIZE (documented_lang_options))
5080             {
5081               if (extra_warnings)
5082                 {
5083                   warning ("ignoring command line option '%s'", argv[i]);
5084                   if (lang)
5085                     warning
5086                       ("(it is valid for %s but not the selected language)",
5087                        lang);
5088                 }
5089             }
5090           else if (argv[i][0] == '-' && argv[i][1] == 'g')
5091             warning ("`%s': unknown or unsupported -g option", &argv[i][2]);
5092           else
5093             error ("unrecognized option `%s'", argv[i]);
5094
5095           i++;
5096         }
5097     }
5098
5099   if (flag_no_inline == 2)
5100     flag_no_inline = 0;
5101   else
5102     flag_really_no_inline = flag_no_inline;
5103
5104   /* Set flag_no_inline before the post_options () hook.  The C front
5105      ends use it to determine tree inlining defaults.  FIXME: such
5106      code should be lang-independent when all front ends use tree
5107      inlining, in which case it, and this condition, should be moved
5108      to the top of process_options() instead.  */
5109   if (optimize == 0)
5110     {
5111       /* Inlining does not work if not optimizing,
5112          so force it not to be done.  */
5113       flag_no_inline = 1;
5114       warn_inline = 0;
5115
5116       /* The c_decode_option function and decode_option hook set
5117          this to `2' if -Wall is used, so we can avoid giving out
5118          lots of errors for people who don't realize what -Wall does.  */
5119       if (warn_uninitialized == 1)
5120         warning ("-Wuninitialized is not supported without -O");
5121     }
5122
5123   if (flag_really_no_inline == 2)
5124     flag_really_no_inline = flag_no_inline;
5125 }
5126 \f
5127 /* Process the options that have been parsed.  */
5128 static void
5129 process_options ()
5130 {
5131 #ifdef OVERRIDE_OPTIONS
5132   /* Some machines may reject certain combinations of options.  */
5133   OVERRIDE_OPTIONS;
5134 #endif
5135
5136   /* Set up the align_*_log variables, defaulting them to 1 if they
5137      were still unset.  */
5138   if (align_loops <= 0) align_loops = 1;
5139   if (align_loops_max_skip > align_loops || !align_loops)
5140     align_loops_max_skip = align_loops - 1;
5141   align_loops_log = floor_log2 (align_loops * 2 - 1);
5142   if (align_jumps <= 0) align_jumps = 1;
5143   if (align_jumps_max_skip > align_jumps || !align_jumps)
5144     align_jumps_max_skip = align_jumps - 1;
5145   align_jumps_log = floor_log2 (align_jumps * 2 - 1);
5146   if (align_labels <= 0) align_labels = 1;
5147   align_labels_log = floor_log2 (align_labels * 2 - 1);
5148   if (align_labels_max_skip > align_labels || !align_labels)
5149     align_labels_max_skip = align_labels - 1;
5150   if (align_functions <= 0) align_functions = 1;
5151   align_functions_log = floor_log2 (align_functions * 2 - 1);
5152
5153   /* Unrolling all loops implies that standard loop unrolling must also
5154      be done.  */
5155   if (flag_unroll_all_loops)
5156     flag_unroll_loops = 1;
5157   /* Loop unrolling requires that strength_reduction be on also.  Silently
5158      turn on strength reduction here if it isn't already on.  Also, the loop
5159      unrolling code assumes that cse will be run after loop, so that must
5160      be turned on also.  */
5161   if (flag_unroll_loops)
5162     {
5163       flag_strength_reduce = 1;
5164       flag_rerun_cse_after_loop = 1;
5165     }
5166
5167   if (flag_non_call_exceptions)
5168     flag_asynchronous_unwind_tables = 1;
5169   if (flag_asynchronous_unwind_tables)
5170     flag_unwind_tables = 1;
5171
5172   /* Disable unit-at-a-time mode for frontends not supporting callgraph
5173      interface.  */
5174   if (flag_unit_at_a_time && ! lang_hooks.callgraph.expand_function)
5175     flag_unit_at_a_time = 0;
5176
5177   /* Warn about options that are not supported on this machine.  */
5178 #ifndef INSN_SCHEDULING
5179   if (flag_schedule_insns || flag_schedule_insns_after_reload)
5180     warning ("instruction scheduling not supported on this target machine");
5181 #endif
5182 #ifndef DELAY_SLOTS
5183   if (flag_delayed_branch)
5184     warning ("this target machine does not have delayed branches");
5185 #endif
5186
5187   user_label_prefix = USER_LABEL_PREFIX;
5188   if (flag_leading_underscore != -1)
5189     {
5190       /* If the default prefix is more complicated than "" or "_",
5191          issue a warning and ignore this option.  */
5192       if (user_label_prefix[0] == 0 ||
5193           (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
5194         {
5195           user_label_prefix = flag_leading_underscore ? "_" : "";
5196         }
5197       else
5198         warning ("-f%sleading-underscore not supported on this target machine",
5199                  flag_leading_underscore ? "" : "no-");
5200     }
5201
5202   /* If we are in verbose mode, write out the version and maybe all the
5203      option flags in use.  */
5204   if (version_flag)
5205     {
5206       print_version (stderr, "");
5207       if (! quiet_flag)
5208         print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
5209     }
5210
5211   if (! quiet_flag  || flag_detailed_statistics)
5212     time_report = 1;
5213
5214   if (flag_syntax_only)
5215     {
5216       write_symbols = NO_DEBUG;
5217       profile_flag = 0;
5218     }
5219
5220   /* Now we know write_symbols, set up the debug hooks based on it.
5221      By default we do nothing for debug output.  */
5222 #if defined(DBX_DEBUGGING_INFO)
5223   if (write_symbols == DBX_DEBUG)
5224     debug_hooks = &dbx_debug_hooks;
5225 #endif
5226 #if defined(XCOFF_DEBUGGING_INFO)
5227   if (write_symbols == XCOFF_DEBUG)
5228     debug_hooks = &xcoff_debug_hooks;
5229 #endif
5230 #ifdef SDB_DEBUGGING_INFO
5231   if (write_symbols == SDB_DEBUG)
5232     debug_hooks = &sdb_debug_hooks;
5233 #endif
5234 #ifdef DWARF_DEBUGGING_INFO
5235   if (write_symbols == DWARF_DEBUG)
5236     debug_hooks = &dwarf_debug_hooks;
5237 #endif
5238 #ifdef DWARF2_DEBUGGING_INFO
5239   if (write_symbols == DWARF2_DEBUG)
5240     debug_hooks = &dwarf2_debug_hooks;
5241 #endif
5242 #ifdef VMS_DEBUGGING_INFO
5243   if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
5244     debug_hooks = &vmsdbg_debug_hooks;
5245 #endif
5246
5247   /* If auxiliary info generation is desired, open the output file.
5248      This goes in the same directory as the source file--unlike
5249      all the other output files.  */
5250   if (flag_gen_aux_info)
5251     {
5252       aux_info_file = fopen (aux_info_file_name, "w");
5253       if (aux_info_file == 0)
5254         fatal_io_error ("can't open %s", aux_info_file_name);
5255     }
5256
5257   if (! targetm.have_named_sections)
5258     {
5259       if (flag_function_sections)
5260         {
5261           warning ("-ffunction-sections not supported for this target");
5262           flag_function_sections = 0;
5263         }
5264       if (flag_data_sections)
5265         {
5266           warning ("-fdata-sections not supported for this target");
5267           flag_data_sections = 0;
5268         }
5269     }
5270
5271   if (flag_function_sections && profile_flag)
5272     {
5273       warning ("-ffunction-sections disabled; it makes profiling impossible");
5274       flag_function_sections = 0;
5275     }
5276
5277 #ifndef HAVE_prefetch
5278   if (flag_prefetch_loop_arrays)
5279     {
5280       warning ("-fprefetch-loop-arrays not supported for this target");
5281       flag_prefetch_loop_arrays = 0;
5282     }
5283 #else
5284   if (flag_prefetch_loop_arrays && !HAVE_prefetch)
5285     {
5286       warning ("-fprefetch-loop-arrays not supported for this target (try -march switches)");
5287       flag_prefetch_loop_arrays = 0;
5288     }
5289 #endif
5290
5291   /* This combination of options isn't handled for i386 targets and doesn't
5292      make much sense anyway, so don't allow it.  */
5293   if (flag_prefetch_loop_arrays && optimize_size)
5294     {
5295       warning ("-fprefetch-loop-arrays is not supported with -Os");
5296       flag_prefetch_loop_arrays = 0;
5297     }
5298
5299 #ifndef OBJECT_FORMAT_ELF
5300   if (flag_function_sections && write_symbols != NO_DEBUG)
5301     warning ("-ffunction-sections may affect debugging on some targets");
5302 #endif
5303
5304     /* The presence of IEEE signaling NaNs, implies all math can trap.  */
5305     if (flag_signaling_nans)
5306       flag_trapping_math = 1;
5307 }
5308 \f
5309 /* Initialize the compiler back end.  */
5310 static void
5311 backend_init ()
5312 {
5313   /* init_emit_once uses reg_raw_mode and therefore must be called
5314      after init_regs which initialized reg_raw_mode.  */
5315   init_regs ();
5316   init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
5317                   || debug_info_level == DINFO_LEVEL_VERBOSE
5318 #ifdef VMS_DEBUGGING_INFO
5319                     /* Enable line number info for traceback */
5320                     || debug_info_level > DINFO_LEVEL_NONE
5321 #endif
5322                     || flag_test_coverage
5323                     || warn_notreached);
5324   init_fake_stack_mems ();
5325   init_alias_once ();
5326   init_loop ();
5327   init_reload ();
5328   init_function_once ();
5329   init_varasm_once ();
5330
5331   /* The following initialization functions need to generate rtl, so
5332      provide a dummy function context for them.  */
5333   init_dummy_function_start ();
5334   init_expmed ();
5335   if (flag_caller_saves)
5336     init_caller_save ();
5337   expand_dummy_function_end ();
5338 }
5339 \f
5340 /* Language-dependent initialization.  Returns nonzero on success.  */
5341 static int
5342 lang_dependent_init (name)
5343      const char *name;
5344 {
5345   if (dump_base_name == 0)
5346     dump_base_name = name ? name : "gccdump";
5347
5348   /* Front-end initialization.  This hook can assume that GC,
5349      identifier hashes etc. are set up, but debug initialization is
5350      not done yet.  This routine must return the original filename
5351      (e.g. foo.i -> foo.c) so can correctly initialize debug output.  */
5352   name = (*lang_hooks.init) (name);
5353   if (name == NULL)
5354     return 0;
5355
5356   /* Is this duplication necessary?  */
5357   name = ggc_strdup (name);
5358   main_input_filename = input_filename = name;
5359   init_asm_output (name);
5360
5361   /* These create various _DECL nodes, so need to be called after the
5362      front end is initialized.  */
5363   init_eh ();
5364   init_optabs ();
5365
5366   /* The following initialization functions need to generate rtl, so
5367      provide a dummy function context for them.  */
5368   init_dummy_function_start ();
5369   init_expr_once ();
5370   expand_dummy_function_end ();
5371
5372   /* Put an entry on the input file stack for the main input file.  */
5373   push_srcloc (input_filename, 0);
5374
5375   /* If dbx symbol table desired, initialize writing it and output the
5376      predefined types.  */
5377   timevar_push (TV_SYMOUT);
5378
5379 #ifdef DWARF2_UNWIND_INFO
5380   if (dwarf2out_do_frame ())
5381     dwarf2out_frame_init ();
5382 #endif
5383
5384   /* Now we have the correct original filename, we can initialize
5385      debug output.  */
5386   (*debug_hooks->init) (name);
5387
5388   timevar_pop (TV_SYMOUT);
5389
5390   return 1;
5391 }
5392 \f
5393 /* Clean up: close opened files, etc.  */
5394
5395 static void
5396 finalize ()
5397 {
5398   /* Close the dump files.  */
5399   if (flag_gen_aux_info)
5400     {
5401       fclose (aux_info_file);
5402       if (errorcount)
5403         unlink (aux_info_file_name);
5404     }
5405
5406   /* Close non-debugging input and output files.  Take special care to note
5407      whether fclose returns an error, since the pages might still be on the
5408      buffer chain while the file is open.  */
5409
5410   if (asm_out_file)
5411     {
5412       if (ferror (asm_out_file) != 0)
5413         fatal_io_error ("error writing to %s", asm_file_name);
5414       if (fclose (asm_out_file) != 0)
5415         fatal_io_error ("error closing %s", asm_file_name);
5416     }
5417
5418   /* Do whatever is necessary to finish printing the graphs.  */
5419   if (graph_dump_format != no_graph)
5420     {
5421       int i;
5422
5423       for (i = 0; i < (int) DFI_MAX; ++i)
5424         if (dump_file[i].initialized && dump_file[i].graph_dump_p)
5425           {
5426             char seq[16];
5427             char *suffix;
5428
5429             sprintf (seq, DUMPFILE_FORMAT, i);
5430             suffix = concat (seq, dump_file[i].extension, NULL);
5431             finish_graph_dump_file (dump_base_name, suffix);
5432             free (suffix);
5433           }
5434     }
5435
5436   if (mem_report)
5437     {
5438       ggc_print_statistics ();
5439       stringpool_statistics ();
5440       dump_tree_statistics ();
5441     }
5442
5443   /* Free up memory for the benefit of leak detectors.  */
5444   free_reg_info ();
5445
5446   /* Language-specific end of compilation actions.  */
5447   (*lang_hooks.finish) ();
5448 }
5449 \f
5450 /* Initialize the compiler, and compile the input file.  */
5451 static void
5452 do_compile ()
5453 {
5454   /* All command line options have been parsed; allow the front end to
5455      perform consistency checks, etc.  */
5456   bool no_backend = (*lang_hooks.post_options) ();
5457
5458   /* The bulk of command line switch processing.  */
5459   process_options ();
5460
5461   /* If an error has already occurred, give up.  */
5462   if (errorcount)
5463     return;
5464
5465   if (aux_base_name)
5466     /*NOP*/;
5467   else if (filename)
5468     {
5469       char *name = xstrdup (lbasename (filename));
5470
5471       aux_base_name = name;
5472       strip_off_ending (name, strlen (name));
5473     }
5474   else
5475     aux_base_name = "gccaux";
5476
5477   /* We cannot start timing until after options are processed since that
5478      says if we run timers or not.  */
5479   init_timevar ();
5480   timevar_start (TV_TOTAL);
5481
5482   /* Set up the back-end if requested.  */
5483   if (!no_backend)
5484     backend_init ();
5485
5486   /* Language-dependent initialization.  Returns true on success.  */
5487   if (lang_dependent_init (filename))
5488     compile_file ();
5489
5490   finalize ();
5491
5492   /* Stop timing and print the times.  */
5493   timevar_stop (TV_TOTAL);
5494   timevar_print (stderr);
5495 }
5496 \f
5497 /* Entry point of cc1, cc1plus, jc1, f771, etc.
5498    Decode command args, then call compile_file.
5499    Exit code is FATAL_EXIT_CODE if can't open files or if there were
5500    any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
5501
5502    It is not safe to call this function more than once.  */
5503
5504 int
5505 toplev_main (argc, argv)
5506      int argc;
5507      char **argv;
5508 {
5509   /* Initialization of GCC's environment, and diagnostics.  */
5510   general_init (argv[0]);
5511
5512   /* Parse the options and do minimal processing; basically just
5513      enough to default flags appropriately.  */
5514   parse_options_and_default_flags (argc, argv);
5515
5516   /* Exit early if we can (e.g. -help).  */
5517   if (!exit_after_options)
5518     do_compile ();
5519
5520   if (errorcount || sorrycount)
5521     return (FATAL_EXIT_CODE);
5522
5523   return (SUCCESS_EXIT_CODE);
5524 }