OSDN Git Service

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