OSDN Git Service

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