OSDN Git Service

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