OSDN Git Service

* cfgcleanup.c (merge_blocks_move_successor_nojumps): Emit dump
[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   /* We may have potential sibling or tail recursion sites.  Select one
2496      (of possibly multiple) methods of performing the call.  */
2497   if (flag_optimize_sibling_calls)
2498     {
2499       timevar_push (TV_JUMP);
2500       open_dump_file (DFI_sibling, decl);
2501
2502       optimize_sibling_and_tail_recursive_calls ();
2503
2504       close_dump_file (DFI_sibling, print_rtl, get_insns ());
2505       timevar_pop (TV_JUMP);
2506     }
2507
2508   /* Complete generation of exception handling code.  */
2509   find_exception_handler_labels ();
2510   if (doing_eh (0))
2511     {
2512       timevar_push (TV_JUMP);
2513       open_dump_file (DFI_eh, decl);
2514
2515       finish_eh_generation ();
2516
2517       close_dump_file (DFI_eh, print_rtl, get_insns ());
2518       timevar_pop (TV_JUMP);
2519     }
2520
2521   /* Delay emitting hard_reg_initial_value sets until after EH landing pad
2522      generation, which might create new sets.  */
2523   emit_initial_value_sets ();
2524
2525 #ifdef FINALIZE_PIC
2526   /* If we are doing position-independent code generation, now
2527      is the time to output special prologues and epilogues.
2528      We do not want to do this earlier, because it just clutters
2529      up inline functions with meaningless insns.  */
2530   if (flag_pic)
2531     FINALIZE_PIC;
2532 #endif
2533
2534   insns = get_insns ();
2535
2536   /* Copy any shared structure that should not be shared.  */
2537   unshare_all_rtl (current_function_decl, insns);
2538
2539 #ifdef SETJMP_VIA_SAVE_AREA
2540   /* This must be performed before virtual register instantiation.  */
2541   if (current_function_calls_alloca)
2542     optimize_save_area_alloca (insns);
2543 #endif
2544
2545   /* Instantiate all virtual registers.  */
2546   instantiate_virtual_regs (current_function_decl, insns);
2547
2548   open_dump_file (DFI_jump, decl);
2549
2550   /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
2551      are initialized and to compute whether control can drop off the end
2552      of the function.  */
2553
2554   timevar_push (TV_JUMP);
2555   /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB.  Do this
2556      before jump optimization switches branch directions.  */
2557   expected_value_to_br_prob ();
2558
2559   reg_scan (insns, max_reg_num (), 0);
2560   rebuild_jump_labels (insns);
2561   find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2562   if (rtl_dump_file)
2563     dump_flow_info (rtl_dump_file);
2564   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_PRE_LOOP
2565                | (flag_thread_jumps ? CLEANUP_THREADING : 0));
2566
2567   /* CFG is no longer maintained up-to-date.  */
2568   free_bb_for_insn ();
2569   copy_loop_headers (insns);
2570   purge_line_number_notes (insns);
2571
2572   timevar_pop (TV_JUMP);
2573   close_dump_file (DFI_jump, print_rtl, insns);
2574
2575   /* Now is when we stop if -fsyntax-only and -Wreturn-type.  */
2576   if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
2577     {
2578       goto exit_rest_of_compilation;
2579     }
2580
2581   /* Long term, this should probably move before the jump optimizer too,
2582      but I didn't want to disturb the rtl_dump_and_exit and related
2583      stuff at this time.  */
2584   if (optimize > 0 && flag_ssa)
2585     {
2586       /* Convert to SSA form.  */
2587
2588       timevar_push (TV_TO_SSA);
2589       open_dump_file (DFI_ssa, decl);
2590
2591       find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2592       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2593       convert_to_ssa ();
2594
2595       close_dump_file (DFI_ssa, print_rtl_with_bb, insns);
2596       timevar_pop (TV_TO_SSA);
2597
2598       /* Perform sparse conditional constant propagation, if requested.  */
2599       if (flag_ssa_ccp)
2600         {
2601           timevar_push (TV_SSA_CCP);
2602           open_dump_file (DFI_ssa_ccp, decl);
2603
2604           ssa_const_prop ();
2605
2606           close_dump_file (DFI_ssa_ccp, print_rtl_with_bb, get_insns ());
2607           timevar_pop (TV_SSA_CCP);
2608         }
2609
2610       /* It would be useful to cleanup the CFG at this point, but block
2611          merging and possibly other transformations might leave a PHI
2612          node in the middle of a basic block, which is a strict no-no.  */
2613
2614       /* The SSA implementation uses basic block numbers in its phi
2615          nodes.  Thus, changing the control-flow graph or the basic
2616          blocks, e.g., calling find_basic_blocks () or cleanup_cfg (),
2617          may cause problems.  */
2618
2619       if (flag_ssa_dce)
2620         {
2621           /* Remove dead code.  */
2622
2623           timevar_push (TV_SSA_DCE);
2624           open_dump_file (DFI_ssa_dce, decl);
2625
2626           insns = get_insns ();
2627           ssa_eliminate_dead_code();
2628
2629           close_dump_file (DFI_ssa_dce, print_rtl_with_bb, insns);
2630           timevar_pop (TV_SSA_DCE);
2631         }
2632
2633       /* Convert from SSA form.  */
2634
2635       timevar_push (TV_FROM_SSA);
2636       open_dump_file (DFI_ussa, decl);
2637
2638       convert_from_ssa ();
2639       /* New registers have been created.  Rescan their usage.  */
2640       reg_scan (insns, max_reg_num (), 1);
2641
2642       close_dump_file (DFI_ussa, print_rtl_with_bb, insns);
2643       timevar_pop (TV_FROM_SSA);
2644
2645       ggc_collect ();
2646       /* CFG is no longer maintained up-to-date.  */
2647       free_bb_for_insn ();
2648     }
2649
2650   timevar_push (TV_JUMP);
2651
2652   if (flag_delete_null_pointer_checks || flag_if_conversion)
2653     {
2654       open_dump_file (DFI_null, decl);
2655       find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2656       if (rtl_dump_file)
2657         dump_flow_info (rtl_dump_file);
2658       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2659
2660       /* Try to identify useless null pointer tests and delete them.  */
2661       if (flag_delete_null_pointer_checks)
2662         delete_null_pointer_checks (insns);
2663
2664       timevar_push (TV_IFCVT);
2665       if (flag_if_conversion)
2666         if_convert (0);
2667       timevar_pop (TV_IFCVT);
2668       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2669       close_dump_file (DFI_null, print_rtl_with_bb, insns);
2670     }
2671
2672   /* Jump optimization, and the removal of NULL pointer checks, may
2673      have reduced the number of instructions substantially.  CSE, and
2674      future passes, allocate arrays whose dimensions involve the
2675      maximum instruction UID, so if we can reduce the maximum UID
2676      we'll save big on memory.  */
2677   renumber_insns (rtl_dump_file);
2678   if (optimize)
2679     compute_bb_for_insn (get_max_uid ());
2680   timevar_pop (TV_JUMP);
2681
2682   close_dump_file (DFI_jump, print_rtl_with_bb, insns);
2683
2684   ggc_collect ();
2685
2686   /* Perform common subexpression elimination.
2687      Nonzero value from `cse_main' means that jumps were simplified
2688      and some code may now be unreachable, so do
2689      jump optimization again.  */
2690
2691   if (optimize > 0)
2692     {
2693       open_dump_file (DFI_cse, decl);
2694       if (rtl_dump_file)
2695         dump_flow_info (rtl_dump_file);
2696       timevar_push (TV_CSE);
2697
2698       reg_scan (insns, max_reg_num (), 1);
2699
2700       tem = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2701       if (tem)
2702         rebuild_jump_labels (insns);
2703       purge_all_dead_edges (0);
2704
2705       delete_trivially_dead_insns (insns, max_reg_num ());
2706
2707       /* If we are not running more CSE passes, then we are no longer
2708          expecting CSE to be run.  But always rerun it in a cheap mode.  */
2709       cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
2710
2711       if (tem || optimize > 1)
2712         cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2713       /* Try to identify useless null pointer tests and delete them.  */
2714       if (flag_delete_null_pointer_checks || flag_thread_jumps)
2715         {
2716           timevar_push (TV_JUMP);
2717
2718           if (flag_delete_null_pointer_checks)
2719             delete_null_pointer_checks (insns);
2720           /* CFG is no longer maintained up-to-date.  */
2721           timevar_pop (TV_JUMP);
2722         }
2723
2724       /* The second pass of jump optimization is likely to have
2725          removed a bunch more instructions.  */
2726       renumber_insns (rtl_dump_file);
2727       compute_bb_for_insn (get_max_uid ());
2728
2729       timevar_pop (TV_CSE);
2730       close_dump_file (DFI_cse, print_rtl_with_bb, insns);
2731     }
2732
2733   open_dump_file (DFI_addressof, decl);
2734
2735   purge_addressof (insns);
2736   if (optimize)
2737     purge_all_dead_edges (0);
2738   reg_scan (insns, max_reg_num (), 1);
2739
2740   close_dump_file (DFI_addressof, print_rtl, insns);
2741
2742   ggc_collect ();
2743
2744   /* Perform global cse.  */
2745
2746   if (optimize > 0 && flag_gcse)
2747     {
2748       int save_csb, save_cfj;
2749       int tem2 = 0;
2750
2751       timevar_push (TV_GCSE);
2752       open_dump_file (DFI_gcse, decl);
2753
2754       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2755       tem = gcse_main (insns, rtl_dump_file);
2756       rebuild_jump_labels (insns);
2757       delete_trivially_dead_insns (insns, max_reg_num ());
2758
2759       save_csb = flag_cse_skip_blocks;
2760       save_cfj = flag_cse_follow_jumps;
2761       flag_cse_skip_blocks = flag_cse_follow_jumps = 0;
2762
2763       /* If -fexpensive-optimizations, re-run CSE to clean up things done
2764          by gcse.  */
2765       if (flag_expensive_optimizations)
2766         {
2767           timevar_push (TV_CSE);
2768           reg_scan (insns, max_reg_num (), 1);
2769           tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2770           purge_all_dead_edges (0);
2771           delete_trivially_dead_insns (insns, max_reg_num ());
2772           timevar_pop (TV_CSE);
2773           cse_not_expected = !flag_rerun_cse_after_loop;
2774         }
2775
2776       /* If gcse or cse altered any jumps, rerun jump optimizations to clean
2777          things up.  Then possibly re-run CSE again.  */
2778       while (tem || tem2)
2779         {
2780           tem = tem2 = 0;
2781           timevar_push (TV_JUMP);
2782           rebuild_jump_labels (insns);
2783           cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2784           timevar_pop (TV_JUMP);
2785
2786           if (flag_expensive_optimizations)
2787             {
2788               timevar_push (TV_CSE);
2789               reg_scan (insns, max_reg_num (), 1);
2790               tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2791               purge_all_dead_edges (0);
2792               delete_trivially_dead_insns (insns, max_reg_num ());
2793               timevar_pop (TV_CSE);
2794             }
2795         }
2796
2797       close_dump_file (DFI_gcse, print_rtl_with_bb, insns);
2798       timevar_pop (TV_GCSE);
2799
2800       ggc_collect ();
2801       flag_cse_skip_blocks = save_csb;
2802       flag_cse_follow_jumps = save_cfj;
2803 #ifdef ENABLE_CHECKING
2804       verify_flow_info ();
2805 #endif
2806     }
2807
2808   /* Move constant computations out of loops.  */
2809
2810   if (optimize > 0 && flag_loop_optimize)
2811     {
2812       timevar_push (TV_LOOP);
2813       delete_dead_jumptables ();
2814       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2815       open_dump_file (DFI_loop, decl);
2816       /* CFG is no longer maintained up-to-date.  */
2817       free_bb_for_insn ();
2818
2819       if (flag_rerun_loop_opt)
2820         {
2821           cleanup_barriers ();
2822
2823           /* We only want to perform unrolling once.  */
2824           loop_optimize (insns, rtl_dump_file, LOOP_FIRST_PASS);
2825
2826           /* The first call to loop_optimize makes some instructions
2827              trivially dead.  We delete those instructions now in the
2828              hope that doing so will make the heuristics in loop work
2829              better and possibly speed up compilation.  */
2830           delete_trivially_dead_insns (insns, max_reg_num ());
2831
2832           /* The regscan pass is currently necessary as the alias
2833                   analysis code depends on this information.  */
2834           reg_scan (insns, max_reg_num (), 1);
2835         }
2836       cleanup_barriers ();
2837       loop_optimize (insns, rtl_dump_file,
2838                      (flag_unroll_loops ? LOOP_UNROLL : 0) | LOOP_BCT
2839                      | (flag_prefetch_loop_arrays ? LOOP_PREFETCH : 0));
2840
2841       /* Loop can create trivially dead instructions.  */
2842       delete_trivially_dead_insns (insns, max_reg_num ());
2843       close_dump_file (DFI_loop, print_rtl, insns);
2844       timevar_pop (TV_LOOP);
2845
2846       ggc_collect ();
2847     }
2848
2849   /* Do control and data flow analysis; wrote some of the results to
2850      the dump file.  */
2851
2852   timevar_push (TV_FLOW);
2853   open_dump_file (DFI_cfg, decl);
2854
2855   find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2856   if (rtl_dump_file)
2857     dump_flow_info (rtl_dump_file);
2858   cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
2859                | (flag_thread_jumps ? CLEANUP_THREADING : 0));
2860
2861   /* It may make more sense to mark constant functions after dead code is
2862      eliminated by life_analyzis, but we need to do it early, as -fprofile-arcs
2863      may insert code making function non-constant, but we still must consider
2864      it as constant, otherwise -fbranch-probabilities will not read data back.
2865
2866      life_analyzis rarely eliminates modification of external memory.
2867    */
2868   if (optimize)
2869     mark_constant_function ();
2870
2871   close_dump_file (DFI_cfg, print_rtl_with_bb, insns);
2872
2873   /* Do branch profiling and static profile estimation passes.  */
2874   if (optimize > 0 || profile_arc_flag || flag_test_coverage
2875       || flag_branch_probabilities)
2876     {
2877       struct loops loops;
2878
2879       timevar_push (TV_BRANCH_PROB);
2880       open_dump_file (DFI_bp, decl);
2881       if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
2882         branch_prob ();
2883
2884       /* Discover and record the loop depth at the head of each basic
2885          block.  The loop infrastructure does the real job for us.  */
2886       flow_loops_find (&loops, LOOP_TREE);
2887
2888       /* Estimate using heuristics if no profiling info is available.  */
2889       if (flag_guess_branch_prob)
2890         estimate_probability (&loops);
2891
2892       if (rtl_dump_file)
2893         flow_loops_dump (&loops, rtl_dump_file, NULL, 0);
2894
2895       flow_loops_free (&loops);
2896       close_dump_file (DFI_bp, print_rtl_with_bb, insns);
2897       timevar_pop (TV_BRANCH_PROB);
2898     }
2899
2900   if (optimize > 0)
2901     {
2902       timevar_push (TV_CSE2);
2903       open_dump_file (DFI_cse2, decl);
2904       if (rtl_dump_file)
2905         dump_flow_info (rtl_dump_file);
2906
2907       if (flag_rerun_cse_after_loop)
2908         {
2909           timevar_push (TV_JUMP);
2910
2911           reg_scan (insns, max_reg_num (), 0);
2912
2913           timevar_push (TV_IFCVT);
2914           cleanup_cfg (CLEANUP_EXPENSIVE);
2915           if (flag_if_conversion)
2916             if_convert (0);
2917           timevar_pop(TV_IFCVT);
2918
2919           timevar_pop (TV_JUMP);
2920           /* CFG is no longer maintained up-to-date.  */
2921           reg_scan (insns, max_reg_num (), 0);
2922           tem = cse_main (insns, max_reg_num (), 1, rtl_dump_file);
2923           purge_all_dead_edges (0);
2924           delete_trivially_dead_insns (insns, max_reg_num ());
2925
2926           if (tem)
2927             {
2928               timevar_push (TV_JUMP);
2929               rebuild_jump_labels (insns);
2930               cleanup_cfg (CLEANUP_EXPENSIVE);
2931               timevar_pop (TV_JUMP);
2932             }
2933         }
2934
2935       close_dump_file (DFI_cse2, print_rtl_with_bb, insns);
2936       timevar_pop (TV_CSE2);
2937
2938       ggc_collect ();
2939     }
2940
2941   cse_not_expected = 1;
2942
2943   open_dump_file (DFI_life, decl);
2944   regclass_init ();
2945
2946   check_function_return_warnings ();
2947
2948 #ifdef ENABLE_CHECKING
2949   verify_flow_info ();
2950 #endif
2951   life_analysis (insns, rtl_dump_file, PROP_FINAL);
2952   if (optimize)
2953     cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_UPDATE_LIFE
2954                  | (flag_thread_jumps ? CLEANUP_THREADING : 0));
2955   timevar_pop (TV_FLOW);
2956
2957   no_new_pseudos = 1;
2958
2959   if (warn_uninitialized || extra_warnings)
2960     {
2961       uninitialized_vars_warning (DECL_INITIAL (decl));
2962       if (extra_warnings)
2963         setjmp_args_warning ();
2964     }
2965
2966   if (optimize)
2967     {
2968       clear_bb_flags ();
2969       if (initialize_uninitialized_subregs ())
2970         {
2971           /* Insns were inserted, so things might look a bit different.  */
2972           insns = get_insns ();
2973           update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
2974                                             PROP_LOG_LINKS | PROP_REG_INFO
2975                                             | PROP_DEATH_NOTES);
2976         }
2977     }
2978
2979   close_dump_file (DFI_life, print_rtl_with_bb, insns);
2980
2981   ggc_collect ();
2982
2983   /* If -opt, try combining insns through substitution.  */
2984
2985   if (optimize > 0)
2986     {
2987       int rebuild_jump_labels_after_combine = 0;
2988
2989       timevar_push (TV_COMBINE);
2990       open_dump_file (DFI_combine, decl);
2991
2992       rebuild_jump_labels_after_combine
2993         = combine_instructions (insns, max_reg_num ());
2994
2995       /* Combining insns may have turned an indirect jump into a
2996          direct jump.  Rebuid the JUMP_LABEL fields of jumping
2997          instructions.  */
2998       if (rebuild_jump_labels_after_combine)
2999         {
3000           timevar_push (TV_JUMP);
3001           rebuild_jump_labels (insns);
3002           timevar_pop (TV_JUMP);
3003
3004           cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
3005         }
3006
3007       close_dump_file (DFI_combine, print_rtl_with_bb, insns);
3008       timevar_pop (TV_COMBINE);
3009
3010       ggc_collect ();
3011     }
3012
3013   /* Rerun if-conversion, as combine may have simplified things enough to
3014      now meet sequence length restrictions.  */
3015   if (flag_if_conversion)
3016     {
3017       timevar_push (TV_IFCVT);
3018       open_dump_file (DFI_ce, decl);
3019
3020       no_new_pseudos = 0;
3021       if_convert (1);
3022       no_new_pseudos = 1;
3023
3024       close_dump_file (DFI_ce, print_rtl_with_bb, insns);
3025       timevar_pop (TV_IFCVT);
3026     }
3027
3028   /* Register allocation pre-pass, to reduce number of moves
3029      necessary for two-address machines.  */
3030   if (optimize > 0 && (flag_regmove || flag_expensive_optimizations))
3031     {
3032       timevar_push (TV_REGMOVE);
3033       open_dump_file (DFI_regmove, decl);
3034
3035       regmove_optimize (insns, max_reg_num (), rtl_dump_file);
3036
3037       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
3038       close_dump_file (DFI_regmove, print_rtl_with_bb, insns);
3039       timevar_pop (TV_REGMOVE);
3040
3041       ggc_collect ();
3042     }
3043
3044   /* Do unconditional splitting before register allocation to allow machine
3045      description to add extra information not needed previously.  */
3046   split_all_insns (1);
3047
3048   /* Any of the several passes since flow1 will have munged register
3049      lifetime data a bit.  */
3050   register_life_up_to_date = 0;
3051
3052 #ifdef OPTIMIZE_MODE_SWITCHING
3053   timevar_push (TV_MODE_SWITCH);
3054
3055   no_new_pseudos = 0;
3056   optimize_mode_switching (NULL);
3057   no_new_pseudos = 1;
3058
3059   timevar_pop (TV_MODE_SWITCH);
3060 #endif
3061
3062   timevar_push (TV_SCHED);
3063
3064 #ifdef INSN_SCHEDULING
3065
3066   /* Print function header into sched dump now
3067      because doing the sched analysis makes some of the dump.  */
3068   if (optimize > 0 && flag_schedule_insns)
3069     {
3070       open_dump_file (DFI_sched, decl);
3071
3072       /* Do control and data sched analysis,
3073          and write some of the results to dump file.  */
3074
3075       schedule_insns (rtl_dump_file);
3076
3077       close_dump_file (DFI_sched, print_rtl_with_bb, insns);
3078
3079       /* Register lifetime information was updated as part of verifying
3080          the schedule.  */
3081       register_life_up_to_date = 1;
3082     }
3083 #endif
3084   timevar_pop (TV_SCHED);
3085
3086   ggc_collect ();
3087
3088   /* Determine if the current function is a leaf before running reload
3089      since this can impact optimizations done by the prologue and
3090      epilogue thus changing register elimination offsets.  */
3091   current_function_is_leaf = leaf_function_p ();
3092
3093   timevar_push (TV_LOCAL_ALLOC);
3094   open_dump_file (DFI_lreg, decl);
3095
3096   /* Allocate pseudo-regs that are used only within 1 basic block.
3097
3098      RUN_JUMP_AFTER_RELOAD records whether or not we need to rerun the
3099      jump optimizer after register allocation and reloading are finished.  */
3100
3101   if (! register_life_up_to_date)
3102     recompute_reg_usage (insns, ! optimize_size);
3103
3104   /* Allocate the reg_renumber array.  */
3105   allocate_reg_info (max_regno, FALSE, TRUE);
3106
3107   /* And the reg_equiv_memory_loc array.  */
3108   reg_equiv_memory_loc = (rtx *) xcalloc (max_regno, sizeof (rtx));
3109
3110   allocate_initial_values (reg_equiv_memory_loc);
3111
3112   regclass (insns, max_reg_num (), rtl_dump_file);
3113   rebuild_label_notes_after_reload = local_alloc ();
3114
3115   timevar_pop (TV_LOCAL_ALLOC);
3116
3117   if (dump_file[DFI_lreg].enabled)
3118     {
3119       timevar_push (TV_DUMP);
3120
3121       dump_flow_info (rtl_dump_file);
3122       dump_local_alloc (rtl_dump_file);
3123
3124       close_dump_file (DFI_lreg, print_rtl_with_bb, insns);
3125       timevar_pop (TV_DUMP);
3126     }
3127
3128   ggc_collect ();
3129
3130   timevar_push (TV_GLOBAL_ALLOC);
3131   open_dump_file (DFI_greg, decl);
3132
3133   /* If optimizing, allocate remaining pseudo-regs.  Do the reload
3134      pass fixing up any insns that are invalid.  */
3135
3136   if (optimize)
3137     failure = global_alloc (rtl_dump_file);
3138   else
3139     {
3140       build_insn_chain (insns);
3141       failure = reload (insns, 0);
3142     }
3143
3144   timevar_pop (TV_GLOBAL_ALLOC);
3145
3146   if (dump_file[DFI_greg].enabled)
3147     {
3148       timevar_push (TV_DUMP);
3149
3150       dump_global_regs (rtl_dump_file);
3151
3152       close_dump_file (DFI_greg, print_rtl_with_bb, insns);
3153       timevar_pop (TV_DUMP);
3154     }
3155
3156   if (failure)
3157     goto exit_rest_of_compilation;
3158
3159   ggc_collect ();
3160
3161   open_dump_file (DFI_postreload, decl);
3162
3163   /* Do a very simple CSE pass over just the hard registers.  */
3164   if (optimize > 0)
3165     {
3166       timevar_push (TV_RELOAD_CSE_REGS);
3167       reload_cse_regs (insns);
3168       timevar_pop (TV_RELOAD_CSE_REGS);
3169     }
3170
3171   /* Register allocation and reloading may have turned an indirect jump into
3172      a direct jump.  If so, we must rebuild the JUMP_LABEL fields of
3173      jumping instructions.  */
3174   if (rebuild_label_notes_after_reload)
3175     {
3176       timevar_push (TV_JUMP);
3177
3178       rebuild_jump_labels (insns);
3179       purge_all_dead_edges (0);
3180
3181       timevar_pop (TV_JUMP);
3182     }
3183
3184   close_dump_file (DFI_postreload, print_rtl_with_bb, insns);
3185
3186   /* Re-create the death notes which were deleted during reload.  */
3187   timevar_push (TV_FLOW2);
3188   open_dump_file (DFI_flow2, decl);
3189
3190 #ifdef ENABLE_CHECKING
3191   verify_flow_info ();
3192 #endif
3193
3194   /* If optimizing, then go ahead and split insns now.  */
3195   if (optimize > 0)
3196     split_all_insns (0);
3197
3198   cleanup_cfg (optimize ? CLEANUP_EXPENSIVE : 0);
3199
3200   /* On some machines, the prologue and epilogue code, or parts thereof,
3201      can be represented as RTL.  Doing so lets us schedule insns between
3202      it and the rest of the code and also allows delayed branch
3203      scheduling to operate in the epilogue.  */
3204   thread_prologue_and_epilogue_insns (insns);
3205
3206   if (optimize)
3207     {
3208       life_analysis (insns, rtl_dump_file, PROP_FINAL);
3209       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE
3210                    | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
3211
3212       /* This is kind of a heuristic.  We need to run combine_stack_adjustments
3213          even for machines with possibly nonzero RETURN_POPS_ARGS
3214          and ACCUMULATE_OUTGOING_ARGS.  We expect that only ports having
3215          push instructions will have popping returns.  */
3216 #ifndef PUSH_ROUNDING
3217       if (!ACCUMULATE_OUTGOING_ARGS)
3218 #endif
3219         combine_stack_adjustments ();
3220
3221       ggc_collect ();
3222     }
3223
3224   flow2_completed = 1;
3225
3226   close_dump_file (DFI_flow2, print_rtl_with_bb, insns);
3227   timevar_pop (TV_FLOW2);
3228
3229 #ifdef HAVE_peephole2
3230   if (optimize > 0 && flag_peephole2)
3231     {
3232       timevar_push (TV_PEEPHOLE2);
3233       open_dump_file (DFI_peephole2, decl);
3234
3235       peephole2_optimize (rtl_dump_file);
3236
3237       close_dump_file (DFI_peephole2, print_rtl_with_bb, insns);
3238       timevar_pop (TV_PEEPHOLE2);
3239     }
3240 #endif
3241
3242   if (optimize > 0 && (flag_rename_registers || flag_cprop_registers))
3243     {
3244       timevar_push (TV_RENAME_REGISTERS);
3245       open_dump_file (DFI_rnreg, decl);
3246
3247       if (flag_rename_registers)
3248         regrename_optimize ();
3249       if (flag_cprop_registers)
3250         copyprop_hardreg_forward ();
3251
3252       close_dump_file (DFI_rnreg, print_rtl_with_bb, insns);
3253       timevar_pop (TV_RENAME_REGISTERS);
3254     }
3255
3256   if (flag_if_conversion2)
3257     {
3258       timevar_push (TV_IFCVT2);
3259       open_dump_file (DFI_ce2, decl);
3260
3261       if_convert (1);
3262
3263       close_dump_file (DFI_ce2, print_rtl_with_bb, insns);
3264       timevar_pop (TV_IFCVT2);
3265     }
3266 #ifdef STACK_REGS
3267   if (optimize)
3268     split_all_insns (1);
3269 #endif
3270
3271 #ifdef INSN_SCHEDULING
3272   if (optimize > 0 && flag_schedule_insns_after_reload)
3273     {
3274       timevar_push (TV_SCHED2);
3275       open_dump_file (DFI_sched2, decl);
3276
3277       /* Do control and data sched analysis again,
3278          and write some more of the results to dump file.  */
3279
3280       split_all_insns (1);
3281
3282       schedule_insns (rtl_dump_file);
3283
3284       close_dump_file (DFI_sched2, print_rtl_with_bb, insns);
3285       timevar_pop (TV_SCHED2);
3286
3287       ggc_collect ();
3288     }
3289 #endif
3290
3291 #ifdef LEAF_REGISTERS
3292   current_function_uses_only_leaf_regs
3293     = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
3294 #endif
3295
3296 #ifdef STACK_REGS
3297   timevar_push (TV_REG_STACK);
3298   open_dump_file (DFI_stack, decl);
3299
3300   reg_to_stack (insns, rtl_dump_file);
3301
3302   close_dump_file (DFI_stack, print_rtl_with_bb, insns);
3303   timevar_pop (TV_REG_STACK);
3304
3305   ggc_collect ();
3306 #endif
3307   if (optimize > 0)
3308     {
3309       timevar_push (TV_REORDER_BLOCKS);
3310       open_dump_file (DFI_bbro, decl);
3311
3312       /* Last attempt to optimize CFG, as scheduling, peepholing and insn
3313          splitting possibly introduced more crossjumping oppurtuntities.
3314          Except that we can't actually run crossjumping without running 
3315          another DCE pass, which we can't do after reg-stack.  */
3316       cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK);
3317       if (flag_reorder_blocks)
3318         {
3319           reorder_basic_blocks ();
3320           cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK);
3321         }
3322
3323       close_dump_file (DFI_bbro, print_rtl_with_bb, insns);
3324       timevar_pop (TV_REORDER_BLOCKS);
3325     }
3326   compute_alignments ();
3327
3328   /* CFG is no longer maintained up-to-date.  */
3329   free_bb_for_insn ();
3330
3331   /* If a machine dependent reorganization is needed, call it.  */
3332 #ifdef MACHINE_DEPENDENT_REORG
3333   timevar_push (TV_MACH_DEP);
3334   open_dump_file (DFI_mach, decl);
3335
3336   MACHINE_DEPENDENT_REORG (insns);
3337
3338   close_dump_file (DFI_mach, print_rtl, insns);
3339   timevar_pop (TV_MACH_DEP);
3340
3341   ggc_collect ();
3342 #endif
3343
3344   purge_line_number_notes (insns);
3345   cleanup_barriers ();
3346
3347   /* If a scheduling pass for delayed branches is to be done,
3348      call the scheduling code.  */
3349
3350 #ifdef DELAY_SLOTS
3351   if (optimize > 0 && flag_delayed_branch)
3352     {
3353       timevar_push (TV_DBR_SCHED);
3354       open_dump_file (DFI_dbr, decl);
3355
3356       dbr_schedule (insns, rtl_dump_file);
3357
3358       close_dump_file (DFI_dbr, print_rtl, insns);
3359       timevar_pop (TV_DBR_SCHED);
3360
3361       ggc_collect ();
3362     }
3363 #endif
3364
3365 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
3366   timevar_push (TV_SHORTEN_BRANCH);
3367   split_all_insns_noflow ();
3368   timevar_pop (TV_SHORTEN_BRANCH);
3369 #endif
3370
3371   convert_to_eh_region_ranges ();
3372
3373   /* Shorten branches.  */
3374   timevar_push (TV_SHORTEN_BRANCH);
3375   shorten_branches (get_insns ());
3376   timevar_pop (TV_SHORTEN_BRANCH);
3377
3378   current_function_nothrow = nothrow_function_p ();
3379   if (current_function_nothrow)
3380     /* Now we know that this can't throw; set the flag for the benefit
3381        of other functions later in this translation unit.  */
3382     TREE_NOTHROW (current_function_decl) = 1;
3383
3384   /* Now turn the rtl into assembler code.  */
3385
3386   timevar_push (TV_FINAL);
3387   {
3388     rtx x;
3389     const char *fnname;
3390
3391     /* Get the function's name, as described by its RTL.  This may be
3392        different from the DECL_NAME name used in the source file.  */
3393
3394     x = DECL_RTL (decl);
3395     if (GET_CODE (x) != MEM)
3396       abort ();
3397     x = XEXP (x, 0);
3398     if (GET_CODE (x) != SYMBOL_REF)
3399       abort ();
3400     fnname = XSTR (x, 0);
3401
3402     assemble_start_function (decl, fnname);
3403     final_start_function (insns, asm_out_file, optimize);
3404     final (insns, asm_out_file, optimize, 0);
3405     final_end_function ();
3406
3407 #ifdef IA64_UNWIND_INFO
3408     /* ??? The IA-64 ".handlerdata" directive must be issued before
3409        the ".endp" directive that closes the procedure descriptor.  */
3410     output_function_exception_table ();
3411 #endif
3412
3413     assemble_end_function (decl, fnname);
3414
3415 #ifndef IA64_UNWIND_INFO
3416     /* Otherwise, it feels unclean to switch sections in the middle.  */
3417     output_function_exception_table ();
3418 #endif
3419
3420     if (! quiet_flag)
3421       fflush (asm_out_file);
3422
3423     /* Release all memory allocated by flow.  */
3424     free_basic_block_vars (0);
3425
3426     /* Release all memory held by regsets now.  */
3427     regset_release_memory ();
3428   }
3429   timevar_pop (TV_FINAL);
3430
3431   ggc_collect ();
3432
3433   /* Write DBX symbols if requested.  */
3434
3435   /* Note that for those inline functions where we don't initially
3436      know for certain that we will be generating an out-of-line copy,
3437      the first invocation of this routine (rest_of_compilation) will
3438      skip over this code by doing a `goto exit_rest_of_compilation;'.
3439      Later on, finish_compilation will call rest_of_compilation again
3440      for those inline functions that need to have out-of-line copies
3441      generated.  During that call, we *will* be routed past here.  */
3442
3443   timevar_push (TV_SYMOUT);
3444   (*debug_hooks->function_decl) (decl);
3445   timevar_pop (TV_SYMOUT);
3446
3447  exit_rest_of_compilation:
3448
3449   /* In case the function was not output,
3450      don't leave any temporary anonymous types
3451      queued up for sdb output.  */
3452 #ifdef SDB_DEBUGGING_INFO
3453   if (write_symbols == SDB_DEBUG)
3454     sdbout_types (NULL_TREE);
3455 #endif
3456
3457   reload_completed = 0;
3458   flow2_completed = 0;
3459   no_new_pseudos = 0;
3460
3461   timevar_push (TV_FINAL);
3462
3463   /* Clear out the insn_length contents now that they are no
3464      longer valid.  */
3465   init_insn_lengths ();
3466
3467   /* Clear out the real_constant_chain before some of the rtx's
3468      it runs through become garbage.  */
3469   clear_const_double_mem ();
3470
3471   /* Show no temporary slots allocated.  */
3472   init_temp_slots ();
3473
3474   free_basic_block_vars (0);
3475   free_bb_for_insn ();
3476
3477   timevar_pop (TV_FINAL);
3478
3479   /* Make sure volatile mem refs aren't considered valid operands for
3480      arithmetic insns.  We must call this here if this is a nested inline
3481      function, since the above code leaves us in the init_recog state
3482      (from final.c), and the function context push/pop code does not
3483      save/restore volatile_ok.
3484
3485      ??? Maybe it isn't necessary for expand_start_function to call this
3486      anymore if we do it here?  */
3487
3488   init_recog_no_volatile ();
3489
3490   /* We're done with this function.  Free up memory if we can.  */
3491   free_after_parsing (cfun);
3492   if (! DECL_DEFER_OUTPUT (decl))
3493     {
3494       free_after_compilation (cfun);
3495
3496       /* Clear integrate.c's pointer to the cfun structure we just
3497          destroyed.  */
3498       DECL_SAVED_INSNS (decl) = 0;
3499     }
3500   cfun = 0;
3501
3502   ggc_collect ();
3503
3504   timevar_pop (TV_REST_OF_COMPILATION);
3505 }
3506 \f
3507 static void
3508 display_help ()
3509 {
3510   int undoc;
3511   unsigned long i;
3512   const char *lang;
3513
3514   printf (_("  -ffixed-<register>      Mark <register> as being unavailable to the compiler\n"));
3515   printf (_("  -fcall-used-<register>  Mark <register> as being corrupted by function calls\n"));
3516   printf (_("  -fcall-saved-<register> Mark <register> as being preserved across functions\n"));
3517   printf (_("  -finline-limit=<number> Limits the size of inlined functions to <number>\n"));
3518   printf (_("  -fmessage-length=<number> Limits diagnostics messages lengths to <number> characters per line.  0 suppresses line-wrapping\n"));
3519   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"));
3520
3521   for (i = ARRAY_SIZE (f_options); i--;)
3522     {
3523       const char *description = f_options[i].description;
3524
3525       if (description != NULL && * description != 0)
3526         printf ("  -f%-21s %s\n",
3527                 f_options[i].string, _(description));
3528     }
3529
3530   printf (_("  -O[number]              Set optimization level to [number]\n"));
3531   printf (_("  -Os                     Optimize for space rather than speed\n"));
3532   for (i = LAST_PARAM; i--;)
3533     {
3534       const char *description = compiler_params[i].help;
3535       const int length = 21-strlen(compiler_params[i].option);
3536
3537       if (description != NULL && * description != 0)
3538         printf ("  --param %s=<value>%.*s%s\n",
3539                 compiler_params[i].option,
3540                 length > 0 ? length : 1, "                     ",
3541                 _(description));
3542     }
3543   printf (_("  -pedantic               Issue warnings needed by strict compliance to ISO C\n"));
3544   printf (_("  -pedantic-errors        Like -pedantic except that errors are produced\n"));
3545   printf (_("  -w                      Suppress warnings\n"));
3546   printf (_("  -W                      Enable extra warnings\n"));
3547
3548   for (i = ARRAY_SIZE (W_options); i--;)
3549     {
3550       const char *description = W_options[i].description;
3551
3552       if (description != NULL && * description != 0)
3553         printf ("  -W%-21s %s\n",
3554                 W_options[i].string, _(description));
3555     }
3556
3557   printf (_("  -Wunused                Enable unused warnings\n"));
3558   printf (_("  -Wlarger-than-<number>  Warn if an object is larger than <number> bytes\n"));
3559   printf (_("  -p                      Enable function profiling\n"));
3560 #if defined (BLOCK_PROFILER) || defined (FUNCTION_BLOCK_PROFILER)
3561   printf (_("  -a                      Enable block profiling \n"));
3562 #endif
3563 #if defined (BLOCK_PROFILER) || defined (FUNCTION_BLOCK_PROFILER) || defined FUNCTION_BLOCK_PROFILER_EXIT
3564   printf (_("  -ax                     Enable jump profiling \n"));
3565 #endif
3566   printf (_("  -o <file>               Place output into <file> \n"));
3567   printf (_("\
3568   -G <number>             Put global and static data smaller than <number>\n\
3569                           bytes into a special section (on some targets)\n"));
3570
3571   for (i = ARRAY_SIZE (debug_args); i--;)
3572     {
3573       if (debug_args[i].description != NULL)
3574         printf ("  -g%-21s %s\n",
3575                 debug_args[i].arg, _(debug_args[i].description));
3576     }
3577
3578   printf (_("  -aux-info <file>        Emit declaration info into <file>\n"));
3579   printf (_("  -quiet                  Do not display functions compiled or elapsed time\n"));
3580   printf (_("  -version                Display the compiler's version\n"));
3581   printf (_("  -d[letters]             Enable dumps from specific passes of the compiler\n"));
3582   printf (_("  -dumpbase <file>        Base name to be used for dumps from specific passes\n"));
3583 #if defined INSN_SCHEDULING
3584   printf (_("  -fsched-verbose=<number> Set the verbosity level of the scheduler\n"));
3585 #endif
3586   printf (_("  --help                  Display this information\n"));
3587
3588   undoc = 0;
3589   lang  = "language";
3590
3591   /* Display descriptions of language specific options.
3592      If there is no description, note that there is an undocumented option.
3593      If the description is empty, do not display anything.  (This allows
3594      options to be deliberately undocumented, for whatever reason).
3595      If the option string is missing, then this is a marker, indicating
3596      that the description string is in fact the name of a language, whose
3597      language specific options are to follow.  */
3598
3599   if (ARRAY_SIZE (documented_lang_options) > 1)
3600     {
3601       printf (_("\nLanguage specific options:\n"));
3602
3603       for (i = 0; i < ARRAY_SIZE (documented_lang_options); i++)
3604         {
3605           const char *description = documented_lang_options[i].description;
3606           const char *option      = documented_lang_options[i].option;
3607
3608           if (description == NULL)
3609             {
3610               undoc = 1;
3611
3612               if (extra_warnings)
3613                 printf (_("  %-23.23s [undocumented]\n"), option);
3614             }
3615           else if (*description == 0)
3616             continue;
3617           else if (option == NULL)
3618             {
3619               if (undoc)
3620                 printf
3621                   (_("\nThere are undocumented %s specific options as well.\n"),
3622                         lang);
3623               undoc = 0;
3624
3625               printf (_("\n Options for %s:\n"), description);
3626
3627               lang = description;
3628             }
3629           else
3630             printf ("  %-23.23s %s\n", option, _(description));
3631         }
3632     }
3633
3634   if (undoc)
3635     printf (_("\nThere are undocumented %s specific options as well.\n"),
3636             lang);
3637
3638   display_target_options ();
3639 }
3640
3641 static void
3642 display_target_options ()
3643 {
3644   int undoc, i;
3645   static bool displayed = false;
3646
3647   /* Avoid double printing for --help --target-help.  */
3648   if (displayed)
3649     return;
3650   displayed = true;
3651
3652   if (ARRAY_SIZE (target_switches) > 1
3653 #ifdef TARGET_OPTIONS
3654       || ARRAY_SIZE (target_options) > 1
3655 #endif
3656       )
3657     {
3658       int doc = 0;
3659
3660       undoc = 0;
3661
3662       printf (_("\nTarget specific options:\n"));
3663
3664       for (i = ARRAY_SIZE (target_switches); i--;)
3665         {
3666           const char *option      = target_switches[i].name;
3667           const char *description = target_switches[i].description;
3668
3669           if (option == NULL || *option == 0)
3670             continue;
3671           else if (description == NULL)
3672             {
3673               undoc = 1;
3674
3675               if (extra_warnings)
3676                 printf (_("  -m%-23.23s [undocumented]\n"), option);
3677             }
3678           else if (* description != 0)
3679             doc += printf ("  -m%-23.23s %s\n", option, _(description));
3680         }
3681
3682 #ifdef TARGET_OPTIONS
3683       for (i = ARRAY_SIZE (target_options); i--;)
3684         {
3685           const char *option      = target_options[i].prefix;
3686           const char *description = target_options[i].description;
3687
3688           if (option == NULL || *option == 0)
3689             continue;
3690           else if (description == NULL)
3691             {
3692               undoc = 1;
3693
3694               if (extra_warnings)
3695                 printf (_("  -m%-23.23s [undocumented]\n"), option);
3696             }
3697           else if (* description != 0)
3698             doc += printf ("  -m%-23.23s %s\n", option, _(description));
3699         }
3700 #endif
3701       if (undoc)
3702         {
3703           if (doc)
3704             printf (_("\nThere are undocumented target specific options as well.\n"));
3705           else
3706             printf (_("  They exist, but they are not documented.\n"));
3707         }
3708     }
3709 }
3710 \f
3711 /* Parse a -d... command line switch.  */
3712
3713 static void
3714 decode_d_option (arg)
3715      const char *arg;
3716 {
3717   int i, c, matched;
3718
3719   while (*arg)
3720     switch (c = *arg++)
3721       {
3722       case 'a':
3723         for (i = 0; i < (int) DFI_MAX; ++i)
3724           dump_file[i].enabled = 1;
3725         break;
3726       case 'A':
3727         flag_debug_asm = 1;
3728         break;
3729       case 'p':
3730         flag_print_asm_name = 1;
3731         break;
3732       case 'P':
3733         flag_dump_rtl_in_asm = 1;
3734         flag_print_asm_name = 1;
3735         break;
3736       case 'v':
3737         graph_dump_format = vcg;
3738         break;
3739       case 'x':
3740         rtl_dump_and_exit = 1;
3741         break;
3742       case 'y':
3743         set_yydebug = 1;
3744         break;
3745       case 'D': /* These are handled by the preprocessor.  */
3746       case 'I':
3747         break;
3748
3749       default:
3750         matched = 0;
3751         for (i = 0; i < (int) DFI_MAX; ++i)
3752           if (c == dump_file[i].debug_switch)
3753             {
3754               dump_file[i].enabled = 1;
3755               matched = 1;
3756             }
3757
3758         if (! matched)
3759           warning ("unrecognized gcc debugging option: %c", c);
3760         break;
3761       }
3762 }
3763
3764 /* Parse a -f... command line switch.  ARG is the value after the -f.
3765    It is safe to access 'ARG - 2' to generate the full switch name.
3766    Return the number of strings consumed.  */
3767
3768 static int
3769 decode_f_option (arg)
3770      const char *arg;
3771 {
3772   int j;
3773   const char *option_value = NULL;
3774
3775   /* Search for the option in the table of binary f options.  */
3776   for (j = ARRAY_SIZE (f_options); j--;)
3777     {
3778       if (!strcmp (arg, f_options[j].string))
3779         {
3780           *f_options[j].variable = f_options[j].on_value;
3781           return 1;
3782         }
3783
3784       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
3785           && ! strcmp (arg + 3, f_options[j].string))
3786         {
3787           *f_options[j].variable = ! f_options[j].on_value;
3788           return 1;
3789         }
3790     }
3791
3792   if (!strcmp (arg, "fast-math"))
3793     set_fast_math_flags ();
3794   else if (!strcmp (arg, "no-fast-math"))
3795     set_no_fast_math_flags ();
3796   else if ((option_value = skip_leading_substring (arg, "inline-limit-"))
3797            || (option_value = skip_leading_substring (arg, "inline-limit=")))
3798     {
3799       int val =
3800         read_integral_parameter (option_value, arg - 2,
3801                                  MAX_INLINE_INSNS);
3802       set_param_value ("max-inline-insns", val);
3803     }
3804 #ifdef INSN_SCHEDULING
3805   else if ((option_value = skip_leading_substring (arg, "sched-verbose=")))
3806     fix_sched_param ("verbose", option_value);
3807 #endif
3808   else if ((option_value = skip_leading_substring (arg, "fixed-")))
3809     fix_register (option_value, 1, 1);
3810   else if ((option_value = skip_leading_substring (arg, "call-used-")))
3811     fix_register (option_value, 0, 1);
3812   else if ((option_value = skip_leading_substring (arg, "call-saved-")))
3813     fix_register (option_value, 0, 0);
3814   else if ((option_value = skip_leading_substring (arg, "align-loops=")))
3815     align_loops = read_integral_parameter (option_value, arg - 2, align_loops);
3816   else if ((option_value = skip_leading_substring (arg, "align-functions=")))
3817     align_functions
3818       = read_integral_parameter (option_value, arg - 2, align_functions);
3819   else if ((option_value = skip_leading_substring (arg, "align-jumps=")))
3820     align_jumps = read_integral_parameter (option_value, arg - 2, align_jumps);
3821   else if ((option_value = skip_leading_substring (arg, "align-labels=")))
3822     align_labels
3823       = read_integral_parameter (option_value, arg - 2, align_labels);
3824   else if ((option_value
3825             = skip_leading_substring (arg, "stack-limit-register=")))
3826     {
3827       int reg = decode_reg_name (option_value);
3828       if (reg < 0)
3829         error ("unrecognized register name `%s'", option_value);
3830       else
3831         stack_limit_rtx = gen_rtx_REG (Pmode, reg);
3832     }
3833   else if ((option_value
3834             = skip_leading_substring (arg, "stack-limit-symbol=")))
3835     {
3836       const char *nm;
3837       nm = ggc_strdup (option_value);
3838       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, nm);
3839     }
3840   else if ((option_value
3841             = skip_leading_substring (arg, "message-length=")))
3842     output_set_maximum_length
3843       (&global_dc->buffer, read_integral_parameter
3844        (option_value, arg - 2, diagnostic_line_cutoff (global_dc)));
3845   else if ((option_value
3846             = skip_leading_substring (arg, "diagnostics-show-location=")))
3847     {
3848       if (!strcmp (option_value, "once"))
3849         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
3850       else if (!strcmp (option_value, "every-line"))
3851         diagnostic_prefixing_rule (global_dc)
3852           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
3853       else
3854         error ("unrecognized option `%s'", arg - 2);
3855     }
3856   else if (!strcmp (arg, "no-stack-limit"))
3857     stack_limit_rtx = NULL_RTX;
3858   else if (!strcmp (arg, "preprocessed"))
3859     /* Recognise this switch but do nothing.  This prevents warnings
3860        about an unrecognized switch if cpplib has not been linked in.  */
3861     ;
3862   else
3863     return 0;
3864
3865   return 1;
3866 }
3867
3868 /* Parse a -W... command line switch.  ARG is the value after the -W.
3869    It is safe to access 'ARG - 2' to generate the full switch name.
3870    Return the number of strings consumed.  */
3871
3872 static int
3873 decode_W_option (arg)
3874      const char *arg;
3875 {
3876   const char *option_value = NULL;
3877   int j;
3878
3879   /* Search for the option in the table of binary W options.  */
3880
3881   for (j = ARRAY_SIZE (W_options); j--;)
3882     {
3883       if (!strcmp (arg, W_options[j].string))
3884         {
3885           *W_options[j].variable = W_options[j].on_value;
3886           return 1;
3887         }
3888
3889       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
3890           && ! strcmp (arg + 3, W_options[j].string))
3891         {
3892           *W_options[j].variable = ! W_options[j].on_value;
3893           return 1;
3894         }
3895     }
3896
3897   if ((option_value = skip_leading_substring (arg, "id-clash-")))
3898     warning ("-Wid-clash-LEN is no longer supported");
3899   else if ((option_value = skip_leading_substring (arg, "larger-than-")))
3900     {
3901       larger_than_size = read_integral_parameter (option_value, arg - 2, -1);
3902
3903       warn_larger_than = larger_than_size != -1;
3904     }
3905   else if (!strcmp (arg, "unused"))
3906     {
3907       set_Wunused (1);
3908     }
3909   else if (!strcmp (arg, "no-unused"))
3910     {
3911       set_Wunused (0);
3912     }
3913   else
3914     return 0;
3915
3916   return 1;
3917 }
3918
3919 /* Parse a -g... command line switch.  ARG is the value after the -g.
3920    It is safe to access 'ARG - 2' to generate the full switch name.
3921    Return the number of strings consumed.  */
3922
3923 static int
3924 decode_g_option (arg)
3925      const char *arg;
3926 {
3927   static unsigned level=0;
3928   /* A lot of code assumes write_symbols == NO_DEBUG if the
3929      debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
3930      of what debugging type has been selected).  This records the
3931      selected type.  It is an error to specify more than one
3932      debugging type.  */
3933   static enum debug_info_type selected_debug_type = NO_DEBUG;
3934   /* Non-zero if debugging format has been explicitly set.
3935      -g and -ggdb don't explicitly set the debugging format so
3936      -gdwarf -g3 is equivalent to -gdwarf3.  */
3937   static int type_explicitly_set_p = 0;
3938   /* Indexed by enum debug_info_type.  */
3939   static const char *const debug_type_names[] =
3940   {
3941     "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff", "vms"
3942   };
3943
3944   /* The maximum admissible debug level value.  */
3945   static const unsigned max_debug_level = 3;
3946
3947   /* Look up ARG in the table.  */
3948   for (da = debug_args; da->arg; da++)
3949     {
3950       const int da_len = strlen (da->arg);
3951
3952       if (da_len == 0 || ! strncmp (arg, da->arg, da_len))
3953         {
3954           enum debug_info_type type = da->debug_type;
3955           const char *p = arg + da_len;
3956
3957           if (*p && ! ISDIGIT (*p))
3958             continue;
3959
3960           /* A debug flag without a level defaults to level 2.
3961              Note we do not want to call read_integral_parameter
3962              for that case since it will call atoi which
3963              will return zero.
3964
3965              ??? We may want to generalize the interface to
3966              read_integral_parameter to better handle this case
3967              if this case shows up often.  */
3968           if (*p)
3969             level = read_integral_parameter (p, 0, max_debug_level + 1);
3970           else
3971             level = (level == 0) ? 2 : level;
3972
3973           if (da_len > 1 && *p && !strncmp (arg, "dwarf", da_len))
3974             {
3975               error ("use -gdwarf -g%d for DWARF v1, level %d",
3976                      level, level);
3977               if (level == 2)
3978                 error ("use -gdwarf-2   for DWARF v2");
3979             }
3980
3981           if (level > max_debug_level)
3982             {
3983               warning ("\
3984 ignoring option `%s' due to invalid debug level specification",
3985                        arg - 2);
3986               level = debug_info_level;
3987             }
3988
3989           if (type == NO_DEBUG)
3990             {
3991               type = PREFERRED_DEBUGGING_TYPE;
3992
3993               if (da_len > 1 && strncmp (arg, "gdb", da_len) == 0)
3994                 {
3995 #ifdef DWARF2_DEBUGGING_INFO
3996                   type = DWARF2_DEBUG;
3997 #else
3998 #ifdef DBX_DEBUGGING_INFO
3999                   type = DBX_DEBUG;
4000 #endif
4001 #endif
4002                 }
4003             }
4004
4005           if (type == NO_DEBUG)
4006             warning ("`%s': unknown or unsupported -g option", arg - 2);
4007
4008           /* Does it conflict with an already selected type?  */
4009           if (type_explicitly_set_p
4010               /* -g/-ggdb don't conflict with anything.  */
4011               && da->debug_type != NO_DEBUG
4012               && type != selected_debug_type)
4013             warning ("`%s' ignored, conflicts with `-g%s'",
4014                      arg - 2, debug_type_names[(int) selected_debug_type]);
4015           else
4016             {
4017               /* If the format has already been set, -g/-ggdb
4018                  only change the debug level.  */
4019               if (type_explicitly_set_p && da->debug_type == NO_DEBUG)
4020                 /* Don't change debugging type.  */
4021                 ;
4022               else
4023                 {
4024                   selected_debug_type = type;
4025                   type_explicitly_set_p = da->debug_type != NO_DEBUG;
4026                 }
4027
4028               write_symbols = (level == 0
4029                                ? NO_DEBUG
4030                                : selected_debug_type);
4031               use_gnu_debug_info_extensions = da->use_extensions_p;
4032               debug_info_level = (enum debug_info_level) level;
4033             }
4034
4035           break;
4036         }
4037     }
4038
4039   if (! da->arg)
4040     return 0;
4041
4042   return 1;
4043 }
4044
4045 /* Decode the first argument in the argv as a language-independent option.
4046    Return the number of strings consumed.  */
4047
4048 static unsigned int
4049 independent_decode_option (argc, argv)
4050      int argc;
4051      char **argv;
4052 {
4053   char *arg = argv[0];
4054
4055   if (arg[0] != '-' || arg[1] == 0)
4056     {
4057       if (arg[0] == '+')
4058         return 0;
4059
4060       filename = arg;
4061
4062       return 1;
4063     }
4064
4065   arg++;
4066
4067   if (!strcmp (arg, "-help"))
4068     {
4069       display_help ();
4070       exit_after_options = 1;
4071     }
4072
4073   if (!strcmp (arg, "-target-help"))
4074     {
4075       display_target_options ();
4076       exit_after_options = 1;
4077     }
4078
4079   if (!strcmp (arg, "-version"))
4080     {
4081       print_version (stderr, "");
4082       exit_after_options = 1;
4083     }
4084
4085   /* Handle '--param <name>=<value>'.  */
4086   if (strcmp (arg, "-param") == 0)
4087     {
4088       char *equal;
4089
4090       if (argc == 1)
4091         {
4092           error ("-param option missing argument");
4093           return 1;
4094         }
4095
4096       /* Get the '<name>=<value>' parameter.  */
4097       arg = argv[1];
4098       /* Look for the `='.  */
4099       equal = strchr (arg, '=');
4100       if (!equal)
4101         error ("invalid --param option: %s", arg);
4102       else
4103         {
4104           int val;
4105
4106           /* Zero out the `=' sign so that we get two separate strings.  */
4107           *equal = '\0';
4108           /* Figure out what value is specified.  */
4109           val = read_integral_parameter (equal + 1, NULL, INVALID_PARAM_VAL);
4110           if (val != INVALID_PARAM_VAL)
4111             set_param_value (arg, val);
4112           else
4113             error ("invalid parameter value `%s'", equal + 1);
4114         }
4115
4116       return 2;
4117     }
4118
4119   if (*arg == 'Y')
4120     arg++;
4121
4122   switch (*arg)
4123     {
4124     default:
4125       return 0;
4126
4127     case 'O':
4128       /* Already been treated in main (). Do nothing.  */
4129       break;
4130
4131     case 'm':
4132       set_target_switch (arg + 1);
4133       break;
4134
4135     case 'f':
4136       return decode_f_option (arg + 1);
4137
4138     case 'g':
4139       return decode_g_option (arg + 1);
4140
4141     case 'd':
4142       if (!strcmp (arg, "dumpbase"))
4143         {
4144           if (argc == 1)
4145             return 0;
4146
4147           dump_base_name = argv[1];
4148           return 2;
4149         }
4150       else
4151         decode_d_option (arg + 1);
4152       break;
4153
4154     case 'p':
4155       if (!strcmp (arg, "pedantic"))
4156         pedantic = 1;
4157       else if (!strcmp (arg, "pedantic-errors"))
4158         flag_pedantic_errors = pedantic = 1;
4159       else if (arg[1] == 0)
4160         profile_flag = 1;
4161       else
4162         return 0;
4163       break;
4164
4165     case 'q':
4166       if (!strcmp (arg, "quiet"))
4167         quiet_flag = 1;
4168       else
4169         return 0;
4170       break;
4171
4172     case 'v':
4173       if (!strcmp (arg, "version"))
4174         version_flag = 1;
4175       else
4176         return 0;
4177       break;
4178
4179     case 'w':
4180       if (arg[1] == 0)
4181         inhibit_warnings = 1;
4182       else
4183         return 0;
4184       break;
4185
4186     case 'W':
4187       if (arg[1] == 0)
4188         {
4189           extra_warnings = 1;
4190           /* We save the value of warn_uninitialized, since if they put
4191              -Wuninitialized on the command line, we need to generate a
4192              warning about not using it without also specifying -O.  */
4193           if (warn_uninitialized != 1)
4194             warn_uninitialized = 2;
4195         }
4196       else
4197         return decode_W_option (arg + 1);
4198       break;
4199
4200     case 'a':
4201       if (!strncmp (arg, "aux-info", 8))
4202         {
4203           if (arg[8] == '\0')
4204             {
4205               if (argc == 1)
4206                 return 0;
4207
4208               aux_info_file_name = argv[1];
4209               flag_gen_aux_info = 1;
4210               return 2;
4211             }
4212           else if (arg[8] == '=')
4213             {
4214               aux_info_file_name = arg + 9;
4215               flag_gen_aux_info = 1;
4216             }
4217           else
4218             return 0;
4219         }
4220       else
4221         return 0;
4222       break;
4223
4224     case 'o':
4225       if (arg[1] == 0)
4226         {
4227           if (argc == 1)
4228             return 0;
4229
4230           asm_file_name = argv[1];
4231           return 2;
4232         }
4233       return 0;
4234
4235     case 'G':
4236       {
4237         int g_switch_val;
4238         int return_val;
4239
4240         if (arg[1] == 0)
4241           {
4242             if (argc == 1)
4243               return 0;
4244
4245             g_switch_val = read_integral_parameter (argv[1], 0, -1);
4246             return_val = 2;
4247           }
4248         else
4249           {
4250             g_switch_val = read_integral_parameter (arg + 1, 0, -1);
4251             return_val = 1;
4252           }
4253
4254         if (g_switch_val == -1)
4255           return_val = 0;
4256         else
4257           {
4258             g_switch_set = TRUE;
4259             g_switch_value = g_switch_val;
4260           }
4261
4262         return return_val;
4263       }
4264     }
4265
4266   return 1;
4267 }
4268 \f
4269 /* Decode -m switches.  */
4270 /* Decode the switch -mNAME.  */
4271
4272 static void
4273 set_target_switch (name)
4274      const char *name;
4275 {
4276   size_t j;
4277   int valid_target_option = 0;
4278
4279   for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4280     if (!strcmp (target_switches[j].name, name))
4281       {
4282         if (target_switches[j].value < 0)
4283           target_flags &= ~-target_switches[j].value;
4284         else
4285           target_flags |= target_switches[j].value;
4286         valid_target_option = 1;
4287       }
4288
4289 #ifdef TARGET_OPTIONS
4290   if (!valid_target_option)
4291     for (j = 0; j < ARRAY_SIZE (target_options); j++)
4292       {
4293         int len = strlen (target_options[j].prefix);
4294         if (!strncmp (target_options[j].prefix, name, len))
4295           {
4296             *target_options[j].variable = name + len;
4297             valid_target_option = 1;
4298           }
4299       }
4300 #endif
4301
4302   if (!valid_target_option)
4303     error ("invalid option `%s'", name);
4304 }
4305 \f
4306 /* Print version information to FILE.
4307    Each line begins with INDENT (for the case where FILE is the
4308    assembler output file).  */
4309
4310 static void
4311 print_version (file, indent)
4312      FILE *file;
4313      const char *indent;
4314 {
4315 #ifndef __VERSION__
4316 #define __VERSION__ "[?]"
4317 #endif
4318   fnotice (file,
4319 #ifdef __GNUC__
4320            "%s%s%s version %s (%s)\n%s\tcompiled by GNU C version %s.\n"
4321 #else
4322            "%s%s%s version %s (%s) compiled by CC.\n"
4323 #endif
4324            , indent, *indent != 0 ? " " : "",
4325            lang_hooks.name, version_string, TARGET_NAME,
4326            indent, __VERSION__);
4327 }
4328
4329 /* Print an option value and return the adjusted position in the line.
4330    ??? We don't handle error returns from fprintf (disk full); presumably
4331    other code will catch a disk full though.  */
4332
4333 static int
4334 print_single_switch (file, pos, max, indent, sep, term, type, name)
4335      FILE *file;
4336      int pos, max;
4337      const char *indent, *sep, *term, *type, *name;
4338 {
4339   /* The ultrix fprintf returns 0 on success, so compute the result we want
4340      here since we need it for the following test.  */
4341   int len = strlen (sep) + strlen (type) + strlen (name);
4342
4343   if (pos != 0
4344       && pos + len > max)
4345     {
4346       fprintf (file, "%s", term);
4347       pos = 0;
4348     }
4349   if (pos == 0)
4350     {
4351       fprintf (file, "%s", indent);
4352       pos = strlen (indent);
4353     }
4354   fprintf (file, "%s%s%s", sep, type, name);
4355   pos += len;
4356   return pos;
4357 }
4358
4359 /* Print active target switches to FILE.
4360    POS is the current cursor position and MAX is the size of a "line".
4361    Each line begins with INDENT and ends with TERM.
4362    Each switch is separated from the next by SEP.  */
4363
4364 static void
4365 print_switch_values (file, pos, max, indent, sep, term)
4366      FILE *file;
4367      int pos, max;
4368      const char *indent, *sep, *term;
4369 {
4370   size_t j;
4371   char **p;
4372
4373   /* Print the options as passed.  */
4374
4375   pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
4376                              _("options passed: "), "");
4377
4378   for (p = &save_argv[1]; *p != NULL; p++)
4379     if (**p == '-')
4380       {
4381         /* Ignore these.  */
4382         if (strcmp (*p, "-o") == 0)
4383           {
4384             if (p[1] != NULL)
4385               p++;
4386             continue;
4387           }
4388         if (strcmp (*p, "-quiet") == 0)
4389           continue;
4390         if (strcmp (*p, "-version") == 0)
4391           continue;
4392         if ((*p)[1] == 'd')
4393           continue;
4394
4395         pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
4396       }
4397   if (pos > 0)
4398     fprintf (file, "%s", term);
4399
4400   /* Print the -f and -m options that have been enabled.
4401      We don't handle language specific options but printing argv
4402      should suffice.  */
4403
4404   pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
4405                              _("options enabled: "), "");
4406
4407   for (j = 0; j < ARRAY_SIZE (f_options); j++)
4408     if (*f_options[j].variable == f_options[j].on_value)
4409       pos = print_single_switch (file, pos, max, indent, sep, term,
4410                                  "-f", f_options[j].string);
4411
4412   /* Print target specific options.  */
4413
4414   for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4415     if (target_switches[j].name[0] != '\0'
4416         && target_switches[j].value > 0
4417         && ((target_switches[j].value & target_flags)
4418             == target_switches[j].value))
4419       {
4420         pos = print_single_switch (file, pos, max, indent, sep, term,
4421                                    "-m", target_switches[j].name);
4422       }
4423
4424 #ifdef TARGET_OPTIONS
4425   for (j = 0; j < ARRAY_SIZE (target_options); j++)
4426     if (*target_options[j].variable != NULL)
4427       {
4428         char prefix[256];
4429         sprintf (prefix, "-m%s", target_options[j].prefix);
4430         pos = print_single_switch (file, pos, max, indent, sep, term,
4431                                    prefix, *target_options[j].variable);
4432       }
4433 #endif
4434
4435   fprintf (file, "%s", term);
4436 }
4437 \f
4438 /* Open assembly code output file.  Do this even if -fsyntax-only is
4439    on, because then the driver will have provided the name of a
4440    temporary file or bit bucket for us.  NAME is the file specified on
4441    the command line, possibly NULL.  */
4442 static void
4443 init_asm_output (name)
4444      const char *name;
4445 {
4446   if (name == NULL && asm_file_name == 0)
4447     asm_out_file = stdout;
4448   else
4449     {
4450       if (asm_file_name == 0)
4451         {
4452           int len = strlen (dump_base_name);
4453           char *dumpname = (char *) xmalloc (len + 6);
4454           memcpy (dumpname, dump_base_name, len + 1);
4455           strip_off_ending (dumpname, len);
4456           strcat (dumpname, ".s");
4457           asm_file_name = dumpname;
4458         }
4459       if (!strcmp (asm_file_name, "-"))
4460         asm_out_file = stdout;
4461       else
4462         asm_out_file = fopen (asm_file_name, "w");
4463       if (asm_out_file == 0)
4464         fatal_io_error ("can't open %s for writing", asm_file_name);
4465     }
4466
4467 #ifdef IO_BUFFER_SIZE
4468   setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
4469            _IOFBF, IO_BUFFER_SIZE);
4470 #endif
4471
4472   if (!flag_syntax_only)
4473     {
4474 #ifdef ASM_FILE_START
4475       ASM_FILE_START (asm_out_file);
4476 #endif
4477
4478 #ifdef ASM_COMMENT_START
4479       if (flag_verbose_asm)
4480         {
4481           /* Print the list of options in effect.  */
4482           print_version (asm_out_file, ASM_COMMENT_START);
4483           print_switch_values (asm_out_file, 0, MAX_LINE,
4484                                ASM_COMMENT_START, " ", "\n");
4485           /* Add a blank line here so it appears in assembler output but not
4486              screen output.  */
4487           fprintf (asm_out_file, "\n");
4488         }
4489 #endif
4490     }
4491 }
4492 \f
4493 /* Initialization of the front end environment, before command line
4494    options are parsed.  Signal handlers, internationalization etc.
4495    ARGV0 is main's argv[0].  */
4496 static void
4497 general_init (argv0)
4498      char *argv0;
4499 {
4500   char *p;
4501
4502   p = argv0 + strlen (argv0);
4503   while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
4504     --p;
4505   progname = p;
4506
4507   xmalloc_set_program_name (progname);
4508
4509   gcc_init_libintl ();
4510
4511   /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
4512 #ifdef SIGSEGV
4513   signal (SIGSEGV, crash_signal);
4514 #endif
4515 #ifdef SIGILL
4516   signal (SIGILL, crash_signal);
4517 #endif
4518 #ifdef SIGBUS
4519   signal (SIGBUS, crash_signal);
4520 #endif
4521 #ifdef SIGABRT
4522   signal (SIGABRT, crash_signal);
4523 #endif
4524 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
4525   signal (SIGIOT, crash_signal);
4526 #endif
4527 #ifdef SIGFPE
4528   signal (SIGFPE, crash_signal);
4529 #endif
4530
4531   /* Initialize the diagnostics reporting machinery, so option parsing
4532      can give warnings and errors.  */
4533   diagnostic_initialize (global_dc);
4534 }
4535 \f
4536 /* Parse command line options and set default flag values, called
4537    after language-independent option-independent initialization.  Do
4538    minimal options processing.  Outputting diagnostics is OK, but GC
4539    and identifier hashtables etc. are not initialized yet.  */
4540 static void
4541 parse_options_and_default_flags (argc, argv)
4542      int argc;
4543      char **argv;
4544 {
4545   int i;
4546
4547   /* Save in case md file wants to emit args as a comment.  */
4548   save_argc = argc;
4549   save_argv = argv;
4550
4551   /* Initialize register usage now so switches may override.  */
4552   init_reg_sets ();
4553
4554   /* Register the language-independent parameters.  */
4555   add_params (lang_independent_params, LAST_PARAM);
4556
4557   /* Perform language-specific options initialization.  */
4558   (*lang_hooks.init_options) ();
4559
4560   /* Scan to see what optimization level has been specified.  That will
4561      determine the default value of many flags.  */
4562   for (i = 1; i < argc; i++)
4563     {
4564       if (!strcmp (argv[i], "-O"))
4565         {
4566           optimize = 1;
4567           optimize_size = 0;
4568         }
4569       else if (argv[i][0] == '-' && argv[i][1] == 'O')
4570         {
4571           /* Handle -Os, -O2, -O3, -O69, ...  */
4572           char *p = &argv[i][2];
4573
4574           if ((p[0] == 's') && (p[1] == 0))
4575             {
4576               optimize_size = 1;
4577
4578               /* Optimizing for size forces optimize to be 2.  */
4579               optimize = 2;
4580             }
4581           else
4582             {
4583               const int optimize_val = read_integral_parameter (p, p - 2, -1);
4584               if (optimize_val != -1)
4585                 {
4586                   optimize = optimize_val;
4587                   optimize_size = 0;
4588                 }
4589             }
4590         }
4591     }
4592
4593   if (!optimize)
4594     {
4595       flag_merge_constants = 0;
4596     }
4597
4598   if (optimize >= 1)
4599     {
4600       flag_defer_pop = 1;
4601       flag_thread_jumps = 1;
4602 #ifdef DELAY_SLOTS
4603       flag_delayed_branch = 1;
4604 #endif
4605 #ifdef CAN_DEBUG_WITHOUT_FP
4606       flag_omit_frame_pointer = 1;
4607 #endif
4608       flag_guess_branch_prob = 1;
4609       flag_cprop_registers = 1;
4610       flag_loop_optimize = 1;
4611       flag_crossjumping = 1;
4612       flag_if_conversion = 1;
4613       flag_if_conversion2 = 1;
4614     }
4615
4616   if (optimize >= 2)
4617     {
4618       flag_optimize_sibling_calls = 1;
4619       flag_cse_follow_jumps = 1;
4620       flag_cse_skip_blocks = 1;
4621       flag_gcse = 1;
4622       flag_expensive_optimizations = 1;
4623       flag_strength_reduce = 1;
4624       flag_rerun_cse_after_loop = 1;
4625       flag_rerun_loop_opt = 1;
4626       flag_caller_saves = 1;
4627       flag_force_mem = 1;
4628       flag_peephole2 = 1;
4629 #ifdef INSN_SCHEDULING
4630       flag_schedule_insns = 1;
4631       flag_schedule_insns_after_reload = 1;
4632 #endif
4633       flag_regmove = 1;
4634       flag_strict_aliasing = 1;
4635       flag_delete_null_pointer_checks = 1;
4636       flag_reorder_blocks = 1;
4637     }
4638
4639   if (optimize >= 3)
4640     {
4641       flag_inline_functions = 1;
4642       flag_rename_registers = 1;
4643     }
4644
4645   if (optimize < 2 || optimize_size)
4646     {
4647       align_loops = 1;
4648       align_jumps = 1;
4649       align_labels = 1;
4650       align_functions = 1;
4651     }
4652
4653   /* Initialize whether `char' is signed.  */
4654   flag_signed_char = DEFAULT_SIGNED_CHAR;
4655 #ifdef DEFAULT_SHORT_ENUMS
4656   /* Initialize how much space enums occupy, by default.  */
4657   flag_short_enums = DEFAULT_SHORT_ENUMS;
4658 #endif
4659
4660   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
4661      modify it.  */
4662   target_flags = 0;
4663   set_target_switch ("");
4664
4665   /* Unwind tables are always present in an ABI-conformant IA-64
4666      object file, so the default should be ON.  */
4667 #ifdef IA64_UNWIND_INFO
4668   flag_unwind_tables = IA64_UNWIND_INFO;
4669 #endif
4670
4671 #ifdef OPTIMIZATION_OPTIONS
4672   /* Allow default optimizations to be specified on a per-machine basis.  */
4673   OPTIMIZATION_OPTIONS (optimize, optimize_size);
4674 #endif
4675
4676   /* Perform normal command line switch decoding.  */
4677   for (i = 1; i < argc;)
4678     {
4679       int lang_processed;
4680       int indep_processed;
4681
4682       /* Give the language a chance to decode the option for itself.  */
4683       lang_processed = (*lang_hooks.decode_option) (argc - i, argv + i);
4684
4685       if (lang_processed >= 0)
4686         /* Now see if the option also has a language independent meaning.
4687            Some options are both language specific and language independent,
4688            eg --help.  */
4689         indep_processed = independent_decode_option (argc - i, argv + i);
4690       else
4691         {
4692           lang_processed = -lang_processed;
4693           indep_processed = 0;
4694         }
4695
4696       if (lang_processed || indep_processed)
4697         i += MAX (lang_processed, indep_processed);
4698       else
4699         {
4700           const char *option = NULL;
4701           const char *lang = NULL;
4702           unsigned int j;
4703
4704           /* It is possible that the command line switch is not valid for the
4705              current language, but it is valid for another language.  In order
4706              to be compatible with previous versions of the compiler (which
4707              did not issue an error message in this case) we check for this
4708              possibility here.  If we do find a match, then if extra_warnings
4709              is set we generate a warning message, otherwise we will just
4710              ignore the option.  */
4711           for (j = 0; j < ARRAY_SIZE (documented_lang_options); j++)
4712             {
4713               option = documented_lang_options[j].option;
4714
4715               if (option == NULL)
4716                 lang = documented_lang_options[j].description;
4717               else if (! strncmp (argv[i], option, strlen (option)))
4718                 break;
4719             }
4720
4721           if (j != ARRAY_SIZE (documented_lang_options))
4722             {
4723               if (extra_warnings)
4724                 {
4725                   warning ("ignoring command line option '%s'", argv[i]);
4726                   if (lang)
4727                     warning
4728                       ("(it is valid for %s but not the selected language)",
4729                        lang);
4730                 }
4731             }
4732           else if (argv[i][0] == '-' && argv[i][1] == 'g')
4733             warning ("`%s': unknown or unsupported -g option", &argv[i][2]);
4734           else
4735             error ("unrecognized option `%s'", argv[i]);
4736
4737           i++;
4738         }
4739     }
4740
4741   if (flag_no_inline == 2)
4742     flag_no_inline = 0;
4743   else
4744     flag_really_no_inline = flag_no_inline;
4745
4746   /* Set flag_no_inline before the post_options () hook.  The C front
4747      ends use it to determine tree inlining defaults.  FIXME: such
4748      code should be lang-independent when all front ends use tree
4749      inlining, in which case it, and this condition, should be moved
4750      to the top of process_options() instead.  */
4751   if (optimize == 0)
4752     {
4753       /* Inlining does not work if not optimizing,
4754          so force it not to be done.  */
4755       flag_no_inline = 1;
4756       warn_inline = 0;
4757
4758       /* The c_decode_option function and decode_option hook set
4759          this to `2' if -Wall is used, so we can avoid giving out
4760          lots of errors for people who don't realize what -Wall does.  */
4761       if (warn_uninitialized == 1)
4762         warning ("-Wuninitialized is not supported without -O");
4763     }
4764
4765   if (flag_really_no_inline == 2)
4766     flag_really_no_inline = flag_no_inline;
4767
4768   /* All command line options have been parsed; allow the front end to
4769      perform consistency checks, etc.  */
4770   (*lang_hooks.post_options) ();
4771 }
4772 \f
4773 /* Process the options that have been parsed.  */
4774 static void
4775 process_options ()
4776 {
4777 #ifdef OVERRIDE_OPTIONS
4778   /* Some machines may reject certain combinations of options.  */
4779   OVERRIDE_OPTIONS;
4780 #endif
4781
4782   /* Set up the align_*_log variables, defaulting them to 1 if they
4783      were still unset.  */
4784   if (align_loops <= 0) align_loops = 1;
4785   if (align_loops_max_skip > align_loops || !align_loops)
4786     align_loops_max_skip = align_loops - 1;
4787   align_loops_log = floor_log2 (align_loops * 2 - 1);
4788   if (align_jumps <= 0) align_jumps = 1;
4789   if (align_jumps_max_skip > align_jumps || !align_jumps)
4790     align_jumps_max_skip = align_jumps - 1;
4791   align_jumps_log = floor_log2 (align_jumps * 2 - 1);
4792   if (align_labels <= 0) align_labels = 1;
4793   align_labels_log = floor_log2 (align_labels * 2 - 1);
4794   if (align_labels_max_skip > align_labels || !align_labels)
4795     align_labels_max_skip = align_labels - 1;
4796   if (align_functions <= 0) align_functions = 1;
4797   align_functions_log = floor_log2 (align_functions * 2 - 1);
4798
4799   /* Unrolling all loops implies that standard loop unrolling must also
4800      be done.  */
4801   if (flag_unroll_all_loops)
4802     flag_unroll_loops = 1;
4803   /* Loop unrolling requires that strength_reduction be on also.  Silently
4804      turn on strength reduction here if it isn't already on.  Also, the loop
4805      unrolling code assumes that cse will be run after loop, so that must
4806      be turned on also.  */
4807   if (flag_unroll_loops)
4808     {
4809       flag_strength_reduce = 1;
4810       flag_rerun_cse_after_loop = 1;
4811     }
4812
4813   if (flag_non_call_exceptions)
4814     flag_asynchronous_unwind_tables = 1;
4815   if (flag_asynchronous_unwind_tables)
4816     flag_unwind_tables = 1;
4817
4818   /* Warn about options that are not supported on this machine.  */
4819 #ifndef INSN_SCHEDULING
4820   if (flag_schedule_insns || flag_schedule_insns_after_reload)
4821     warning ("instruction scheduling not supported on this target machine");
4822 #endif
4823 #ifndef DELAY_SLOTS
4824   if (flag_delayed_branch)
4825     warning ("this target machine does not have delayed branches");
4826 #endif
4827
4828   /* Some operating systems do not allow profiling without a frame
4829      pointer.  */
4830   if (!TARGET_ALLOWS_PROFILING_WITHOUT_FRAME_POINTER
4831       && profile_flag
4832       && flag_omit_frame_pointer)
4833     {
4834       error ("profiling does not work without a frame pointer");
4835       flag_omit_frame_pointer = 0;
4836     }
4837     
4838   user_label_prefix = USER_LABEL_PREFIX;
4839   if (flag_leading_underscore != -1)
4840     {
4841       /* If the default prefix is more complicated than "" or "_",
4842          issue a warning and ignore this option.  */
4843       if (user_label_prefix[0] == 0 ||
4844           (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
4845         {
4846           user_label_prefix = flag_leading_underscore ? "_" : "";
4847         }
4848       else
4849         warning ("-f%sleading-underscore not supported on this target machine",
4850                  flag_leading_underscore ? "" : "no-");
4851     }
4852
4853   /* If we are in verbose mode, write out the version and maybe all the
4854      option flags in use.  */
4855   if (version_flag)
4856     {
4857       print_version (stderr, "");
4858       if (! quiet_flag)
4859         print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
4860     }
4861
4862   if (! quiet_flag)
4863     time_report = 1;
4864
4865   if (flag_syntax_only)
4866     {
4867       write_symbols = NO_DEBUG;
4868       profile_flag = 0;
4869     }
4870
4871   /* Now we know write_symbols, set up the debug hooks based on it.
4872      By default we do nothing for debug output.  */
4873 #if defined(DBX_DEBUGGING_INFO)
4874   if (write_symbols == DBX_DEBUG)
4875     debug_hooks = &dbx_debug_hooks;
4876 #endif
4877 #if defined(XCOFF_DEBUGGING_INFO)
4878   if (write_symbols == XCOFF_DEBUG)
4879     debug_hooks = &xcoff_debug_hooks;
4880 #endif
4881 #ifdef SDB_DEBUGGING_INFO
4882   if (write_symbols == SDB_DEBUG)
4883     debug_hooks = &sdb_debug_hooks;
4884 #endif
4885 #ifdef DWARF_DEBUGGING_INFO
4886   if (write_symbols == DWARF_DEBUG)
4887     debug_hooks = &dwarf_debug_hooks;
4888 #endif
4889 #ifdef DWARF2_DEBUGGING_INFO
4890   if (write_symbols == DWARF2_DEBUG)
4891     debug_hooks = &dwarf2_debug_hooks;
4892 #endif
4893 #ifdef VMS_DEBUGGING_INFO
4894   if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
4895     debug_hooks = &vmsdbg_debug_hooks;
4896 #endif
4897
4898   /* If auxiliary info generation is desired, open the output file.
4899      This goes in the same directory as the source file--unlike
4900      all the other output files.  */
4901   if (flag_gen_aux_info)
4902     {
4903       aux_info_file = fopen (aux_info_file_name, "w");
4904       if (aux_info_file == 0)
4905         fatal_io_error ("can't open %s", aux_info_file_name);
4906     }
4907
4908   if (! targetm.have_named_sections)
4909     {
4910       if (flag_function_sections)
4911         {
4912           warning ("-ffunction-sections not supported for this target");
4913           flag_function_sections = 0;
4914         }
4915       if (flag_data_sections)
4916         {
4917           warning ("-fdata-sections not supported for this target");
4918           flag_data_sections = 0;
4919         }
4920     }
4921
4922   if (flag_function_sections && profile_flag)
4923     {
4924       warning ("-ffunction-sections disabled; it makes profiling impossible");
4925       flag_function_sections = 0;
4926     }
4927
4928 #ifndef HAVE_prefetch
4929   if (flag_prefetch_loop_arrays)
4930     {
4931       warning ("-fprefetch-loop-arrays not supported for this target");
4932       flag_prefetch_loop_arrays = 0;
4933     }
4934 #else
4935   if (flag_prefetch_loop_arrays && !HAVE_prefetch)
4936     {
4937       warning ("-fprefetch-loop-arrays not supported for this target (try -march switches)");
4938       flag_prefetch_loop_arrays = 0;
4939     }
4940 #endif
4941
4942   /* This combination of options isn't handled for i386 targets and doesn't
4943      make much sense anyway, so don't allow it.  */
4944   if (flag_prefetch_loop_arrays && optimize_size)
4945     {
4946       warning ("-fprefetch-loop-arrays is not supported with -Os");
4947       flag_prefetch_loop_arrays = 0;
4948     }
4949
4950 #ifndef OBJECT_FORMAT_ELF
4951   if (flag_function_sections && write_symbols != NO_DEBUG)
4952     warning ("-ffunction-sections may affect debugging on some targets");
4953 #endif
4954 }
4955 \f
4956 /* Language-independent initialization, before language-dependent
4957    initialization.  */
4958 static void
4959 lang_independent_init ()
4960 {
4961   /* Initialize the garbage-collector, and string pools.  */
4962   init_ggc ();
4963   ggc_add_rtx_root (&stack_limit_rtx, 1);
4964   ggc_add_tree_root (&current_function_decl, 1);
4965   ggc_add_tree_root (&current_function_func_begin_label, 1);
4966
4967   init_stringpool ();
4968   init_obstacks ();
4969
4970   init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
4971                   || debug_info_level == DINFO_LEVEL_VERBOSE
4972 #ifdef VMS_DEBUGGING_INFO
4973                     /* Enable line number info for traceback */
4974                     || debug_info_level > DINFO_LEVEL_NONE
4975 #endif
4976                     || flag_test_coverage
4977                     || warn_notreached);
4978   init_regs ();
4979   init_alias_once ();
4980   init_stmt ();
4981   init_loop ();
4982   init_reload ();
4983   init_function_once ();
4984   init_stor_layout_once ();
4985   init_varasm_once ();
4986   init_EXPR_INSN_LIST_cache ();
4987
4988   /* The following initialization functions need to generate rtl, so
4989      provide a dummy function context for them.  */
4990   init_dummy_function_start ();
4991   init_expmed ();
4992   init_expr_once ();
4993   if (flag_caller_saves)
4994     init_caller_save ();
4995   expand_dummy_function_end ();
4996 }
4997 \f
4998 /* Language-dependent initialization.  Returns non-zero on success.  */
4999 static int
5000 lang_dependent_init (name)
5001      const char *name;
5002 {
5003   if (dump_base_name == 0)
5004     dump_base_name = name ? name : "gccdump";
5005
5006   /* Front-end initialization.  This hook can assume that GC,
5007      identifier hashes etc. are set up, but debug initialization is
5008      not done yet.  This routine must return the original filename
5009      (e.g. foo.i -> foo.c) so can correctly initialize debug output.  */
5010   name = (*lang_hooks.init) (name);
5011   if (name == NULL)
5012     return 0;
5013
5014   /* Is this duplication necessary?  */
5015   name = ggc_strdup (name);
5016   main_input_filename = input_filename = name;
5017   init_asm_output (name);
5018
5019   /* These create various _DECL nodes, so need to be called after the
5020      front end is initialized.  */
5021   init_eh ();
5022   init_optabs ();
5023
5024   /* Put an entry on the input file stack for the main input file.  */
5025   push_srcloc (input_filename, 0);
5026
5027   /* If dbx symbol table desired, initialize writing it and output the
5028      predefined types.  */
5029   timevar_push (TV_SYMOUT);
5030
5031 #ifdef DWARF2_UNWIND_INFO
5032   if (dwarf2out_do_frame ())
5033     dwarf2out_frame_init ();
5034 #endif
5035
5036   /* Now we have the correct original filename, we can initialize
5037      debug output.  */
5038   (*debug_hooks->init) (name);
5039
5040   timevar_pop (TV_SYMOUT);
5041
5042   return 1;
5043 }
5044 \f
5045 /* Clean up: close opened files, etc.  */
5046
5047 static void
5048 finalize ()
5049 {
5050   /* Close the dump files.  */
5051   if (flag_gen_aux_info)
5052     {
5053       fclose (aux_info_file);
5054       if (errorcount)
5055         unlink (aux_info_file_name);
5056     }
5057
5058   /* Close non-debugging input and output files.  Take special care to note
5059      whether fclose returns an error, since the pages might still be on the
5060      buffer chain while the file is open.  */
5061
5062   if (asm_out_file)
5063     {
5064       if (ferror (asm_out_file) != 0)
5065         fatal_io_error ("error writing to %s", asm_file_name);
5066       if (fclose (asm_out_file) != 0)
5067         fatal_io_error ("error closing %s", asm_file_name);
5068     }
5069
5070   /* Do whatever is necessary to finish printing the graphs.  */
5071   if (graph_dump_format != no_graph)
5072     {
5073       int i;
5074
5075       for (i = 0; i < (int) DFI_MAX; ++i)
5076         if (dump_file[i].initialized && dump_file[i].graph_dump_p)
5077           {
5078             char seq[16];
5079             char *suffix;
5080
5081             sprintf (seq, DUMPFILE_FORMAT, i);
5082             suffix = concat (seq, dump_file[i].extension, NULL);
5083             finish_graph_dump_file (dump_base_name, suffix);
5084             free (suffix);
5085           }
5086     }
5087
5088   if (mem_report)
5089     {
5090       ggc_print_statistics ();
5091       stringpool_statistics ();
5092       dump_tree_statistics ();
5093     }
5094
5095   /* Free up memory for the benefit of leak detectors.  */
5096   free_reg_info ();
5097
5098   /* Language-specific end of compilation actions.  */
5099   (*lang_hooks.finish) ();
5100 }
5101 \f
5102 /* Initialize the compiler, and compile the input file.  */
5103 static void
5104 do_compile ()
5105 {
5106   /* The bulk of command line switch processing.  */
5107   process_options ();
5108
5109   /* We cannot start timing until after options are processed since that
5110      says if we run timers or not.  */
5111   init_timevar ();
5112   timevar_start (TV_TOTAL);
5113
5114   /* Language-independent initialization.  Also sets up GC, identifier
5115      hashes etc.  */
5116   lang_independent_init ();
5117
5118   /* Language-dependent initialization.  Returns true on success.  */
5119   if (lang_dependent_init (filename))
5120     compile_file ();
5121
5122   finalize ();
5123
5124   /* Stop timing and print the times.  */
5125   timevar_stop (TV_TOTAL);
5126   timevar_print (stderr);
5127 }
5128 \f
5129 /* Entry point of cc1, cc1plus, jc1, f771, etc.
5130    Decode command args, then call compile_file.
5131    Exit code is FATAL_EXIT_CODE if can't open files or if there were
5132    any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
5133
5134    It is not safe to call this function more than once.  */
5135
5136 int
5137 toplev_main (argc, argv)
5138      int argc;
5139      char **argv;
5140 {
5141   hex_init ();
5142
5143   /* Initialization of GCC's environment, and diagnostics.  */
5144   general_init (argv [0]);
5145
5146   /* Parse the options and do minimal processing; basically just
5147      enough to default flags appropriately.  */
5148   parse_options_and_default_flags (argc, argv);
5149
5150   /* Exit early if we can (e.g. -help).  */
5151   if (!exit_after_options)
5152     do_compile ();
5153
5154   if (errorcount || sorrycount)
5155     return (FATAL_EXIT_CODE);
5156
5157   return (SUCCESS_EXIT_CODE);
5158 }