* emit-rtl.c (adjust_address_1): Always copy address to avoid
[official-gcc.git] / gcc / toplev.c
blob66615008200e659e82fb5d4d441e4c9061acbbbc
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.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
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. */
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>
34 #ifdef HAVE_SYS_RESOURCE_H
35 # include <sys/resource.h>
36 #endif
38 #ifdef HAVE_SYS_TIMES_H
39 # include <sys/times.h>
40 #endif
42 #include "input.h"
43 #include "tree.h"
44 #include "rtl.h"
45 #include "tm_p.h"
46 #include "flags.h"
47 #include "insn-attr.h"
48 #include "insn-config.h"
49 #include "hard-reg-set.h"
50 #include "recog.h"
51 #include "output.h"
52 #include "except.h"
53 #include "function.h"
54 #include "toplev.h"
55 #include "expr.h"
56 #include "basic-block.h"
57 #include "intl.h"
58 #include "ggc.h"
59 #include "graph.h"
60 #include "loop.h"
61 #include "regs.h"
62 #include "timevar.h"
63 #include "diagnostic.h"
64 #include "ssa.h"
65 #include "params.h"
66 #include "reload.h"
67 #include "dwarf2asm.h"
68 #include "integrate.h"
69 #include "debug.h"
70 #include "target.h"
71 #include "langhooks.h"
73 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
74 #include "dwarf2out.h"
75 #endif
77 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
78 #include "dbxout.h"
79 #endif
81 #ifdef SDB_DEBUGGING_INFO
82 #include "sdbout.h"
83 #endif
85 #ifdef XCOFF_DEBUGGING_INFO
86 #include "xcoffout.h" /* Needed for external data
87 declarations for e.g. AIX 4.x. */
88 #endif
90 #ifdef HALF_PIC_DEBUG
91 #include "halfpic.h"
92 #endif
94 #ifdef VMS
95 /* The extra parameters substantially improve the I/O performance. */
97 static FILE *
98 vms_fopen (fname, type)
99 char *fname;
100 char *type;
102 /* The <stdio.h> in the gcc-vms-1.42 distribution prototypes fopen with two
103 fixed arguments, which matches ANSI's specification but not VAXCRTL's
104 pre-ANSI implementation. This hack circumvents the mismatch problem. */
105 FILE *(*vmslib_fopen)() = (FILE *(*)()) fopen;
107 if (*type == 'w')
108 return (*vmslib_fopen) (fname, type, "mbc=32",
109 "deq=64", "fop=tef", "shr=nil");
110 else
111 return (*vmslib_fopen) (fname, type, "mbc=32");
114 #define fopen vms_fopen
115 #endif /* VMS */
117 #if defined (HAVE_DECL_ENVIRON) && !HAVE_DECL_ENVIRON
118 extern char **environ;
119 #endif
121 /* Carry information from ASM_DECLARE_OBJECT_NAME
122 to ASM_FINISH_DECLARE_OBJECT. */
124 extern int size_directive_output;
125 extern tree last_assemble_variable_decl;
127 static void general_init PARAMS ((char *));
128 static void parse_options_and_default_flags PARAMS ((int, char **));
129 static void do_compile PARAMS ((void));
130 static void process_options PARAMS ((void));
131 static void lang_independent_init PARAMS ((void));
132 static int lang_dependent_init PARAMS ((const char *));
133 static void init_asm_output PARAMS ((const char *));
134 static void finalize PARAMS ((void));
136 static void set_target_switch PARAMS ((const char *));
137 static const char *decl_name PARAMS ((tree, int));
139 static void float_signal PARAMS ((int)) ATTRIBUTE_NORETURN;
140 static void crash_signal PARAMS ((int)) ATTRIBUTE_NORETURN;
141 static void set_float_handler PARAMS ((jmp_buf));
142 static void compile_file PARAMS ((void));
143 static void display_help PARAMS ((void));
144 static void display_target_options PARAMS ((void));
146 static void decode_d_option PARAMS ((const char *));
147 static int decode_f_option PARAMS ((const char *));
148 static int decode_W_option PARAMS ((const char *));
149 static int decode_g_option PARAMS ((const char *));
150 static unsigned int independent_decode_option PARAMS ((int, char **));
152 static void print_version PARAMS ((FILE *, const char *));
153 static int print_single_switch PARAMS ((FILE *, int, int, const char *,
154 const char *, const char *,
155 const char *, const char *));
156 static void print_switch_values PARAMS ((FILE *, int, int, const char *,
157 const char *, const char *));
159 /* Length of line when printing switch values. */
160 #define MAX_LINE 75
162 /* Name of program invoked, sans directories. */
164 const char *progname;
166 /* Copy of arguments to toplev_main. */
167 int save_argc;
168 char **save_argv;
170 /* Name of current original source file (what was input to cpp).
171 This comes from each #-command in the actual input. */
173 const char *input_filename;
175 /* Name of top-level original source file (what was input to cpp).
176 This comes from the #-command at the beginning of the actual input.
177 If there isn't any there, then this is the cc1 input file name. */
179 const char *main_input_filename;
181 /* Current line number in real source file. */
183 int lineno;
185 /* Nonzero if it is unsafe to create any new pseudo registers. */
186 int no_new_pseudos;
188 /* Stack of currently pending input files. */
190 struct file_stack *input_file_stack;
192 /* Incremented on each change to input_file_stack. */
193 int input_file_stack_tick;
195 /* Name to use as base of names for dump output files. */
197 const char *dump_base_name;
199 /* Format to use to print dumpfile index value */
200 #ifndef DUMPFILE_FORMAT
201 #define DUMPFILE_FORMAT ".%02d."
202 #endif
204 /* Bit flags that specify the machine subtype we are compiling for.
205 Bits are tested using macros TARGET_... defined in the tm.h file
206 and set by `-m...' switches. Must be defined in rtlanal.c. */
208 extern int target_flags;
210 /* Debug hooks - dependent upon command line options. */
212 struct gcc_debug_hooks *debug_hooks = &do_nothing_debug_hooks;
214 /* Describes a dump file. */
216 struct dump_file_info
218 /* The unique extension to apply, e.g. ".jump". */
219 const char *const extension;
221 /* The -d<c> character that enables this dump file. */
222 char const debug_switch;
224 /* True if there is a corresponding graph dump file. */
225 char const graph_dump_p;
227 /* True if the user selected this dump. */
228 char enabled;
230 /* True if the files have been initialized (ie truncated). */
231 char initialized;
234 /* Enumerate the extant dump files. */
236 enum dump_file_index
238 DFI_rtl,
239 DFI_sibling,
240 DFI_eh,
241 DFI_jump,
242 DFI_ssa,
243 DFI_ssa_ccp,
244 DFI_ssa_dce,
245 DFI_ussa,
246 DFI_cse,
247 DFI_addressof,
248 DFI_gcse,
249 DFI_loop,
250 DFI_cse2,
251 DFI_cfg,
252 DFI_bp,
253 DFI_life,
254 DFI_combine,
255 DFI_ce,
256 DFI_regmove,
257 DFI_sched,
258 DFI_lreg,
259 DFI_greg,
260 DFI_postreload,
261 DFI_flow2,
262 DFI_peephole2,
263 DFI_rnreg,
264 DFI_ce2,
265 DFI_sched2,
266 DFI_stack,
267 DFI_bbro,
268 DFI_mach,
269 DFI_dbr,
270 DFI_MAX
273 /* Describes all the dump files. Should be kept in order of the
274 pass and in sync with dump_file_index above.
276 Remaining -d letters:
278 " o q u "
279 " H JK OPQ TUV YZ"
282 struct dump_file_info dump_file[DFI_MAX] =
284 { "rtl", 'r', 0, 0, 0 },
285 { "sibling", 'i', 0, 0, 0 },
286 { "eh", 'h', 0, 0, 0 },
287 { "jump", 'j', 0, 0, 0 },
288 { "ssa", 'e', 1, 0, 0 },
289 { "ssaccp", 'W', 1, 0, 0 },
290 { "ssadce", 'X', 1, 0, 0 },
291 { "ussa", 'e', 1, 0, 0 }, /* Yes, duplicate enable switch. */
292 { "cse", 's', 0, 0, 0 },
293 { "addressof", 'F', 0, 0, 0 },
294 { "gcse", 'G', 1, 0, 0 },
295 { "loop", 'L', 1, 0, 0 },
296 { "cse2", 't', 1, 0, 0 },
297 { "cfg", 'f', 1, 0, 0 },
298 { "bp", 'b', 1, 0, 0 },
299 { "life", 'f', 1, 0, 0 }, /* Yes, duplicate enable switch. */
300 { "combine", 'c', 1, 0, 0 },
301 { "ce", 'C', 1, 0, 0 },
302 { "regmove", 'N', 1, 0, 0 },
303 { "sched", 'S', 1, 0, 0 },
304 { "lreg", 'l', 1, 0, 0 },
305 { "greg", 'g', 1, 0, 0 },
306 { "postreload", 'o', 1, 0, 0 },
307 { "flow2", 'w', 1, 0, 0 },
308 { "peephole2", 'z', 1, 0, 0 },
309 { "rnreg", 'n', 1, 0, 0 },
310 { "ce2", 'E', 1, 0, 0 },
311 { "sched2", 'R', 1, 0, 0 },
312 { "stack", 'k', 1, 0, 0 },
313 { "bbro", 'B', 1, 0, 0 },
314 { "mach", 'M', 1, 0, 0 },
315 { "dbr", 'd', 0, 0, 0 },
318 static int open_dump_file PARAMS ((enum dump_file_index, tree));
319 static void close_dump_file PARAMS ((enum dump_file_index,
320 void (*) (FILE *, rtx), rtx));
322 /* Other flags saying which kinds of debugging dump have been requested. */
324 int rtl_dump_and_exit;
325 int flag_print_asm_name;
326 static int version_flag;
327 static char *filename;
328 enum graph_dump_types graph_dump_format;
330 /* Name for output file of assembly code, specified with -o. */
332 char *asm_file_name;
334 /* Value of the -G xx switch, and whether it was passed or not. */
335 int g_switch_value;
336 int g_switch_set;
338 /* Type(s) of debugging information we are producing (if any).
339 See flags.h for the definitions of the different possible
340 types of debugging information. */
341 enum debug_info_type write_symbols = NO_DEBUG;
343 /* Level of debugging information we are producing. See flags.h
344 for the definitions of the different possible levels. */
345 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
347 /* Nonzero means use GNU-only extensions in the generated symbolic
348 debugging information. */
349 /* Currently, this only has an effect when write_symbols is set to
350 DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
351 int use_gnu_debug_info_extensions = 0;
353 /* Nonzero means do optimizations. -O.
354 Particular numeric values stand for particular amounts of optimization;
355 thus, -O2 stores 2 here. However, the optimizations beyond the basic
356 ones are not controlled directly by this variable. Instead, they are
357 controlled by individual `flag_...' variables that are defaulted
358 based on this variable. */
360 int optimize = 0;
362 /* Nonzero means optimize for size. -Os.
363 The only valid values are zero and non-zero. When optimize_size is
364 non-zero, optimize defaults to 2, but certain individual code
365 bloating optimizations are disabled. */
367 int optimize_size = 0;
369 /* Nonzero if we should exit after parsing options. */
370 static int exit_after_options = 0;
372 /* The FUNCTION_DECL for the function currently being compiled,
373 or 0 if between functions. */
374 tree current_function_decl;
376 /* Set to the FUNC_BEGIN label of the current function, or NULL_TREE
377 if none. */
378 tree current_function_func_begin_label;
380 /* Pointer to function to compute the name to use to print a declaration.
381 DECL is the declaration in question.
382 VERBOSITY determines what information will be printed:
383 0: DECL_NAME, demangled as necessary.
384 1: and scope information.
385 2: and any other information that might be interesting, such as function
386 parameter types in C++. */
388 const char *(*decl_printable_name) PARAMS ((tree, int));
390 /* Pointer to function to compute rtl for a language-specific tree code. */
392 typedef rtx (*lang_expand_expr_t)
393 PARAMS ((union tree_node *, rtx, enum machine_mode,
394 enum expand_modifier modifier));
396 lang_expand_expr_t lang_expand_expr = 0;
398 /* Pointer to function to finish handling an incomplete decl at the
399 end of compilation. */
401 void (*incomplete_decl_finalize_hook) PARAMS ((tree)) = 0;
403 /* Nonzero if doing dwarf2 duplicate elimination. */
405 int flag_eliminate_dwarf2_dups = 0;
407 /* Nonzero if generating code to do profiling. */
409 int profile_flag = 0;
411 /* Nonzero if generating code to profile program flow graph arcs. */
413 int profile_arc_flag = 0;
415 /* Nonzero if generating info for gcov to calculate line test coverage. */
417 int flag_test_coverage = 0;
419 /* Nonzero indicates that branch taken probabilities should be calculated. */
421 int flag_branch_probabilities = 0;
423 /* Nonzero if basic blocks should be reordered. */
425 int flag_reorder_blocks = 0;
427 /* Nonzero if registers should be renamed. */
429 int flag_rename_registers = 0;
431 /* Nonzero for -pedantic switch: warn about anything
432 that standard spec forbids. */
434 int pedantic = 0;
436 /* Temporarily suppress certain warnings.
437 This is set while reading code from a system header file. */
439 int in_system_header = 0;
441 /* Don't print functions as they are compiled. -quiet. */
443 int quiet_flag = 0;
445 /* Print times taken by the various passes. -ftime-report. */
447 int time_report = 0;
449 /* Print memory still in use at end of compilation (which may have little
450 to do with peak memory consumption). -fmem-report. */
452 int mem_report = 0;
454 /* Non-zero means to collect statistics which might be expensive
455 and to print them when we are done. */
456 int flag_detailed_statistics = 0;
459 /* -f flags. */
461 /* Nonzero means `char' should be signed. */
463 int flag_signed_char;
465 /* Nonzero means give an enum type only as many bytes as it needs. */
467 int flag_short_enums;
469 /* Nonzero for -fcaller-saves: allocate values in regs that need to
470 be saved across function calls, if that produces overall better code.
471 Optional now, so people can test it. */
473 #ifdef DEFAULT_CALLER_SAVES
474 int flag_caller_saves = 1;
475 #else
476 int flag_caller_saves = 0;
477 #endif
479 /* Nonzero if structures and unions should be returned in memory.
481 This should only be defined if compatibility with another compiler or
482 with an ABI is needed, because it results in slower code. */
484 #ifndef DEFAULT_PCC_STRUCT_RETURN
485 #define DEFAULT_PCC_STRUCT_RETURN 1
486 #endif
488 /* Nonzero for -fpcc-struct-return: return values the same way PCC does. */
490 int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
492 /* Nonzero for -fforce-mem: load memory value into a register
493 before arithmetic on it. This makes better cse but slower compilation. */
495 int flag_force_mem = 0;
497 /* Nonzero for -fforce-addr: load memory address into a register before
498 reference to memory. This makes better cse but slower compilation. */
500 int flag_force_addr = 0;
502 /* Nonzero for -fdefer-pop: don't pop args after each function call;
503 instead save them up to pop many calls' args with one insns. */
505 int flag_defer_pop = 0;
507 /* Nonzero for -ffloat-store: don't allocate floats and doubles
508 in extended-precision registers. */
510 int flag_float_store = 0;
512 /* Nonzero for -fcse-follow-jumps:
513 have cse follow jumps to do a more extensive job. */
515 int flag_cse_follow_jumps;
517 /* Nonzero for -fcse-skip-blocks:
518 have cse follow a branch around a block. */
519 int flag_cse_skip_blocks;
521 /* Nonzero for -fexpensive-optimizations:
522 perform miscellaneous relatively-expensive optimizations. */
523 int flag_expensive_optimizations;
525 /* Nonzero for -fthread-jumps:
526 have jump optimize output of loop. */
528 int flag_thread_jumps;
530 /* Nonzero enables strength-reduction in loop.c. */
532 int flag_strength_reduce = 0;
534 /* Nonzero enables loop unrolling in unroll.c. Only loops for which the
535 number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
536 UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
537 unrolled. */
539 int flag_unroll_loops;
541 /* Nonzero enables loop unrolling in unroll.c. All loops are unrolled.
542 This is generally not a win. */
544 int flag_unroll_all_loops;
546 /* Nonzero forces all invariant computations in loops to be moved
547 outside the loop. */
549 int flag_move_all_movables = 0;
551 /* Nonzero forces all general induction variables in loops to be
552 strength reduced. */
554 int flag_reduce_all_givs = 0;
556 /* Nonzero to perform full register move optimization passes. This is the
557 default for -O2. */
559 int flag_regmove = 0;
561 /* Nonzero for -fwritable-strings:
562 store string constants in data segment and don't uniquize them. */
564 int flag_writable_strings = 0;
566 /* Nonzero means don't put addresses of constant functions in registers.
567 Used for compiling the Unix kernel, where strange substitutions are
568 done on the assembly output. */
570 int flag_no_function_cse = 0;
572 /* Nonzero for -fomit-frame-pointer:
573 don't make a frame pointer in simple functions that don't require one. */
575 int flag_omit_frame_pointer = 0;
577 /* Nonzero means place each function into its own section on those platforms
578 which support arbitrary section names and unlimited numbers of sections. */
580 int flag_function_sections = 0;
582 /* ... and similar for data. */
584 int flag_data_sections = 0;
586 /* Nonzero to inhibit use of define_optimization peephole opts. */
588 int flag_no_peephole = 0;
590 /* Nonzero allows GCC to optimize sibling and tail recursive calls. */
592 int flag_optimize_sibling_calls = 0;
594 /* Nonzero means the front end generally wants `errno' maintained by math
595 operations, like built-in SQRT. */
597 int flag_errno_math = 1;
599 /* Nonzero means that unsafe floating-point math optimizations are allowed
600 for the sake of speed. IEEE compliance is not guaranteed, and operations
601 are allowed to assume that their arguments and results are "normal"
602 (e.g., nonnegative for SQRT). */
604 int flag_unsafe_math_optimizations = 0;
606 /* Zero means that floating-point math operations cannot generate a
607 (user-visible) trap. This is the case, for example, in nonstop
608 IEEE 754 arithmetic. */
610 int flag_trapping_math = 1;
612 /* 0 means straightforward implementation of complex divide acceptable.
613 1 means wide ranges of inputs must work for complex divide.
614 2 means C99-like requirements for complex divide (not yet implemented). */
616 int flag_complex_divide_method = 0;
618 /* Nonzero means all references through pointers are volatile. */
620 int flag_volatile;
622 /* Nonzero means treat all global and extern variables as volatile. */
624 int flag_volatile_global;
626 /* Nonzero means treat all static variables as volatile. */
628 int flag_volatile_static;
630 /* Nonzero means just do syntax checking; don't output anything. */
632 int flag_syntax_only = 0;
634 /* Nonzero means perform global cse. */
636 static int flag_gcse;
638 /* Nonzero means to use global dataflow analysis to eliminate
639 useless null pointer tests. */
641 static int flag_delete_null_pointer_checks;
643 /* Nonzero means to do the enhanced load motion during gcse, which trys
644 to hoist loads by not killing them when a store to the same location
645 is seen. */
647 int flag_gcse_lm = 1;
649 /* Nonzero means to perform store motion after gcse, which will try to
650 move stores closer to the exit block. Its not very effective without
651 flag_gcse_lm. */
653 int flag_gcse_sm = 1;
655 /* Nonzero means to rerun cse after loop optimization. This increases
656 compilation time about 20% and picks up a few more common expressions. */
658 static int flag_rerun_cse_after_loop;
660 /* Nonzero means to run loop optimizations twice. */
662 int flag_rerun_loop_opt;
664 /* Nonzero for -finline-functions: ok to inline functions that look like
665 good inline candidates. */
667 int flag_inline_functions;
669 /* Nonzero for -fkeep-inline-functions: even if we make a function
670 go inline everywhere, keep its definition around for debugging
671 purposes. */
673 int flag_keep_inline_functions;
675 /* Nonzero means that functions will not be inlined. */
677 int flag_no_inline;
679 /* Nonzero means that we should emit static const variables
680 regardless of whether or not optimization is turned on. */
682 int flag_keep_static_consts = 1;
684 /* Nonzero means we should be saving declaration info into a .X file. */
686 int flag_gen_aux_info = 0;
688 /* Specified name of aux-info file. */
690 static char *aux_info_file_name;
692 /* Nonzero means make the text shared if supported. */
694 int flag_shared_data;
696 /* Nonzero means schedule into delayed branch slots if supported. */
698 int flag_delayed_branch;
700 /* Nonzero if we are compiling pure (sharable) code.
701 Value is 1 if we are doing reasonable (i.e. simple
702 offset into offset table) pic. Value is 2 if we can
703 only perform register offsets. */
705 int flag_pic;
707 /* Nonzero means generate extra code for exception handling and enable
708 exception handling. */
710 int flag_exceptions;
712 /* Nonzero means generate frame unwind info table when supported. */
714 int flag_unwind_tables = 0;
716 /* Nonzero means generate frame unwind info table exact at each insn boundary */
718 int flag_asynchronous_unwind_tables = 0;
720 /* Nonzero means don't place uninitialized global data in common storage
721 by default. */
723 int flag_no_common;
725 /* Nonzero means pretend it is OK to examine bits of target floats,
726 even if that isn't true. The resulting code will have incorrect constants,
727 but the same series of instructions that the native compiler would make. */
729 int flag_pretend_float;
731 /* Nonzero means change certain warnings into errors.
732 Usually these are warnings about failure to conform to some standard. */
734 int flag_pedantic_errors = 0;
736 /* flag_schedule_insns means schedule insns within basic blocks (before
737 local_alloc).
738 flag_schedule_insns_after_reload means schedule insns after
739 global_alloc. */
741 int flag_schedule_insns = 0;
742 int flag_schedule_insns_after_reload = 0;
744 /* The following flags have effect only for scheduling before register
745 allocation:
747 flag_schedule_interblock means schedule insns accross basic blocks.
748 flag_schedule_speculative means allow speculative motion of non-load insns.
749 flag_schedule_speculative_load means allow speculative motion of some
750 load insns.
751 flag_schedule_speculative_load_dangerous allows speculative motion of more
752 load insns. */
754 int flag_schedule_interblock = 1;
755 int flag_schedule_speculative = 1;
756 int flag_schedule_speculative_load = 0;
757 int flag_schedule_speculative_load_dangerous = 0;
759 int flag_single_precision_constant;
761 /* flag_branch_on_count_reg means try to replace add-1,compare,branch tupple
762 by a cheaper branch on a count register. */
763 int flag_branch_on_count_reg = 1;
765 /* -finhibit-size-directive inhibits output of .size for ELF.
766 This is used only for compiling crtstuff.c,
767 and it may be extended to other effects
768 needed for crtstuff.c on other systems. */
769 int flag_inhibit_size_directive = 0;
771 /* -fverbose-asm causes extra commentary information to be produced in
772 the generated assembly code (to make it more readable). This option
773 is generally only of use to those who actually need to read the
774 generated assembly code (perhaps while debugging the compiler itself).
775 -fno-verbose-asm, the default, causes the extra information
776 to be omitted and is useful when comparing two assembler files. */
778 int flag_verbose_asm = 0;
780 /* -dA causes debug commentary information to be produced in
781 the generated assembly code (to make it more readable). This option
782 is generally only of use to those who actually need to read the
783 generated assembly code (perhaps while debugging the compiler itself).
784 Currently, this switch is only used by dwarfout.c; however, it is intended
785 to be a catchall for printing debug information in the assembler file. */
787 int flag_debug_asm = 0;
789 /* -dP causes the rtl to be emitted as a comment in assembly. */
791 int flag_dump_rtl_in_asm = 0;
793 /* -fgnu-linker specifies use of the GNU linker for initializations.
794 (Or, more generally, a linker that handles initializations.)
795 -fno-gnu-linker says that collect2 will be used. */
796 #ifdef USE_COLLECT2
797 int flag_gnu_linker = 0;
798 #else
799 int flag_gnu_linker = 1;
800 #endif
802 /* Enable SSA. */
803 int flag_ssa = 0;
805 /* Enable ssa conditional constant propagation. */
806 int flag_ssa_ccp = 0;
808 /* Enable ssa aggressive dead code elimination. */
809 int flag_ssa_dce = 0;
811 /* Tag all structures with __attribute__(packed). */
812 int flag_pack_struct = 0;
814 /* Emit code to check for stack overflow; also may cause large objects
815 to be allocated dynamically. */
816 int flag_stack_check;
818 /* When non-NULL, indicates that whenever space is allocated on the
819 stack, the resulting stack pointer must not pass this
820 address---that is, for stacks that grow downward, the stack pointer
821 must always be greater than or equal to this address; for stacks
822 that grow upward, the stack pointer must be less than this address.
823 At present, the rtx may be either a REG or a SYMBOL_REF, although
824 the support provided depends on the backend. */
825 rtx stack_limit_rtx;
827 /* 0 if pointer arguments may alias each other. True in C.
828 1 if pointer arguments may not alias each other but may alias
829 global variables.
830 2 if pointer arguments may not alias each other and may not
831 alias global variables. True in Fortran.
832 This defaults to 0 for C. */
833 int flag_argument_noalias = 0;
835 /* Nonzero if we should do (language-dependent) alias analysis.
836 Typically, this analysis will assume that expressions of certain
837 types do not alias expressions of certain other types. Only used
838 if alias analysis (in general) is enabled. */
839 int flag_strict_aliasing = 0;
841 /* Instrument functions with calls at entry and exit, for profiling. */
842 int flag_instrument_function_entry_exit = 0;
844 /* Nonzero means ignore `#ident' directives. 0 means handle them.
845 On SVR4 targets, it also controls whether or not to emit a
846 string identifying the compiler. */
848 int flag_no_ident = 0;
850 /* This will perform a peephole pass before sched2. */
851 int flag_peephole2 = 0;
853 /* This will try to guess branch probabilities. */
854 int flag_guess_branch_prob = 0;
856 /* -fbounded-pointers causes gcc to compile pointers as composite
857 objects occupying three words: the pointer value, the base address
858 of the referent object, and the address immediately beyond the end
859 of the referent object. The base and extent allow us to perform
860 runtime bounds checking. -fbounded-pointers implies -fcheck-bounds. */
861 int flag_bounded_pointers = 0;
863 /* -fcheck-bounds causes gcc to generate array bounds checks.
864 For C, C++: defaults to value of flag_bounded_pointers.
865 For ObjC: defaults to off.
866 For Java: defaults to on.
867 For Fortran: defaults to off.
868 For CHILL: defaults to off. */
869 int flag_bounds_check = 0;
871 /* This will attempt to merge constant section constants, if 1 only
872 string constants and constants from constant pool, if 2 also constant
873 variables. */
874 int flag_merge_constants = 1;
876 /* If one, renumber instruction UIDs to reduce the number of
877 unused UIDs if there are a lot of instructions. If greater than
878 one, unconditionally renumber instruction UIDs. */
879 int flag_renumber_insns = 1;
881 /* Values of the -falign-* flags: how much to align labels in code.
882 0 means `use default', 1 means `don't align'.
883 For each variable, there is an _log variant which is the power
884 of two not less than the variable, for .align output. */
886 int align_loops;
887 int align_loops_log;
888 int align_loops_max_skip;
889 int align_jumps;
890 int align_jumps_log;
891 int align_jumps_max_skip;
892 int align_labels;
893 int align_labels_log;
894 int align_labels_max_skip;
895 int align_functions;
896 int align_functions_log;
898 /* Table of supported debugging formats. */
899 static const struct
901 const char *const arg;
902 /* Since PREFERRED_DEBUGGING_TYPE isn't necessarily a
903 constant expression, we use NO_DEBUG in its place. */
904 const enum debug_info_type debug_type;
905 const int use_extensions_p;
906 const char *const description;
907 } *da,
908 debug_args[] =
910 { "", NO_DEBUG, DEFAULT_GDB_EXTENSIONS,
911 N_("Generate debugging info in default format") },
912 { "gdb", NO_DEBUG, 1, N_("Generate debugging info in default extended format") },
913 #ifdef DBX_DEBUGGING_INFO
914 { "stabs", DBX_DEBUG, 0, N_("Generate STABS format debug info") },
915 { "stabs+", DBX_DEBUG, 1, N_("Generate extended STABS format debug info") },
916 #endif
917 #ifdef DWARF_DEBUGGING_INFO
918 { "dwarf", DWARF_DEBUG, 0, N_("Generate DWARF-1 format debug info") },
919 { "dwarf+", DWARF_DEBUG, 1,
920 N_("Generate extended DWARF-1 format debug info") },
921 #endif
922 #ifdef DWARF2_DEBUGGING_INFO
923 { "dwarf-2", DWARF2_DEBUG, 0, N_("Generate DWARF-2 debug info") },
924 #endif
925 #ifdef XCOFF_DEBUGGING_INFO
926 { "xcoff", XCOFF_DEBUG, 0, N_("Generate XCOFF format debug info") },
927 { "xcoff+", XCOFF_DEBUG, 1, N_("Generate extended XCOFF format debug info") },
928 #endif
929 #ifdef SDB_DEBUGGING_INFO
930 { "coff", SDB_DEBUG, 0, N_("Generate COFF format debug info") },
931 #endif
932 { 0, 0, 0, 0 }
935 typedef struct
937 const char *string;
938 int *variable;
939 int on_value;
940 const char *description;
942 lang_independent_options;
944 int flag_trapv = 0;
946 /* Add or remove a leading underscore from user symbols. */
947 int flag_leading_underscore = -1;
949 /* The user symbol prefix after having resolved same. */
950 const char *user_label_prefix;
952 static const param_info lang_independent_params[] = {
953 #define DEFPARAM(ENUM, OPTION, HELP, DEFAULT) \
954 { OPTION, DEFAULT, HELP },
955 #include "params.def"
956 #undef DEFPARAM
957 { NULL, 0, NULL }
960 /* A default for same. */
961 #ifndef USER_LABEL_PREFIX
962 #define USER_LABEL_PREFIX ""
963 #endif
965 /* Table of language-independent -f options.
966 STRING is the option name. VARIABLE is the address of the variable.
967 ON_VALUE is the value to store in VARIABLE
968 if `-fSTRING' is seen as an option.
969 (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
971 lang_independent_options f_options[] =
973 {"eliminate-dwarf2-dups", &flag_eliminate_dwarf2_dups, 1,
974 N_("Perform DWARF2 duplicate elimination") },
975 {"float-store", &flag_float_store, 1,
976 N_("Do not store floats in registers") },
977 {"volatile", &flag_volatile, 1,
978 N_("Consider all mem refs through pointers as volatile") },
979 {"volatile-global", &flag_volatile_global, 1,
980 N_("Consider all mem refs to global data to be volatile") },
981 {"volatile-static", &flag_volatile_static, 1,
982 N_("Consider all mem refs to static data to be volatile") },
983 {"defer-pop", &flag_defer_pop, 1,
984 N_("Defer popping functions args from stack until later") },
985 {"omit-frame-pointer", &flag_omit_frame_pointer, 1,
986 N_("When possible do not generate stack frames") },
987 {"optimize-sibling-calls", &flag_optimize_sibling_calls, 1,
988 N_("Optimize sibling and tail recursive calls") },
989 {"cse-follow-jumps", &flag_cse_follow_jumps, 1,
990 N_("When running CSE, follow jumps to their targets") },
991 {"cse-skip-blocks", &flag_cse_skip_blocks, 1,
992 N_("When running CSE, follow conditional jumps") },
993 {"expensive-optimizations", &flag_expensive_optimizations, 1,
994 N_("Perform a number of minor, expensive optimisations") },
995 {"thread-jumps", &flag_thread_jumps, 1,
996 N_("Perform jump threading optimisations") },
997 {"strength-reduce", &flag_strength_reduce, 1,
998 N_("Perform strength reduction optimisations") },
999 {"unroll-loops", &flag_unroll_loops, 1,
1000 N_("Perform loop unrolling when iteration count is known") },
1001 {"unroll-all-loops", &flag_unroll_all_loops, 1,
1002 N_("Perform loop unrolling for all loops") },
1003 {"move-all-movables", &flag_move_all_movables, 1,
1004 N_("Force all loop invariant computations out of loops") },
1005 {"reduce-all-givs", &flag_reduce_all_givs, 1,
1006 N_("Strength reduce all loop general induction variables") },
1007 {"writable-strings", &flag_writable_strings, 1,
1008 N_("Store strings in writable data section") },
1009 {"peephole", &flag_no_peephole, 0,
1010 N_("Enable machine specific peephole optimisations") },
1011 {"force-mem", &flag_force_mem, 1,
1012 N_("Copy memory operands into registers before using") },
1013 {"force-addr", &flag_force_addr, 1,
1014 N_("Copy memory address constants into regs before using") },
1015 {"function-cse", &flag_no_function_cse, 0,
1016 N_("Allow function addresses to be held in registers") },
1017 {"inline-functions", &flag_inline_functions, 1,
1018 N_("Integrate simple functions into their callers") },
1019 {"keep-inline-functions", &flag_keep_inline_functions, 1,
1020 N_("Generate code for funcs even if they are fully inlined") },
1021 {"inline", &flag_no_inline, 0,
1022 N_("Pay attention to the 'inline' keyword") },
1023 {"keep-static-consts", &flag_keep_static_consts, 1,
1024 N_("Emit static const variables even if they are not used") },
1025 {"syntax-only", &flag_syntax_only, 1,
1026 N_("Check for syntax errors, then stop") },
1027 {"shared-data", &flag_shared_data, 1,
1028 N_("Mark data as shared rather than private") },
1029 {"caller-saves", &flag_caller_saves, 1,
1030 N_("Enable saving registers around function calls") },
1031 {"pcc-struct-return", &flag_pcc_struct_return, 1,
1032 N_("Return 'short' aggregates in memory, not registers") },
1033 {"reg-struct-return", &flag_pcc_struct_return, 0,
1034 N_("Return 'short' aggregates in registers") },
1035 {"delayed-branch", &flag_delayed_branch, 1,
1036 N_("Attempt to fill delay slots of branch instructions") },
1037 {"gcse", &flag_gcse, 1,
1038 N_("Perform the global common subexpression elimination") },
1039 {"gcse-lm", &flag_gcse_lm, 1,
1040 N_("Perform enhanced load motion during global subexpression elimination") },
1041 {"gcse-sm", &flag_gcse_sm, 1,
1042 N_("Perform store motion after global subexpression elimination") },
1043 {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1,
1044 N_("Run CSE pass after loop optimisations") },
1045 {"rerun-loop-opt", &flag_rerun_loop_opt, 1,
1046 N_("Run the loop optimiser twice") },
1047 {"delete-null-pointer-checks", &flag_delete_null_pointer_checks, 1,
1048 N_("Delete useless null pointer checks") },
1049 {"pretend-float", &flag_pretend_float, 1,
1050 N_("Pretend that host and target use the same FP format") },
1051 {"schedule-insns", &flag_schedule_insns, 1,
1052 N_("Reschedule instructions before register allocation") },
1053 {"schedule-insns2", &flag_schedule_insns_after_reload, 1,
1054 N_("Reschedule instructions after register allocation") },
1055 {"sched-interblock",&flag_schedule_interblock, 1,
1056 N_("Enable scheduling across basic blocks") },
1057 {"sched-spec",&flag_schedule_speculative, 1,
1058 N_("Allow speculative motion of non-loads") },
1059 {"sched-spec-load",&flag_schedule_speculative_load, 1,
1060 N_("Allow speculative motion of some loads") },
1061 {"sched-spec-load-dangerous",&flag_schedule_speculative_load_dangerous, 1,
1062 N_("Allow speculative motion of more loads") },
1063 {"branch-count-reg",&flag_branch_on_count_reg, 1,
1064 N_("Replace add,compare,branch with branch on count reg") },
1065 {"pic", &flag_pic, 1,
1066 N_("Generate position independent code, if possible") },
1067 {"PIC", &flag_pic, 2, ""},
1068 {"exceptions", &flag_exceptions, 1,
1069 N_("Enable exception handling") },
1070 {"unwind-tables", &flag_unwind_tables, 1,
1071 N_("Just generate unwind tables for exception handling") },
1072 {"asynchronous-unwind-tables", &flag_asynchronous_unwind_tables, 1,
1073 N_("Generate unwind tables exact at each instruction boundary") },
1074 {"non-call-exceptions", &flag_non_call_exceptions, 1,
1075 N_("Support synchronous non-call exceptions") },
1076 {"profile-arcs", &profile_arc_flag, 1,
1077 N_("Insert arc based program profiling code") },
1078 {"test-coverage", &flag_test_coverage, 1,
1079 N_("Create data files needed by gcov") },
1080 {"branch-probabilities", &flag_branch_probabilities, 1,
1081 N_("Use profiling information for branch probabilities") },
1082 {"reorder-blocks", &flag_reorder_blocks, 1,
1083 N_("Reorder basic blocks to improve code placement") },
1084 {"rename-registers", &flag_rename_registers, 1,
1085 N_("Do the register renaming optimization pass") },
1086 {"common", &flag_no_common, 0,
1087 N_("Do not put uninitialized globals in the common section") },
1088 {"inhibit-size-directive", &flag_inhibit_size_directive, 1,
1089 N_("Do not generate .size directives") },
1090 {"function-sections", &flag_function_sections, 1,
1091 N_("place each function into its own section") },
1092 {"data-sections", &flag_data_sections, 1,
1093 N_("place data items into their own section") },
1094 {"verbose-asm", &flag_verbose_asm, 1,
1095 N_("Add extra commentry to assembler output") },
1096 {"gnu-linker", &flag_gnu_linker, 1,
1097 N_("Output GNU ld formatted global initialisers") },
1098 {"regmove", &flag_regmove, 1,
1099 N_("Enables a register move optimisation") },
1100 {"optimize-register-move", &flag_regmove, 1,
1101 N_("Do the full regmove optimization pass") },
1102 {"pack-struct", &flag_pack_struct, 1,
1103 N_("Pack structure members together without holes") },
1104 {"stack-check", &flag_stack_check, 1,
1105 N_("Insert stack checking code into the program") },
1106 {"argument-alias", &flag_argument_noalias, 0,
1107 N_("Specify that arguments may alias each other & globals") },
1108 {"argument-noalias", &flag_argument_noalias, 1,
1109 N_("Assume arguments may alias globals but not each other") },
1110 {"argument-noalias-global", &flag_argument_noalias, 2,
1111 N_("Assume arguments do not alias each other or globals") },
1112 {"strict-aliasing", &flag_strict_aliasing, 1,
1113 N_("Assume strict aliasing rules apply") },
1114 {"align-loops", &align_loops, 0,
1115 N_("Align the start of loops") },
1116 {"align-jumps", &align_jumps, 0,
1117 N_("Align labels which are only reached by jumping") },
1118 {"align-labels", &align_labels, 0,
1119 N_("Align all labels") },
1120 {"align-functions", &align_functions, 0,
1121 N_("Align the start of functions") },
1122 {"merge-constants", &flag_merge_constants, 1,
1123 N_("Attempt to merge identical constants accross compilation units") },
1124 {"merge-all-constants", &flag_merge_constants, 2,
1125 N_("Attempt to merge identical constants and constant variables") },
1126 {"dump-unnumbered", &flag_dump_unnumbered, 1,
1127 N_("Suppress output of instruction numbers and line number notes in debugging dumps") },
1128 {"instrument-functions", &flag_instrument_function_entry_exit, 1,
1129 N_("Instrument function entry/exit with profiling calls") },
1130 {"ssa", &flag_ssa, 1,
1131 N_("Enable SSA optimizations") },
1132 {"ssa-ccp", &flag_ssa_ccp, 1,
1133 N_("Enable SSA conditional constant propagation") },
1134 {"ssa-dce", &flag_ssa_dce, 1,
1135 N_("Enable aggressive SSA dead code elimination") },
1136 {"leading-underscore", &flag_leading_underscore, 1,
1137 N_("External symbols have a leading underscore") },
1138 {"ident", &flag_no_ident, 0,
1139 N_("Process #ident directives") },
1140 { "peephole2", &flag_peephole2, 1,
1141 N_("Enables an rtl peephole pass run before sched2") },
1142 { "guess-branch-probability", &flag_guess_branch_prob, 1,
1143 N_("Enables guessing of branch probabilities") },
1144 {"math-errno", &flag_errno_math, 1,
1145 N_("Set errno after built-in math functions") },
1146 {"trapping-math", &flag_trapping_math, 1,
1147 N_("Floating-point operations can trap") },
1148 {"unsafe-math-optimizations", &flag_unsafe_math_optimizations, 1,
1149 N_("Allow math optimizations that may violate IEEE or ANSI standards") },
1150 {"bounded-pointers", &flag_bounded_pointers, 1,
1151 N_("Compile pointers as triples: value, base & end") },
1152 {"bounds-check", &flag_bounds_check, 1,
1153 N_("Generate code to check bounds before dereferencing pointers and arrays") },
1154 {"single-precision-constant", &flag_single_precision_constant, 1,
1155 N_("Convert floating point constant to single precision constant") },
1156 {"time-report", &time_report, 1,
1157 N_("Report time taken by each compiler pass at end of run") },
1158 {"mem-report", &mem_report, 1,
1159 N_("Report on permanent memory allocation at end of run") },
1160 { "trapv", &flag_trapv, 1,
1161 N_("Trap for signed overflow in addition / subtraction / multiplication") },
1164 /* Table of language-specific options. */
1166 static const struct lang_opt
1168 const char *const option;
1169 const char *const description;
1171 documented_lang_options[] =
1173 /* In order not to overload the --help output, the convention
1174 used here is to only describe those options which are not
1175 enabled by default. */
1177 { "-ansi",
1178 N_("Compile just for ISO C89") },
1179 { "-fallow-single-precision",
1180 N_("Do not promote floats to double if using -traditional") },
1181 { "-std= ",
1182 N_("Determine language standard") },
1184 { "-fsigned-bitfields", "" },
1185 { "-funsigned-bitfields",
1186 N_("Make bitfields by unsigned by default") },
1187 { "-fno-signed-bitfields", "" },
1188 { "-fno-unsigned-bitfields","" },
1189 { "-fsigned-char",
1190 N_("Make 'char' be signed by default") },
1191 { "-funsigned-char",
1192 N_("Make 'char' be unsigned by default") },
1193 { "-fno-signed-char", "" },
1194 { "-fno-unsigned-char", "" },
1196 { "-ftraditional", "" },
1197 { "-traditional",
1198 N_("Attempt to support traditional K&R style C") },
1199 { "-fnotraditional", "" },
1200 { "-fno-traditional", "" },
1202 { "-fasm", "" },
1203 { "-fno-asm",
1204 N_("Do not recognise the 'asm' keyword") },
1205 { "-fbuiltin", "" },
1206 { "-fno-builtin",
1207 N_("Do not recognise any built in functions") },
1208 { "-fhosted",
1209 N_("Assume normal C execution environment") },
1210 { "-fno-hosted", "" },
1211 { "-ffreestanding",
1212 N_("Assume that standard libraries & main might not exist") },
1213 { "-fno-freestanding", "" },
1214 { "-fcond-mismatch",
1215 N_("Allow different types as args of ? operator") },
1216 { "-fno-cond-mismatch", "" },
1217 { "-fdollars-in-identifiers",
1218 N_("Allow the use of $ inside identifiers") },
1219 { "-fno-dollars-in-identifiers", "" },
1220 { "-fpreprocessed", "" },
1221 { "-fno-preprocessed", "" },
1222 { "-fshort-double",
1223 N_("Use the same size for double as for float") },
1224 { "-fno-short-double", "" },
1225 { "-fshort-enums",
1226 N_("Use the smallest fitting integer to hold enums") },
1227 { "-fno-short-enums", "" },
1228 { "-fshort-wchar",
1229 N_("Override the underlying type for wchar_t to `unsigned short'") },
1230 { "-fno-short-wchar", "" },
1232 { "-Wall",
1233 N_("Enable most warning messages") },
1234 { "-Wbad-function-cast",
1235 N_("Warn about casting functions to incompatible types") },
1236 { "-Wno-bad-function-cast", "" },
1237 { "-Wno-missing-noreturn", "" },
1238 { "-Wmissing-format-attribute",
1239 N_("Warn about functions which might be candidates for format attributes") },
1240 { "-Wno-missing-format-attribute", "" },
1241 { "-Wcast-qual",
1242 N_("Warn about casts which discard qualifiers") },
1243 { "-Wno-cast-qual", "" },
1244 { "-Wchar-subscripts",
1245 N_("Warn about subscripts whose type is 'char'") },
1246 { "-Wno-char-subscripts", "" },
1247 { "-Wcomment",
1248 N_("Warn if nested comments are detected") },
1249 { "-Wno-comment", "" },
1250 { "-Wcomments",
1251 N_("Warn if nested comments are detected") },
1252 { "-Wno-comments", "" },
1253 { "-Wconversion",
1254 N_("Warn about possibly confusing type conversions") },
1255 { "-Wno-conversion", "" },
1256 { "-Wformat",
1257 N_("Warn about printf/scanf/strftime/strfmon format anomalies") },
1258 { "-Wno-format", "" },
1259 { "-Wformat-y2k", "" },
1260 { "-Wno-format-y2k",
1261 N_("Don't warn about strftime formats yielding 2 digit years") },
1262 { "-Wformat-extra-args", "" },
1263 { "-Wno-format-extra-args",
1264 N_("Don't warn about too many arguments to format functions") },
1265 { "-Wformat-nonliteral",
1266 N_("Warn about non-string-literal format strings") },
1267 { "-Wno-format-nonliteral", "" },
1268 { "-Wformat-security",
1269 N_("Warn about possible security problems with format functions") },
1270 { "-Wno-format-security", "" },
1271 { "-Wimplicit-function-declaration",
1272 N_("Warn about implicit function declarations") },
1273 { "-Wno-implicit-function-declaration", "" },
1274 { "-Werror-implicit-function-declaration", "" },
1275 { "-Wimplicit-int",
1276 N_("Warn when a declaration does not specify a type") },
1277 { "-Wno-implicit-int", "" },
1278 { "-Wimplicit", "" },
1279 { "-Wno-implicit", "" },
1280 { "-Wimport",
1281 N_("Warn about the use of the #import directive") },
1282 { "-Wno-import", "" },
1283 { "-Wlong-long","" },
1284 { "-Wno-long-long",
1285 N_("Do not warn about using 'long long' when -pedantic") },
1286 { "-Wmain",
1287 N_("Warn about suspicious declarations of main") },
1288 { "-Wno-main", "" },
1289 { "-Wmissing-braces",
1290 N_("Warn about possibly missing braces around initialisers") },
1291 { "-Wno-missing-braces", "" },
1292 { "-Wmissing-declarations",
1293 N_("Warn about global funcs without previous declarations") },
1294 { "-Wno-missing-declarations", "" },
1295 { "-Wmissing-prototypes",
1296 N_("Warn about global funcs without prototypes") },
1297 { "-Wno-missing-prototypes", "" },
1298 { "-Wmultichar",
1299 N_("Warn about use of multicharacter literals") },
1300 { "-Wno-multichar", "" },
1301 { "-Wnested-externs",
1302 N_("Warn about externs not at file scope level") },
1303 { "-Wno-nested-externs", "" },
1304 { "-Wparentheses",
1305 N_("Warn about possible missing parentheses") },
1306 { "-Wno-parentheses", "" },
1307 { "-Wsequence-point",
1308 N_("Warn about possible violations of sequence point rules") },
1309 { "-Wno-sequence-point", "" },
1310 { "-Wpointer-arith",
1311 N_("Warn about function pointer arithmetic") },
1312 { "-Wno-pointer-arith", "" },
1313 { "-Wredundant-decls",
1314 N_("Warn about multiple declarations of the same object") },
1315 { "-Wno-redundant-decls", "" },
1316 { "-Wsign-compare",
1317 N_("Warn about signed/unsigned comparisons") },
1318 { "-Wno-sign-compare", "" },
1319 { "-Wfloat-equal",
1320 N_("Warn about testing equality of floating point numbers") },
1321 { "-Wno-float-equal", "" },
1322 { "-Wunknown-pragmas",
1323 N_("Warn about unrecognized pragmas") },
1324 { "-Wno-unknown-pragmas", "" },
1325 { "-Wstrict-prototypes",
1326 N_("Warn about non-prototyped function decls") },
1327 { "-Wno-strict-prototypes", "" },
1328 { "-Wtraditional",
1329 N_("Warn about constructs whose meaning change in ISO C") },
1330 { "-Wno-traditional", "" },
1331 { "-Wtrigraphs",
1332 N_("Warn when trigraphs are encountered") },
1333 { "-Wno-trigraphs", "" },
1334 { "-Wundef", "" },
1335 { "-Wno-undef", "" },
1336 { "-Wwrite-strings",
1337 N_("Mark strings as 'const char *'") },
1338 { "-Wno-write-strings", "" },
1340 #define DEFINE_LANG_NAME(NAME) { NULL, NAME },
1342 #include "options.h"
1346 /* Here is a table, controlled by the tm.h file, listing each -m switch
1347 and which bits in `target_switches' it should set or clear.
1348 If VALUE is positive, it is bits to set.
1349 If VALUE is negative, -VALUE is bits to clear.
1350 (The sign bit is not used so there is no confusion.) */
1352 static const struct
1354 const char *const name;
1355 const int value;
1356 const char *const description;
1358 target_switches [] = TARGET_SWITCHES;
1360 /* This table is similar, but allows the switch to have a value. */
1362 #ifdef TARGET_OPTIONS
1363 static const struct
1365 const char *const prefix;
1366 const char **const variable;
1367 const char *const description;
1369 target_options [] = TARGET_OPTIONS;
1370 #endif
1372 /* Options controlling warnings. */
1374 /* Don't print warning messages. -w. */
1376 int inhibit_warnings = 0;
1378 /* Don't suppress warnings from system headers. -Wsystem-headers. */
1380 int warn_system_headers = 0;
1382 /* Print various extra warnings. -W. */
1384 int extra_warnings = 0;
1386 /* Treat warnings as errors. -Werror. */
1388 int warnings_are_errors = 0;
1390 /* Nonzero to warn about unused variables, functions et.al. */
1392 int warn_unused_function;
1393 int warn_unused_label;
1394 int warn_unused_parameter;
1395 int warn_unused_variable;
1396 int warn_unused_value;
1398 /* Nonzero to warn about code which is never reached. */
1400 int warn_notreached;
1402 /* Nonzero to warn about variables used before they are initialized. */
1404 int warn_uninitialized;
1406 /* Nonzero means warn about all declarations which shadow others. */
1408 int warn_shadow;
1410 /* Warn if a switch on an enum fails to have a case for every enum value. */
1412 int warn_switch;
1414 /* Nonzero means warn about function definitions that default the return type
1415 or that use a null return and have a return-type other than void. */
1417 int warn_return_type;
1419 /* Nonzero means warn about pointer casts that increase the required
1420 alignment of the target type (and might therefore lead to a crash
1421 due to a misaligned access). */
1423 int warn_cast_align;
1425 /* Nonzero means warn about any objects definitions whose size is larger
1426 than N bytes. Also want about function definitions whose returned
1427 values are larger than N bytes. The value N is in `larger_than_size'. */
1429 int warn_larger_than;
1430 HOST_WIDE_INT larger_than_size;
1432 /* Nonzero means warn if inline function is too large. */
1434 int warn_inline;
1436 /* Warn if a function returns an aggregate,
1437 since there are often incompatible calling conventions for doing this. */
1439 int warn_aggregate_return;
1441 /* Warn if packed attribute on struct is unnecessary and inefficient. */
1443 int warn_packed;
1445 /* Warn when gcc pads a structure to an alignment boundary. */
1447 int warn_padded;
1449 /* Warn when an optimization pass is disabled. */
1451 int warn_disabled_optimization;
1453 /* Warn about functions which might be candidates for attribute noreturn. */
1455 int warn_missing_noreturn;
1457 /* Likewise for -W. */
1459 lang_independent_options W_options[] =
1461 {"unused-function", &warn_unused_function, 1,
1462 N_("Warn when a function is unused") },
1463 {"unused-label", &warn_unused_label, 1,
1464 N_("Warn when a label is unused") },
1465 {"unused-parameter", &warn_unused_parameter, 1,
1466 N_("Warn when a function parameter is unused") },
1467 {"unused-variable", &warn_unused_variable, 1,
1468 N_("Warn when a variable is unused") },
1469 {"unused-value", &warn_unused_value, 1,
1470 N_("Warn when an expression value is unused") },
1471 {"system-headers", &warn_system_headers, 1,
1472 N_("Do not suppress warnings from system headers") },
1473 {"error", &warnings_are_errors, 1,
1474 N_("Treat all warnings as errors") },
1475 {"shadow", &warn_shadow, 1,
1476 N_("Warn when one local variable shadows another") },
1477 {"switch", &warn_switch, 1,
1478 N_("Warn about enumerated switches missing a specific case") },
1479 {"aggregate-return", &warn_aggregate_return, 1,
1480 N_("Warn about returning structures, unions or arrays") },
1481 {"cast-align", &warn_cast_align, 1,
1482 N_("Warn about pointer casts which increase alignment") },
1483 {"unreachable-code", &warn_notreached, 1,
1484 N_("Warn about code that will never be executed") },
1485 {"uninitialized", &warn_uninitialized, 1,
1486 N_("Warn about uninitialized automatic variables") },
1487 {"inline", &warn_inline, 1,
1488 N_("Warn when an inlined function cannot be inlined") },
1489 {"packed", &warn_packed, 1,
1490 N_("Warn when the packed attribute has no effect on struct layout") },
1491 {"padded", &warn_padded, 1,
1492 N_("Warn when padding is required to align struct members") },
1493 {"disabled-optimization", &warn_disabled_optimization, 1,
1494 N_("Warn when an optimization pass is disabled") },
1495 {"missing-noreturn", &warn_missing_noreturn, 1,
1496 N_("Warn about functions which might be candidates for attribute noreturn") }
1499 void
1500 set_Wunused (setting)
1501 int setting;
1503 warn_unused_function = setting;
1504 warn_unused_label = setting;
1505 /* Unused function parameter warnings are reported when either ``-W
1506 -Wunused'' or ``-Wunused-parameter'' is specified. Differentiate
1507 -Wunused by setting WARN_UNUSED_PARAMETER to -1. */
1508 if (!setting)
1509 warn_unused_parameter = 0;
1510 else if (!warn_unused_parameter)
1511 warn_unused_parameter = -1;
1512 warn_unused_variable = setting;
1513 warn_unused_value = setting;
1516 /* The following routines are useful in setting all the flags that
1517 -ffast-math and -fno-fast-math imply. */
1519 void
1520 set_fast_math_flags ()
1522 flag_trapping_math = 0;
1523 flag_unsafe_math_optimizations = 1;
1524 flag_errno_math = 0;
1527 void
1528 set_no_fast_math_flags ()
1530 flag_trapping_math = 1;
1531 flag_unsafe_math_optimizations = 0;
1532 flag_errno_math = 1;
1536 /* Output files for assembler code (real compiler output)
1537 and debugging dumps. */
1539 FILE *asm_out_file;
1540 FILE *aux_info_file;
1541 FILE *rtl_dump_file = NULL;
1543 /* Decode the string P as an integral parameter.
1544 If the string is indeed an integer return its numeric value else
1545 issue an Invalid Option error for the option PNAME and return DEFVAL.
1546 If PNAME is zero just return DEFVAL, do not call error. */
1549 read_integral_parameter (p, pname, defval)
1550 const char *p;
1551 const char *pname;
1552 const int defval;
1554 const char *endp = p;
1556 while (*endp)
1558 if (ISDIGIT (*endp))
1559 endp++;
1560 else
1561 break;
1564 if (*endp != 0)
1566 if (pname != 0)
1567 error ("invalid option `%s'", pname);
1568 return defval;
1571 return atoi (p);
1575 /* This is the default decl_printable_name function. */
1577 static const char *
1578 decl_name (decl, verbosity)
1579 tree decl;
1580 int verbosity ATTRIBUTE_UNUSED;
1582 return IDENTIFIER_POINTER (DECL_NAME (decl));
1586 /* This calls abort and is used to avoid problems when abort if a macro.
1587 It is used when we need to pass the address of abort. */
1589 void
1590 do_abort ()
1592 abort ();
1595 /* When `malloc.c' is compiled with `rcheck' defined,
1596 it calls this function to report clobberage. */
1598 void
1599 botch (s)
1600 const char *s ATTRIBUTE_UNUSED;
1602 abort ();
1605 /* Return the logarithm of X, base 2, considering X unsigned,
1606 if X is a power of 2. Otherwise, returns -1.
1608 This should be used via the `exact_log2' macro. */
1611 exact_log2_wide (x)
1612 unsigned HOST_WIDE_INT x;
1614 int log = 0;
1615 /* Test for 0 or a power of 2. */
1616 if (x == 0 || x != (x & -x))
1617 return -1;
1618 while ((x >>= 1) != 0)
1619 log++;
1620 return log;
1623 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
1624 If X is 0, return -1.
1626 This should be used via the floor_log2 macro. */
1629 floor_log2_wide (x)
1630 unsigned HOST_WIDE_INT x;
1632 int log = -1;
1633 while (x != 0)
1634 log++,
1635 x >>= 1;
1636 return log;
1639 static int float_handler_set;
1640 int float_handled;
1641 jmp_buf float_handler;
1643 /* Signals actually come here. */
1645 static void
1646 float_signal (signo)
1647 /* If this is missing, some compilers complain. */
1648 int signo ATTRIBUTE_UNUSED;
1650 if (float_handled == 0)
1651 crash_signal (signo);
1652 float_handled = 0;
1654 /* On System-V derived systems, we must reinstall the signal handler.
1655 This is harmless on BSD-derived systems. */
1656 signal (SIGFPE, float_signal);
1657 longjmp (float_handler, 1);
1660 /* Specify where to longjmp to when a floating arithmetic error happens.
1661 If HANDLER is 0, it means don't handle the errors any more. */
1663 static void
1664 set_float_handler (handler)
1665 jmp_buf handler;
1667 float_handled = (handler != 0);
1668 if (handler)
1669 memcpy (float_handler, handler, sizeof (float_handler));
1671 if (float_handled && ! float_handler_set)
1673 signal (SIGFPE, float_signal);
1674 float_handler_set = 1;
1678 /* This is a wrapper function for code which might elicit an
1679 arithmetic exception. That code should be passed in as a function
1680 pointer FN, and one argument DATA. DATA is usually a struct which
1681 contains the real input and output for function FN. This function
1682 returns 0 (failure) if longjmp was called (i.e. an exception
1683 occurred.) It returns 1 (success) otherwise. */
1686 do_float_handler (fn, data)
1687 void (*fn) PARAMS ((PTR));
1688 PTR data;
1690 jmp_buf buf;
1692 if (setjmp (buf))
1694 /* We got here via longjmp () caused by an exception in function
1695 fn (). */
1696 set_float_handler (NULL);
1697 return 0;
1700 set_float_handler (buf);
1701 (*fn)(data);
1702 set_float_handler (NULL);
1703 return 1;
1706 /* Handler for fatal signals, such as SIGSEGV. These are transformed
1707 into ICE messages, which is much more user friendly. */
1709 static void
1710 crash_signal (signo)
1711 int signo;
1713 internal_error ("internal error: %s", strsignal (signo));
1716 /* Strip off a legitimate source ending from the input string NAME of
1717 length LEN. Rather than having to know the names used by all of
1718 our front ends, we strip off an ending of a period followed by
1719 up to five characters. (Java uses ".class".) */
1721 void
1722 strip_off_ending (name, len)
1723 char *name;
1724 int len;
1726 int i;
1727 for (i = 2; i < 6 && len > i; i++)
1729 if (name[len - i] == '.')
1731 name[len - i] = '\0';
1732 break;
1737 /* Output a quoted string. */
1739 void
1740 output_quoted_string (asm_file, string)
1741 FILE *asm_file;
1742 const char *string;
1744 #ifdef OUTPUT_QUOTED_STRING
1745 OUTPUT_QUOTED_STRING (asm_file, string);
1746 #else
1747 char c;
1749 putc ('\"', asm_file);
1750 while ((c = *string++) != 0)
1752 if (c == '\"' || c == '\\')
1753 putc ('\\', asm_file);
1754 putc (c, asm_file);
1756 putc ('\"', asm_file);
1757 #endif
1760 /* Output a file name in the form wanted by System V. */
1762 void
1763 output_file_directive (asm_file, input_name)
1764 FILE *asm_file;
1765 const char *input_name;
1767 int len = strlen (input_name);
1768 const char *na = input_name + len;
1770 /* NA gets INPUT_NAME sans directory names. */
1771 while (na > input_name)
1773 if (IS_DIR_SEPARATOR (na[-1]))
1774 break;
1775 na--;
1778 #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
1779 ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
1780 #else
1781 #ifdef ASM_OUTPUT_SOURCE_FILENAME
1782 ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
1783 #else
1784 fprintf (asm_file, "\t.file\t");
1785 output_quoted_string (asm_file, na);
1786 fputc ('\n', asm_file);
1787 #endif
1788 #endif
1791 /* Routine to open a dump file. Return true if the dump file is enabled. */
1793 static int
1794 open_dump_file (index, decl)
1795 enum dump_file_index index;
1796 tree decl;
1798 char *dump_name;
1799 const char *open_arg;
1800 char seq[16];
1802 if (! dump_file[index].enabled)
1803 return 0;
1805 timevar_push (TV_DUMP);
1806 if (rtl_dump_file != NULL)
1807 fclose (rtl_dump_file);
1809 sprintf (seq, DUMPFILE_FORMAT, index);
1811 if (! dump_file[index].initialized)
1813 /* If we've not initialized the files, do so now. */
1814 if (graph_dump_format != no_graph
1815 && dump_file[index].graph_dump_p)
1817 dump_name = concat (seq, dump_file[index].extension, NULL);
1818 clean_graph_dump_file (dump_base_name, dump_name);
1819 free (dump_name);
1821 dump_file[index].initialized = 1;
1822 open_arg = "w";
1824 else
1825 open_arg = "a";
1827 dump_name = concat (dump_base_name, seq,
1828 dump_file[index].extension, NULL);
1830 rtl_dump_file = fopen (dump_name, open_arg);
1831 if (rtl_dump_file == NULL)
1832 fatal_io_error ("can't open %s", dump_name);
1834 free (dump_name);
1836 if (decl)
1837 fprintf (rtl_dump_file, "\n;; Function %s\n\n",
1838 decl_printable_name (decl, 2));
1840 timevar_pop (TV_DUMP);
1841 return 1;
1844 /* Routine to close a dump file. */
1846 static void
1847 close_dump_file (index, func, insns)
1848 enum dump_file_index index;
1849 void (*func) PARAMS ((FILE *, rtx));
1850 rtx insns;
1852 if (! rtl_dump_file)
1853 return;
1855 timevar_push (TV_DUMP);
1856 if (insns
1857 && graph_dump_format != no_graph
1858 && dump_file[index].graph_dump_p)
1860 char seq[16];
1861 char *suffix;
1863 sprintf (seq, DUMPFILE_FORMAT, index);
1864 suffix = concat (seq, dump_file[index].extension, NULL);
1865 print_rtl_graph_with_bb (dump_base_name, suffix, insns);
1866 free (suffix);
1869 if (func && insns)
1870 func (rtl_dump_file, insns);
1872 fflush (rtl_dump_file);
1873 fclose (rtl_dump_file);
1875 rtl_dump_file = NULL;
1876 timevar_pop (TV_DUMP);
1879 /* Do any final processing required for the declarations in VEC, of
1880 which there are LEN. We write out inline functions and variables
1881 that have been deferred until this point, but which are required.
1882 Returns non-zero if anything was put out. */
1885 wrapup_global_declarations (vec, len)
1886 tree *vec;
1887 int len;
1889 tree decl;
1890 int i;
1891 int reconsider;
1892 int output_something = 0;
1894 for (i = 0; i < len; i++)
1896 decl = vec[i];
1898 /* We're not deferring this any longer. */
1899 DECL_DEFER_OUTPUT (decl) = 0;
1901 if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0
1902 && incomplete_decl_finalize_hook != 0)
1903 (*incomplete_decl_finalize_hook) (decl);
1906 /* Now emit any global variables or functions that we have been
1907 putting off. We need to loop in case one of the things emitted
1908 here references another one which comes earlier in the list. */
1911 reconsider = 0;
1912 for (i = 0; i < len; i++)
1914 decl = vec[i];
1916 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
1917 continue;
1919 /* Don't write out static consts, unless we still need them.
1921 We also keep static consts if not optimizing (for debugging),
1922 unless the user specified -fno-keep-static-consts.
1923 ??? They might be better written into the debug information.
1924 This is possible when using DWARF.
1926 A language processor that wants static constants to be always
1927 written out (even if it is not used) is responsible for
1928 calling rest_of_decl_compilation itself. E.g. the C front-end
1929 calls rest_of_decl_compilation from finish_decl.
1930 One motivation for this is that is conventional in some
1931 environments to write things like:
1932 static const char rcsid[] = "... version string ...";
1933 intending to force the string to be in the executable.
1935 A language processor that would prefer to have unneeded
1936 static constants "optimized away" would just defer writing
1937 them out until here. E.g. C++ does this, because static
1938 constants are often defined in header files.
1940 ??? A tempting alternative (for both C and C++) would be
1941 to force a constant to be written if and only if it is
1942 defined in a main file, as opposed to an include file. */
1944 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
1945 && (((! TREE_READONLY (decl) || TREE_PUBLIC (decl))
1946 && !DECL_COMDAT (decl))
1947 || (!optimize
1948 && flag_keep_static_consts
1949 && !DECL_ARTIFICIAL (decl))
1950 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
1952 reconsider = 1;
1953 rest_of_decl_compilation (decl, NULL, 1, 1);
1956 if (TREE_CODE (decl) == FUNCTION_DECL
1957 && DECL_INITIAL (decl) != 0
1958 && DECL_SAVED_INSNS (decl) != 0
1959 && (flag_keep_inline_functions
1960 || (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
1961 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
1963 reconsider = 1;
1964 output_inline_function (decl);
1968 if (reconsider)
1969 output_something = 1;
1971 while (reconsider);
1973 return output_something;
1976 /* Issue appropriate warnings for the global declarations in VEC (of
1977 which there are LEN). Output debugging information for them. */
1979 void
1980 check_global_declarations (vec, len)
1981 tree *vec;
1982 int len;
1984 tree decl;
1985 int i;
1987 for (i = 0; i < len; i++)
1989 decl = vec[i];
1991 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
1992 && ! TREE_ASM_WRITTEN (decl))
1993 /* Cancel the RTL for this decl so that, if debugging info
1994 output for global variables is still to come,
1995 this one will be omitted. */
1996 SET_DECL_RTL (decl, NULL_RTX);
1998 /* Warn about any function
1999 declared static but not defined.
2000 We don't warn about variables,
2001 because many programs have static variables
2002 that exist only to get some text into the object file. */
2003 if (TREE_CODE (decl) == FUNCTION_DECL
2004 && (warn_unused_function
2005 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2006 && DECL_INITIAL (decl) == 0
2007 && DECL_EXTERNAL (decl)
2008 && ! DECL_ARTIFICIAL (decl)
2009 && ! TREE_PUBLIC (decl))
2011 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2012 pedwarn_with_decl (decl,
2013 "`%s' used but never defined");
2014 else
2015 warning_with_decl (decl,
2016 "`%s' declared `static' but never defined");
2017 /* This symbol is effectively an "extern" declaration now. */
2018 TREE_PUBLIC (decl) = 1;
2019 assemble_external (decl);
2022 /* Warn about static fns or vars defined but not used,
2023 but not about inline functions or static consts
2024 since defining those in header files is normal practice. */
2025 if (((warn_unused_function
2026 && TREE_CODE (decl) == FUNCTION_DECL && ! DECL_INLINE (decl))
2027 || (warn_unused_variable
2028 && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
2029 && ! DECL_IN_SYSTEM_HEADER (decl)
2030 && ! DECL_EXTERNAL (decl)
2031 && ! TREE_PUBLIC (decl)
2032 && ! TREE_USED (decl)
2033 && (TREE_CODE (decl) == FUNCTION_DECL || ! DECL_REGISTER (decl))
2034 /* The TREE_USED bit for file-scope decls
2035 is kept in the identifier, to handle multiple
2036 external decls in different scopes. */
2037 && ! TREE_USED (DECL_NAME (decl)))
2038 warning_with_decl (decl, "`%s' defined but not used");
2040 timevar_push (TV_SYMOUT);
2041 (*debug_hooks->global_decl) (decl);
2042 timevar_pop (TV_SYMOUT);
2046 /* Save the current INPUT_FILENAME and LINENO on the top entry in the
2047 INPUT_FILE_STACK. Push a new entry for FILE and LINE, and set the
2048 INPUT_FILENAME and LINENO accordingly. */
2050 void
2051 push_srcloc (file, line)
2052 const char *file;
2053 int line;
2055 struct file_stack *fs;
2057 if (input_file_stack)
2059 input_file_stack->name = input_filename;
2060 input_file_stack->line = lineno;
2063 fs = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2064 fs->name = input_filename = file;
2065 fs->line = lineno = line;
2066 fs->indent_level = 0;
2067 fs->next = input_file_stack;
2068 input_file_stack = fs;
2069 input_file_stack_tick++;
2072 /* Pop the top entry off the stack of presently open source files.
2073 Restore the INPUT_FILENAME and LINENO from the new topmost entry on
2074 the stack. */
2076 void
2077 pop_srcloc ()
2079 struct file_stack *fs;
2081 fs = input_file_stack;
2082 input_file_stack = fs->next;
2083 free (fs);
2084 input_file_stack_tick++;
2085 /* The initial source file is never popped. */
2086 if (!input_file_stack)
2087 abort ();
2088 input_filename = input_file_stack->name;
2089 lineno = input_file_stack->line;
2092 /* Compile an entire translation unit. Write a file of assembly
2093 output and various debugging dumps. */
2095 static void
2096 compile_file ()
2098 tree globals;
2100 /* Initialize yet another pass. */
2102 init_final (main_input_filename);
2103 init_branch_prob (dump_base_name);
2105 timevar_push (TV_PARSE);
2107 /* Call the parser, which parses the entire file
2108 (calling rest_of_compilation for each function). */
2109 yyparse ();
2111 /* In case there were missing block closers,
2112 get us back to the global binding level. */
2113 (*lang_hooks.clear_binding_stack) ();
2115 /* Compilation is now finished except for writing
2116 what's left of the symbol table output. */
2118 timevar_pop (TV_PARSE);
2120 if (flag_syntax_only)
2121 return;
2123 globals = getdecls ();
2125 /* Really define vars that have had only a tentative definition.
2126 Really output inline functions that must actually be callable
2127 and have not been output so far. */
2130 int len = list_length (globals);
2131 tree *vec = (tree *) xmalloc (sizeof (tree) * len);
2132 int i;
2133 tree decl;
2135 /* Process the decls in reverse order--earliest first.
2136 Put them into VEC from back to front, then take out from front. */
2138 for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
2139 vec[len - i - 1] = decl;
2141 wrapup_global_declarations (vec, len);
2143 /* This must occur after the loop to output deferred functions. Else
2144 the profiler initializer would not be emitted if all the functions
2145 in this compilation unit were deferred.
2147 output_func_start_profiler can not cause any additional functions or
2148 data to need to be output, so it need not be in the deferred function
2149 loop above. */
2150 output_func_start_profiler ();
2152 check_global_declarations (vec, len);
2154 /* Clean up. */
2155 free (vec);
2158 /* Write out any pending weak symbol declarations. */
2160 weak_finish ();
2162 /* Do dbx symbols. */
2163 timevar_push (TV_SYMOUT);
2165 #ifdef DWARF2_UNWIND_INFO
2166 if (dwarf2out_do_frame ())
2167 dwarf2out_frame_finish ();
2168 #endif
2170 (*debug_hooks->finish) (main_input_filename);
2171 timevar_pop (TV_SYMOUT);
2173 /* Output some stuff at end of file if nec. */
2175 dw2_output_indirect_constants ();
2177 end_final (dump_base_name);
2179 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
2181 timevar_push (TV_DUMP);
2182 open_dump_file (DFI_bp, NULL);
2184 end_branch_prob ();
2186 close_dump_file (DFI_bp, NULL, NULL_RTX);
2187 timevar_pop (TV_DUMP);
2190 #ifdef ASM_FILE_END
2191 ASM_FILE_END (asm_out_file);
2192 #endif
2194 /* Attach a special .ident directive to the end of the file to identify
2195 the version of GCC which compiled this code. The format of the .ident
2196 string is patterned after the ones produced by native SVR4 compilers. */
2197 #ifdef IDENT_ASM_OP
2198 if (!flag_no_ident)
2199 fprintf (asm_out_file, "%s\"GCC: (GNU) %s\"\n",
2200 IDENT_ASM_OP, version_string);
2201 #endif
2203 if (optimize > 0 && open_dump_file (DFI_combine, NULL))
2205 timevar_push (TV_DUMP);
2206 dump_combine_total_stats (rtl_dump_file);
2207 close_dump_file (DFI_combine, NULL, NULL_RTX);
2208 timevar_pop (TV_DUMP);
2212 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
2213 and TYPE_DECL nodes.
2215 This does nothing for local (non-static) variables, unless the
2216 variable is a register variable with an ASMSPEC. In that case, or
2217 if the variable is not an automatic, it sets up the RTL and
2218 outputs any assembler code (label definition, storage allocation
2219 and initialization).
2221 DECL is the declaration. If ASMSPEC is nonzero, it specifies
2222 the assembler symbol name to be used. TOP_LEVEL is nonzero
2223 if this declaration is not within a function. */
2225 void
2226 rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2227 tree decl;
2228 const char *asmspec;
2229 int top_level;
2230 int at_end;
2232 /* Declarations of variables, and of functions defined elsewhere. */
2234 /* The most obvious approach, to put an #ifndef around where
2235 this macro is used, doesn't work since it's inside a macro call. */
2236 #ifndef ASM_FINISH_DECLARE_OBJECT
2237 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP, END)
2238 #endif
2240 /* Forward declarations for nested functions are not "external",
2241 but we need to treat them as if they were. */
2242 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
2243 || TREE_CODE (decl) == FUNCTION_DECL)
2245 timevar_push (TV_VARCONST);
2246 if (asmspec)
2247 make_decl_rtl (decl, asmspec);
2248 /* Don't output anything
2249 when a tentative file-scope definition is seen.
2250 But at end of compilation, do output code for them. */
2251 if (at_end || !DECL_DEFER_OUTPUT (decl))
2252 assemble_variable (decl, top_level, at_end, 0);
2253 if (decl == last_assemble_variable_decl)
2255 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2256 top_level, at_end);
2258 timevar_pop (TV_VARCONST);
2260 else if (DECL_REGISTER (decl) && asmspec != 0)
2262 if (decode_reg_name (asmspec) >= 0)
2264 SET_DECL_RTL (decl, NULL_RTX);
2265 make_decl_rtl (decl, asmspec);
2267 else
2269 error ("invalid register name `%s' for register variable", asmspec);
2270 DECL_REGISTER (decl) = 0;
2271 if (!top_level)
2272 expand_decl (decl);
2275 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2276 else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2277 && TREE_CODE (decl) == TYPE_DECL)
2279 timevar_push (TV_SYMOUT);
2280 dbxout_symbol (decl, 0);
2281 timevar_pop (TV_SYMOUT);
2283 #endif
2284 #ifdef SDB_DEBUGGING_INFO
2285 else if (write_symbols == SDB_DEBUG && top_level
2286 && TREE_CODE (decl) == TYPE_DECL)
2288 timevar_push (TV_SYMOUT);
2289 sdbout_symbol (decl, 0);
2290 timevar_pop (TV_SYMOUT);
2292 #endif
2295 /* Called after finishing a record, union or enumeral type. */
2297 void
2298 rest_of_type_compilation (type, toplev)
2299 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO) || defined (SDB_DEBUGGING_INFO)
2300 tree type;
2301 int toplev;
2302 #else
2303 tree type ATTRIBUTE_UNUSED;
2304 int toplev ATTRIBUTE_UNUSED;
2305 #endif
2307 timevar_push (TV_SYMOUT);
2308 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2309 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2310 dbxout_symbol (TYPE_STUB_DECL (type), !toplev);
2311 #endif
2312 #ifdef SDB_DEBUGGING_INFO
2313 if (write_symbols == SDB_DEBUG)
2314 sdbout_symbol (TYPE_STUB_DECL (type), !toplev);
2315 #endif
2316 #ifdef DWARF2_DEBUGGING_INFO
2317 if ((write_symbols == DWARF2_DEBUG
2318 || write_symbols == VMS_AND_DWARF2_DEBUG)
2319 && toplev)
2320 dwarf2out_decl (TYPE_STUB_DECL (type));
2321 #endif
2322 timevar_pop (TV_SYMOUT);
2325 /* This is called from finish_function (within yyparse)
2326 after each top-level definition is parsed.
2327 It is supposed to compile that function or variable
2328 and output the assembler code for it.
2329 After we return, the tree storage is freed. */
2331 void
2332 rest_of_compilation (decl)
2333 tree decl;
2335 rtx insns;
2336 int tem;
2337 int failure = 0;
2338 int rebuild_label_notes_after_reload;
2339 int register_life_up_to_date;
2341 timevar_push (TV_REST_OF_COMPILATION);
2343 /* Now that we're out of the frontend, we shouldn't have any more
2344 CONCATs anywhere. */
2345 generating_concat_p = 0;
2347 /* When processing delayed functions, prepare_function_start() won't
2348 have been run to re-initialize it. */
2349 cse_not_expected = ! optimize;
2351 /* First, make sure that NOTE_BLOCK is set correctly for each
2352 NOTE_INSN_BLOCK_BEG/NOTE_INSN_BLOCK_END note. */
2353 if (!cfun->x_whole_function_mode_p)
2354 identify_blocks ();
2356 /* Then remove any notes we don't need. That will make iterating
2357 over the instruction sequence faster, and allow the garbage
2358 collector to reclaim the memory used by the notes. */
2359 remove_unnecessary_notes ();
2361 /* In function-at-a-time mode, we do not attempt to keep the BLOCK
2362 tree in sensible shape. So, we just recalculate it here. */
2363 if (cfun->x_whole_function_mode_p)
2364 reorder_blocks ();
2366 init_flow ();
2368 /* If we are reconsidering an inline function
2369 at the end of compilation, skip the stuff for making it inline. */
2371 if (DECL_SAVED_INSNS (decl) == 0)
2373 int inlinable = 0;
2374 tree parent;
2375 const char *lose;
2377 /* If this is nested inside an inlined external function, pretend
2378 it was only declared. Since we cannot inline such functions,
2379 generating code for this one is not only not necessary but will
2380 confuse some debugging output writers. */
2381 for (parent = DECL_CONTEXT (current_function_decl);
2382 parent != NULL_TREE;
2383 parent = get_containing_scope (parent))
2384 if (TREE_CODE (parent) == FUNCTION_DECL
2385 && DECL_INLINE (parent) && DECL_EXTERNAL (parent))
2387 DECL_INITIAL (decl) = 0;
2388 goto exit_rest_of_compilation;
2391 /* If requested, consider whether to make this function inline. */
2392 if ((DECL_INLINE (decl) && !flag_no_inline)
2393 || flag_inline_functions)
2395 timevar_push (TV_INTEGRATION);
2396 lose = function_cannot_inline_p (decl);
2397 timevar_pop (TV_INTEGRATION);
2398 if (lose || ! optimize)
2400 if (warn_inline && DECL_INLINE (decl))
2401 warning_with_decl (decl, lose);
2402 DECL_ABSTRACT_ORIGIN (decl) = 0;
2403 /* Don't really compile an extern inline function.
2404 If we can't make it inline, pretend
2405 it was only declared. */
2406 if (DECL_EXTERNAL (decl))
2408 DECL_INITIAL (decl) = 0;
2409 goto exit_rest_of_compilation;
2412 else
2413 /* ??? Note that this has the effect of making it look
2414 like "inline" was specified for a function if we choose
2415 to inline it. This isn't quite right, but it's
2416 probably not worth the trouble to fix. */
2417 inlinable = DECL_INLINE (decl) = 1;
2420 insns = get_insns ();
2422 /* Dump the rtl code if we are dumping rtl. */
2424 if (open_dump_file (DFI_rtl, decl))
2426 if (DECL_SAVED_INSNS (decl))
2427 fprintf (rtl_dump_file, ";; (integrable)\n\n");
2428 close_dump_file (DFI_rtl, print_rtl, insns);
2431 /* Convert from NOTE_INSN_EH_REGION style notes, and do other
2432 sorts of eh initialization. Delay this until after the
2433 initial rtl dump so that we can see the original nesting. */
2434 convert_from_eh_region_ranges ();
2436 /* If function is inline, and we don't yet know whether to
2437 compile it by itself, defer decision till end of compilation.
2438 finish_compilation will call rest_of_compilation again
2439 for those functions that need to be output. Also defer those
2440 functions that we are supposed to defer. */
2442 if (inlinable
2443 || (DECL_INLINE (decl)
2444 && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
2445 && ! flag_keep_inline_functions)
2446 || DECL_EXTERNAL (decl))))
2447 DECL_DEFER_OUTPUT (decl) = 1;
2449 if (DECL_INLINE (decl))
2450 /* DWARF wants separate debugging info for abstract and
2451 concrete instances of all inline functions, including those
2452 declared inline but not inlined, and those inlined even
2453 though they weren't declared inline. Conveniently, that's
2454 what DECL_INLINE means at this point. */
2455 (*debug_hooks->deferred_inline_function) (decl);
2457 if (DECL_DEFER_OUTPUT (decl))
2459 /* If -Wreturn-type, we have to do a bit of compilation. We just
2460 want to call cleanup the cfg to figure out whether or not we can
2461 fall off the end of the function; we do the minimum amount of
2462 work necessary to make that safe. */
2463 if (warn_return_type)
2465 int saved_optimize = optimize;
2467 optimize = 0;
2468 rebuild_jump_labels (insns);
2469 find_exception_handler_labels ();
2470 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2471 cleanup_cfg (CLEANUP_PRE_SIBCALL | CLEANUP_PRE_LOOP);
2472 optimize = saved_optimize;
2474 /* CFG is no longer maintained up-to-date. */
2475 free_bb_for_insn ();
2478 current_function_nothrow = nothrow_function_p ();
2479 if (current_function_nothrow)
2480 /* Now we know that this can't throw; set the flag for the benefit
2481 of other functions later in this translation unit. */
2482 TREE_NOTHROW (current_function_decl) = 1;
2484 timevar_push (TV_INTEGRATION);
2485 save_for_inline (decl);
2486 timevar_pop (TV_INTEGRATION);
2487 DECL_SAVED_INSNS (decl)->inlinable = inlinable;
2488 goto exit_rest_of_compilation;
2491 /* If specified extern inline but we aren't inlining it, we are
2492 done. This goes for anything that gets here with DECL_EXTERNAL
2493 set, not just things with DECL_INLINE. */
2494 if (DECL_EXTERNAL (decl))
2495 goto exit_rest_of_compilation;
2498 ggc_collect ();
2500 /* Initialize some variables used by the optimizers. */
2501 init_function_for_compilation ();
2503 if (! DECL_DEFER_OUTPUT (decl))
2504 TREE_ASM_WRITTEN (decl) = 1;
2506 /* Now that integrate will no longer see our rtl, we need not
2507 distinguish between the return value of this function and the
2508 return value of called functions. Also, we can remove all SETs
2509 of subregs of hard registers; they are only here because of
2510 integrate. Also, we can now initialize pseudos intended to
2511 carry magic hard reg data throughout the function. */
2512 rtx_equal_function_value_matters = 0;
2513 purge_hard_subreg_sets (get_insns ());
2514 emit_initial_value_sets ();
2516 /* Don't return yet if -Wreturn-type; we need to do cleanup_cfg. */
2517 if ((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
2518 goto exit_rest_of_compilation;
2520 /* We may have potential sibling or tail recursion sites. Select one
2521 (of possibly multiple) methods of performing the call. */
2522 if (flag_optimize_sibling_calls)
2524 timevar_push (TV_JUMP);
2525 open_dump_file (DFI_sibling, decl);
2527 optimize_sibling_and_tail_recursive_calls ();
2529 close_dump_file (DFI_sibling, print_rtl, get_insns ());
2530 timevar_pop (TV_JUMP);
2533 /* Complete generation of exception handling code. */
2534 find_exception_handler_labels ();
2535 if (doing_eh (0))
2537 timevar_push (TV_JUMP);
2538 open_dump_file (DFI_eh, decl);
2540 finish_eh_generation ();
2542 close_dump_file (DFI_eh, print_rtl, get_insns ());
2543 timevar_pop (TV_JUMP);
2546 #ifdef FINALIZE_PIC
2547 /* If we are doing position-independent code generation, now
2548 is the time to output special prologues and epilogues.
2549 We do not want to do this earlier, because it just clutters
2550 up inline functions with meaningless insns. */
2551 if (flag_pic)
2552 FINALIZE_PIC;
2553 #endif
2555 insns = get_insns ();
2557 /* Copy any shared structure that should not be shared. */
2558 unshare_all_rtl (current_function_decl, insns);
2560 #ifdef SETJMP_VIA_SAVE_AREA
2561 /* This must be performed before virtual register instantiation. */
2562 if (current_function_calls_alloca)
2563 optimize_save_area_alloca (insns);
2564 #endif
2566 /* Instantiate all virtual registers. */
2567 instantiate_virtual_regs (current_function_decl, insns);
2569 open_dump_file (DFI_jump, decl);
2571 /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
2572 are initialized and to compute whether control can drop off the end
2573 of the function. */
2575 timevar_push (TV_JUMP);
2576 /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB. Do this
2577 before jump optimization switches branch directions. */
2578 expected_value_to_br_prob ();
2580 reg_scan (insns, max_reg_num (), 0);
2581 rebuild_jump_labels (insns);
2582 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2583 cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_PRE_LOOP);
2585 /* CFG is no longer maintained up-to-date. */
2586 free_bb_for_insn ();
2587 copy_loop_headers (insns);
2588 purge_line_number_notes (insns);
2590 timevar_pop (TV_JUMP);
2592 /* Now is when we stop if -fsyntax-only and -Wreturn-type. */
2593 if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
2595 close_dump_file (DFI_jump, print_rtl, insns);
2596 goto exit_rest_of_compilation;
2599 /* Long term, this should probably move before the jump optimizer too,
2600 but I didn't want to disturb the rtl_dump_and_exit and related
2601 stuff at this time. */
2602 if (optimize > 0 && flag_ssa)
2604 /* Convert to SSA form. */
2606 timevar_push (TV_TO_SSA);
2607 open_dump_file (DFI_ssa, decl);
2609 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2610 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2611 convert_to_ssa ();
2613 close_dump_file (DFI_ssa, print_rtl_with_bb, insns);
2614 timevar_pop (TV_TO_SSA);
2616 /* Perform sparse conditional constant propagation, if requested. */
2617 if (flag_ssa_ccp)
2619 timevar_push (TV_SSA_CCP);
2620 open_dump_file (DFI_ssa_ccp, decl);
2622 ssa_const_prop ();
2624 close_dump_file (DFI_ssa_ccp, print_rtl_with_bb, get_insns ());
2625 timevar_pop (TV_SSA_CCP);
2628 /* It would be useful to cleanup the CFG at this point, but block
2629 merging and possibly other transformations might leave a PHI
2630 node in the middle of a basic block, which is a strict no-no. */
2632 /* The SSA implementation uses basic block numbers in its phi
2633 nodes. Thus, changing the control-flow graph or the basic
2634 blocks, e.g., calling find_basic_blocks () or cleanup_cfg (),
2635 may cause problems. */
2637 if (flag_ssa_dce)
2639 /* Remove dead code. */
2641 timevar_push (TV_SSA_DCE);
2642 open_dump_file (DFI_ssa_dce, decl);
2644 insns = get_insns ();
2645 ssa_eliminate_dead_code();
2647 close_dump_file (DFI_ssa_dce, print_rtl_with_bb, insns);
2648 timevar_pop (TV_SSA_DCE);
2651 /* Convert from SSA form. */
2653 timevar_push (TV_FROM_SSA);
2654 open_dump_file (DFI_ussa, decl);
2656 convert_from_ssa ();
2657 /* New registers have been created. Rescan their usage. */
2658 reg_scan (insns, max_reg_num (), 1);
2660 close_dump_file (DFI_ussa, print_rtl_with_bb, insns);
2661 timevar_pop (TV_FROM_SSA);
2663 ggc_collect ();
2664 /* CFG is no longer maintained up-to-date. */
2665 free_bb_for_insn ();
2668 timevar_push (TV_JUMP);
2670 if (optimize > 0)
2672 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2673 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2675 /* ??? Run if-conversion before delete_null_pointer_checks,
2676 since the later does not preserve the CFG. This should
2677 be changed -- no since converting if's that are going to
2678 be deleted. */
2679 timevar_push (TV_IFCVT);
2680 if_convert (0);
2681 timevar_pop (TV_IFCVT);
2683 /* CFG is no longer maintained up-to-date. */
2684 free_bb_for_insn ();
2685 /* Try to identify useless null pointer tests and delete them. */
2686 if (flag_delete_null_pointer_checks)
2687 delete_null_pointer_checks (insns);
2690 /* Jump optimization, and the removal of NULL pointer checks, may
2691 have reduced the number of instructions substantially. CSE, and
2692 future passes, allocate arrays whose dimensions involve the
2693 maximum instruction UID, so if we can reduce the maximum UID
2694 we'll save big on memory. */
2695 renumber_insns (rtl_dump_file);
2696 timevar_pop (TV_JUMP);
2698 close_dump_file (DFI_jump, print_rtl, insns);
2700 ggc_collect ();
2702 /* Perform common subexpression elimination.
2703 Nonzero value from `cse_main' means that jumps were simplified
2704 and some code may now be unreachable, so do
2705 jump optimization again. */
2707 if (optimize > 0)
2709 open_dump_file (DFI_cse, decl);
2710 timevar_push (TV_CSE);
2712 reg_scan (insns, max_reg_num (), 1);
2714 if (flag_thread_jumps)
2716 timevar_push (TV_JUMP);
2717 thread_jumps (insns, max_reg_num (), 1);
2718 timevar_pop (TV_JUMP);
2721 tem = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2723 /* If we are not running more CSE passes, then we are no longer
2724 expecting CSE to be run. But always rerun it in a cheap mode. */
2725 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
2727 if (tem || optimize > 1)
2729 timevar_push (TV_JUMP);
2730 rebuild_jump_labels (insns);
2731 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2732 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2733 timevar_pop (TV_JUMP);
2734 /* CFG is no longer maintained up-to-date. */
2735 free_bb_for_insn ();
2738 /* Run this after jump optmizations remove all the unreachable code
2739 so that unreachable code will not keep values live. */
2740 delete_trivially_dead_insns (insns, max_reg_num (), 0);
2742 /* Try to identify useless null pointer tests and delete them. */
2743 if (flag_delete_null_pointer_checks)
2745 timevar_push (TV_JUMP);
2746 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2748 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2750 delete_null_pointer_checks (insns);
2751 /* CFG is no longer maintained up-to-date. */
2752 free_bb_for_insn ();
2753 timevar_pop (TV_JUMP);
2756 /* The second pass of jump optimization is likely to have
2757 removed a bunch more instructions. */
2758 renumber_insns (rtl_dump_file);
2760 timevar_pop (TV_CSE);
2761 close_dump_file (DFI_cse, print_rtl, insns);
2764 open_dump_file (DFI_addressof, decl);
2766 purge_addressof (insns);
2767 reg_scan (insns, max_reg_num (), 1);
2769 close_dump_file (DFI_addressof, print_rtl, insns);
2771 ggc_collect ();
2773 /* Perform global cse. */
2775 if (optimize > 0 && flag_gcse)
2777 int save_csb, save_cfj;
2778 int tem2 = 0;
2780 timevar_push (TV_GCSE);
2781 open_dump_file (DFI_gcse, decl);
2783 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2784 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2785 tem = gcse_main (insns, rtl_dump_file);
2787 save_csb = flag_cse_skip_blocks;
2788 save_cfj = flag_cse_follow_jumps;
2789 flag_cse_skip_blocks = flag_cse_follow_jumps = 0;
2791 /* CFG is no longer maintained up-to-date. */
2792 free_bb_for_insn ();
2793 /* If -fexpensive-optimizations, re-run CSE to clean up things done
2794 by gcse. */
2795 if (flag_expensive_optimizations)
2797 timevar_push (TV_CSE);
2798 reg_scan (insns, max_reg_num (), 1);
2799 tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2800 timevar_pop (TV_CSE);
2801 cse_not_expected = !flag_rerun_cse_after_loop;
2804 /* If gcse or cse altered any jumps, rerun jump optimizations to clean
2805 things up. Then possibly re-run CSE again. */
2806 while (tem || tem2)
2808 tem = tem2 = 0;
2809 timevar_push (TV_JUMP);
2810 rebuild_jump_labels (insns);
2811 delete_trivially_dead_insns (insns, max_reg_num (), 0);
2812 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2813 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2814 /* CFG is no longer maintained up-to-date. */
2815 free_bb_for_insn ();
2816 timevar_pop (TV_JUMP);
2818 if (flag_expensive_optimizations)
2820 timevar_push (TV_CSE);
2821 reg_scan (insns, max_reg_num (), 1);
2822 tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
2823 timevar_pop (TV_CSE);
2827 close_dump_file (DFI_gcse, print_rtl, insns);
2828 timevar_pop (TV_GCSE);
2830 ggc_collect ();
2831 flag_cse_skip_blocks = save_csb;
2832 flag_cse_follow_jumps = save_cfj;
2835 /* Move constant computations out of loops. */
2837 if (optimize > 0)
2839 timevar_push (TV_LOOP);
2840 open_dump_file (DFI_loop, decl);
2841 free_bb_for_insn ();
2843 if (flag_rerun_loop_opt)
2845 cleanup_barriers ();
2847 /* We only want to perform unrolling once. */
2849 loop_optimize (insns, rtl_dump_file, 0);
2851 /* The first call to loop_optimize makes some instructions
2852 trivially dead. We delete those instructions now in the
2853 hope that doing so will make the heuristics in loop work
2854 better and possibly speed up compilation. */
2855 delete_trivially_dead_insns (insns, max_reg_num (), 0);
2857 /* The regscan pass is currently necessary as the alias
2858 analysis code depends on this information. */
2859 reg_scan (insns, max_reg_num (), 1);
2861 cleanup_barriers ();
2862 loop_optimize (insns, rtl_dump_file,
2863 (flag_unroll_loops ? LOOP_UNROLL : 0) | LOOP_BCT);
2865 close_dump_file (DFI_loop, print_rtl, insns);
2866 timevar_pop (TV_LOOP);
2868 ggc_collect ();
2871 if (optimize > 0)
2873 timevar_push (TV_CSE2);
2874 open_dump_file (DFI_cse2, decl);
2876 if (flag_rerun_cse_after_loop)
2878 /* Running another jump optimization pass before the second
2879 cse pass sometimes simplifies the RTL enough to allow
2880 the second CSE pass to do a better job. Jump_optimize can change
2881 max_reg_num so we must rerun reg_scan afterwards.
2882 ??? Rework to not call reg_scan so often. */
2883 timevar_push (TV_JUMP);
2885 /* The previous call to loop_optimize makes some instructions
2886 trivially dead. We delete those instructions now in the
2887 hope that doing so will make the heuristics in jump work
2888 better and possibly speed up compilation. */
2889 delete_trivially_dead_insns (insns, max_reg_num (), 0);
2891 reg_scan (insns, max_reg_num (), 0);
2893 timevar_push (TV_IFCVT);
2895 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2896 cleanup_cfg (CLEANUP_EXPENSIVE);
2897 if_convert (0);
2899 timevar_pop(TV_IFCVT);
2901 timevar_pop (TV_JUMP);
2903 /* CFG is no longer maintained up-to-date. */
2904 free_bb_for_insn ();
2905 reg_scan (insns, max_reg_num (), 0);
2906 tem = cse_main (insns, max_reg_num (), 1, rtl_dump_file);
2908 if (tem)
2910 timevar_push (TV_JUMP);
2911 rebuild_jump_labels (insns);
2912 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2913 cleanup_cfg (CLEANUP_EXPENSIVE);
2914 /* CFG is no longer maintained up-to-date. */
2915 free_bb_for_insn ();
2916 timevar_pop (TV_JUMP);
2920 if (flag_thread_jumps)
2922 /* This pass of jump threading straightens out code
2923 that was kinked by loop optimization. */
2924 timevar_push (TV_JUMP);
2925 reg_scan (insns, max_reg_num (), 0);
2926 thread_jumps (insns, max_reg_num (), 0);
2927 timevar_pop (TV_JUMP);
2930 close_dump_file (DFI_cse2, print_rtl, insns);
2931 timevar_pop (TV_CSE2);
2933 ggc_collect ();
2936 cse_not_expected = 1;
2938 regclass_init ();
2940 /* Do control and data flow analysis; wrote some of the results to
2941 the dump file. */
2943 timevar_push (TV_FLOW);
2944 open_dump_file (DFI_cfg, decl);
2946 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2947 cleanup_cfg (optimize ? CLEANUP_EXPENSIVE : 0);
2948 check_function_return_warnings ();
2950 /* It may make more sense to mark constant functions after dead code is
2951 eliminated by life_analyzis, but we need to do it early, as -fprofile-arcs
2952 may insert code making function non-constant, but we still must consider
2953 it as constant, otherwise -fbranch-probabilities will not read data back.
2955 life_analyzis rarely eliminates modification of external memory.
2957 mark_constant_function ();
2959 close_dump_file (DFI_cfg, print_rtl_with_bb, insns);
2961 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
2963 timevar_push (TV_BRANCH_PROB);
2964 open_dump_file (DFI_bp, decl);
2966 branch_prob ();
2968 close_dump_file (DFI_bp, print_rtl_with_bb, insns);
2969 timevar_pop (TV_BRANCH_PROB);
2972 open_dump_file (DFI_life, decl);
2973 if (optimize)
2975 struct loops loops;
2977 /* Discover and record the loop depth at the head of each basic
2978 block. The loop infrastructure does the real job for us. */
2979 flow_loops_find (&loops, LOOP_TREE);
2981 /* Estimate using heuristics if no profiling info is available. */
2982 if (flag_guess_branch_prob)
2983 estimate_probability (&loops);
2985 if (rtl_dump_file)
2986 flow_loops_dump (&loops, rtl_dump_file, NULL, 0);
2988 flow_loops_free (&loops);
2990 life_analysis (insns, rtl_dump_file, PROP_FINAL);
2991 timevar_pop (TV_FLOW);
2993 no_new_pseudos = 1;
2995 if (warn_uninitialized || extra_warnings)
2997 uninitialized_vars_warning (DECL_INITIAL (decl));
2998 if (extra_warnings)
2999 setjmp_args_warning ();
3002 if (optimize)
3004 if (initialize_uninitialized_subregs ())
3006 /* Insns were inserted, so things might look a bit different. */
3007 insns = get_insns();
3008 life_analysis (insns, rtl_dump_file,
3009 (PROP_LOG_LINKS | PROP_REG_INFO | PROP_DEATH_NOTES));
3013 close_dump_file (DFI_life, print_rtl_with_bb, insns);
3015 ggc_collect ();
3017 /* If -opt, try combining insns through substitution. */
3019 if (optimize > 0)
3021 int rebuild_jump_labels_after_combine = 0;
3023 timevar_push (TV_COMBINE);
3024 open_dump_file (DFI_combine, decl);
3026 rebuild_jump_labels_after_combine
3027 = combine_instructions (insns, max_reg_num ());
3029 /* Always purge dead edges, as we may eliminate an insn throwing
3030 exception. */
3031 rebuild_jump_labels_after_combine |= purge_all_dead_edges (true);
3033 /* Combining insns may have turned an indirect jump into a
3034 direct jump. Rebuid the JUMP_LABEL fields of jumping
3035 instructions. */
3036 if (rebuild_jump_labels_after_combine)
3038 timevar_push (TV_JUMP);
3039 rebuild_jump_labels (insns);
3040 timevar_pop (TV_JUMP);
3042 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
3045 close_dump_file (DFI_combine, print_rtl_with_bb, insns);
3046 timevar_pop (TV_COMBINE);
3048 ggc_collect ();
3051 /* Rerun if-conversion, as combine may have simplified things enough to
3052 now meet sequence length restrictions. */
3053 if (optimize > 0)
3055 timevar_push (TV_IFCVT);
3056 open_dump_file (DFI_ce, decl);
3058 no_new_pseudos = 0;
3059 if_convert (1);
3060 no_new_pseudos = 1;
3062 close_dump_file (DFI_ce, print_rtl_with_bb, insns);
3063 timevar_pop (TV_IFCVT);
3066 /* Register allocation pre-pass, to reduce number of moves
3067 necessary for two-address machines. */
3068 if (optimize > 0 && (flag_regmove || flag_expensive_optimizations))
3070 timevar_push (TV_REGMOVE);
3071 open_dump_file (DFI_regmove, decl);
3073 regmove_optimize (insns, max_reg_num (), rtl_dump_file);
3075 close_dump_file (DFI_regmove, print_rtl_with_bb, insns);
3076 timevar_pop (TV_REGMOVE);
3078 ggc_collect ();
3081 /* Do unconditional splitting before register allocation to allow machine
3082 description to add extra information not needed previously. */
3083 split_all_insns (1);
3085 /* Any of the several passes since flow1 will have munged register
3086 lifetime data a bit. */
3087 register_life_up_to_date = 0;
3089 #ifdef OPTIMIZE_MODE_SWITCHING
3090 timevar_push (TV_MODE_SWITCH);
3092 no_new_pseudos = 0;
3093 if (optimize_mode_switching (NULL))
3095 /* We did work, and so had to regenerate global life information.
3096 Take advantage of this and don't re-recompute register life
3097 information below. */
3098 register_life_up_to_date = 1;
3100 no_new_pseudos = 1;
3102 timevar_pop (TV_MODE_SWITCH);
3103 #endif
3105 timevar_push (TV_SCHED);
3107 #ifdef INSN_SCHEDULING
3109 /* Print function header into sched dump now
3110 because doing the sched analysis makes some of the dump. */
3111 if (optimize > 0 && flag_schedule_insns)
3113 open_dump_file (DFI_sched, decl);
3115 /* Do control and data sched analysis,
3116 and write some of the results to dump file. */
3118 schedule_insns (rtl_dump_file);
3120 close_dump_file (DFI_sched, print_rtl_with_bb, insns);
3122 /* Register lifetime information was updated as part of verifying
3123 the schedule. */
3124 register_life_up_to_date = 1;
3126 #endif
3127 timevar_pop (TV_SCHED);
3129 ggc_collect ();
3131 /* Determine if the current function is a leaf before running reload
3132 since this can impact optimizations done by the prologue and
3133 epilogue thus changing register elimination offsets. */
3134 current_function_is_leaf = leaf_function_p ();
3136 timevar_push (TV_LOCAL_ALLOC);
3137 open_dump_file (DFI_lreg, decl);
3139 /* Allocate pseudo-regs that are used only within 1 basic block.
3141 RUN_JUMP_AFTER_RELOAD records whether or not we need to rerun the
3142 jump optimizer after register allocation and reloading are finished. */
3144 if (! register_life_up_to_date)
3145 recompute_reg_usage (insns, ! optimize_size);
3147 /* Allocate the reg_renumber array. */
3148 allocate_reg_info (max_regno, FALSE, TRUE);
3150 /* And the reg_equiv_memory_loc array. */
3151 reg_equiv_memory_loc = (rtx *) xcalloc (max_regno, sizeof (rtx));
3153 allocate_initial_values (reg_equiv_memory_loc);
3155 regclass (insns, max_reg_num (), rtl_dump_file);
3156 rebuild_label_notes_after_reload = local_alloc ();
3158 timevar_pop (TV_LOCAL_ALLOC);
3160 if (dump_file[DFI_lreg].enabled)
3162 timevar_push (TV_DUMP);
3164 dump_flow_info (rtl_dump_file);
3165 dump_local_alloc (rtl_dump_file);
3167 close_dump_file (DFI_lreg, print_rtl_with_bb, insns);
3168 timevar_pop (TV_DUMP);
3171 ggc_collect ();
3173 timevar_push (TV_GLOBAL_ALLOC);
3174 open_dump_file (DFI_greg, decl);
3176 /* If optimizing, allocate remaining pseudo-regs. Do the reload
3177 pass fixing up any insns that are invalid. */
3179 if (optimize)
3180 failure = global_alloc (rtl_dump_file);
3181 else
3183 build_insn_chain (insns);
3184 failure = reload (insns, 0);
3187 timevar_pop (TV_GLOBAL_ALLOC);
3189 if (dump_file[DFI_greg].enabled)
3191 timevar_push (TV_DUMP);
3193 dump_global_regs (rtl_dump_file);
3195 close_dump_file (DFI_greg, print_rtl_with_bb, insns);
3196 timevar_pop (TV_DUMP);
3199 if (failure)
3200 goto exit_rest_of_compilation;
3202 ggc_collect ();
3204 open_dump_file (DFI_postreload, decl);
3206 /* Do a very simple CSE pass over just the hard registers. */
3207 if (optimize > 0)
3209 timevar_push (TV_RELOAD_CSE_REGS);
3210 reload_cse_regs (insns);
3211 timevar_pop (TV_RELOAD_CSE_REGS);
3214 /* Register allocation and reloading may have turned an indirect jump into
3215 a direct jump. If so, we must rebuild the JUMP_LABEL fields of
3216 jumping instructions. */
3217 if (rebuild_label_notes_after_reload)
3219 timevar_push (TV_JUMP);
3221 rebuild_jump_labels (insns);
3223 timevar_pop (TV_JUMP);
3226 close_dump_file (DFI_postreload, print_rtl_with_bb, insns);
3228 /* Re-create the death notes which were deleted during reload. */
3229 timevar_push (TV_FLOW2);
3230 open_dump_file (DFI_flow2, decl);
3232 #ifdef ENABLE_CHECKING
3233 verify_flow_info ();
3234 #endif
3236 /* If optimizing, then go ahead and split insns now. */
3237 if (optimize > 0)
3238 split_all_insns (0);
3240 cleanup_cfg (optimize ? CLEANUP_EXPENSIVE : 0);
3242 /* On some machines, the prologue and epilogue code, or parts thereof,
3243 can be represented as RTL. Doing so lets us schedule insns between
3244 it and the rest of the code and also allows delayed branch
3245 scheduling to operate in the epilogue. */
3246 thread_prologue_and_epilogue_insns (insns);
3248 if (optimize)
3250 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_CROSSJUMP);
3251 life_analysis (insns, rtl_dump_file, PROP_FINAL);
3253 /* This is kind of a heuristic. We need to run combine_stack_adjustments
3254 even for machines with possibly nonzero RETURN_POPS_ARGS
3255 and ACCUMULATE_OUTGOING_ARGS. We expect that only ports having
3256 push instructions will have popping returns. */
3257 #ifndef PUSH_ROUNDING
3258 if (!ACCUMULATE_OUTGOING_ARGS)
3259 #endif
3260 combine_stack_adjustments ();
3262 ggc_collect ();
3265 flow2_completed = 1;
3267 close_dump_file (DFI_flow2, print_rtl_with_bb, insns);
3268 timevar_pop (TV_FLOW2);
3270 #ifdef HAVE_peephole2
3271 if (optimize > 0 && flag_peephole2)
3273 timevar_push (TV_PEEPHOLE2);
3274 open_dump_file (DFI_peephole2, decl);
3276 peephole2_optimize (rtl_dump_file);
3278 close_dump_file (DFI_peephole2, print_rtl_with_bb, insns);
3279 timevar_pop (TV_PEEPHOLE2);
3281 #endif
3283 if (optimize > 0 && flag_rename_registers)
3285 timevar_push (TV_RENAME_REGISTERS);
3286 open_dump_file (DFI_rnreg, decl);
3288 regrename_optimize ();
3290 close_dump_file (DFI_rnreg, print_rtl_with_bb, insns);
3291 timevar_pop (TV_RENAME_REGISTERS);
3294 if (optimize > 0)
3296 timevar_push (TV_IFCVT2);
3297 open_dump_file (DFI_ce2, decl);
3299 if_convert (1);
3301 close_dump_file (DFI_ce2, print_rtl_with_bb, insns);
3302 timevar_pop (TV_IFCVT2);
3304 #ifdef STACK_REGS
3305 if (optimize)
3306 split_all_insns (1);
3307 #endif
3309 #ifdef INSN_SCHEDULING
3310 if (optimize > 0 && flag_schedule_insns_after_reload)
3312 timevar_push (TV_SCHED2);
3313 open_dump_file (DFI_sched2, decl);
3315 /* Do control and data sched analysis again,
3316 and write some more of the results to dump file. */
3318 split_all_insns (1);
3320 schedule_insns (rtl_dump_file);
3322 close_dump_file (DFI_sched2, print_rtl_with_bb, insns);
3323 timevar_pop (TV_SCHED2);
3325 ggc_collect ();
3327 #endif
3329 #ifdef LEAF_REGISTERS
3330 current_function_uses_only_leaf_regs
3331 = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
3332 #endif
3334 #ifdef STACK_REGS
3335 timevar_push (TV_REG_STACK);
3336 open_dump_file (DFI_stack, decl);
3338 reg_to_stack (insns, rtl_dump_file);
3340 close_dump_file (DFI_stack, print_rtl_with_bb, insns);
3341 timevar_pop (TV_REG_STACK);
3343 ggc_collect ();
3344 #endif
3345 if (optimize > 0)
3347 timevar_push (TV_REORDER_BLOCKS);
3348 open_dump_file (DFI_bbro, decl);
3350 /* Last attempt to optimize CFG, as life analyzis possibly removed
3351 some instructions. */
3352 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK
3353 | CLEANUP_CROSSJUMP);
3354 if (flag_reorder_blocks)
3356 reorder_basic_blocks ();
3357 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK);
3360 close_dump_file (DFI_bbro, print_rtl_with_bb, insns);
3361 timevar_pop (TV_REORDER_BLOCKS);
3363 compute_alignments ();
3365 /* CFG is no longer maintained up-to-date. */
3366 free_bb_for_insn ();
3368 /* If a machine dependent reorganization is needed, call it. */
3369 #ifdef MACHINE_DEPENDENT_REORG
3370 timevar_push (TV_MACH_DEP);
3371 open_dump_file (DFI_mach, decl);
3373 MACHINE_DEPENDENT_REORG (insns);
3375 close_dump_file (DFI_mach, print_rtl, insns);
3376 timevar_pop (TV_MACH_DEP);
3378 ggc_collect ();
3379 #endif
3381 purge_line_number_notes (insns);
3382 cleanup_barriers ();
3384 /* If a scheduling pass for delayed branches is to be done,
3385 call the scheduling code. */
3387 #ifdef DELAY_SLOTS
3388 if (optimize > 0 && flag_delayed_branch)
3390 timevar_push (TV_DBR_SCHED);
3391 open_dump_file (DFI_dbr, decl);
3393 dbr_schedule (insns, rtl_dump_file);
3395 close_dump_file (DFI_dbr, print_rtl, insns);
3396 timevar_pop (TV_DBR_SCHED);
3398 ggc_collect ();
3400 #endif
3402 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
3403 timevar_push (TV_SHORTEN_BRANCH);
3404 split_all_insns_noflow ();
3405 timevar_pop (TV_SHORTEN_BRANCH);
3406 #endif
3408 convert_to_eh_region_ranges ();
3410 /* Shorten branches. */
3411 timevar_push (TV_SHORTEN_BRANCH);
3412 shorten_branches (get_insns ());
3413 timevar_pop (TV_SHORTEN_BRANCH);
3415 current_function_nothrow = nothrow_function_p ();
3416 if (current_function_nothrow)
3417 /* Now we know that this can't throw; set the flag for the benefit
3418 of other functions later in this translation unit. */
3419 TREE_NOTHROW (current_function_decl) = 1;
3421 /* Now turn the rtl into assembler code. */
3423 timevar_push (TV_FINAL);
3425 rtx x;
3426 const char *fnname;
3428 /* Get the function's name, as described by its RTL. This may be
3429 different from the DECL_NAME name used in the source file. */
3431 x = DECL_RTL (decl);
3432 if (GET_CODE (x) != MEM)
3433 abort ();
3434 x = XEXP (x, 0);
3435 if (GET_CODE (x) != SYMBOL_REF)
3436 abort ();
3437 fnname = XSTR (x, 0);
3439 assemble_start_function (decl, fnname);
3440 final_start_function (insns, asm_out_file, optimize);
3441 final (insns, asm_out_file, optimize, 0);
3442 final_end_function ();
3444 #ifdef IA64_UNWIND_INFO
3445 /* ??? The IA-64 ".handlerdata" directive must be issued before
3446 the ".endp" directive that closes the procedure descriptor. */
3447 output_function_exception_table ();
3448 #endif
3450 assemble_end_function (decl, fnname);
3452 #ifndef IA64_UNWIND_INFO
3453 /* Otherwise, it feels unclean to switch sections in the middle. */
3454 output_function_exception_table ();
3455 #endif
3457 if (! quiet_flag)
3458 fflush (asm_out_file);
3460 /* Release all memory allocated by flow. */
3461 free_basic_block_vars (0);
3463 /* Release all memory held by regsets now. */
3464 regset_release_memory ();
3466 timevar_pop (TV_FINAL);
3468 ggc_collect ();
3470 /* Write DBX symbols if requested. */
3472 /* Note that for those inline functions where we don't initially
3473 know for certain that we will be generating an out-of-line copy,
3474 the first invocation of this routine (rest_of_compilation) will
3475 skip over this code by doing a `goto exit_rest_of_compilation;'.
3476 Later on, finish_compilation will call rest_of_compilation again
3477 for those inline functions that need to have out-of-line copies
3478 generated. During that call, we *will* be routed past here. */
3480 timevar_push (TV_SYMOUT);
3481 (*debug_hooks->function_decl) (decl);
3482 timevar_pop (TV_SYMOUT);
3484 exit_rest_of_compilation:
3486 /* In case the function was not output,
3487 don't leave any temporary anonymous types
3488 queued up for sdb output. */
3489 #ifdef SDB_DEBUGGING_INFO
3490 if (write_symbols == SDB_DEBUG)
3491 sdbout_types (NULL_TREE);
3492 #endif
3494 reload_completed = 0;
3495 flow2_completed = 0;
3496 no_new_pseudos = 0;
3498 timevar_push (TV_FINAL);
3500 /* Clear out the insn_length contents now that they are no
3501 longer valid. */
3502 init_insn_lengths ();
3504 /* Clear out the real_constant_chain before some of the rtx's
3505 it runs through become garbage. */
3506 clear_const_double_mem ();
3508 /* Show no temporary slots allocated. */
3509 init_temp_slots ();
3511 free_basic_block_vars (0);
3512 free_bb_for_insn ();
3514 timevar_pop (TV_FINAL);
3516 /* Make sure volatile mem refs aren't considered valid operands for
3517 arithmetic insns. We must call this here if this is a nested inline
3518 function, since the above code leaves us in the init_recog state
3519 (from final.c), and the function context push/pop code does not
3520 save/restore volatile_ok.
3522 ??? Maybe it isn't necessary for expand_start_function to call this
3523 anymore if we do it here? */
3525 init_recog_no_volatile ();
3527 /* We're done with this function. Free up memory if we can. */
3528 free_after_parsing (cfun);
3529 if (! DECL_DEFER_OUTPUT (decl))
3531 free_after_compilation (cfun);
3533 /* Clear integrate.c's pointer to the cfun structure we just
3534 destroyed. */
3535 DECL_SAVED_INSNS (decl) = 0;
3537 cfun = 0;
3539 ggc_collect ();
3541 timevar_pop (TV_REST_OF_COMPILATION);
3544 static void
3545 display_help ()
3547 int undoc;
3548 unsigned long i;
3549 const char *lang;
3551 printf (_(" -ffixed-<register> Mark <register> as being unavailable to the compiler\n"));
3552 printf (_(" -fcall-used-<register> Mark <register> as being corrupted by function calls\n"));
3553 printf (_(" -fcall-saved-<register> Mark <register> as being preserved across functions\n"));
3554 printf (_(" -finline-limit=<number> Limits the size of inlined functions to <number>\n"));
3555 printf (_(" -fmessage-length=<number> Limits diagnostics messages lengths to <number> characters per line. 0 suppresses line-wrapping\n"));
3556 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"));
3558 for (i = ARRAY_SIZE (f_options); i--;)
3560 const char *description = f_options[i].description;
3562 if (description != NULL && * description != 0)
3563 printf (" -f%-21s %s\n",
3564 f_options[i].string, _(description));
3567 printf (_(" -O[number] Set optimisation level to [number]\n"));
3568 printf (_(" -Os Optimise for space rather than speed\n"));
3569 for (i = LAST_PARAM; i--;)
3571 const char *description = compiler_params[i].help;
3572 const int length = 21-strlen(compiler_params[i].option);
3574 if (description != NULL && * description != 0)
3575 printf (" --param %s=<value>%.*s%s\n",
3576 compiler_params[i].option,
3577 length > 0 ? length : 1, " ",
3578 _(description));
3580 printf (_(" -pedantic Issue warnings needed by strict compliance to ISO C\n"));
3581 printf (_(" -pedantic-errors Like -pedantic except that errors are produced\n"));
3582 printf (_(" -w Suppress warnings\n"));
3583 printf (_(" -W Enable extra warnings\n"));
3585 for (i = ARRAY_SIZE (W_options); i--;)
3587 const char *description = W_options[i].description;
3589 if (description != NULL && * description != 0)
3590 printf (" -W%-21s %s\n",
3591 W_options[i].string, _(description));
3594 printf (_(" -Wunused Enable unused warnings\n"));
3595 printf (_(" -Wlarger-than-<number> Warn if an object is larger than <number> bytes\n"));
3596 printf (_(" -p Enable function profiling\n"));
3597 #if defined (BLOCK_PROFILER) || defined (FUNCTION_BLOCK_PROFILER)
3598 printf (_(" -a Enable block profiling \n"));
3599 #endif
3600 #if defined (BLOCK_PROFILER) || defined (FUNCTION_BLOCK_PROFILER) || defined FUNCTION_BLOCK_PROFILER_EXIT
3601 printf (_(" -ax Enable jump profiling \n"));
3602 #endif
3603 printf (_(" -o <file> Place output into <file> \n"));
3604 printf (_("\
3605 -G <number> Put global and static data smaller than <number>\n\
3606 bytes into a special section (on some targets)\n"));
3608 for (i = ARRAY_SIZE (debug_args); i--;)
3610 if (debug_args[i].description != NULL)
3611 printf (" -g%-21s %s\n",
3612 debug_args[i].arg, _(debug_args[i].description));
3615 printf (_(" -aux-info <file> Emit declaration info into <file>\n"));
3616 printf (_(" -quiet Do not display functions compiled or elapsed time\n"));
3617 printf (_(" -version Display the compiler's version\n"));
3618 printf (_(" -d[letters] Enable dumps from specific passes of the compiler\n"));
3619 printf (_(" -dumpbase <file> Base name to be used for dumps from specific passes\n"));
3620 #if defined INSN_SCHEDULING
3621 printf (_(" -fsched-verbose=<number> Set the verbosity level of the scheduler\n"));
3622 #endif
3623 printf (_(" --help Display this information\n"));
3625 undoc = 0;
3626 lang = "language";
3628 /* Display descriptions of language specific options.
3629 If there is no description, note that there is an undocumented option.
3630 If the description is empty, do not display anything. (This allows
3631 options to be deliberately undocumented, for whatever reason).
3632 If the option string is missing, then this is a marker, indicating
3633 that the description string is in fact the name of a language, whose
3634 language specific options are to follow. */
3636 if (ARRAY_SIZE (documented_lang_options) > 1)
3638 printf (_("\nLanguage specific options:\n"));
3640 for (i = 0; i < ARRAY_SIZE (documented_lang_options); i++)
3642 const char *description = documented_lang_options[i].description;
3643 const char *option = documented_lang_options[i].option;
3645 if (description == NULL)
3647 undoc = 1;
3649 if (extra_warnings)
3650 printf (_(" %-23.23s [undocumented]\n"), option);
3652 else if (*description == 0)
3653 continue;
3654 else if (option == NULL)
3656 if (undoc)
3657 printf
3658 (_("\nThere are undocumented %s specific options as well.\n"),
3659 lang);
3660 undoc = 0;
3662 printf (_("\n Options for %s:\n"), description);
3664 lang = description;
3666 else
3667 printf (" %-23.23s %s\n", option, _(description));
3671 if (undoc)
3672 printf (_("\nThere are undocumented %s specific options as well.\n"),
3673 lang);
3675 display_target_options ();
3678 static void
3679 display_target_options ()
3681 int undoc,i;
3682 static bool displayed = false;
3684 /* Avoid double printing for --help --target-help. */
3685 if (displayed)
3686 return;
3687 displayed = true;
3689 if (ARRAY_SIZE (target_switches) > 1
3690 #ifdef TARGET_OPTIONS
3691 || ARRAY_SIZE (target_options) > 1
3692 #endif
3695 int doc = 0;
3697 undoc = 0;
3699 printf (_("\nTarget specific options:\n"));
3701 for (i = ARRAY_SIZE (target_switches); i--;)
3703 const char *option = target_switches[i].name;
3704 const char *description = target_switches[i].description;
3706 if (option == NULL || *option == 0)
3707 continue;
3708 else if (description == NULL)
3710 undoc = 1;
3712 if (extra_warnings)
3713 printf (_(" -m%-23.23s [undocumented]\n"), option);
3715 else if (* description != 0)
3716 doc += printf (" -m%-23.23s %s\n", option, _(description));
3719 #ifdef TARGET_OPTIONS
3720 for (i = ARRAY_SIZE (target_options); i--;)
3722 const char *option = target_options[i].prefix;
3723 const char *description = target_options[i].description;
3725 if (option == NULL || *option == 0)
3726 continue;
3727 else if (description == NULL)
3729 undoc = 1;
3731 if (extra_warnings)
3732 printf (_(" -m%-23.23s [undocumented]\n"), option);
3734 else if (* description != 0)
3735 doc += printf (" -m%-23.23s %s\n", option, _(description));
3737 #endif
3738 if (undoc)
3740 if (doc)
3741 printf (_("\nThere are undocumented target specific options as well.\n"));
3742 else
3743 printf (_(" They exist, but they are not documented.\n"));
3748 /* Parse a -d... command line switch. */
3750 static void
3751 decode_d_option (arg)
3752 const char *arg;
3754 int i, c, matched;
3756 while (*arg)
3757 switch (c = *arg++)
3759 case 'a':
3760 for (i = 0; i < (int) DFI_MAX; ++i)
3761 dump_file[i].enabled = 1;
3762 break;
3763 case 'A':
3764 flag_debug_asm = 1;
3765 break;
3766 case 'p':
3767 flag_print_asm_name = 1;
3768 break;
3769 case 'P':
3770 flag_dump_rtl_in_asm = 1;
3771 flag_print_asm_name = 1;
3772 break;
3773 case 'v':
3774 graph_dump_format = vcg;
3775 break;
3776 case 'x':
3777 rtl_dump_and_exit = 1;
3778 break;
3779 case 'y':
3780 (*lang_hooks.set_yydebug) (1);
3781 break;
3782 case 'D': /* These are handled by the preprocessor. */
3783 case 'I':
3784 break;
3786 default:
3787 matched = 0;
3788 for (i = 0; i < (int) DFI_MAX; ++i)
3789 if (c == dump_file[i].debug_switch)
3791 dump_file[i].enabled = 1;
3792 matched = 1;
3795 if (! matched)
3796 warning ("unrecognized gcc debugging option: %c", c);
3797 break;
3801 /* Parse a -f... command line switch. ARG is the value after the -f.
3802 It is safe to access 'ARG - 2' to generate the full switch name.
3803 Return the number of strings consumed. */
3805 static int
3806 decode_f_option (arg)
3807 const char *arg;
3809 int j;
3810 const char *option_value = NULL;
3812 /* Search for the option in the table of binary f options. */
3813 for (j = ARRAY_SIZE (f_options); j--;)
3815 if (!strcmp (arg, f_options[j].string))
3817 *f_options[j].variable = f_options[j].on_value;
3818 return 1;
3821 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
3822 && ! strcmp (arg + 3, f_options[j].string))
3824 *f_options[j].variable = ! f_options[j].on_value;
3825 return 1;
3829 if (!strcmp (arg, "fast-math"))
3830 set_fast_math_flags();
3831 else if (!strcmp (arg, "no-fast-math"))
3832 set_no_fast_math_flags();
3833 else if ((option_value = skip_leading_substring (arg, "inline-limit-"))
3834 || (option_value = skip_leading_substring (arg, "inline-limit=")))
3836 int val =
3837 read_integral_parameter (option_value, arg - 2,
3838 MAX_INLINE_INSNS);
3839 set_param_value ("max-inline-insns", val);
3841 #ifdef INSN_SCHEDULING
3842 else if ((option_value = skip_leading_substring (arg, "sched-verbose=")))
3843 fix_sched_param ("verbose", option_value);
3844 #endif
3845 else if ((option_value = skip_leading_substring (arg, "fixed-")))
3846 fix_register (option_value, 1, 1);
3847 else if ((option_value = skip_leading_substring (arg, "call-used-")))
3848 fix_register (option_value, 0, 1);
3849 else if ((option_value = skip_leading_substring (arg, "call-saved-")))
3850 fix_register (option_value, 0, 0);
3851 else if ((option_value = skip_leading_substring (arg, "align-loops=")))
3852 align_loops = read_integral_parameter (option_value, arg - 2, align_loops);
3853 else if ((option_value = skip_leading_substring (arg, "align-functions=")))
3854 align_functions
3855 = read_integral_parameter (option_value, arg - 2, align_functions);
3856 else if ((option_value = skip_leading_substring (arg, "align-jumps=")))
3857 align_jumps = read_integral_parameter (option_value, arg - 2, align_jumps);
3858 else if ((option_value = skip_leading_substring (arg, "align-labels=")))
3859 align_labels
3860 = read_integral_parameter (option_value, arg - 2, align_labels);
3861 else if ((option_value
3862 = skip_leading_substring (arg, "stack-limit-register=")))
3864 int reg = decode_reg_name (option_value);
3865 if (reg < 0)
3866 error ("unrecognized register name `%s'", option_value);
3867 else
3868 stack_limit_rtx = gen_rtx_REG (Pmode, reg);
3870 else if ((option_value
3871 = skip_leading_substring (arg, "stack-limit-symbol=")))
3873 const char *nm;
3874 nm = ggc_strdup (option_value);
3875 stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, nm);
3877 else if ((option_value
3878 = skip_leading_substring (arg, "message-length=")))
3879 output_set_maximum_length
3880 (&global_dc->buffer, read_integral_parameter
3881 (option_value, arg - 2, diagnostic_line_cutoff (global_dc)));
3882 else if ((option_value
3883 = skip_leading_substring (arg, "diagnostics-show-location=")))
3885 if (!strcmp (option_value, "once"))
3886 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
3887 else if (!strcmp (option_value, "every-line"))
3888 diagnostic_prefixing_rule (global_dc)
3889 = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
3890 else
3891 error ("unrecognized option `%s'", arg - 2);
3893 else if (!strcmp (arg, "no-stack-limit"))
3894 stack_limit_rtx = NULL_RTX;
3895 else if (!strcmp (arg, "preprocessed"))
3896 /* Recognise this switch but do nothing. This prevents warnings
3897 about an unrecognized switch if cpplib has not been linked in. */
3899 else
3900 return 0;
3902 return 1;
3905 /* Parse a -W... command line switch. ARG is the value after the -W.
3906 It is safe to access 'ARG - 2' to generate the full switch name.
3907 Return the number of strings consumed. */
3909 static int
3910 decode_W_option (arg)
3911 const char *arg;
3913 const char *option_value = NULL;
3914 int j;
3916 /* Search for the option in the table of binary W options. */
3918 for (j = ARRAY_SIZE (W_options); j--;)
3920 if (!strcmp (arg, W_options[j].string))
3922 *W_options[j].variable = W_options[j].on_value;
3923 return 1;
3926 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
3927 && ! strcmp (arg + 3, W_options[j].string))
3929 *W_options[j].variable = ! W_options[j].on_value;
3930 return 1;
3934 if ((option_value = skip_leading_substring (arg, "id-clash-")))
3935 warning ("-Wid-clash-LEN is no longer supported");
3936 else if ((option_value = skip_leading_substring (arg, "larger-than-")))
3938 larger_than_size = read_integral_parameter (option_value, arg - 2, -1);
3940 warn_larger_than = larger_than_size != -1;
3942 else if (!strcmp (arg, "unused"))
3944 set_Wunused (1);
3946 else if (!strcmp (arg, "no-unused"))
3948 set_Wunused (0);
3950 else
3951 return 0;
3953 return 1;
3956 /* Parse a -g... command line switch. ARG is the value after the -g.
3957 It is safe to access 'ARG - 2' to generate the full switch name.
3958 Return the number of strings consumed. */
3960 static int
3961 decode_g_option (arg)
3962 const char *arg;
3964 static unsigned level=0;
3965 /* A lot of code assumes write_symbols == NO_DEBUG if the
3966 debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
3967 of what debugging type has been selected). This records the
3968 selected type. It is an error to specify more than one
3969 debugging type. */
3970 static enum debug_info_type selected_debug_type = NO_DEBUG;
3971 /* Non-zero if debugging format has been explicitly set.
3972 -g and -ggdb don't explicitly set the debugging format so
3973 -gdwarf -g3 is equivalent to -gdwarf3. */
3974 static int type_explicitly_set_p = 0;
3975 /* Indexed by enum debug_info_type. */
3976 static const char *const debug_type_names[] =
3978 "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff", "vms"
3981 /* The maximum admissible debug level value. */
3982 static const unsigned max_debug_level = 3;
3984 /* Look up ARG in the table. */
3985 for (da = debug_args; da->arg; da++)
3987 const int da_len = strlen (da->arg);
3989 if (da_len == 0 || ! strncmp (arg, da->arg, da_len))
3991 enum debug_info_type type = da->debug_type;
3992 const char *p = arg + da_len;
3994 if (*p && ! ISDIGIT (*p))
3995 continue;
3997 /* A debug flag without a level defaults to level 2.
3998 Note we do not want to call read_integral_parameter
3999 for that case since it will call atoi which
4000 will return zero.
4002 ??? We may want to generalize the interface to
4003 read_integral_parameter to better handle this case
4004 if this case shows up often. */
4005 if (*p)
4006 level = read_integral_parameter (p, 0, max_debug_level + 1);
4007 else
4008 level = (level == 0) ? 2 : level;
4010 if (da_len > 1 && *p && !strncmp (arg, "dwarf", da_len))
4012 error ("use -gdwarf -g%d for DWARF v1, level %d",
4013 level, level);
4014 if (level == 2)
4015 error ("use -gdwarf-2 for DWARF v2");
4018 if (level > max_debug_level)
4020 warning ("\
4021 ignoring option `%s' due to invalid debug level specification",
4022 arg - 2);
4023 level = debug_info_level;
4026 if (type == NO_DEBUG)
4028 type = PREFERRED_DEBUGGING_TYPE;
4030 if (da_len > 1 && strncmp (arg, "gdb", da_len) == 0)
4032 #if defined (DWARF2_DEBUGGING_INFO) && !defined (LINKER_DOES_NOT_WORK_WITH_DWARF2)
4033 type = DWARF2_DEBUG;
4034 #else
4035 #ifdef DBX_DEBUGGING_INFO
4036 type = DBX_DEBUG;
4037 #endif
4038 #endif
4042 if (type == NO_DEBUG)
4043 warning ("`%s': unknown or unsupported -g option", arg - 2);
4045 /* Does it conflict with an already selected type? */
4046 if (type_explicitly_set_p
4047 /* -g/-ggdb don't conflict with anything. */
4048 && da->debug_type != NO_DEBUG
4049 && type != selected_debug_type)
4050 warning ("`%s' ignored, conflicts with `-g%s'",
4051 arg - 2, debug_type_names[(int) selected_debug_type]);
4052 else
4054 /* If the format has already been set, -g/-ggdb
4055 only change the debug level. */
4056 if (type_explicitly_set_p && da->debug_type == NO_DEBUG)
4057 /* Don't change debugging type. */
4059 else
4061 selected_debug_type = type;
4062 type_explicitly_set_p = da->debug_type != NO_DEBUG;
4065 write_symbols = (level == 0
4066 ? NO_DEBUG
4067 : selected_debug_type);
4068 use_gnu_debug_info_extensions = da->use_extensions_p;
4069 debug_info_level = (enum debug_info_level) level;
4072 break;
4076 if (! da->arg)
4077 return 0;
4079 return 1;
4082 /* Decode the first argument in the argv as a language-independent option.
4083 Return the number of strings consumed. */
4085 static unsigned int
4086 independent_decode_option (argc, argv)
4087 int argc;
4088 char **argv;
4090 char *arg = argv[0];
4092 if (arg[0] != '-' || arg[1] == 0)
4094 if (arg[0] == '+')
4095 return 0;
4097 filename = arg;
4099 return 1;
4102 arg++;
4104 if (!strcmp (arg, "-help"))
4106 display_help ();
4107 exit_after_options = 1;
4110 if (!strcmp (arg, "-target-help"))
4112 display_target_options ();
4113 exit_after_options = 1;
4116 if (!strcmp (arg, "-version"))
4118 print_version (stderr, "");
4119 exit_after_options = 1;
4122 /* Handle '--param <name>=<value>'. */
4123 if (strcmp (arg, "-param") == 0)
4125 char *equal;
4127 if (argc == 1)
4129 error ("-param option missing argument");
4130 return 1;
4133 /* Get the '<name>=<value>' parameter. */
4134 arg = argv[1];
4135 /* Look for the `='. */
4136 equal = strchr (arg, '=');
4137 if (!equal)
4138 error ("invalid --param option: %s", arg);
4139 else
4141 int val;
4143 /* Zero out the `=' sign so that we get two separate strings. */
4144 *equal = '\0';
4145 /* Figure out what value is specified. */
4146 val = read_integral_parameter (equal + 1, NULL, INVALID_PARAM_VAL);
4147 if (val != INVALID_PARAM_VAL)
4148 set_param_value (arg, val);
4149 else
4150 error ("invalid parameter value `%s'", equal + 1);
4153 return 2;
4156 if (*arg == 'Y')
4157 arg++;
4159 switch (*arg)
4161 default:
4162 return 0;
4164 case 'O':
4165 /* Already been treated in main (). Do nothing. */
4166 break;
4168 case 'm':
4169 set_target_switch (arg + 1);
4170 break;
4172 case 'f':
4173 return decode_f_option (arg + 1);
4175 case 'g':
4176 return decode_g_option (arg + 1);
4178 case 'd':
4179 if (!strcmp (arg, "dumpbase"))
4181 if (argc == 1)
4182 return 0;
4184 dump_base_name = argv[1];
4185 return 2;
4187 else
4188 decode_d_option (arg + 1);
4189 break;
4191 case 'p':
4192 if (!strcmp (arg, "pedantic"))
4193 pedantic = 1;
4194 else if (!strcmp (arg, "pedantic-errors"))
4195 flag_pedantic_errors = pedantic = 1;
4196 else if (arg[1] == 0)
4197 profile_flag = 1;
4198 else
4199 return 0;
4200 break;
4202 case 'q':
4203 if (!strcmp (arg, "quiet"))
4204 quiet_flag = 1;
4205 else
4206 return 0;
4207 break;
4209 case 'v':
4210 if (!strcmp (arg, "version"))
4211 version_flag = 1;
4212 else
4213 return 0;
4214 break;
4216 case 'w':
4217 if (arg[1] == 0)
4218 inhibit_warnings = 1;
4219 else
4220 return 0;
4221 break;
4223 case 'W':
4224 if (arg[1] == 0)
4226 extra_warnings = 1;
4227 /* We save the value of warn_uninitialized, since if they put
4228 -Wuninitialized on the command line, we need to generate a
4229 warning about not using it without also specifying -O. */
4230 if (warn_uninitialized != 1)
4231 warn_uninitialized = 2;
4233 else
4234 return decode_W_option (arg + 1);
4235 break;
4237 case 'o':
4238 if (arg[1] == 0)
4240 if (argc == 1)
4241 return 0;
4243 asm_file_name = argv[1];
4244 return 2;
4246 return 0;
4248 case 'G':
4250 int g_switch_val;
4251 int return_val;
4253 if (arg[1] == 0)
4255 if (argc == 1)
4256 return 0;
4258 g_switch_val = read_integral_parameter (argv[1], 0, -1);
4259 return_val = 2;
4261 else
4263 g_switch_val = read_integral_parameter (arg + 1, 0, -1);
4264 return_val = 1;
4267 if (g_switch_val == -1)
4268 return_val = 0;
4269 else
4271 g_switch_set = TRUE;
4272 g_switch_value = g_switch_val;
4275 return return_val;
4279 return 1;
4282 /* Decode -m switches. */
4283 /* Decode the switch -mNAME. */
4285 static void
4286 set_target_switch (name)
4287 const char *name;
4289 size_t j;
4290 int valid_target_option = 0;
4292 for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4293 if (!strcmp (target_switches[j].name, name))
4295 if (target_switches[j].value < 0)
4296 target_flags &= ~-target_switches[j].value;
4297 else
4298 target_flags |= target_switches[j].value;
4299 valid_target_option = 1;
4302 #ifdef TARGET_OPTIONS
4303 if (!valid_target_option)
4304 for (j = 0; j < ARRAY_SIZE (target_options); j++)
4306 int len = strlen (target_options[j].prefix);
4307 if (!strncmp (target_options[j].prefix, name, len))
4309 *target_options[j].variable = name + len;
4310 valid_target_option = 1;
4313 #endif
4315 if (!valid_target_option)
4316 error ("invalid option `%s'", name);
4319 /* Print version information to FILE.
4320 Each line begins with INDENT (for the case where FILE is the
4321 assembler output file). */
4323 static void
4324 print_version (file, indent)
4325 FILE *file;
4326 const char *indent;
4328 #ifndef __VERSION__
4329 #define __VERSION__ "[?]"
4330 #endif
4331 fnotice (file,
4332 #ifdef __GNUC__
4333 "%s%s%s version %s (%s)\n%s\tcompiled by GNU C version %s.\n"
4334 #else
4335 "%s%s%s version %s (%s) compiled by CC.\n"
4336 #endif
4337 , indent, *indent != 0 ? " " : "",
4338 lang_hooks.name, version_string, TARGET_NAME,
4339 indent, __VERSION__);
4342 /* Print an option value and return the adjusted position in the line.
4343 ??? We don't handle error returns from fprintf (disk full); presumably
4344 other code will catch a disk full though. */
4346 static int
4347 print_single_switch (file, pos, max, indent, sep, term, type, name)
4348 FILE *file;
4349 int pos, max;
4350 const char *indent, *sep, *term, *type, *name;
4352 /* The ultrix fprintf returns 0 on success, so compute the result we want
4353 here since we need it for the following test. */
4354 int len = strlen (sep) + strlen (type) + strlen (name);
4356 if (pos != 0
4357 && pos + len > max)
4359 fprintf (file, "%s", term);
4360 pos = 0;
4362 if (pos == 0)
4364 fprintf (file, "%s", indent);
4365 pos = strlen (indent);
4367 fprintf (file, "%s%s%s", sep, type, name);
4368 pos += len;
4369 return pos;
4372 /* Print active target switches to FILE.
4373 POS is the current cursor position and MAX is the size of a "line".
4374 Each line begins with INDENT and ends with TERM.
4375 Each switch is separated from the next by SEP. */
4377 static void
4378 print_switch_values (file, pos, max, indent, sep, term)
4379 FILE *file;
4380 int pos, max;
4381 const char *indent, *sep, *term;
4383 size_t j;
4384 char **p;
4386 /* Print the options as passed. */
4388 pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
4389 _("options passed: "), "");
4391 for (p = &save_argv[1]; *p != NULL; p++)
4392 if (**p == '-')
4394 /* Ignore these. */
4395 if (strcmp (*p, "-o") == 0)
4397 if (p[1] != NULL)
4398 p++;
4399 continue;
4401 if (strcmp (*p, "-quiet") == 0)
4402 continue;
4403 if (strcmp (*p, "-version") == 0)
4404 continue;
4405 if ((*p)[1] == 'd')
4406 continue;
4408 pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
4410 if (pos > 0)
4411 fprintf (file, "%s", term);
4413 /* Print the -f and -m options that have been enabled.
4414 We don't handle language specific options but printing argv
4415 should suffice. */
4417 pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
4418 _("options enabled: "), "");
4420 for (j = 0; j < ARRAY_SIZE (f_options); j++)
4421 if (*f_options[j].variable == f_options[j].on_value)
4422 pos = print_single_switch (file, pos, max, indent, sep, term,
4423 "-f", f_options[j].string);
4425 /* Print target specific options. */
4427 for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4428 if (target_switches[j].name[0] != '\0'
4429 && target_switches[j].value > 0
4430 && ((target_switches[j].value & target_flags)
4431 == target_switches[j].value))
4433 pos = print_single_switch (file, pos, max, indent, sep, term,
4434 "-m", target_switches[j].name);
4437 #ifdef TARGET_OPTIONS
4438 for (j = 0; j < ARRAY_SIZE (target_options); j++)
4439 if (*target_options[j].variable != NULL)
4441 char prefix[256];
4442 sprintf (prefix, "-m%s", target_options[j].prefix);
4443 pos = print_single_switch (file, pos, max, indent, sep, term,
4444 prefix, *target_options[j].variable);
4446 #endif
4448 fprintf (file, "%s", term);
4451 /* Open assembly code output file. Do this even if -fsyntax-only is
4452 on, because then the driver will have provided the name of a
4453 temporary file or bit bucket for us. NAME is the file specified on
4454 the command line, possibly NULL. */
4455 static void
4456 init_asm_output (name)
4457 const char *name;
4459 if (name == NULL && asm_file_name == 0)
4460 asm_out_file = stdout;
4461 else
4463 if (asm_file_name == 0)
4465 int len = strlen (dump_base_name);
4466 char *dumpname = (char *) xmalloc (len + 6);
4467 memcpy (dumpname, dump_base_name, len + 1);
4468 strip_off_ending (dumpname, len);
4469 strcat (dumpname, ".s");
4470 asm_file_name = dumpname;
4472 if (!strcmp (asm_file_name, "-"))
4473 asm_out_file = stdout;
4474 else
4475 asm_out_file = fopen (asm_file_name, "w");
4476 if (asm_out_file == 0)
4477 fatal_io_error ("can't open %s for writing", asm_file_name);
4480 #ifdef IO_BUFFER_SIZE
4481 setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
4482 _IOFBF, IO_BUFFER_SIZE);
4483 #endif
4485 if (!flag_syntax_only)
4487 #ifdef ASM_FILE_START
4488 ASM_FILE_START (asm_out_file);
4489 #endif
4491 #ifdef ASM_COMMENT_START
4492 if (flag_verbose_asm)
4494 /* Print the list of options in effect. */
4495 print_version (asm_out_file, ASM_COMMENT_START);
4496 print_switch_values (asm_out_file, 0, MAX_LINE,
4497 ASM_COMMENT_START, " ", "\n");
4498 /* Add a blank line here so it appears in assembler output but not
4499 screen output. */
4500 fprintf (asm_out_file, "\n");
4502 #endif
4506 /* Initialization of the front end environment, before command line
4507 options are parsed. Signal handlers, internationalization etc.
4508 ARGV0 is main's argv[0]. */
4509 static void
4510 general_init (argv0)
4511 char *argv0;
4513 char *p;
4515 p = argv0 + strlen (argv0);
4516 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
4517 --p;
4518 progname = p;
4520 xmalloc_set_program_name (progname);
4522 gcc_init_libintl ();
4524 /* Install handler for SIGFPE, which may be received while we do
4525 compile-time floating point arithmetic. */
4526 signal (SIGFPE, float_signal);
4528 /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */
4529 #ifdef SIGSEGV
4530 signal (SIGSEGV, crash_signal);
4531 #endif
4532 #ifdef SIGILL
4533 signal (SIGILL, crash_signal);
4534 #endif
4535 #ifdef SIGBUS
4536 signal (SIGBUS, crash_signal);
4537 #endif
4538 #ifdef SIGABRT
4539 signal (SIGABRT, crash_signal);
4540 #endif
4541 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
4542 signal (SIGIOT, crash_signal);
4543 #endif
4545 /* Initialize the diagnostics reporting machinery, so option parsing
4546 can give warnings and errors. */
4547 diagnostic_initialize (global_dc);
4550 /* Parse command line options and set default flag values, called
4551 after language-independent option-independent initialization. Do
4552 minimal options processing. Outputting diagnostics is OK, but GC
4553 and identifier hashtables etc. are not initialized yet. */
4554 static void
4555 parse_options_and_default_flags (argc, argv)
4556 int argc;
4557 char **argv;
4559 int i;
4561 /* Save in case md file wants to emit args as a comment. */
4562 save_argc = argc;
4563 save_argv = argv;
4565 /* Initialize register usage now so switches may override. */
4566 init_reg_sets ();
4568 /* Register the language-independent parameters. */
4569 add_params (lang_independent_params, LAST_PARAM);
4571 /* Perform language-specific options initialization. */
4572 (*lang_hooks.init_options) ();
4574 /* Scan to see what optimization level has been specified. That will
4575 determine the default value of many flags. */
4576 for (i = 1; i < argc; i++)
4578 if (!strcmp (argv[i], "-O"))
4580 optimize = 1;
4581 optimize_size = 0;
4583 else if (argv[i][0] == '-' && argv[i][1] == 'O')
4585 /* Handle -Os, -O2, -O3, -O69, ... */
4586 char *p = &argv[i][2];
4588 if ((p[0] == 's') && (p[1] == 0))
4590 optimize_size = 1;
4592 /* Optimizing for size forces optimize to be 2. */
4593 optimize = 2;
4595 else
4597 const int optimize_val = read_integral_parameter (p, p - 2, -1);
4598 if (optimize_val != -1)
4600 optimize = optimize_val;
4601 optimize_size = 0;
4607 if (!optimize)
4609 flag_merge_constants = 0;
4612 if (optimize >= 1)
4614 flag_defer_pop = 1;
4615 flag_thread_jumps = 1;
4616 #ifdef DELAY_SLOTS
4617 flag_delayed_branch = 1;
4618 #endif
4619 #ifdef CAN_DEBUG_WITHOUT_FP
4620 flag_omit_frame_pointer = 1;
4621 #endif
4622 flag_guess_branch_prob = 1;
4625 if (optimize >= 2)
4627 flag_optimize_sibling_calls = 1;
4628 flag_cse_follow_jumps = 1;
4629 flag_cse_skip_blocks = 1;
4630 flag_gcse = 1;
4631 flag_expensive_optimizations = 1;
4632 flag_strength_reduce = 1;
4633 flag_rerun_cse_after_loop = 1;
4634 flag_rerun_loop_opt = 1;
4635 flag_caller_saves = 1;
4636 flag_force_mem = 1;
4637 flag_peephole2 = 1;
4638 #ifdef INSN_SCHEDULING
4639 flag_schedule_insns = 1;
4640 flag_schedule_insns_after_reload = 1;
4641 #endif
4642 flag_regmove = 1;
4643 flag_strict_aliasing = 1;
4644 flag_delete_null_pointer_checks = 1;
4645 flag_reorder_blocks = 1;
4648 if (optimize >= 3)
4650 flag_inline_functions = 1;
4651 flag_rename_registers = 1;
4654 if (optimize < 2 || optimize_size)
4656 align_loops = 1;
4657 align_jumps = 1;
4658 align_labels = 1;
4659 align_functions = 1;
4662 /* Initialize whether `char' is signed. */
4663 flag_signed_char = DEFAULT_SIGNED_CHAR;
4664 #ifdef DEFAULT_SHORT_ENUMS
4665 /* Initialize how much space enums occupy, by default. */
4666 flag_short_enums = DEFAULT_SHORT_ENUMS;
4667 #endif
4669 /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
4670 modify it. */
4671 target_flags = 0;
4672 set_target_switch ("");
4674 /* Unwind tables are always present in an ABI-conformant IA-64
4675 object file, so the default should be ON. */
4676 #ifdef IA64_UNWIND_INFO
4677 flag_unwind_tables = IA64_UNWIND_INFO;
4678 #endif
4680 #ifdef OPTIMIZATION_OPTIONS
4681 /* Allow default optimizations to be specified on a per-machine basis. */
4682 OPTIMIZATION_OPTIONS (optimize, optimize_size);
4683 #endif
4685 /* Perform normal command line switch decoding. */
4686 for (i = 1; i < argc;)
4688 int lang_processed;
4689 int indep_processed;
4691 /* Give the language a chance to decode the option for itself. */
4692 lang_processed = (*lang_hooks.decode_option) (argc - i, argv + i);
4694 if (lang_processed >= 0)
4695 /* Now see if the option also has a language independent meaning.
4696 Some options are both language specific and language independent,
4697 eg --help. */
4698 indep_processed = independent_decode_option (argc - i, argv + i);
4699 else
4701 lang_processed = -lang_processed;
4702 indep_processed = 0;
4705 if (lang_processed || indep_processed)
4706 i += MAX (lang_processed, indep_processed);
4707 else
4709 const char *option = NULL;
4710 const char *lang = NULL;
4711 unsigned int j;
4713 /* It is possible that the command line switch is not valid for the
4714 current language, but it is valid for another language. In order
4715 to be compatible with previous versions of the compiler (which
4716 did not issue an error message in this case) we check for this
4717 possibility here. If we do find a match, then if extra_warnings
4718 is set we generate a warning message, otherwise we will just
4719 ignore the option. */
4720 for (j = 0; j < ARRAY_SIZE (documented_lang_options); j++)
4722 option = documented_lang_options[j].option;
4724 if (option == NULL)
4725 lang = documented_lang_options[j].description;
4726 else if (! strncmp (argv[i], option, strlen (option)))
4727 break;
4730 if (j != ARRAY_SIZE (documented_lang_options))
4732 if (extra_warnings)
4734 warning ("ignoring command line option '%s'", argv[i]);
4735 if (lang)
4736 warning
4737 ("(it is valid for %s but not the selected language)",
4738 lang);
4741 else if (argv[i][0] == '-' && argv[i][1] == 'g')
4742 warning ("`%s': unknown or unsupported -g option", &argv[i][2]);
4743 else
4744 error ("unrecognized option `%s'", argv[i]);
4746 i++;
4750 /* All command line options have been parsed; allow the front end to
4751 perform consistency checks, etc. */
4752 (*lang_hooks.post_options) ();
4755 /* Process the options that have been parsed. */
4756 static void
4757 process_options ()
4759 if (optimize == 0)
4761 /* Inlining does not work if not optimizing,
4762 so force it not to be done. */
4763 flag_no_inline = 1;
4764 warn_inline = 0;
4766 /* The c_decode_option function and decode_option hook set
4767 this to `2' if -Wall is used, so we can avoid giving out
4768 lots of errors for people who don't realize what -Wall does. */
4769 if (warn_uninitialized == 1)
4770 warning ("-Wuninitialized is not supported without -O");
4773 #ifdef OVERRIDE_OPTIONS
4774 /* Some machines may reject certain combinations of options. */
4775 OVERRIDE_OPTIONS;
4776 #endif
4778 /* Set up the align_*_log variables, defaulting them to 1 if they
4779 were still unset. */
4780 if (align_loops <= 0) align_loops = 1;
4781 if (align_loops_max_skip > align_loops || !align_loops)
4782 align_loops_max_skip = align_loops - 1;
4783 align_loops_log = floor_log2 (align_loops * 2 - 1);
4784 if (align_jumps <= 0) align_jumps = 1;
4785 if (align_jumps_max_skip > align_jumps || !align_jumps)
4786 align_jumps_max_skip = align_jumps - 1;
4787 align_jumps_log = floor_log2 (align_jumps * 2 - 1);
4788 if (align_labels <= 0) align_labels = 1;
4789 align_labels_log = floor_log2 (align_labels * 2 - 1);
4790 if (align_labels_max_skip > align_labels || !align_labels)
4791 align_labels_max_skip = align_labels - 1;
4792 if (align_functions <= 0) align_functions = 1;
4793 align_functions_log = floor_log2 (align_functions * 2 - 1);
4795 /* Unrolling all loops implies that standard loop unrolling must also
4796 be done. */
4797 if (flag_unroll_all_loops)
4798 flag_unroll_loops = 1;
4799 /* Loop unrolling requires that strength_reduction be on also. Silently
4800 turn on strength reduction here if it isn't already on. Also, the loop
4801 unrolling code assumes that cse will be run after loop, so that must
4802 be turned on also. */
4803 if (flag_unroll_loops)
4805 flag_strength_reduce = 1;
4806 flag_rerun_cse_after_loop = 1;
4809 if (flag_non_call_exceptions)
4810 flag_asynchronous_unwind_tables = 1;
4811 if (flag_asynchronous_unwind_tables)
4812 flag_unwind_tables = 1;
4814 /* Warn about options that are not supported on this machine. */
4815 #ifndef INSN_SCHEDULING
4816 if (flag_schedule_insns || flag_schedule_insns_after_reload)
4817 warning ("instruction scheduling not supported on this target machine");
4818 #endif
4819 #ifndef DELAY_SLOTS
4820 if (flag_delayed_branch)
4821 warning ("this target machine does not have delayed branches");
4822 #endif
4824 /* Some operating systems do not allow profiling without a frame
4825 pointer. */
4826 if (!TARGET_ALLOWS_PROFILING_WITHOUT_FRAME_POINTER
4827 && profile_flag
4828 && flag_omit_frame_pointer)
4830 error ("profiling does not work without a frame pointer");
4831 flag_omit_frame_pointer = 0;
4834 user_label_prefix = USER_LABEL_PREFIX;
4835 if (flag_leading_underscore != -1)
4837 /* If the default prefix is more complicated than "" or "_",
4838 issue a warning and ignore this option. */
4839 if (user_label_prefix[0] == 0 ||
4840 (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
4842 user_label_prefix = flag_leading_underscore ? "_" : "";
4844 else
4845 warning ("-f%sleading-underscore not supported on this target machine",
4846 flag_leading_underscore ? "" : "no-");
4849 /* If we are in verbose mode, write out the version and maybe all the
4850 option flags in use. */
4851 if (version_flag)
4853 print_version (stderr, "");
4854 if (! quiet_flag)
4855 print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
4858 if (! quiet_flag)
4859 time_report = 1;
4861 if (flag_syntax_only)
4863 write_symbols = NO_DEBUG;
4864 profile_flag = 0;
4867 /* Now we know write_symbols, set up the debug hooks based on it.
4868 By default we do nothing for debug output. */
4869 #if defined(DBX_DEBUGGING_INFO)
4870 if (write_symbols == DBX_DEBUG)
4871 debug_hooks = &dbx_debug_hooks;
4872 #endif
4873 #if defined(XCOFF_DEBUGGING_INFO)
4874 if (write_symbols == XCOFF_DEBUG)
4875 debug_hooks = &xcoff_debug_hooks;
4876 #endif
4877 #ifdef SDB_DEBUGGING_INFO
4878 if (write_symbols == SDB_DEBUG)
4879 debug_hooks = &sdb_debug_hooks;
4880 #endif
4881 #ifdef DWARF_DEBUGGING_INFO
4882 if (write_symbols == DWARF_DEBUG)
4883 debug_hooks = &dwarf_debug_hooks;
4884 #endif
4885 #ifdef DWARF2_DEBUGGING_INFO
4886 if (write_symbols == DWARF2_DEBUG)
4887 debug_hooks = &dwarf2_debug_hooks;
4888 #endif
4889 #ifdef VMS_DEBUGGING_INFO
4890 if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
4891 debug_hooks = &vmsdbg_debug_hooks;
4892 #endif
4894 /* If auxiliary info generation is desired, open the output file.
4895 This goes in the same directory as the source file--unlike
4896 all the other output files. */
4897 if (flag_gen_aux_info)
4899 aux_info_file = fopen (aux_info_file_name, "w");
4900 if (aux_info_file == 0)
4901 fatal_io_error ("can't open %s", aux_info_file_name);
4904 if (! targetm.have_named_sections)
4906 if (flag_function_sections)
4908 warning ("-ffunction-sections not supported for this target");
4909 flag_function_sections = 0;
4911 if (flag_data_sections)
4913 warning ("-fdata-sections not supported for this target");
4914 flag_data_sections = 0;
4918 if (flag_function_sections && profile_flag)
4920 warning ("-ffunction-sections disabled; it makes profiling impossible");
4921 flag_function_sections = 0;
4924 #ifndef OBJECT_FORMAT_ELF
4925 if (flag_function_sections && write_symbols != NO_DEBUG)
4926 warning ("-ffunction-sections may affect debugging on some targets");
4927 #endif
4930 /* Language-independent initialization, before language-dependent
4931 initialization. */
4932 static void
4933 lang_independent_init ()
4935 decl_printable_name = decl_name;
4936 lang_expand_expr = (lang_expand_expr_t) do_abort;
4938 /* Set the language-dependent identifier size. */
4939 tree_code_length[(int) IDENTIFIER_NODE]
4940 = ((lang_hooks.identifier_size - sizeof (struct tree_common))
4941 / sizeof (tree));
4943 /* Initialize the garbage-collector, and string pools. */
4944 init_ggc ();
4945 ggc_add_rtx_root (&stack_limit_rtx, 1);
4946 ggc_add_tree_root (&current_function_decl, 1);
4947 ggc_add_tree_root (&current_function_func_begin_label, 1);
4949 init_stringpool ();
4950 init_obstacks ();
4952 init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
4953 || debug_info_level == DINFO_LEVEL_VERBOSE
4954 #ifdef VMS_DEBUGGING_INFO
4955 /* Enable line number info for traceback */
4956 || debug_info_level > DINFO_LEVEL_NONE
4957 #endif
4958 || flag_test_coverage
4959 || warn_notreached);
4960 init_regs ();
4961 init_alias_once ();
4962 init_stmt ();
4963 init_loop ();
4964 init_reload ();
4965 init_function_once ();
4966 init_stor_layout_once ();
4967 init_varasm_once ();
4968 init_EXPR_INSN_LIST_cache ();
4970 /* The following initialization functions need to generate rtl, so
4971 provide a dummy function context for them. */
4972 init_dummy_function_start ();
4973 init_expmed ();
4974 init_expr_once ();
4975 if (flag_caller_saves)
4976 init_caller_save ();
4977 expand_dummy_function_end ();
4980 /* Language-dependent initialization. Returns non-zero on success. */
4981 static int
4982 lang_dependent_init (name)
4983 const char *name;
4985 if (dump_base_name == 0)
4986 dump_base_name = name ? name : "gccdump";
4988 /* Front-end initialization. This hook can assume that GC,
4989 identifier hashes etc. are set up, but debug initialization is
4990 not done yet. This routine must return the original filename
4991 (e.g. foo.i -> foo.c) so can correctly initialize debug output. */
4992 name = (*lang_hooks.init) (name);
4993 if (name == NULL)
4994 return 0;
4996 /* Is this duplication necessary? */
4997 name = ggc_strdup (name);
4998 main_input_filename = input_filename = name;
4999 init_asm_output (name);
5001 /* These create various _DECL nodes, so need to be called after the
5002 front end is initialized. */
5003 init_eh ();
5004 init_optabs ();
5006 /* Put an entry on the input file stack for the main input file. */
5007 push_srcloc (input_filename, 0);
5009 /* If dbx symbol table desired, initialize writing it and output the
5010 predefined types. */
5011 timevar_push (TV_SYMOUT);
5013 #ifdef DWARF2_UNWIND_INFO
5014 if (dwarf2out_do_frame ())
5015 dwarf2out_frame_init ();
5016 #endif
5018 /* Now we have the correct original filename, we can initialize
5019 debug output. */
5020 (*debug_hooks->init) (name);
5022 timevar_pop (TV_SYMOUT);
5024 return 1;
5027 /* Clean up: close opened files, etc. */
5029 static void
5030 finalize ()
5032 /* Close the dump files. */
5033 if (flag_gen_aux_info)
5035 fclose (aux_info_file);
5036 if (errorcount)
5037 unlink (aux_info_file_name);
5040 /* Close non-debugging input and output files. Take special care to note
5041 whether fclose returns an error, since the pages might still be on the
5042 buffer chain while the file is open. */
5044 if (asm_out_file)
5046 if (ferror (asm_out_file) != 0)
5047 fatal_io_error ("error writing to %s", asm_file_name);
5048 if (fclose (asm_out_file) != 0)
5049 fatal_io_error ("error closing %s", asm_file_name);
5052 /* Do whatever is necessary to finish printing the graphs. */
5053 if (graph_dump_format != no_graph)
5055 int i;
5057 for (i = 0; i < (int) DFI_MAX; ++i)
5058 if (dump_file[i].initialized && dump_file[i].graph_dump_p)
5060 char seq[16];
5061 char *suffix;
5063 sprintf (seq, DUMPFILE_FORMAT, i);
5064 suffix = concat (seq, dump_file[i].extension, NULL);
5065 finish_graph_dump_file (dump_base_name, suffix);
5066 free (suffix);
5070 if (mem_report)
5072 ggc_print_statistics ();
5073 stringpool_statistics ();
5074 dump_tree_statistics ();
5077 /* Free up memory for the benefit of leak detectors. */
5078 free_reg_info ();
5080 /* Language-specific end of compilation actions. */
5081 (*lang_hooks.finish) ();
5084 /* Initialize the compiler, and compile the input file. */
5085 static void
5086 do_compile ()
5088 /* The bulk of command line switch processing. */
5089 process_options ();
5091 /* We cannot start timing until after options are processed since that
5092 says if we run timers or not. */
5093 init_timevar ();
5094 timevar_start (TV_TOTAL);
5096 /* Language-independent initialization. Also sets up GC, identifier
5097 hashes etc. */
5098 lang_independent_init ();
5100 /* Language-dependent initialization. Returns true on success. */
5101 if (lang_dependent_init (filename))
5102 compile_file ();
5104 finalize ();
5106 /* Stop timing and print the times. */
5107 timevar_stop (TV_TOTAL);
5108 timevar_print (stderr);
5111 /* Entry point of cc1, cc1plus, jc1, f771, etc.
5112 Decode command args, then call compile_file.
5113 Exit code is FATAL_EXIT_CODE if can't open files or if there were
5114 any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
5116 It is not safe to call this function more than once. */
5119 toplev_main (argc, argv)
5120 int argc;
5121 char **argv;
5123 /* Initialization of GCC's environment, and diagnostics. */
5124 general_init (argv [0]);
5126 /* Parse the options and do minimal processing; basically just
5127 enough to default flags appropriately. */
5128 parse_options_and_default_flags (argc, argv);
5130 /* Exit early if we can (e.g. -help). */
5131 if (!exit_after_options)
5132 do_compile ();
5134 if (errorcount || sorrycount)
5135 return (FATAL_EXIT_CODE);
5137 return (SUCCESS_EXIT_CODE);