OSDN Git Service

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