OSDN Git Service

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