OSDN Git Service

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