OSDN Git Service

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