OSDN Git Service

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