OSDN Git Service

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