OSDN Git Service

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