OSDN Git Service

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