OSDN Git Service

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