OSDN Git Service

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