* config/i386/i386.md (clrstrsi): Call ix86_set_move_mem_attrs.
[official-gcc.git] / gcc / toplev.c
blob6bddc9c3690013feda83e2bd774f1bbcdbebe908
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 GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
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-codes.h"
49 #include "insn-config.h"
50 #include "hard-reg-set.h"
51 #include "recog.h"
52 #include "output.h"
53 #include "except.h"
54 #include "function.h"
55 #include "toplev.h"
56 #include "expr.h"
57 #include "basic-block.h"
58 #include "intl.h"
59 #include "ggc.h"
60 #include "graph.h"
61 #include "loop.h"
62 #include "regs.h"
63 #include "timevar.h"
64 #include "diagnostic.h"
65 #include "ssa.h"
66 #include "params.h"
68 #ifndef ACCUMULATE_OUTGOING_ARGS
69 #define ACCUMULATE_OUTGOING_ARGS 0
70 #endif
72 #ifdef DWARF_DEBUGGING_INFO
73 #include "dwarfout.h"
74 #endif
76 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
77 #include "dwarf2out.h"
78 #endif
80 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
81 #include "dbxout.h"
82 #endif
84 #ifdef SDB_DEBUGGING_INFO
85 #include "sdbout.h"
86 #endif
88 #ifdef XCOFF_DEBUGGING_INFO
89 #include "xcoffout.h"
90 #endif
92 #ifdef VMS
93 /* The extra parameters substantially improve the I/O performance. */
95 static FILE *
96 vms_fopen (fname, type)
97 char *fname;
98 char *type;
100 /* The <stdio.h> in the gcc-vms-1.42 distribution prototypes fopen with two
101 fixed arguments, which matches ANSI's specification but not VAXCRTL's
102 pre-ANSI implementation. This hack circumvents the mismatch problem. */
103 FILE *(*vmslib_fopen)() = (FILE *(*)()) fopen;
105 if (*type == 'w')
106 return (*vmslib_fopen) (fname, type, "mbc=32",
107 "deq=64", "fop=tef", "shr=nil");
108 else
109 return (*vmslib_fopen) (fname, type, "mbc=32");
112 #define fopen vms_fopen
113 #endif /* VMS */
115 #ifndef DEFAULT_GDB_EXTENSIONS
116 #define DEFAULT_GDB_EXTENSIONS 1
117 #endif
119 /* If more than one debugging type is supported, you must define
120 PREFERRED_DEBUGGING_TYPE to choose a format in a system-dependent way.
122 This is one long line cause VAXC can't handle a \-newline. */
123 #if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) + defined (DWARF_DEBUGGING_INFO) + defined (DWARF2_DEBUGGING_INFO) + defined (XCOFF_DEBUGGING_INFO))
124 #ifndef PREFERRED_DEBUGGING_TYPE
125 You Lose! You must define PREFERRED_DEBUGGING_TYPE!
126 #endif /* no PREFERRED_DEBUGGING_TYPE */
127 #else /* Only one debugging format supported. Define PREFERRED_DEBUGGING_TYPE
128 so the following code needn't care. */
129 #ifdef DBX_DEBUGGING_INFO
130 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
131 #endif
132 #ifdef SDB_DEBUGGING_INFO
133 #define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
134 #endif
135 #ifdef DWARF_DEBUGGING_INFO
136 #define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
137 #endif
138 #ifdef DWARF2_DEBUGGING_INFO
139 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
140 #endif
141 #ifdef XCOFF_DEBUGGING_INFO
142 #define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG
143 #endif
144 #endif /* More than one debugger format enabled. */
146 /* If still not defined, must have been because no debugging formats
147 are supported. */
148 #ifndef PREFERRED_DEBUGGING_TYPE
149 #define PREFERRED_DEBUGGING_TYPE NO_DEBUG
150 #endif
152 #if defined (HAVE_DECL_ENVIRON) && !HAVE_DECL_ENVIRON
153 extern char **environ;
154 #endif
156 /* Carry information from ASM_DECLARE_OBJECT_NAME
157 to ASM_FINISH_DECLARE_OBJECT. */
159 extern int size_directive_output;
160 extern tree last_assemble_variable_decl;
162 static void set_target_switch PARAMS ((const char *));
163 static const char *decl_name PARAMS ((tree, int));
165 static void float_signal PARAMS ((int)) ATTRIBUTE_NORETURN;
166 static void crash_signal PARAMS ((int)) ATTRIBUTE_NORETURN;
167 #ifdef ASM_IDENTIFY_LANGUAGE
168 /* This might or might not be used in ASM_IDENTIFY_LANGUAGE. */
169 static void output_lang_identify PARAMS ((FILE *)) ATTRIBUTE_UNUSED;
170 #endif
171 static void compile_file PARAMS ((const char *));
172 static void display_help PARAMS ((void));
173 static void display_target_options PARAMS ((void));
175 static void decode_d_option PARAMS ((const char *));
176 static int decode_f_option PARAMS ((const char *));
177 static int decode_W_option PARAMS ((const char *));
178 static int decode_g_option PARAMS ((const char *));
179 static unsigned int independent_decode_option PARAMS ((int, char **));
181 static void print_version PARAMS ((FILE *, const char *));
182 static int print_single_switch PARAMS ((FILE *, int, int, const char *,
183 const char *, const char *,
184 const char *, const char *));
185 static void print_switch_values PARAMS ((FILE *, int, int, const char *,
186 const char *, const char *));
188 /* Length of line when printing switch values. */
189 #define MAX_LINE 75
191 /* Name of program invoked, sans directories. */
193 const char *progname;
195 /* Copy of arguments to toplev_main. */
196 int save_argc;
197 char **save_argv;
199 /* Name of current original source file (what was input to cpp).
200 This comes from each #-command in the actual input. */
202 const char *input_filename;
204 /* Name of top-level original source file (what was input to cpp).
205 This comes from the #-command at the beginning of the actual input.
206 If there isn't any there, then this is the cc1 input file name. */
208 const char *main_input_filename;
210 /* Current line number in real source file. */
212 int lineno;
214 /* Nonzero if it is unsafe to create any new pseudo registers. */
215 int no_new_pseudos;
217 /* Stack of currently pending input files. */
219 struct file_stack *input_file_stack;
221 /* Incremented on each change to input_file_stack. */
222 int input_file_stack_tick;
224 /* Name to use as base of names for dump output files. */
226 const char *dump_base_name;
228 /* Bit flags that specify the machine subtype we are compiling for.
229 Bits are tested using macros TARGET_... defined in the tm.h file
230 and set by `-m...' switches. Must be defined in rtlanal.c. */
232 extern int target_flags;
234 /* Describes a dump file. */
236 struct dump_file_info
238 /* The unique extension to apply, e.g. ".jump". */
239 const char *const extension;
241 /* The -d<c> character that enables this dump file. */
242 char const debug_switch;
244 /* True if there is a corresponding graph dump file. */
245 char const graph_dump_p;
247 /* True if the user selected this dump. */
248 char enabled;
250 /* True if the files have been initialized (ie truncated). */
251 char initialized;
254 /* Enumerate the extant dump files. */
256 enum dump_file_index
258 DFI_rtl,
259 DFI_sibling,
260 DFI_jump,
261 DFI_cse,
262 DFI_addressof,
263 DFI_ssa,
264 DFI_dce,
265 DFI_ussa,
266 DFI_gcse,
267 DFI_loop,
268 DFI_cse2,
269 DFI_cfg,
270 DFI_bp,
271 DFI_life,
272 DFI_combine,
273 DFI_ce,
274 DFI_regmove,
275 DFI_sched,
276 DFI_lreg,
277 DFI_greg,
278 DFI_postreload,
279 DFI_flow2,
280 DFI_peephole2,
281 DFI_rnreg,
282 DFI_ce2,
283 DFI_sched2,
284 DFI_bbro,
285 DFI_jump2,
286 DFI_mach,
287 DFI_dbr,
288 DFI_stack,
289 DFI_MAX
292 /* Describes all the dump files. Should be kept in order of the
293 pass and in sync with dump_file_index above.
295 Remaining -d letters:
297 " h o q u "
298 " H K OPQ TUVW YZ"
301 struct dump_file_info dump_file[DFI_MAX] =
303 { "rtl", 'r', 0, 0, 0 },
304 { "sibling", 'i', 0, 0, 0 },
305 { "jump", 'j', 0, 0, 0 },
306 { "cse", 's', 0, 0, 0 },
307 { "addressof", 'F', 0, 0, 0 },
308 { "ssa", 'e', 1, 0, 0 },
309 { "dce", 'X', 1, 0, 0 },
310 { "ussa", 'e', 1, 0, 0 }, /* Yes, duplicate enable switch. */
311 { "gcse", 'G', 1, 0, 0 },
312 { "loop", 'L', 1, 0, 0 },
313 { "cse2", 't', 1, 0, 0 },
314 { "cfg", 'f', 1, 0, 0 },
315 { "bp", 'b', 1, 0, 0 },
316 { "life", 'f', 1, 0, 0 }, /* Yes, duplicate enable switch. */
317 { "combine", 'c', 1, 0, 0 },
318 { "ce", 'C', 1, 0, 0 },
319 { "regmove", 'N', 1, 0, 0 },
320 { "sched", 'S', 1, 0, 0 },
321 { "lreg", 'l', 1, 0, 0 },
322 { "greg", 'g', 1, 0, 0 },
323 { "postreload", 'o', 1, 0, 0 },
324 { "flow2", 'w', 1, 0, 0 },
325 { "peephole2", 'z', 1, 0, 0 },
326 { "rnreg", 'n', 1, 0, 0 },
327 { "ce2", 'E', 1, 0, 0 },
328 { "sched2", 'R', 1, 0, 0 },
329 { "bbro", 'B', 1, 0, 0 },
330 { "jump2", 'J', 1, 0, 0 },
331 { "mach", 'M', 1, 0, 0 },
332 { "dbr", 'd', 0, 0, 0 },
333 { "stack", 'k', 1, 0, 0 },
336 static int open_dump_file PARAMS ((enum dump_file_index, tree));
337 static void close_dump_file PARAMS ((enum dump_file_index,
338 void (*) (FILE *, rtx), rtx));
340 /* Other flags saying which kinds of debugging dump have been requested. */
342 int rtl_dump_and_exit;
343 int flag_print_asm_name;
344 static int flag_print_mem;
345 static int version_flag;
346 static char *filename;
347 enum graph_dump_types graph_dump_format;
349 /* Name for output file of assembly code, specified with -o. */
351 char *asm_file_name;
353 /* Value of the -G xx switch, and whether it was passed or not. */
354 int g_switch_value;
355 int g_switch_set;
357 /* Type(s) of debugging information we are producing (if any).
358 See flags.h for the definitions of the different possible
359 types of debugging information. */
360 enum debug_info_type write_symbols = NO_DEBUG;
362 /* Level of debugging information we are producing. See flags.h
363 for the definitions of the different possible levels. */
364 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
366 /* Nonzero means use GNU-only extensions in the generated symbolic
367 debugging information. */
368 /* Currently, this only has an effect when write_symbols is set to
369 DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
370 int use_gnu_debug_info_extensions = 0;
372 /* Nonzero means do optimizations. -O.
373 Particular numeric values stand for particular amounts of optimization;
374 thus, -O2 stores 2 here. However, the optimizations beyond the basic
375 ones are not controlled directly by this variable. Instead, they are
376 controlled by individual `flag_...' variables that are defaulted
377 based on this variable. */
379 int optimize = 0;
381 /* Nonzero means optimize for size. -Os.
382 The only valid values are zero and non-zero. When optimize_size is
383 non-zero, optimize defaults to 2, but certain individual code
384 bloating optimizations are disabled. */
386 int optimize_size = 0;
388 /* Number of error messages and warning messages so far. */
390 int errorcount = 0;
391 int warningcount = 0;
392 int sorrycount = 0;
394 /* Nonzero if we should exit after parsing options. */
395 static int exit_after_options = 0;
397 /* The FUNCTION_DECL for the function currently being compiled,
398 or 0 if between functions. */
399 tree current_function_decl;
401 /* Set to the FUNC_BEGIN label of the current function, or NULL_TREE
402 if none. */
403 tree current_function_func_begin_label;
405 /* Pointer to function to compute the name to use to print a declaration.
406 DECL is the declaration in question.
407 VERBOSITY determines what information will be printed:
408 0: DECL_NAME, demangled as necessary.
409 1: and scope information.
410 2: and any other information that might be interesting, such as function
411 parameter types in C++. */
413 const char *(*decl_printable_name) PARAMS ((tree, int));
415 /* Pointer to function to compute rtl for a language-specific tree code. */
417 typedef rtx (*lang_expand_expr_t)
418 PARAMS ((union tree_node *, rtx, enum machine_mode,
419 enum expand_modifier modifier));
421 lang_expand_expr_t lang_expand_expr = 0;
423 tree (*lang_expand_constant) PARAMS ((tree)) = 0;
425 /* Pointer to function to finish handling an incomplete decl at the
426 end of compilation. */
428 void (*incomplete_decl_finalize_hook) PARAMS ((tree)) = 0;
430 /* Nonzero if doing dwarf2 duplicate elimination. */
432 int flag_eliminate_dwarf2_dups = 0;
434 /* Nonzero if generating code to do profiling. */
436 int profile_flag = 0;
438 /* Nonzero if generating code to do profiling on a line-by-line basis. */
440 int profile_block_flag;
442 /* Nonzero if generating code to profile program flow graph arcs. */
444 int profile_arc_flag = 0;
446 /* Nonzero if generating info for gcov to calculate line test coverage. */
448 int flag_test_coverage = 0;
450 /* Nonzero indicates that branch taken probabilities should be calculated. */
452 int flag_branch_probabilities = 0;
454 /* Nonzero if basic blocks should be reordered. */
456 int flag_reorder_blocks = 0;
458 /* Nonzero if registers should be renamed. */
460 int flag_rename_registers = 0;
462 /* Nonzero for -pedantic switch: warn about anything
463 that standard spec forbids. */
465 int pedantic = 0;
467 /* Temporarily suppress certain warnings.
468 This is set while reading code from a system header file. */
470 int in_system_header = 0;
472 /* Don't print functions as they are compiled. -quiet. */
474 int quiet_flag = 0;
476 /* Print times taken by the various passes. -ftime-report. */
478 int time_report = 0;
480 /* Print memory still in use at end of compilation (which may have little
481 to do with peak memory consumption). -fmem-report. */
483 int mem_report = 0;
485 /* Non-zero means to collect statistics which might be expensive
486 and to print them when we are done. */
487 int flag_detailed_statistics = 0;
490 /* -f flags. */
492 /* Nonzero means `char' should be signed. */
494 int flag_signed_char;
496 /* Nonzero means give an enum type only as many bytes as it needs. */
498 int flag_short_enums;
500 /* Nonzero for -fcaller-saves: allocate values in regs that need to
501 be saved across function calls, if that produces overall better code.
502 Optional now, so people can test it. */
504 #ifdef DEFAULT_CALLER_SAVES
505 int flag_caller_saves = 1;
506 #else
507 int flag_caller_saves = 0;
508 #endif
510 /* Nonzero if structures and unions should be returned in memory.
512 This should only be defined if compatibility with another compiler or
513 with an ABI is needed, because it results in slower code. */
515 #ifndef DEFAULT_PCC_STRUCT_RETURN
516 #define DEFAULT_PCC_STRUCT_RETURN 1
517 #endif
519 /* Nonzero for -fpcc-struct-return: return values the same way PCC does. */
521 int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
523 /* Nonzero for -fforce-mem: load memory value into a register
524 before arithmetic on it. This makes better cse but slower compilation. */
526 int flag_force_mem = 0;
528 /* Nonzero for -fforce-addr: load memory address into a register before
529 reference to memory. This makes better cse but slower compilation. */
531 int flag_force_addr = 0;
533 /* Nonzero for -fdefer-pop: don't pop args after each function call;
534 instead save them up to pop many calls' args with one insns. */
536 int flag_defer_pop = 0;
538 /* Nonzero for -ffloat-store: don't allocate floats and doubles
539 in extended-precision registers. */
541 int flag_float_store = 0;
543 /* Nonzero for -fcse-follow-jumps:
544 have cse follow jumps to do a more extensive job. */
546 int flag_cse_follow_jumps;
548 /* Nonzero for -fcse-skip-blocks:
549 have cse follow a branch around a block. */
550 int flag_cse_skip_blocks;
552 /* Nonzero for -fexpensive-optimizations:
553 perform miscellaneous relatively-expensive optimizations. */
554 int flag_expensive_optimizations;
556 /* Nonzero for -fthread-jumps:
557 have jump optimize output of loop. */
559 int flag_thread_jumps;
561 /* Nonzero enables strength-reduction in loop.c. */
563 int flag_strength_reduce = 0;
565 /* Nonzero enables loop unrolling in unroll.c. Only loops for which the
566 number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
567 UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
568 unrolled. */
570 int flag_unroll_loops;
572 /* Nonzero enables loop unrolling in unroll.c. All loops are unrolled.
573 This is generally not a win. */
575 int flag_unroll_all_loops;
577 /* Nonzero forces all invariant computations in loops to be moved
578 outside the loop. */
580 int flag_move_all_movables = 0;
582 /* Nonzero forces all general induction variables in loops to be
583 strength reduced. */
585 int flag_reduce_all_givs = 0;
587 /* Nonzero to perform full register move optimization passes. This is the
588 default for -O2. */
590 int flag_regmove = 0;
592 /* Nonzero for -fwritable-strings:
593 store string constants in data segment and don't uniquize them. */
595 int flag_writable_strings = 0;
597 /* Nonzero means don't put addresses of constant functions in registers.
598 Used for compiling the Unix kernel, where strange substitutions are
599 done on the assembly output. */
601 int flag_no_function_cse = 0;
603 /* Nonzero for -fomit-frame-pointer:
604 don't make a frame pointer in simple functions that don't require one. */
606 int flag_omit_frame_pointer = 0;
608 /* Nonzero means place each function into its own section on those platforms
609 which support arbitrary section names and unlimited numbers of sections. */
611 int flag_function_sections = 0;
613 /* ... and similar for data. */
615 int flag_data_sections = 0;
617 /* Nonzero to inhibit use of define_optimization peephole opts. */
619 int flag_no_peephole = 0;
621 /* Nonzero allows GCC to optimize sibling and tail recursive calls. */
623 int flag_optimize_sibling_calls = 0;
625 /* Nonzero means the front end generally wants `errno' maintained by math
626 operations, like built-in SQRT. */
628 int flag_errno_math = 1;
630 /* Nonzero means that unsafe floating-point math optimizations are allowed
631 for the sake of speed. IEEE compliance is not guaranteed, and operations
632 are allowed to assume that their arguments and results are "normal"
633 (e.g., nonnegative for SQRT). */
635 int flag_unsafe_math_optimizations = 0;
637 /* Zero means that floating-point math operations cannot generate a
638 (user-visible) trap. This is the case, for example, in nonstop
639 IEEE 754 arithmetic. */
641 int flag_trapping_math = 1;
643 /* 0 means straightforward implementation of complex divide acceptable.
644 1 means wide ranges of inputs must work for complex divide.
645 2 means C99-like requirements for complex divide (not yet implemented). */
647 int flag_complex_divide_method = 0;
649 /* Nonzero means all references through pointers are volatile. */
651 int flag_volatile;
653 /* Nonzero means treat all global and extern variables as volatile. */
655 int flag_volatile_global;
657 /* Nonzero means treat all static variables as volatile. */
659 int flag_volatile_static;
661 /* Nonzero means just do syntax checking; don't output anything. */
663 int flag_syntax_only = 0;
665 /* Nonzero means perform global cse. */
667 static int flag_gcse;
669 /* Nonzero means to use global dataflow analysis to eliminate
670 useless null pointer tests. */
672 static int flag_delete_null_pointer_checks;
674 /* Nonzero means to rerun cse after loop optimization. This increases
675 compilation time about 20% and picks up a few more common expressions. */
677 static int flag_rerun_cse_after_loop;
679 /* Nonzero means to run loop optimizations twice. */
681 int flag_rerun_loop_opt;
683 /* Nonzero for -finline-functions: ok to inline functions that look like
684 good inline candidates. */
686 int flag_inline_functions;
688 /* Nonzero for -fkeep-inline-functions: even if we make a function
689 go inline everywhere, keep its definition around for debugging
690 purposes. */
692 int flag_keep_inline_functions;
694 /* Nonzero means that functions will not be inlined. */
696 int flag_no_inline;
698 /* Nonzero means that we should emit static const variables
699 regardless of whether or not optimization is turned on. */
701 int flag_keep_static_consts = 1;
703 /* Nonzero means we should be saving declaration info into a .X file. */
705 int flag_gen_aux_info = 0;
707 /* Specified name of aux-info file. */
709 static char *aux_info_file_name;
711 /* Nonzero means make the text shared if supported. */
713 int flag_shared_data;
715 /* Nonzero means schedule into delayed branch slots if supported. */
717 int flag_delayed_branch;
719 /* Nonzero if we are compiling pure (sharable) code.
720 Value is 1 if we are doing reasonable (i.e. simple
721 offset into offset table) pic. Value is 2 if we can
722 only perform register offsets. */
724 int flag_pic;
726 /* Nonzero means generate extra code for exception handling and enable
727 exception handling. */
729 int flag_exceptions;
731 /* Nonzero means use the new model for exception handling. Replaces
732 -DNEW_EH_MODEL as a compile option. */
734 int flag_new_exceptions = 1;
736 /* Nonzero means generate frame unwind info table when supported. */
738 int flag_unwind_tables = 0;
740 /* Nonzero means don't place uninitialized global data in common storage
741 by default. */
743 int flag_no_common;
745 /* Nonzero means pretend it is OK to examine bits of target floats,
746 even if that isn't true. The resulting code will have incorrect constants,
747 but the same series of instructions that the native compiler would make. */
749 int flag_pretend_float;
751 /* Nonzero means change certain warnings into errors.
752 Usually these are warnings about failure to conform to some standard. */
754 int flag_pedantic_errors = 0;
756 /* flag_schedule_insns means schedule insns within basic blocks (before
757 local_alloc).
758 flag_schedule_insns_after_reload means schedule insns after
759 global_alloc. */
761 int flag_schedule_insns = 0;
762 int flag_schedule_insns_after_reload = 0;
764 /* The following flags have effect only for scheduling before register
765 allocation:
767 flag_schedule_interblock means schedule insns accross basic blocks.
768 flag_schedule_speculative means allow speculative motion of non-load insns.
769 flag_schedule_speculative_load means allow speculative motion of some
770 load insns.
771 flag_schedule_speculative_load_dangerous allows speculative motion of more
772 load insns. */
774 int flag_schedule_interblock = 1;
775 int flag_schedule_speculative = 1;
776 int flag_schedule_speculative_load = 0;
777 int flag_schedule_speculative_load_dangerous = 0;
779 int flag_single_precision_constant;
781 /* flag_branch_on_count_reg means try to replace add-1,compare,branch tupple
782 by a cheaper branch on a count register. */
783 int flag_branch_on_count_reg = 1;
785 /* -finhibit-size-directive inhibits output of .size for ELF.
786 This is used only for compiling crtstuff.c,
787 and it may be extended to other effects
788 needed for crtstuff.c on other systems. */
789 int flag_inhibit_size_directive = 0;
791 /* -fverbose-asm causes extra commentary information to be produced in
792 the generated assembly code (to make it more readable). This option
793 is generally only of use to those who actually need to read the
794 generated assembly code (perhaps while debugging the compiler itself).
795 -fno-verbose-asm, the default, causes the extra information
796 to be omitted and is useful when comparing two assembler files. */
798 int flag_verbose_asm = 0;
800 /* -dA causes debug commentary information to be produced in
801 the generated assembly code (to make it more readable). This option
802 is generally only of use to those who actually need to read the
803 generated assembly code (perhaps while debugging the compiler itself).
804 Currently, this switch is only used by dwarfout.c; however, it is intended
805 to be a catchall for printing debug information in the assembler file. */
807 int flag_debug_asm = 0;
809 /* -dP causes the rtl to be emitted as a comment in assembly. */
811 int flag_dump_rtl_in_asm = 0;
813 /* -fgnu-linker specifies use of the GNU linker for initializations.
814 (Or, more generally, a linker that handles initializations.)
815 -fno-gnu-linker says that collect2 will be used. */
816 #ifdef USE_COLLECT2
817 int flag_gnu_linker = 0;
818 #else
819 int flag_gnu_linker = 1;
820 #endif
822 /* Enable SSA. */
823 int flag_ssa = 0;
825 /* Enable dead code elimination. */
826 int flag_dce = 0;
828 /* Tag all structures with __attribute__(packed). */
829 int flag_pack_struct = 0;
831 /* Emit code to check for stack overflow; also may cause large objects
832 to be allocated dynamically. */
833 int flag_stack_check;
835 /* When non-NULL, indicates that whenever space is allocated on the
836 stack, the resulting stack pointer must not pass this
837 address---that is, for stacks that grow downward, the stack pointer
838 must always be greater than or equal to this address; for stacks
839 that grow upward, the stack pointer must be less than this address.
840 At present, the rtx may be either a REG or a SYMBOL_REF, although
841 the support provided depends on the backend. */
842 rtx stack_limit_rtx;
844 /* -fcheck-memory-usage causes extra code to be generated in order to check
845 memory accesses. This is used by a detector of bad memory accesses such
846 as Checker. */
847 int flag_check_memory_usage = 0;
849 /* -fprefix-function-name causes function name to be prefixed. This
850 can be used with -fcheck-memory-usage to isolate code compiled with
851 -fcheck-memory-usage. */
852 int flag_prefix_function_name = 0;
854 /* 0 if pointer arguments may alias each other. True in C.
855 1 if pointer arguments may not alias each other but may alias
856 global variables.
857 2 if pointer arguments may not alias each other and may not
858 alias global variables. True in Fortran.
859 This defaults to 0 for C. */
860 int flag_argument_noalias = 0;
862 /* Nonzero if we should do (language-dependent) alias analysis.
863 Typically, this analysis will assume that expressions of certain
864 types do not alias expressions of certain other types. Only used
865 if alias analysis (in general) is enabled. */
866 int flag_strict_aliasing = 0;
868 /* Instrument functions with calls at entry and exit, for profiling. */
869 int flag_instrument_function_entry_exit = 0;
871 /* Nonzero means ignore `#ident' directives. 0 means handle them.
872 On SVR4 targets, it also controls whether or not to emit a
873 string identifying the compiler. */
875 int flag_no_ident = 0;
877 /* This will perform a peephole pass before sched2. */
878 int flag_peephole2 = 0;
880 /* This will try to guess branch probabilities. */
881 int flag_guess_branch_prob = 0;
883 /* -fbounded-pointers causes gcc to compile pointers as composite
884 objects occupying three words: the pointer value, the base address
885 of the referent object, and the address immediately beyond the end
886 of the referent object. The base and extent allow us to perform
887 runtime bounds checking. -fbounded-pointers implies -fcheck-bounds. */
888 int flag_bounded_pointers = 0;
890 /* -fcheck-bounds causes gcc to generate array bounds checks.
891 For C, C++: defaults to value of flag_bounded_pointers.
892 For ObjC: defaults to off.
893 For Java: defaults to on.
894 For Fortran: defaults to off.
895 For CHILL: defaults to off. */
896 int flag_bounds_check = 0;
898 /* If one, renumber instruction UIDs to reduce the number of
899 unused UIDs if there are a lot of instructions. If greater than
900 one, unconditionally renumber instruction UIDs. */
901 int flag_renumber_insns = 1;
903 /* Values of the -falign-* flags: how much to align labels in code.
904 0 means `use default', 1 means `don't align'.
905 For each variable, there is an _log variant which is the power
906 of two not less than the variable, for .align output. */
908 int align_loops;
909 int align_loops_log;
910 int align_jumps;
911 int align_jumps_log;
912 int align_labels;
913 int align_labels_log;
914 int align_functions;
915 int align_functions_log;
917 /* Table of supported debugging formats. */
918 static struct
920 const char *arg;
921 /* Since PREFERRED_DEBUGGING_TYPE isn't necessarily a
922 constant expression, we use NO_DEBUG in its place. */
923 enum debug_info_type debug_type;
924 int use_extensions_p;
925 const char *description;
926 } *da,
927 debug_args[] =
929 { "", NO_DEBUG, DEFAULT_GDB_EXTENSIONS,
930 "Generate default debug format output" },
931 { "gdb", NO_DEBUG, 1, "Generate default extended debug format output" },
932 #ifdef DBX_DEBUGGING_INFO
933 { "stabs", DBX_DEBUG, 0, "Generate STABS format debug output" },
934 { "stabs+", DBX_DEBUG, 1, "Generate extended STABS format debug output" },
935 #endif
936 #ifdef DWARF_DEBUGGING_INFO
937 { "dwarf", DWARF_DEBUG, 0, "Generate DWARF-1 format debug output"},
938 { "dwarf+", DWARF_DEBUG, 1,
939 "Generated extended DWARF-1 format debug output" },
940 #endif
941 #ifdef DWARF2_DEBUGGING_INFO
942 { "dwarf-2", DWARF2_DEBUG, 0, "Enable DWARF-2 debug output" },
943 #endif
944 #ifdef XCOFF_DEBUGGING_INFO
945 { "xcoff", XCOFF_DEBUG, 0, "Generate XCOFF format debug output" },
946 { "xcoff+", XCOFF_DEBUG, 1, "Generate extended XCOFF format debug output" },
947 #endif
948 #ifdef SDB_DEBUGGING_INFO
949 { "coff", SDB_DEBUG, 0, "Generate COFF format debug output" },
950 #endif
951 { 0, 0, 0, 0 }
954 typedef struct
956 const char *string;
957 int *variable;
958 int on_value;
959 const char *description;
961 lang_independent_options;
963 int flag_trapv = 0;
965 /* Add or remove a leading underscore from user symbols. */
966 int flag_leading_underscore = -1;
968 /* The user symbol prefix after having resolved same. */
969 const char *user_label_prefix;
971 static const param_info lang_independent_params[] = {
972 #define DEFPARAM(ENUM, OPTION, HELP, DEFAULT) \
973 { OPTION, DEFAULT },
974 #include "params.def"
975 #undef DEFPARAM
976 { NULL, 0 }
979 /* A default for same. */
980 #ifndef USER_LABEL_PREFIX
981 #define USER_LABEL_PREFIX ""
982 #endif
984 /* Table of language-independent -f options.
985 STRING is the option name. VARIABLE is the address of the variable.
986 ON_VALUE is the value to store in VARIABLE
987 if `-fSTRING' is seen as an option.
988 (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
990 lang_independent_options f_options[] =
992 {"eliminate-dwarf2-dups", &flag_eliminate_dwarf2_dups, 1,
993 "Perform DWARF2 duplicate elimination"},
994 {"float-store", &flag_float_store, 1,
995 "Do not store floats in registers" },
996 {"volatile", &flag_volatile, 1,
997 "Consider all mem refs through pointers as volatile"},
998 {"volatile-global", &flag_volatile_global, 1,
999 "Consider all mem refs to global data to be volatile" },
1000 {"volatile-static", &flag_volatile_static, 1,
1001 "Consider all mem refs to static data to be volatile" },
1002 {"defer-pop", &flag_defer_pop, 1,
1003 "Defer popping functions args from stack until later" },
1004 {"omit-frame-pointer", &flag_omit_frame_pointer, 1,
1005 "When possible do not generate stack frames"},
1006 {"optimize-sibling-calls", &flag_optimize_sibling_calls, 1,
1007 "Optimize sibling and tail recursive calls" },
1008 {"cse-follow-jumps", &flag_cse_follow_jumps, 1,
1009 "When running CSE, follow jumps to their targets" },
1010 {"cse-skip-blocks", &flag_cse_skip_blocks, 1,
1011 "When running CSE, follow conditional jumps" },
1012 {"expensive-optimizations", &flag_expensive_optimizations, 1,
1013 "Perform a number of minor, expensive optimisations" },
1014 {"thread-jumps", &flag_thread_jumps, 1,
1015 "Perform jump threading optimisations"},
1016 {"strength-reduce", &flag_strength_reduce, 1,
1017 "Perform strength reduction optimisations" },
1018 {"unroll-loops", &flag_unroll_loops, 1,
1019 "Perform loop unrolling when iteration count is known" },
1020 {"unroll-all-loops", &flag_unroll_all_loops, 1,
1021 "Perform loop unrolling for all loops" },
1022 {"move-all-movables", &flag_move_all_movables, 1,
1023 "Force all loop invariant computations out of loops" },
1024 {"reduce-all-givs", &flag_reduce_all_givs, 1,
1025 "Strength reduce all loop general induction variables" },
1026 {"writable-strings", &flag_writable_strings, 1,
1027 "Store strings in writable data section" },
1028 {"peephole", &flag_no_peephole, 0,
1029 "Enable machine specific peephole optimisations" },
1030 {"force-mem", &flag_force_mem, 1,
1031 "Copy memory operands into registers before using" },
1032 {"force-addr", &flag_force_addr, 1,
1033 "Copy memory address constants into regs before using" },
1034 {"function-cse", &flag_no_function_cse, 0,
1035 "Allow function addresses to be held in registers" },
1036 {"inline-functions", &flag_inline_functions, 1,
1037 "Integrate simple functions into their callers" },
1038 {"keep-inline-functions", &flag_keep_inline_functions, 1,
1039 "Generate code for funcs even if they are fully inlined" },
1040 {"inline", &flag_no_inline, 0,
1041 "Pay attention to the 'inline' keyword"},
1042 {"keep-static-consts", &flag_keep_static_consts, 1,
1043 "Emit static const variables even if they are not used" },
1044 {"syntax-only", &flag_syntax_only, 1,
1045 "Check for syntax errors, then stop" },
1046 {"shared-data", &flag_shared_data, 1,
1047 "Mark data as shared rather than private" },
1048 {"caller-saves", &flag_caller_saves, 1,
1049 "Enable saving registers around function calls" },
1050 {"pcc-struct-return", &flag_pcc_struct_return, 1,
1051 "Return 'short' aggregates in memory, not registers" },
1052 {"reg-struct-return", &flag_pcc_struct_return, 0,
1053 "Return 'short' aggregates in registers" },
1054 {"delayed-branch", &flag_delayed_branch, 1,
1055 "Attempt to fill delay slots of branch instructions" },
1056 {"gcse", &flag_gcse, 1,
1057 "Perform the global common subexpression elimination" },
1058 {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1,
1059 "Run CSE pass after loop optimisations"},
1060 {"rerun-loop-opt", &flag_rerun_loop_opt, 1,
1061 "Run the loop optimiser twice"},
1062 {"delete-null-pointer-checks", &flag_delete_null_pointer_checks, 1,
1063 "Delete useless null pointer checks" },
1064 {"pretend-float", &flag_pretend_float, 1,
1065 "Pretend that host and target use the same FP format"},
1066 {"schedule-insns", &flag_schedule_insns, 1,
1067 "Reschedule instructions before register allocation"},
1068 {"schedule-insns2", &flag_schedule_insns_after_reload, 1,
1069 "Reschedule instructions after register allocation"},
1070 {"sched-interblock",&flag_schedule_interblock, 1,
1071 "Enable scheduling across basic blocks" },
1072 {"sched-spec",&flag_schedule_speculative, 1,
1073 "Allow speculative motion of non-loads" },
1074 {"sched-spec-load",&flag_schedule_speculative_load, 1,
1075 "Allow speculative motion of some loads" },
1076 {"sched-spec-load-dangerous",&flag_schedule_speculative_load_dangerous, 1,
1077 "Allow speculative motion of more loads" },
1078 {"branch-count-reg",&flag_branch_on_count_reg, 1,
1079 "Replace add,compare,branch with branch on count reg"},
1080 {"pic", &flag_pic, 1,
1081 "Generate position independent code, if possible"},
1082 {"PIC", &flag_pic, 2, ""},
1083 {"exceptions", &flag_exceptions, 1,
1084 "Enable exception handling" },
1085 {"new-exceptions", &flag_new_exceptions, 1,
1086 "Use the new model for exception handling" },
1087 {"unwind-tables", &flag_unwind_tables, 1,
1088 "Just generate unwind tables for exception handling" },
1089 {"sjlj-exceptions", &exceptions_via_longjmp, 1,
1090 "Use setjmp/longjmp to handle exceptions" },
1091 {"asynchronous-exceptions", &asynchronous_exceptions, 1,
1092 "Support asynchronous exceptions" },
1093 {"profile-arcs", &profile_arc_flag, 1,
1094 "Insert arc based program profiling code" },
1095 {"test-coverage", &flag_test_coverage, 1,
1096 "Create data files needed by gcov" },
1097 {"branch-probabilities", &flag_branch_probabilities, 1,
1098 "Use profiling information for branch probabilities" },
1099 {"reorder-blocks", &flag_reorder_blocks, 1,
1100 "Reorder basic blocks to improve code placement" },
1101 {"rename-registers", &flag_rename_registers, 1,
1102 "Do the register renaming optimization pass"},
1103 {"common", &flag_no_common, 0,
1104 "Do not put unitialised globals in the common section" },
1105 {"inhibit-size-directive", &flag_inhibit_size_directive, 1,
1106 "Do not generate .size directives" },
1107 {"function-sections", &flag_function_sections, 1,
1108 "place each function into its own section" },
1109 {"data-sections", &flag_data_sections, 1,
1110 "place data items into their own section" },
1111 {"verbose-asm", &flag_verbose_asm, 1,
1112 "Add extra commentry to assembler output"},
1113 {"gnu-linker", &flag_gnu_linker, 1,
1114 "Output GNU ld formatted global initialisers"},
1115 {"regmove", &flag_regmove, 1,
1116 "Enables a register move optimisation"},
1117 {"optimize-register-move", &flag_regmove, 1,
1118 "Do the full regmove optimization pass"},
1119 {"pack-struct", &flag_pack_struct, 1,
1120 "Pack structure members together without holes" },
1121 {"stack-check", &flag_stack_check, 1,
1122 "Insert stack checking code into the program" },
1123 {"argument-alias", &flag_argument_noalias, 0,
1124 "Specify that arguments may alias each other & globals"},
1125 {"argument-noalias", &flag_argument_noalias, 1,
1126 "Assume arguments may alias globals but not each other"},
1127 {"argument-noalias-global", &flag_argument_noalias, 2,
1128 "Assume arguments do not alias each other or globals" },
1129 {"strict-aliasing", &flag_strict_aliasing, 1,
1130 "Assume strict aliasing rules apply" },
1131 {"align-loops", &align_loops, 0,
1132 "Align the start of loops" },
1133 {"align-jumps", &align_jumps, 0,
1134 "Align labels which are only reached by jumping" },
1135 {"align-labels", &align_labels, 0,
1136 "Align all labels" },
1137 {"align-functions", &align_functions, 0,
1138 "Align the start of functions" },
1139 {"check-memory-usage", &flag_check_memory_usage, 1,
1140 "Generate code to check every memory access" },
1141 {"prefix-function-name", &flag_prefix_function_name, 1,
1142 "Add a prefix to all function names" },
1143 {"dump-unnumbered", &flag_dump_unnumbered, 1,
1144 "Suppress output of instruction numbers and line number notes in debugging dumps"},
1145 {"instrument-functions", &flag_instrument_function_entry_exit, 1,
1146 "Instrument function entry/exit with profiling calls"},
1147 {"ssa", &flag_ssa, 1,
1148 "Enable SSA optimizations" },
1149 {"dce", &flag_dce, 1,
1150 "Enable dead code elimination" },
1151 {"leading-underscore", &flag_leading_underscore, 1,
1152 "External symbols have a leading underscore" },
1153 {"ident", &flag_no_ident, 0,
1154 "Process #ident directives"},
1155 { "peephole2", &flag_peephole2, 1,
1156 "Enables an rtl peephole pass run before sched2" },
1157 { "guess-branch-probability", &flag_guess_branch_prob, 1,
1158 "Enables guessing of branch probabilities" },
1159 {"math-errno", &flag_errno_math, 1,
1160 "Set errno after built-in math functions"},
1161 {"trapping-math", &flag_trapping_math, 1,
1162 "Floating-point operations can trap"},
1163 {"unsafe-math-optimizations", &flag_unsafe_math_optimizations, 1,
1164 "Allow math optimizations that may violate IEEE or ANSI standards"},
1165 {"bounded-pointers", &flag_bounded_pointers, 1,
1166 "Compile pointers as triples: value, base & end" },
1167 {"bounds-check", &flag_bounds_check, 1,
1168 "Generate code to check bounds before dereferencing pointers and arrays" },
1169 {"single-precision-constant", &flag_single_precision_constant, 1,
1170 "Convert floating point constant to single precision constant"},
1171 {"time-report", &time_report, 1,
1172 "Report time taken by each compiler pass at end of run"},
1173 {"mem-report", &mem_report, 1,
1174 "Report on permanent memory allocation at end of run"},
1175 { "trapv", &flag_trapv, 1,
1176 "Trap for signed overflow in addition / subtraction / multiplication." },
1179 /* Table of language-specific options. */
1181 static struct lang_opt
1183 const char *option;
1184 const char *description;
1186 documented_lang_options[] =
1188 /* In order not to overload the --help output, the convention
1189 used here is to only describe those options which are not
1190 enabled by default. */
1192 { "-ansi", "Compile just for ISO C89" },
1193 { "-fallow-single-precision",
1194 "Do not promote floats to double if using -traditional" },
1195 { "-std= ", "Determine language standard"},
1197 { "-fsigned-bitfields", "" },
1198 { "-funsigned-bitfields","Make bitfields by unsigned by default" },
1199 { "-fno-signed-bitfields", "" },
1200 { "-fno-unsigned-bitfields","" },
1201 { "-fsigned-char", "Make 'char' be signed by default"},
1202 { "-funsigned-char", "Make 'char' be unsigned by default"},
1203 { "-fno-signed-char", "" },
1204 { "-fno-unsigned-char", "" },
1206 { "-ftraditional", "" },
1207 { "-traditional", "Attempt to support traditional K&R style C"},
1208 { "-fnotraditional", "" },
1209 { "-fno-traditional", "" },
1211 { "-fasm", "" },
1212 { "-fno-asm", "Do not recognise the 'asm' keyword" },
1213 { "-fbuiltin", "" },
1214 { "-fno-builtin", "Do not recognise any built in functions" },
1215 { "-fhosted", "Assume normal C execution environment" },
1216 { "-fno-hosted", "" },
1217 { "-ffreestanding",
1218 "Assume that standard libraries & main might not exist" },
1219 { "-fno-freestanding", "" },
1220 { "-fcond-mismatch", "Allow different types as args of ? operator"},
1221 { "-fno-cond-mismatch", "" },
1222 { "-fdollars-in-identifiers", "Allow the use of $ inside identifiers" },
1223 { "-fno-dollars-in-identifiers", "" },
1224 { "-fpreprocessed", "" },
1225 { "-fno-preprocessed", "" },
1226 { "-fshort-double", "Use the same size for double as for float" },
1227 { "-fno-short-double", "" },
1228 { "-fshort-enums", "Use the smallest fitting integer to hold enums"},
1229 { "-fno-short-enums", "" },
1230 { "-fshort-wchar", "Override the underlying type for wchar_t to `unsigned short'" },
1231 { "-fno-short-wchar", "" },
1233 { "-Wall", "Enable most warning messages" },
1234 { "-Wbad-function-cast",
1235 "Warn about casting functions to incompatible types" },
1236 { "-Wno-bad-function-cast", "" },
1237 { "-Wno-missing-noreturn", "" },
1238 { "-Wmissing-format-attribute",
1239 "Warn about functions which might be candidates for format attributes" },
1240 { "-Wno-missing-format-attribute", "" },
1241 { "-Wcast-qual", "Warn about casts which discard qualifiers"},
1242 { "-Wno-cast-qual", "" },
1243 { "-Wchar-subscripts", "Warn about subscripts whose type is 'char'"},
1244 { "-Wno-char-subscripts", "" },
1245 { "-Wcomment", "Warn if nested comments are detected" },
1246 { "-Wno-comment", "" },
1247 { "-Wcomments", "Warn if nested comments are detected" },
1248 { "-Wno-comments", "" },
1249 { "-Wconversion", "Warn about possibly confusing type conversions" },
1250 { "-Wno-conversion", "" },
1251 { "-Wformat", "Warn about printf/scanf/strftime/strfmon format anomalies" },
1252 { "-Wno-format", "" },
1253 { "-Wformat-y2k", "" },
1254 { "-Wno-format-y2k",
1255 "Don't warn about strftime formats yielding 2 digit years" },
1256 { "-Wformat-extra-args", "" },
1257 { "-Wno-format-extra-args",
1258 "Don't warn about too many arguments to format functions" },
1259 { "-Wformat-nonliteral", "Warn about non-string-literal format strings" },
1260 { "-Wno-format-nonliteral", "" },
1261 { "-Wformat-security",
1262 "Warn about possible security problems with format functions" },
1263 { "-Wno-format-security", "" },
1264 { "-Wimplicit-function-declaration",
1265 "Warn about implicit function declarations" },
1266 { "-Wno-implicit-function-declaration", "" },
1267 { "-Werror-implicit-function-declaration", "" },
1268 { "-Wimplicit-int", "Warn when a declaration does not specify a type" },
1269 { "-Wno-implicit-int", "" },
1270 { "-Wimplicit", "" },
1271 { "-Wno-implicit", "" },
1272 { "-Wimport", "Warn about the use of the #import directive" },
1273 { "-Wno-import", "" },
1274 { "-Wlong-long","" },
1275 { "-Wno-long-long", "Do not warn about using 'long long' when -pedantic" },
1276 { "-Wmain", "Warn about suspicious declarations of main" },
1277 { "-Wno-main", "" },
1278 { "-Wmissing-braces",
1279 "Warn about possibly missing braces around initialisers" },
1280 { "-Wno-missing-braces", "" },
1281 { "-Wmissing-declarations",
1282 "Warn about global funcs without previous declarations"},
1283 { "-Wno-missing-declarations", "" },
1284 { "-Wmissing-prototypes", "Warn about global funcs without prototypes" },
1285 { "-Wno-missing-prototypes", "" },
1286 { "-Wmultichar", "Warn about use of multicharacter literals"},
1287 { "-Wno-multichar", "" },
1288 { "-Wnested-externs", "Warn about externs not at file scope level" },
1289 { "-Wno-nested-externs", "" },
1290 { "-Wparentheses", "Warn about possible missing parentheses" },
1291 { "-Wno-parentheses", "" },
1292 { "-Wsequence-point",
1293 "Warn about possible violations of sequence point rules" },
1294 { "-Wno-sequence-point", "" },
1295 { "-Wpointer-arith", "Warn about function pointer arithmetic" },
1296 { "-Wno-pointer-arith", "" },
1297 { "-Wredundant-decls",
1298 "Warn about multiple declarations of the same object" },
1299 { "-Wno-redundant-decls", "" },
1300 { "-Wsign-compare", "Warn about signed/unsigned comparisons" },
1301 { "-Wno-sign-compare", "" },
1302 { "-Wfloat-equal", "Warn about testing equality of floating point numbers" },
1303 { "-Wno-float-equal", "" },
1304 { "-Wunknown-pragmas", "Warn about unrecognized pragmas" },
1305 { "-Wno-unknown-pragmas", "" },
1306 { "-Wstrict-prototypes", "Warn about non-prototyped function decls" },
1307 { "-Wno-strict-prototypes", "" },
1308 { "-Wtraditional", "Warn about constructs whose meaning change in ISO C"},
1309 { "-Wno-traditional", "" },
1310 { "-Wtrigraphs", "Warn when trigraphs are encountered" },
1311 { "-Wno-trigraphs", "" },
1312 { "-Wundef", "" },
1313 { "-Wno-undef", "" },
1314 { "-Wwrite-strings", "Mark strings as 'const char *'"},
1315 { "-Wno-write-strings", "" },
1317 #define DEFINE_LANG_NAME(NAME) { NULL, NAME },
1319 #include "options.h"
1323 /* Here is a table, controlled by the tm.h file, listing each -m switch
1324 and which bits in `target_switches' it should set or clear.
1325 If VALUE is positive, it is bits to set.
1326 If VALUE is negative, -VALUE is bits to clear.
1327 (The sign bit is not used so there is no confusion.) */
1329 struct
1331 const char *name;
1332 int value;
1333 const char *description;
1335 target_switches [] = TARGET_SWITCHES;
1337 /* This table is similar, but allows the switch to have a value. */
1339 #ifdef TARGET_OPTIONS
1340 struct
1342 const char *prefix;
1343 const char **variable;
1344 const char *description;
1346 target_options [] = TARGET_OPTIONS;
1347 #endif
1349 /* Options controlling warnings. */
1351 /* Don't print warning messages. -w. */
1353 int inhibit_warnings = 0;
1355 /* Don't suppress warnings from system headers. -Wsystem-headers. */
1357 int warn_system_headers = 0;
1359 /* Print various extra warnings. -W. */
1361 int extra_warnings = 0;
1363 /* Treat warnings as errors. -Werror. */
1365 int warnings_are_errors = 0;
1367 /* Nonzero to warn about unused variables, functions et.al. */
1369 int warn_unused_function;
1370 int warn_unused_label;
1371 int warn_unused_parameter;
1372 int warn_unused_variable;
1373 int warn_unused_value;
1375 void
1376 set_Wunused (setting)
1377 int setting;
1379 warn_unused_function = setting;
1380 warn_unused_label = setting;
1381 /* Unused function parameter warnings are reported when either ``-W
1382 -Wunused'' or ``-Wunused-parameter'' is specified. Differentiate
1383 -Wunused by setting WARN_UNUSED_PARAMETER to -1. */
1384 if (!setting)
1385 warn_unused_parameter = 0;
1386 else if (!warn_unused_parameter)
1387 warn_unused_parameter = -1;
1388 warn_unused_variable = setting;
1389 warn_unused_value = setting;
1392 /* Nonzero to warn about code which is never reached. */
1394 int warn_notreached;
1396 /* Nonzero to warn about variables used before they are initialized. */
1398 int warn_uninitialized;
1400 /* Nonzero means warn about all declarations which shadow others. */
1402 int warn_shadow;
1404 /* Warn if a switch on an enum fails to have a case for every enum value. */
1406 int warn_switch;
1408 /* Nonzero means warn about function definitions that default the return type
1409 or that use a null return and have a return-type other than void. */
1411 int warn_return_type;
1413 /* Nonzero means warn about pointer casts that increase the required
1414 alignment of the target type (and might therefore lead to a crash
1415 due to a misaligned access). */
1417 int warn_cast_align;
1419 /* Nonzero means warn about any identifiers that match in the first N
1420 characters. The value N is in `id_clash_len'. */
1422 int warn_id_clash;
1423 int id_clash_len;
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, "Warn when a function is unused" },
1462 {"unused-label", &warn_unused_label, 1, "Warn when a label is unused" },
1463 {"unused-parameter", &warn_unused_parameter, 1, "Warn when a function parameter is unused" },
1464 {"unused-variable", &warn_unused_variable, 1, "Warn when a variable is unused" },
1465 {"unused-value", &warn_unused_value, 1, "Warn when an expression value is unused" },
1466 {"system-headers", &warn_system_headers, 1, "Do not suppress warnings from system headers"},
1467 {"error", &warnings_are_errors, 1, ""},
1468 {"shadow", &warn_shadow, 1, "Warn when one local variable shadows another" },
1469 {"switch", &warn_switch, 1,
1470 "Warn about enumerated switches missing a specific case" },
1471 {"aggregate-return", &warn_aggregate_return, 1,
1472 "Warn about returning structures, unions or arrays" },
1473 {"cast-align", &warn_cast_align, 1,
1474 "Warn about pointer casts which increase alignment" },
1475 {"unreachable-code", &warn_notreached, 1,
1476 "Warn about code that will never be executed" },
1477 {"uninitialized", &warn_uninitialized, 1,
1478 "Warn about unitialized automatic variables"},
1479 {"inline", &warn_inline, 1,
1480 "Warn when an inlined function cannot be inlined"},
1481 {"packed", &warn_packed, 1,
1482 "Warn when the packed attribute has no effect on struct layout"},
1483 {"padded", &warn_padded, 1,
1484 "Warn when padding is required to align struct members"},
1485 {"disabled-optimization", &warn_disabled_optimization, 1,
1486 "Warn when an optimization pass is disabled"},
1487 {"missing-noreturn", &warn_missing_noreturn, 1,
1488 "Warn about functions which might be candidates for attribute noreturn"}
1491 /* The following routines are useful in setting all the flags that
1492 -ffast-math and -fno-fast-math imply. */
1494 void
1495 set_fast_math_flags ()
1497 flag_trapping_math = 0;
1498 flag_unsafe_math_optimizations = 1;
1499 flag_errno_math = 0;
1502 void
1503 set_no_fast_math_flags ()
1505 flag_trapping_math = 1;
1506 flag_unsafe_math_optimizations = 0;
1507 flag_errno_math = 1;
1511 /* Output files for assembler code (real compiler output)
1512 and debugging dumps. */
1514 FILE *asm_out_file;
1515 FILE *aux_info_file;
1516 FILE *rtl_dump_file = NULL;
1518 /* Decode the string P as an integral parameter.
1519 If the string is indeed an integer return its numeric value else
1520 issue an Invalid Option error for the option PNAME and return DEFVAL.
1521 If PNAME is zero just return DEFVAL, do not call error. */
1524 read_integral_parameter (p, pname, defval)
1525 const char *p;
1526 const char *pname;
1527 const int defval;
1529 const char *endp = p;
1531 while (*endp)
1533 if (*endp >= '0' && *endp <= '9')
1534 endp++;
1535 else
1536 break;
1539 if (*endp != 0)
1541 if (pname != 0)
1542 error ("Invalid option `%s'", pname);
1543 return defval;
1546 return atoi (p);
1550 /* This is the default decl_printable_name function. */
1552 static const char *
1553 decl_name (decl, verbosity)
1554 tree decl;
1555 int verbosity ATTRIBUTE_UNUSED;
1557 return IDENTIFIER_POINTER (DECL_NAME (decl));
1561 /* This calls abort and is used to avoid problems when abort if a macro.
1562 It is used when we need to pass the address of abort. */
1564 void
1565 do_abort ()
1567 abort ();
1570 /* When `malloc.c' is compiled with `rcheck' defined,
1571 it calls this function to report clobberage. */
1573 void
1574 botch (s)
1575 const char *s ATTRIBUTE_UNUSED;
1577 abort ();
1580 /* Return the logarithm of X, base 2, considering X unsigned,
1581 if X is a power of 2. Otherwise, returns -1.
1583 This should be used via the `exact_log2' macro. */
1586 exact_log2_wide (x)
1587 register unsigned HOST_WIDE_INT x;
1589 register int log = 0;
1590 /* Test for 0 or a power of 2. */
1591 if (x == 0 || x != (x & -x))
1592 return -1;
1593 while ((x >>= 1) != 0)
1594 log++;
1595 return log;
1598 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
1599 If X is 0, return -1.
1601 This should be used via the floor_log2 macro. */
1604 floor_log2_wide (x)
1605 register unsigned HOST_WIDE_INT x;
1607 register int log = -1;
1608 while (x != 0)
1609 log++,
1610 x >>= 1;
1611 return log;
1614 /* Return the approximate positive square root of a number N. This is for
1615 statistical reports, not code generation. */
1616 double
1617 approx_sqrt (x)
1618 double x;
1620 double s, d;
1622 if (x < 0)
1623 abort ();
1624 if (x == 0)
1625 return 0;
1627 s = x;
1630 d = (s * s - x) / (2 * s);
1631 s -= d;
1633 while (d > .0001);
1634 return s;
1637 static int float_handler_set;
1638 int float_handled;
1639 jmp_buf float_handler;
1641 /* Signals actually come here. */
1643 static void
1644 float_signal (signo)
1645 /* If this is missing, some compilers complain. */
1646 int signo ATTRIBUTE_UNUSED;
1648 if (float_handled == 0)
1649 crash_signal (signo);
1650 #if defined (USG) || defined (hpux)
1651 /* Re-enable the signal catcher. */
1652 signal (SIGFPE, float_signal);
1653 #endif
1654 float_handled = 0;
1655 signal (SIGFPE, float_signal);
1656 longjmp (float_handler, 1);
1659 /* Specify where to longjmp to when a floating arithmetic error happens.
1660 If HANDLER is 0, it means don't handle the errors any more. */
1662 void
1663 set_float_handler (handler)
1664 jmp_buf handler;
1666 float_handled = (handler != 0);
1667 if (handler)
1668 bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
1670 if (float_handled && ! float_handler_set)
1672 signal (SIGFPE, float_signal);
1673 float_handler_set = 1;
1677 /* This is a wrapper function for code which might elicit an
1678 arithmetic exception. That code should be passed in as a function
1679 pointer FN, and one argument DATA. DATA is usually a struct which
1680 contains the real input and output for function FN. This function
1681 returns 0 (failure) if longjmp was called (i.e. an exception
1682 occured.) It returns 1 (success) otherwise. */
1685 do_float_handler (fn, data)
1686 void (*fn) PARAMS ((PTR));
1687 PTR data;
1689 jmp_buf buf;
1691 if (setjmp (buf))
1693 /* We got here via longjmp () caused by an exception in function
1694 fn (). */
1695 set_float_handler (NULL);
1696 return 0;
1699 set_float_handler (buf);
1700 (*fn)(data);
1701 set_float_handler (NULL);
1702 return 1;
1705 /* Handler for fatal signals, such as SIGSEGV. These are transformed
1706 into ICE messages, which is much more user friendly. */
1708 static void
1709 crash_signal (signo)
1710 int signo;
1712 internal_error ("Internal error: %s", strsignal (signo));
1715 /* Strip off a legitimate source ending from the input string NAME of
1716 length LEN. Rather than having to know the names used by all of
1717 our front ends, we strip off an ending of a period followed by
1718 up to five characters. (Java uses ".class".) */
1720 void
1721 strip_off_ending (name, len)
1722 char *name;
1723 int len;
1725 int i;
1726 for (i = 2; i < 6 && len > i; i++)
1728 if (name[len - i] == '.')
1730 name[len - i] = '\0';
1731 break;
1736 /* Given a file name X, return the nondirectory portion. */
1738 char *
1739 file_name_nondirectory (x)
1740 const char *x;
1742 char *tmp = (char *) strrchr (x, '/');
1743 if (DIR_SEPARATOR != '/' && ! tmp)
1744 tmp = (char *) strrchr (x, DIR_SEPARATOR);
1745 if (tmp)
1746 return (char *) (tmp + 1);
1747 else
1748 return (char *) x;
1751 /* Output a quoted string. */
1753 void
1754 output_quoted_string (asm_file, string)
1755 FILE *asm_file;
1756 const char *string;
1758 #ifdef OUTPUT_QUOTED_STRING
1759 OUTPUT_QUOTED_STRING (asm_file, string);
1760 #else
1761 char c;
1763 putc ('\"', asm_file);
1764 while ((c = *string++) != 0)
1766 if (c == '\"' || c == '\\')
1767 putc ('\\', asm_file);
1768 putc (c, asm_file);
1770 putc ('\"', asm_file);
1771 #endif
1774 /* Output a file name in the form wanted by System V. */
1776 void
1777 output_file_directive (asm_file, input_name)
1778 FILE *asm_file;
1779 const char *input_name;
1781 int len = strlen (input_name);
1782 const char *na = input_name + len;
1784 /* NA gets INPUT_NAME sans directory names. */
1785 while (na > input_name)
1787 if (IS_DIR_SEPARATOR (na[-1]))
1788 break;
1789 na--;
1792 #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
1793 ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
1794 #else
1795 #ifdef ASM_OUTPUT_SOURCE_FILENAME
1796 ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
1797 #else
1798 fprintf (asm_file, "\t.file\t");
1799 output_quoted_string (asm_file, na);
1800 fputc ('\n', asm_file);
1801 #endif
1802 #endif
1805 #ifdef ASM_IDENTIFY_LANGUAGE
1806 /* Routine to build language identifier for object file. */
1808 static void
1809 output_lang_identify (asm_out_file)
1810 FILE *asm_out_file;
1812 int len = strlen (lang_identify ()) + sizeof ("__gnu_compiled_") + 1;
1813 char *s = (char *) alloca (len);
1815 sprintf (s, "__gnu_compiled_%s", lang_identify ());
1816 ASM_OUTPUT_LABEL (asm_out_file, s);
1818 #endif
1820 /* Routine to open a dump file. Return true if the dump file is enabled. */
1822 static int
1823 open_dump_file (index, decl)
1824 enum dump_file_index index;
1825 tree decl;
1827 char *dump_name;
1828 const char *open_arg;
1829 char seq[16];
1831 if (! dump_file[index].enabled)
1832 return 0;
1834 timevar_push (TV_DUMP);
1835 if (rtl_dump_file != NULL)
1836 fclose (rtl_dump_file);
1838 sprintf (seq, ".%02d.", index);
1840 if (! dump_file[index].initialized)
1842 /* If we've not initialized the files, do so now. */
1843 if (graph_dump_format != no_graph
1844 && dump_file[index].graph_dump_p)
1846 dump_name = concat (seq, dump_file[index].extension, NULL);
1847 clean_graph_dump_file (dump_base_name, dump_name);
1848 free (dump_name);
1850 dump_file[index].initialized = 1;
1851 open_arg = "w";
1853 else
1854 open_arg = "a";
1856 dump_name = concat (dump_base_name, seq,
1857 dump_file[index].extension, NULL);
1859 rtl_dump_file = fopen (dump_name, open_arg);
1860 if (rtl_dump_file == NULL)
1861 fatal_io_error ("can't open %s", dump_name);
1863 free (dump_name);
1865 if (decl)
1866 fprintf (rtl_dump_file, "\n;; Function %s\n\n",
1867 decl_printable_name (decl, 2));
1869 timevar_pop (TV_DUMP);
1870 return 1;
1873 /* Routine to close a dump file. */
1875 static void
1876 close_dump_file (index, func, insns)
1877 enum dump_file_index index;
1878 void (*func) PARAMS ((FILE *, rtx));
1879 rtx insns;
1881 if (! rtl_dump_file)
1882 return;
1884 timevar_push (TV_DUMP);
1885 if (insns
1886 && graph_dump_format != no_graph
1887 && dump_file[index].graph_dump_p)
1889 char seq[16];
1890 char *suffix;
1892 sprintf (seq, ".%02d.", index);
1893 suffix = concat (seq, dump_file[index].extension, NULL);
1894 print_rtl_graph_with_bb (dump_base_name, suffix, insns);
1895 free (suffix);
1898 if (func && insns)
1899 func (rtl_dump_file, insns);
1901 fflush (rtl_dump_file);
1902 fclose (rtl_dump_file);
1904 rtl_dump_file = NULL;
1905 timevar_pop (TV_DUMP);
1908 /* Do any final processing required for the declarations in VEC, of
1909 which there are LEN. We write out inline functions and variables
1910 that have been deferred until this point, but which are required.
1911 Returns non-zero if anything was put out. */
1914 wrapup_global_declarations (vec, len)
1915 tree *vec;
1916 int len;
1918 tree decl;
1919 int i;
1920 int reconsider;
1921 int output_something = 0;
1923 for (i = 0; i < len; i++)
1925 decl = vec[i];
1927 /* We're not deferring this any longer. */
1928 DECL_DEFER_OUTPUT (decl) = 0;
1930 if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0
1931 && incomplete_decl_finalize_hook != 0)
1932 (*incomplete_decl_finalize_hook) (decl);
1935 /* Now emit any global variables or functions that we have been
1936 putting off. We need to loop in case one of the things emitted
1937 here references another one which comes earlier in the list. */
1940 reconsider = 0;
1941 for (i = 0; i < len; i++)
1943 decl = vec[i];
1945 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
1946 continue;
1948 /* Don't write out static consts, unless we still need them.
1950 We also keep static consts if not optimizing (for debugging),
1951 unless the user specified -fno-keep-static-consts.
1952 ??? They might be better written into the debug information.
1953 This is possible when using DWARF.
1955 A language processor that wants static constants to be always
1956 written out (even if it is not used) is responsible for
1957 calling rest_of_decl_compilation itself. E.g. the C front-end
1958 calls rest_of_decl_compilation from finish_decl.
1959 One motivation for this is that is conventional in some
1960 environments to write things like:
1961 static const char rcsid[] = "... version string ...";
1962 intending to force the string to be in the executable.
1964 A language processor that would prefer to have unneeded
1965 static constants "optimized away" would just defer writing
1966 them out until here. E.g. C++ does this, because static
1967 constants are often defined in header files.
1969 ??? A tempting alternative (for both C and C++) would be
1970 to force a constant to be written if and only if it is
1971 defined in a main file, as opposed to an include file. */
1973 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
1974 && (((! TREE_READONLY (decl) || TREE_PUBLIC (decl))
1975 && !DECL_COMDAT (decl))
1976 || (!optimize
1977 && flag_keep_static_consts
1978 && !DECL_ARTIFICIAL (decl))
1979 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
1981 reconsider = 1;
1982 rest_of_decl_compilation (decl, NULL_PTR, 1, 1);
1985 if (TREE_CODE (decl) == FUNCTION_DECL
1986 && DECL_INITIAL (decl) != 0
1987 && DECL_SAVED_INSNS (decl) != 0
1988 && (flag_keep_inline_functions
1989 || (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
1990 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
1992 reconsider = 1;
1993 output_inline_function (decl);
1997 if (reconsider)
1998 output_something = 1;
2000 while (reconsider);
2002 return output_something;
2005 /* Issue appropriate warnings for the global declarations in VEC (of
2006 which there are LEN). Output debugging information for them. */
2008 void
2009 check_global_declarations (vec, len)
2010 tree *vec;
2011 int len;
2013 tree decl;
2014 int i;
2016 for (i = 0; i < len; i++)
2018 decl = vec[i];
2020 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2021 && ! TREE_ASM_WRITTEN (decl))
2022 /* Cancel the RTL for this decl so that, if debugging info
2023 output for global variables is still to come,
2024 this one will be omitted. */
2025 DECL_RTL (decl) = NULL;
2027 /* Warn about any function
2028 declared static but not defined.
2029 We don't warn about variables,
2030 because many programs have static variables
2031 that exist only to get some text into the object file. */
2032 if (TREE_CODE (decl) == FUNCTION_DECL
2033 && (warn_unused_function
2034 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2035 && DECL_INITIAL (decl) == 0
2036 && DECL_EXTERNAL (decl)
2037 && ! DECL_ARTIFICIAL (decl)
2038 && ! TREE_PUBLIC (decl))
2040 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2041 pedwarn_with_decl (decl,
2042 "`%s' used but never defined");
2043 else
2044 warning_with_decl (decl,
2045 "`%s' declared `static' but never defined");
2046 /* This symbol is effectively an "extern" declaration now. */
2047 TREE_PUBLIC (decl) = 1;
2048 assemble_external (decl);
2051 /* Warn about static fns or vars defined but not used,
2052 but not about inline functions or static consts
2053 since defining those in header files is normal practice. */
2054 if (((warn_unused_function
2055 && TREE_CODE (decl) == FUNCTION_DECL && ! DECL_INLINE (decl))
2056 || (warn_unused_variable
2057 && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
2058 && ! DECL_IN_SYSTEM_HEADER (decl)
2059 && ! DECL_EXTERNAL (decl)
2060 && ! TREE_PUBLIC (decl)
2061 && ! TREE_USED (decl)
2062 && (TREE_CODE (decl) == FUNCTION_DECL || ! DECL_REGISTER (decl))
2063 /* The TREE_USED bit for file-scope decls
2064 is kept in the identifier, to handle multiple
2065 external decls in different scopes. */
2066 && ! TREE_USED (DECL_NAME (decl)))
2067 warning_with_decl (decl, "`%s' defined but not used");
2069 timevar_push (TV_SYMOUT);
2070 #ifdef SDB_DEBUGGING_INFO
2071 /* The COFF linker can move initialized global vars to the end.
2072 And that can screw up the symbol ordering.
2073 By putting the symbols in that order to begin with,
2074 we avoid a problem. mcsun!unido!fauern!tumuc!pes@uunet.uu.net. */
2075 if (write_symbols == SDB_DEBUG && TREE_CODE (decl) == VAR_DECL
2076 && TREE_PUBLIC (decl) && DECL_INITIAL (decl)
2077 && ! DECL_EXTERNAL (decl)
2078 && DECL_RTL (decl) != 0)
2079 sdbout_symbol (decl, 0);
2081 /* Output COFF information for non-global
2082 file-scope initialized variables. */
2083 if (write_symbols == SDB_DEBUG
2084 && TREE_CODE (decl) == VAR_DECL
2085 && DECL_INITIAL (decl)
2086 && ! DECL_EXTERNAL (decl)
2087 && DECL_RTL (decl) != 0
2088 && GET_CODE (DECL_RTL (decl)) == MEM)
2089 sdbout_toplevel_data (decl);
2090 #endif /* SDB_DEBUGGING_INFO */
2091 #ifdef DWARF_DEBUGGING_INFO
2092 /* Output DWARF information for file-scope tentative data object
2093 declarations, file-scope (extern) function declarations (which
2094 had no corresponding body) and file-scope tagged type declarations
2095 and definitions which have not yet been forced out. */
2097 if (write_symbols == DWARF_DEBUG
2098 && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
2099 dwarfout_file_scope_decl (decl, 1);
2100 #endif
2101 #ifdef DWARF2_DEBUGGING_INFO
2102 /* Output DWARF2 information for file-scope tentative data object
2103 declarations, file-scope (extern) function declarations (which
2104 had no corresponding body) and file-scope tagged type declarations
2105 and definitions which have not yet been forced out. */
2107 if (write_symbols == DWARF2_DEBUG
2108 && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
2109 dwarf2out_decl (decl);
2110 #endif
2111 timevar_pop (TV_SYMOUT);
2115 /* Save the current INPUT_FILENAME and LINENO on the top entry in the
2116 INPUT_FILE_STACK. Push a new entry for FILE and LINE, and set the
2117 INPUT_FILENAME and LINENO accordingly. */
2119 void
2120 push_srcloc (file, line)
2121 const char *file;
2122 int line;
2124 struct file_stack *fs;
2126 if (input_file_stack)
2128 input_file_stack->name = input_filename;
2129 input_file_stack->line = lineno;
2132 fs = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2133 fs->name = input_filename = file;
2134 fs->line = lineno = line;
2135 fs->indent_level = 0;
2136 fs->next = input_file_stack;
2137 input_file_stack = fs;
2138 input_file_stack_tick++;
2141 /* Pop the top entry off the stack of presently open source files.
2142 Restore the INPUT_FILENAME and LINENO from the new topmost entry on
2143 the stack. */
2145 void
2146 pop_srcloc ()
2148 struct file_stack *fs;
2150 fs = input_file_stack;
2151 input_file_stack = fs->next;
2152 free (fs);
2153 input_file_stack_tick++;
2154 /* The initial source file is never popped. */
2155 if (!input_file_stack)
2156 abort ();
2157 input_filename = input_file_stack->name;
2158 lineno = input_file_stack->line;
2161 /* Compile an entire file of output from cpp, named NAME.
2162 Write a file of assembly output and various debugging dumps. */
2164 static void
2165 compile_file (name)
2166 const char *name;
2168 tree globals;
2170 int name_specified = name != 0;
2172 if (dump_base_name == 0)
2173 dump_base_name = name ? name : "gccdump";
2175 if (! quiet_flag)
2176 time_report = 1;
2178 /* Start timing total execution time. */
2180 init_timevar ();
2181 timevar_start (TV_TOTAL);
2183 /* Initialize data in various passes. */
2185 init_obstacks ();
2186 name = init_parse (name);
2187 init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
2188 || debug_info_level == DINFO_LEVEL_VERBOSE
2189 || flag_test_coverage
2190 || warn_notreached);
2191 init_regs ();
2192 init_alias_once ();
2193 init_decl_processing ();
2194 init_optabs ();
2195 init_stmt ();
2196 init_eh ();
2197 init_loop ();
2198 init_reload ();
2199 init_function_once ();
2200 init_stor_layout_once ();
2201 init_varasm_once ();
2202 init_EXPR_INSN_LIST_cache ();
2204 /* The following initialization functions need to generate rtl, so
2205 provide a dummy function context for them. */
2206 init_dummy_function_start ();
2207 init_expmed ();
2208 init_expr_once ();
2209 if (flag_caller_saves)
2210 init_caller_save ();
2211 expand_dummy_function_end ();
2213 /* If auxiliary info generation is desired, open the output file.
2214 This goes in the same directory as the source file--unlike
2215 all the other output files. */
2216 if (flag_gen_aux_info)
2218 aux_info_file = fopen (aux_info_file_name, "w");
2219 if (aux_info_file == 0)
2220 fatal_io_error ("can't open %s", aux_info_file_name);
2223 /* Open assembler code output file. Do this even if -fsyntax-only is on,
2224 because then the driver will have provided the name of a temporary
2225 file or bit bucket for us. */
2227 if (! name_specified && asm_file_name == 0)
2228 asm_out_file = stdout;
2229 else
2231 if (asm_file_name == 0)
2233 int len = strlen (dump_base_name);
2234 char *dumpname = (char *) xmalloc (len + 6);
2235 memcpy (dumpname, dump_base_name, len + 1);
2236 strip_off_ending (dumpname, len);
2237 strcat (dumpname, ".s");
2238 asm_file_name = dumpname;
2240 if (!strcmp (asm_file_name, "-"))
2241 asm_out_file = stdout;
2242 else
2243 asm_out_file = fopen (asm_file_name, "w");
2244 if (asm_out_file == 0)
2245 fatal_io_error ("can't open %s for writing", asm_file_name);
2248 #ifdef IO_BUFFER_SIZE
2249 setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
2250 _IOFBF, IO_BUFFER_SIZE);
2251 #endif
2253 if (name != 0)
2254 name = ggc_strdup (name);
2256 input_filename = name;
2258 /* Put an entry on the input file stack for the main input file. */
2259 push_srcloc (input_filename, 0);
2261 /* Perform language-specific initialization.
2262 This may set main_input_filename. */
2263 if (lang_hooks.init)
2264 (*lang_hooks.init) ();
2266 /* If the input doesn't start with a #line, use the input name
2267 as the official input file name. */
2268 if (main_input_filename == 0)
2269 main_input_filename = name;
2271 if (flag_syntax_only)
2273 write_symbols = NO_DEBUG;
2274 profile_flag = 0;
2275 profile_block_flag = 0;
2277 else
2279 ASM_FILE_START (asm_out_file);
2281 #ifdef ASM_COMMENT_START
2282 if (flag_verbose_asm)
2284 /* Print the list of options in effect. */
2285 print_version (asm_out_file, ASM_COMMENT_START);
2286 print_switch_values (asm_out_file, 0, MAX_LINE,
2287 ASM_COMMENT_START, " ", "\n");
2288 /* Add a blank line here so it appears in assembler output but not
2289 screen output. */
2290 fprintf (asm_out_file, "\n");
2292 #endif
2294 /* Output something to inform GDB that this compilation was by GCC. */
2295 #ifndef ASM_IDENTIFY_GCC
2296 fprintf (asm_out_file, "gcc2_compiled.:\n");
2297 #else
2298 ASM_IDENTIFY_GCC (asm_out_file);
2299 #endif
2301 /* Output something to identify which front-end produced this file. */
2302 #ifdef ASM_IDENTIFY_LANGUAGE
2303 ASM_IDENTIFY_LANGUAGE (asm_out_file);
2304 #endif
2305 } /* ! flag_syntax_only */
2307 #ifndef ASM_OUTPUT_SECTION_NAME
2308 if (flag_function_sections)
2310 warning ("-ffunction-sections not supported for this target.");
2311 flag_function_sections = 0;
2313 if (flag_data_sections)
2315 warning ("-fdata-sections not supported for this target.");
2316 flag_data_sections = 0;
2318 #endif
2320 if (flag_function_sections
2321 && (profile_flag || profile_block_flag))
2323 warning ("-ffunction-sections disabled; it makes profiling impossible.");
2324 flag_function_sections = 0;
2327 #ifndef OBJECT_FORMAT_ELF
2328 if (flag_function_sections && write_symbols != NO_DEBUG)
2329 warning ("-ffunction-sections may affect debugging on some targets.");
2330 #endif
2332 /* ??? Note: There used to be a conditional here
2333 to call assemble_zeros without fail if DBX_DEBUGGING_INFO is defined.
2334 This was to guarantee separation between gcc_compiled. and
2335 the first function, for the sake of dbx on Suns.
2336 However, having the extra zero here confused the Emacs
2337 code for unexec, and might confuse other programs too.
2338 Therefore, I took out that change.
2339 In future versions we should find another way to solve
2340 that dbx problem. -- rms, 23 May 93. */
2342 /* Don't let the first function fall at the same address
2343 as gcc_compiled., if profiling. */
2344 if (profile_flag || profile_block_flag)
2346 /* It's best if we can write a nop here since some
2347 assemblers don't tolerate zeros in the text section. */
2348 output_asm_insn (get_insn_template (CODE_FOR_nop, NULL), NULL_PTR);
2351 /* If dbx symbol table desired, initialize writing it
2352 and output the predefined types. */
2353 timevar_push (TV_SYMOUT);
2354 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2355 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2356 dbxout_init (asm_out_file, main_input_filename, getdecls ());
2357 #endif
2358 #ifdef SDB_DEBUGGING_INFO
2359 if (write_symbols == SDB_DEBUG)
2360 sdbout_init (asm_out_file, main_input_filename, getdecls ());
2361 #endif
2362 #ifdef DWARF_DEBUGGING_INFO
2363 if (write_symbols == DWARF_DEBUG)
2364 dwarfout_init (asm_out_file, main_input_filename);
2365 #endif
2366 #ifdef DWARF2_UNWIND_INFO
2367 if (dwarf2out_do_frame ())
2368 dwarf2out_frame_init ();
2369 #endif
2370 #ifdef DWARF2_DEBUGGING_INFO
2371 if (write_symbols == DWARF2_DEBUG)
2372 dwarf2out_init (asm_out_file, main_input_filename);
2373 #endif
2374 timevar_pop (TV_SYMOUT);
2376 /* Initialize yet another pass. */
2378 init_final (main_input_filename);
2379 init_branch_prob (dump_base_name);
2381 timevar_push (TV_PARSE);
2383 /* Call the parser, which parses the entire file
2384 (calling rest_of_compilation for each function). */
2386 if (yyparse () != 0)
2388 if (errorcount == 0)
2389 fnotice (stderr, "Errors detected in input file (your bison.simple is out of date)\n");
2391 /* In case there were missing closebraces,
2392 get us back to the global binding level. */
2393 while (! global_bindings_p ())
2394 poplevel (0, 0, 0);
2397 /* Compilation is now finished except for writing
2398 what's left of the symbol table output. */
2400 timevar_pop (TV_PARSE);
2402 if (flag_syntax_only)
2403 goto finish_syntax;
2405 globals = getdecls ();
2407 /* Really define vars that have had only a tentative definition.
2408 Really output inline functions that must actually be callable
2409 and have not been output so far. */
2412 int len = list_length (globals);
2413 tree *vec = (tree *) xmalloc (sizeof (tree) * len);
2414 int i;
2415 tree decl;
2417 /* Process the decls in reverse order--earliest first.
2418 Put them into VEC from back to front, then take out from front. */
2420 for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
2421 vec[len - i - 1] = decl;
2423 wrapup_global_declarations (vec, len);
2425 /* This must occur after the loop to output deferred functions. Else
2426 the profiler initializer would not be emitted if all the functions
2427 in this compilation unit were deferred.
2429 output_func_start_profiler can not cause any additional functions or
2430 data to need to be output, so it need not be in the deferred function
2431 loop above. */
2432 output_func_start_profiler ();
2434 /* Now that all possible functions have been output, we can dump
2435 the exception table. */
2437 #ifndef IA64_UNWIND_INFO
2438 output_exception_table ();
2439 #endif
2440 free_exception_table ();
2442 check_global_declarations (vec, len);
2444 /* Clean up. */
2445 free (vec);
2448 /* Write out any pending weak symbol declarations. */
2450 weak_finish ();
2452 /* Do dbx symbols. */
2453 timevar_push (TV_SYMOUT);
2454 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2455 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2456 dbxout_finish (asm_out_file, main_input_filename);
2457 #endif
2459 #ifdef DWARF_DEBUGGING_INFO
2460 if (write_symbols == DWARF_DEBUG)
2461 dwarfout_finish ();
2462 #endif
2464 #ifdef DWARF2_UNWIND_INFO
2465 if (dwarf2out_do_frame ())
2466 dwarf2out_frame_finish ();
2467 #endif
2469 #ifdef DWARF2_DEBUGGING_INFO
2470 if (write_symbols == DWARF2_DEBUG)
2471 dwarf2out_finish ();
2472 #endif
2473 timevar_pop (TV_SYMOUT);
2475 /* Output some stuff at end of file if nec. */
2477 end_final (dump_base_name);
2479 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
2481 timevar_push (TV_DUMP);
2482 open_dump_file (DFI_bp, NULL);
2484 end_branch_prob ();
2486 close_dump_file (DFI_bp, NULL, NULL_RTX);
2487 timevar_pop (TV_DUMP);
2490 #ifdef ASM_FILE_END
2491 ASM_FILE_END (asm_out_file);
2492 #endif
2494 /* Language-specific end of compilation actions. */
2495 finish_syntax:
2496 if (lang_hooks.finish)
2497 (*lang_hooks.finish) ();
2499 /* Close the dump files. */
2501 if (flag_gen_aux_info)
2503 fclose (aux_info_file);
2504 if (errorcount)
2505 unlink (aux_info_file_name);
2508 if (optimize > 0 && open_dump_file (DFI_combine, NULL))
2510 timevar_push (TV_DUMP);
2511 dump_combine_total_stats (rtl_dump_file);
2512 close_dump_file (DFI_combine, NULL, NULL_RTX);
2513 timevar_pop (TV_DUMP);
2516 /* Close non-debugging input and output files. Take special care to note
2517 whether fclose returns an error, since the pages might still be on the
2518 buffer chain while the file is open. */
2520 finish_parse ();
2522 if (ferror (asm_out_file) != 0)
2523 fatal_io_error ("error writing to %s", asm_file_name);
2524 if (fclose (asm_out_file) != 0)
2525 fatal_io_error ("error closing %s", asm_file_name);
2527 /* Do whatever is necessary to finish printing the graphs. */
2528 if (graph_dump_format != no_graph)
2530 int i;
2532 for (i = 0; i < (int) DFI_MAX; ++i)
2533 if (dump_file[i].initialized && dump_file[i].graph_dump_p)
2535 char seq[16];
2536 char *suffix;
2538 sprintf (seq, ".%02d.", i);
2539 suffix = concat (seq, dump_file[i].extension, NULL);
2540 finish_graph_dump_file (dump_base_name, suffix);
2541 free (suffix);
2545 if (mem_report)
2547 ggc_print_statistics ();
2548 stringpool_statistics ();
2551 /* Free up memory for the benefit of leak detectors. */
2552 free_reg_info ();
2554 /* Stop timing total execution time. */
2555 timevar_stop (TV_TOTAL);
2557 /* Print the times. */
2559 timevar_print (stderr);
2562 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
2563 and TYPE_DECL nodes.
2565 This does nothing for local (non-static) variables, unless the
2566 variable is a register variable with an ASMSPEC. In that case, or
2567 if the variable is not an automatice, it sets up the RTL and
2568 outputs any assembler code (label definition, storage allocation
2569 and initialization).
2571 DECL is the declaration. If ASMSPEC is nonzero, it specifies
2572 the assembler symbol name to be used. TOP_LEVEL is nonzero
2573 if this declaration is not within a function. */
2575 void
2576 rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2577 tree decl;
2578 const char *asmspec;
2579 int top_level;
2580 int at_end;
2582 /* Declarations of variables, and of functions defined elsewhere. */
2584 /* The most obvious approach, to put an #ifndef around where
2585 this macro is used, doesn't work since it's inside a macro call. */
2586 #ifndef ASM_FINISH_DECLARE_OBJECT
2587 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP, END)
2588 #endif
2590 /* Forward declarations for nested functions are not "external",
2591 but we need to treat them as if they were. */
2592 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
2593 || TREE_CODE (decl) == FUNCTION_DECL)
2595 timevar_push (TV_VARCONST);
2596 make_decl_rtl (decl, asmspec);
2597 /* Don't output anything
2598 when a tentative file-scope definition is seen.
2599 But at end of compilation, do output code for them. */
2600 if (at_end || !DECL_DEFER_OUTPUT (decl))
2601 assemble_variable (decl, top_level, at_end, 0);
2602 if (decl == last_assemble_variable_decl)
2604 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2605 top_level, at_end);
2607 timevar_pop (TV_VARCONST);
2609 else if (DECL_REGISTER (decl) && asmspec != 0)
2611 if (decode_reg_name (asmspec) >= 0)
2613 DECL_RTL (decl) = 0;
2614 make_decl_rtl (decl, asmspec);
2616 else
2618 error ("invalid register name `%s' for register variable", asmspec);
2619 DECL_REGISTER (decl) = 0;
2620 make_decl_rtl (decl, NULL);
2623 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2624 else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2625 && TREE_CODE (decl) == TYPE_DECL)
2627 timevar_push (TV_SYMOUT);
2628 dbxout_symbol (decl, 0);
2629 timevar_pop (TV_SYMOUT);
2631 #endif
2632 #ifdef SDB_DEBUGGING_INFO
2633 else if (write_symbols == SDB_DEBUG && top_level
2634 && TREE_CODE (decl) == TYPE_DECL)
2636 timevar_push (TV_SYMOUT);
2637 sdbout_symbol (decl, 0);
2638 timevar_pop (TV_SYMOUT);
2640 #endif
2643 /* Called after finishing a record, union or enumeral type. */
2645 void
2646 rest_of_type_compilation (type, toplev)
2647 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO) || defined (SDB_DEBUGGING_INFO)
2648 tree type;
2649 int toplev;
2650 #else
2651 tree type ATTRIBUTE_UNUSED;
2652 int toplev ATTRIBUTE_UNUSED;
2653 #endif
2655 timevar_push (TV_SYMOUT);
2656 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2657 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2658 dbxout_symbol (TYPE_STUB_DECL (type), !toplev);
2659 #endif
2660 #ifdef SDB_DEBUGGING_INFO
2661 if (write_symbols == SDB_DEBUG)
2662 sdbout_symbol (TYPE_STUB_DECL (type), !toplev);
2663 #endif
2664 #ifdef DWARF2_DEBUGGING_INFO
2665 if (write_symbols == DWARF2_DEBUG && toplev)
2666 dwarf2out_decl (TYPE_STUB_DECL (type));
2667 #endif
2668 timevar_pop (TV_SYMOUT);
2671 /* DECL is an inline function, whose body is present, but which is not
2672 being output at this point. (We're putting that off until we need
2673 to do it.) If there are any actions that need to take place,
2674 including the emission of debugging information for the function,
2675 this is where they should go. This function may be called by
2676 language-dependent code for front-ends that do not even generate
2677 RTL for functions that don't need to be put out. */
2679 void
2680 note_deferral_of_defined_inline_function (decl)
2681 tree decl ATTRIBUTE_UNUSED;
2683 #ifdef DWARF_DEBUGGING_INFO
2684 /* Generate the DWARF info for the "abstract" instance of a function
2685 which we may later generate inlined and/or out-of-line instances
2686 of. */
2687 if (write_symbols == DWARF_DEBUG
2688 && (DECL_INLINE (decl) || DECL_ABSTRACT (decl))
2689 && ! DECL_ABSTRACT_ORIGIN (decl))
2691 /* The front-end may not have set CURRENT_FUNCTION_DECL, but the
2692 DWARF code expects it to be set in this case. Intuitively,
2693 DECL is the function we just finished defining, so setting
2694 CURRENT_FUNCTION_DECL is sensible. */
2695 tree saved_cfd = current_function_decl;
2696 int was_abstract = DECL_ABSTRACT (decl);
2697 current_function_decl = decl;
2699 /* Let the DWARF code do its work. */
2700 set_decl_abstract_flags (decl, 1);
2701 dwarfout_file_scope_decl (decl, 0);
2702 if (! was_abstract)
2703 set_decl_abstract_flags (decl, 0);
2705 /* Reset CURRENT_FUNCTION_DECL. */
2706 current_function_decl = saved_cfd;
2708 #endif
2711 /* FNDECL is an inline function which is about to be emitted out of line.
2712 Do any preparation, such as emitting abstract debug info for the inline
2713 before it gets mangled by optimization. */
2715 void
2716 note_outlining_of_inline_function (fndecl)
2717 tree fndecl ATTRIBUTE_UNUSED;
2719 #ifdef DWARF2_DEBUGGING_INFO
2720 /* The DWARF 2 backend tries to reduce debugging bloat by not emitting
2721 the abstract description of inline functions until something tries to
2722 reference them. Force it out now, before optimizations mangle the
2723 block tree. */
2724 if (write_symbols == DWARF2_DEBUG)
2725 dwarf2out_abstract_function (fndecl);
2726 #endif
2729 /* This is called from finish_function (within yyparse)
2730 after each top-level definition is parsed.
2731 It is supposed to compile that function or variable
2732 and output the assembler code for it.
2733 After we return, the tree storage is freed. */
2735 void
2736 rest_of_compilation (decl)
2737 tree decl;
2739 register rtx insns;
2740 int tem;
2741 int failure = 0;
2742 int rebuild_label_notes_after_reload;
2743 int register_life_up_to_date;
2745 timevar_push (TV_REST_OF_COMPILATION);
2747 /* Now that we're out of the frontend, we shouldn't have any more
2748 CONCATs anywhere. */
2749 generating_concat_p = 0;
2751 /* When processing delayed functions, prepare_function_start() won't
2752 have been run to re-initialize it. */
2753 cse_not_expected = ! optimize;
2755 /* First, make sure that NOTE_BLOCK is set correctly for each
2756 NOTE_INSN_BLOCK_BEG/NOTE_INSN_BLOCK_END note. */
2757 if (!cfun->x_whole_function_mode_p)
2758 identify_blocks ();
2760 /* Then remove any notes we don't need. That will make iterating
2761 over the instruction sequence faster, and allow the garbage
2762 collector to reclaim the memory used by the notes. */
2763 remove_unnecessary_notes ();
2765 /* In function-at-a-time mode, we do not attempt to keep the BLOCK
2766 tree in sensible shape. So, we just recalculate it here. */
2767 if (cfun->x_whole_function_mode_p)
2768 reorder_blocks ();
2770 init_flow ();
2772 /* If we are reconsidering an inline function
2773 at the end of compilation, skip the stuff for making it inline. */
2775 if (DECL_SAVED_INSNS (decl) == 0)
2777 int inlinable = 0;
2778 tree parent;
2779 const char *lose;
2781 /* If this is nested inside an inlined external function, pretend
2782 it was only declared. Since we cannot inline such functions,
2783 generating code for this one is not only not necessary but will
2784 confuse some debugging output writers. */
2785 for (parent = DECL_CONTEXT (current_function_decl);
2786 parent != NULL_TREE;
2787 parent = get_containing_scope (parent))
2788 if (TREE_CODE (parent) == FUNCTION_DECL
2789 && DECL_INLINE (parent) && DECL_EXTERNAL (parent))
2791 DECL_INITIAL (decl) = 0;
2792 goto exit_rest_of_compilation;
2795 /* If requested, consider whether to make this function inline. */
2796 if (DECL_INLINE (decl) || flag_inline_functions)
2798 timevar_push (TV_INTEGRATION);
2799 lose = function_cannot_inline_p (decl);
2800 timevar_pop (TV_INTEGRATION);
2801 if (lose || ! optimize)
2803 if (warn_inline && DECL_INLINE (decl))
2804 warning_with_decl (decl, lose);
2805 DECL_ABSTRACT_ORIGIN (decl) = 0;
2806 /* Don't really compile an extern inline function.
2807 If we can't make it inline, pretend
2808 it was only declared. */
2809 if (DECL_EXTERNAL (decl))
2811 DECL_INITIAL (decl) = 0;
2812 goto exit_rest_of_compilation;
2815 else
2816 /* ??? Note that this has the effect of making it look
2817 like "inline" was specified for a function if we choose
2818 to inline it. This isn't quite right, but it's
2819 probably not worth the trouble to fix. */
2820 inlinable = DECL_INLINE (decl) = 1;
2823 insns = get_insns ();
2825 /* Dump the rtl code if we are dumping rtl. */
2827 if (open_dump_file (DFI_rtl, decl))
2829 if (DECL_SAVED_INSNS (decl))
2830 fprintf (rtl_dump_file, ";; (integrable)\n\n");
2831 close_dump_file (DFI_rtl, print_rtl, insns);
2834 /* If function is inline, and we don't yet know whether to
2835 compile it by itself, defer decision till end of compilation.
2836 finish_compilation will call rest_of_compilation again
2837 for those functions that need to be output. Also defer those
2838 functions that we are supposed to defer. */
2840 if (inlinable
2841 || (DECL_INLINE (decl)
2842 && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
2843 && ! flag_keep_inline_functions)
2844 || DECL_EXTERNAL (decl))))
2845 DECL_DEFER_OUTPUT (decl) = 1;
2847 if (DECL_INLINE (decl))
2848 /* DWARF wants seperate debugging info for abstract and
2849 concrete instances of all inline functions, including those
2850 declared inline but not inlined, and those inlined even
2851 though they weren't declared inline. Conveniently, that's
2852 what DECL_INLINE means at this point. */
2853 note_deferral_of_defined_inline_function (decl);
2855 if (DECL_DEFER_OUTPUT (decl))
2857 /* If -Wreturn-type, we have to do a bit of compilation. We just
2858 want to call jump_optimize to figure out whether or not we can
2859 fall off the end of the function; we do the minimum amount of
2860 work necessary to make that safe. And, we set optimize to zero
2861 to keep jump_optimize from working too hard. */
2862 if (warn_return_type)
2864 int saved_optimize = optimize;
2866 optimize = 0;
2867 find_exception_handler_labels ();
2868 jump_optimize (insns, !JUMP_CROSS_JUMP, !JUMP_NOOP_MOVES,
2869 !JUMP_AFTER_REGSCAN);
2870 optimize = saved_optimize;
2873 current_function_nothrow = nothrow_function_p ();
2874 if (current_function_nothrow)
2875 /* Now we know that this can't throw; set the flag for the benefit
2876 of other functions later in this translation unit. */
2877 TREE_NOTHROW (current_function_decl) = 1;
2879 timevar_push (TV_INTEGRATION);
2880 save_for_inline (decl);
2881 timevar_pop (TV_INTEGRATION);
2882 DECL_SAVED_INSNS (decl)->inlinable = inlinable;
2883 goto exit_rest_of_compilation;
2886 /* If specified extern inline but we aren't inlining it, we are
2887 done. This goes for anything that gets here with DECL_EXTERNAL
2888 set, not just things with DECL_INLINE. */
2889 if (DECL_EXTERNAL (decl))
2890 goto exit_rest_of_compilation;
2893 ggc_collect ();
2895 /* Initialize some variables used by the optimizers. */
2896 init_function_for_compilation ();
2898 if (! DECL_DEFER_OUTPUT (decl))
2899 TREE_ASM_WRITTEN (decl) = 1;
2901 /* Now that integrate will no longer see our rtl, we need not
2902 distinguish between the return value of this function and the
2903 return value of called functions. Also, we can remove all SETs
2904 of subregs of hard registers; they are only here because of
2905 integrate.*/
2906 rtx_equal_function_value_matters = 0;
2907 purge_hard_subreg_sets (get_insns ());
2909 /* Don't return yet if -Wreturn-type; we need to do jump_optimize. */
2910 if ((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
2911 goto exit_rest_of_compilation;
2913 /* Emit code to get eh context, if needed. */
2914 emit_eh_context ();
2916 /* We may have potential sibling or tail recursion sites. Select one
2917 (of possibly multiple) methods of performing the call. */
2918 if (flag_optimize_sibling_calls)
2920 timevar_push (TV_JUMP);
2921 open_dump_file (DFI_sibling, decl);
2923 optimize_sibling_and_tail_recursive_calls ();
2925 close_dump_file (DFI_sibling, print_rtl, get_insns ());
2926 timevar_pop (TV_JUMP);
2929 #ifdef FINALIZE_PIC
2930 /* If we are doing position-independent code generation, now
2931 is the time to output special prologues and epilogues.
2932 We do not want to do this earlier, because it just clutters
2933 up inline functions with meaningless insns. */
2934 if (flag_pic)
2935 FINALIZE_PIC;
2936 #endif
2938 insns = get_insns ();
2940 /* Copy any shared structure that should not be shared. */
2941 unshare_all_rtl (current_function_decl, insns);
2943 #ifdef SETJMP_VIA_SAVE_AREA
2944 /* This must be performed before virutal register instantiation. */
2945 if (current_function_calls_alloca)
2946 optimize_save_area_alloca (insns);
2947 #endif
2949 /* Instantiate all virtual registers. */
2950 instantiate_virtual_regs (current_function_decl, insns);
2952 /* Find all the EH handlers. */
2953 find_exception_handler_labels ();
2955 open_dump_file (DFI_jump, decl);
2957 /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
2958 are initialized and to compute whether control can drop off the end
2959 of the function. */
2961 timevar_push (TV_JUMP);
2962 /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB. Do this
2963 before jump optimization switches branch directions. */
2964 expected_value_to_br_prob ();
2966 reg_scan (insns, max_reg_num (), 0);
2967 jump_optimize (insns, !JUMP_CROSS_JUMP, !JUMP_NOOP_MOVES,
2968 JUMP_AFTER_REGSCAN);
2970 timevar_pop (TV_JUMP);
2972 /* Now is when we stop if -fsyntax-only and -Wreturn-type. */
2973 if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
2975 close_dump_file (DFI_jump, print_rtl, insns);
2976 goto exit_rest_of_compilation;
2979 timevar_push (TV_JUMP);
2981 if (optimize > 0)
2983 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2984 cleanup_cfg (insns);
2986 /* ??? Run if-conversion before delete_null_pointer_checks,
2987 since the later does not preserve the CFG. This should
2988 be changed -- no since converting if's that are going to
2989 be deleted. */
2990 timevar_push (TV_IFCVT);
2991 if_convert (0);
2992 timevar_pop (TV_IFCVT);
2994 /* Try to identify useless null pointer tests and delete them. */
2995 if (flag_delete_null_pointer_checks)
2996 delete_null_pointer_checks (insns);
2999 /* Jump optimization, and the removal of NULL pointer checks, may
3000 have reduced the number of instructions substantially. CSE, and
3001 future passes, allocate arrays whose dimensions involve the
3002 maximum instruction UID, so if we can reduce the maximum UID
3003 we'll save big on memory. */
3004 renumber_insns (rtl_dump_file);
3005 timevar_pop (TV_JUMP);
3007 close_dump_file (DFI_jump, print_rtl, insns);
3009 ggc_collect ();
3011 /* Perform common subexpression elimination.
3012 Nonzero value from `cse_main' means that jumps were simplified
3013 and some code may now be unreachable, so do
3014 jump optimization again. */
3016 if (optimize > 0)
3018 open_dump_file (DFI_cse, decl);
3019 timevar_push (TV_CSE);
3021 reg_scan (insns, max_reg_num (), 1);
3023 if (flag_thread_jumps)
3025 timevar_push (TV_JUMP);
3026 thread_jumps (insns, max_reg_num (), 1);
3027 timevar_pop (TV_JUMP);
3030 tem = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
3032 /* If we are not running more CSE passes, then we are no longer
3033 expecting CSE to be run. But always rerun it in a cheap mode. */
3034 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
3036 if (tem || optimize > 1)
3038 timevar_push (TV_JUMP);
3039 jump_optimize (insns, !JUMP_CROSS_JUMP, !JUMP_NOOP_MOVES,
3040 !JUMP_AFTER_REGSCAN);
3041 timevar_pop (TV_JUMP);
3044 /* Run this after jump optmizations remove all the unreachable code
3045 so that unreachable code will not keep values live. */
3046 delete_trivially_dead_insns (insns, max_reg_num ());
3048 /* Try to identify useless null pointer tests and delete them. */
3049 if (flag_delete_null_pointer_checks)
3051 timevar_push (TV_JUMP);
3052 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
3054 cleanup_cfg (insns);
3056 delete_null_pointer_checks (insns);
3057 timevar_pop (TV_JUMP);
3060 /* The second pass of jump optimization is likely to have
3061 removed a bunch more instructions. */
3062 renumber_insns (rtl_dump_file);
3064 timevar_pop (TV_CSE);
3065 close_dump_file (DFI_cse, print_rtl, insns);
3068 open_dump_file (DFI_addressof, decl);
3070 purge_addressof (insns);
3071 reg_scan (insns, max_reg_num (), 1);
3073 close_dump_file (DFI_addressof, print_rtl, insns);
3075 ggc_collect ();
3077 if (optimize > 0 && flag_ssa)
3079 /* Convert to SSA form. */
3081 timevar_push (TV_TO_SSA);
3082 open_dump_file (DFI_ssa, decl);
3084 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
3085 cleanup_cfg (insns);
3086 convert_to_ssa ();
3088 close_dump_file (DFI_ssa, print_rtl_with_bb, insns);
3089 timevar_pop (TV_TO_SSA);
3091 /* The SSA implementation uses basic block numbers in its phi
3092 nodes. Thus, changing the control-flow graph or the basic
3093 blocks, e.g., calling find_basic_blocks () or cleanup_cfg (),
3094 may cause problems. */
3096 if (flag_dce)
3098 /* Remove dead code. */
3100 timevar_push (TV_DEAD_CODE_ELIM);
3101 open_dump_file (DFI_dce, decl);
3103 insns = get_insns ();
3104 eliminate_dead_code();
3106 close_dump_file (DFI_dce, print_rtl_with_bb, insns);
3107 timevar_pop (TV_DEAD_CODE_ELIM);
3110 /* Convert from SSA form. */
3112 timevar_push (TV_FROM_SSA);
3113 open_dump_file (DFI_ussa, decl);
3115 convert_from_ssa ();
3116 /* New registers have been created. Rescan their usage. */
3117 reg_scan (insns, max_reg_num (), 1);
3118 /* Life analysis used in SSA adds log_links but these
3119 shouldn't be there until the flow stage, so clear
3120 them away. */
3121 clear_log_links (insns);
3123 close_dump_file (DFI_ussa, print_rtl_with_bb, insns);
3124 timevar_pop (TV_FROM_SSA);
3126 ggc_collect ();
3129 /* Perform global cse. */
3131 if (optimize > 0 && flag_gcse)
3133 int save_csb, save_cfj;
3134 int tem2 = 0;
3136 timevar_push (TV_GCSE);
3137 open_dump_file (DFI_gcse, decl);
3139 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
3140 cleanup_cfg (insns);
3141 tem = gcse_main (insns, rtl_dump_file);
3143 save_csb = flag_cse_skip_blocks;
3144 save_cfj = flag_cse_follow_jumps;
3145 flag_cse_skip_blocks = flag_cse_follow_jumps = 0;
3147 /* If -fexpensive-optimizations, re-run CSE to clean up things done
3148 by gcse. */
3149 if (flag_expensive_optimizations)
3151 timevar_push (TV_CSE);
3152 reg_scan (insns, max_reg_num (), 1);
3153 tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
3154 timevar_pop (TV_CSE);
3155 cse_not_expected = !flag_rerun_cse_after_loop;
3158 /* If gcse or cse altered any jumps, rerun jump optimizations to clean
3159 things up. Then possibly re-run CSE again. */
3160 while (tem || tem2)
3162 tem = tem2 = 0;
3163 timevar_push (TV_JUMP);
3164 jump_optimize (insns, !JUMP_CROSS_JUMP, !JUMP_NOOP_MOVES,
3165 !JUMP_AFTER_REGSCAN);
3166 timevar_pop (TV_JUMP);
3168 if (flag_expensive_optimizations)
3170 timevar_push (TV_CSE);
3171 reg_scan (insns, max_reg_num (), 1);
3172 tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
3173 timevar_pop (TV_CSE);
3177 close_dump_file (DFI_gcse, print_rtl, insns);
3178 timevar_pop (TV_GCSE);
3180 ggc_collect ();
3181 flag_cse_skip_blocks = save_csb;
3182 flag_cse_follow_jumps = save_cfj;
3185 /* Move constant computations out of loops. */
3187 if (optimize > 0)
3189 timevar_push (TV_LOOP);
3190 open_dump_file (DFI_loop, decl);
3192 if (flag_rerun_loop_opt)
3194 /* We only want to perform unrolling once. */
3196 loop_optimize (insns, rtl_dump_file, 0);
3198 /* The first call to loop_optimize makes some instructions
3199 trivially dead. We delete those instructions now in the
3200 hope that doing so will make the heuristics in loop work
3201 better and possibly speed up compilation. */
3202 delete_trivially_dead_insns (insns, max_reg_num ());
3204 /* The regscan pass is currently necessary as the alias
3205 analysis code depends on this information. */
3206 reg_scan (insns, max_reg_num (), 1);
3208 loop_optimize (insns, rtl_dump_file,
3209 (flag_unroll_loops ? LOOP_UNROLL : 0) | LOOP_BCT);
3211 close_dump_file (DFI_loop, print_rtl, insns);
3212 timevar_pop (TV_LOOP);
3214 ggc_collect ();
3217 if (optimize > 0)
3219 timevar_push (TV_CSE2);
3220 open_dump_file (DFI_cse2, decl);
3222 if (flag_rerun_cse_after_loop)
3224 /* Running another jump optimization pass before the second
3225 cse pass sometimes simplifies the RTL enough to allow
3226 the second CSE pass to do a better job. Jump_optimize can change
3227 max_reg_num so we must rerun reg_scan afterwards.
3228 ??? Rework to not call reg_scan so often. */
3229 timevar_push (TV_JUMP);
3231 reg_scan (insns, max_reg_num (), 0);
3232 jump_optimize (insns, !JUMP_CROSS_JUMP,
3233 !JUMP_NOOP_MOVES, JUMP_AFTER_REGSCAN);
3235 timevar_push (TV_IFCVT);
3237 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
3238 cleanup_cfg (insns);
3239 if_convert (0);
3241 timevar_pop(TV_IFCVT);
3243 timevar_pop (TV_JUMP);
3245 reg_scan (insns, max_reg_num (), 0);
3246 tem = cse_main (insns, max_reg_num (), 1, rtl_dump_file);
3248 if (tem)
3250 timevar_push (TV_JUMP);
3251 jump_optimize (insns, !JUMP_CROSS_JUMP,
3252 !JUMP_NOOP_MOVES, !JUMP_AFTER_REGSCAN);
3253 timevar_pop (TV_JUMP);
3257 if (flag_thread_jumps)
3259 /* This pass of jump threading straightens out code
3260 that was kinked by loop optimization. */
3261 timevar_push (TV_JUMP);
3262 reg_scan (insns, max_reg_num (), 0);
3263 thread_jumps (insns, max_reg_num (), 0);
3264 timevar_pop (TV_JUMP);
3267 close_dump_file (DFI_cse2, print_rtl, insns);
3268 timevar_pop (TV_CSE2);
3270 ggc_collect ();
3273 cse_not_expected = 1;
3275 regclass_init ();
3277 /* Do control and data flow analysis; wrote some of the results to
3278 the dump file. */
3280 timevar_push (TV_FLOW);
3281 open_dump_file (DFI_cfg, decl);
3283 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
3284 cleanup_cfg (insns);
3285 check_function_return_warnings ();
3287 close_dump_file (DFI_cfg, print_rtl_with_bb, insns);
3289 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
3291 timevar_push (TV_BRANCH_PROB);
3292 open_dump_file (DFI_bp, decl);
3294 branch_prob ();
3296 close_dump_file (DFI_bp, print_rtl_with_bb, insns);
3297 timevar_pop (TV_BRANCH_PROB);
3300 open_dump_file (DFI_life, decl);
3301 if (optimize)
3303 struct loops loops;
3305 /* Discover and record the loop depth at the head of each basic
3306 block. The loop infrastructure does the real job for us. */
3307 flow_loops_find (&loops, LOOP_TREE);
3309 /* Estimate using heuristics if no profiling info is available. */
3310 if (flag_guess_branch_prob)
3311 estimate_probability (&loops);
3313 if (rtl_dump_file)
3314 flow_loops_dump (&loops, rtl_dump_file, NULL, 0);
3316 flow_loops_free (&loops);
3318 life_analysis (insns, rtl_dump_file, PROP_FINAL);
3319 mark_constant_function ();
3320 timevar_pop (TV_FLOW);
3322 register_life_up_to_date = 1;
3323 no_new_pseudos = 1;
3325 if (warn_uninitialized || extra_warnings)
3327 uninitialized_vars_warning (DECL_INITIAL (decl));
3328 if (extra_warnings)
3329 setjmp_args_warning ();
3332 close_dump_file (DFI_life, print_rtl_with_bb, insns);
3334 ggc_collect ();
3336 /* If -opt, try combining insns through substitution. */
3338 if (optimize > 0)
3340 int rebuild_jump_labels_after_combine = 0;
3342 timevar_push (TV_COMBINE);
3343 open_dump_file (DFI_combine, decl);
3345 rebuild_jump_labels_after_combine
3346 = combine_instructions (insns, max_reg_num ());
3348 /* Combining insns may have turned an indirect jump into a
3349 direct jump. Rebuid the JUMP_LABEL fields of jumping
3350 instructions. */
3351 if (rebuild_jump_labels_after_combine)
3353 timevar_push (TV_JUMP);
3354 rebuild_jump_labels (insns);
3355 timevar_pop (TV_JUMP);
3357 timevar_push (TV_FLOW);
3358 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
3359 cleanup_cfg (insns);
3361 /* Blimey. We've got to have the CFG up to date for the call to
3362 if_convert below. However, the random deletion of blocks
3363 without updating life info can wind up with Wierd Stuff in
3364 global_live_at_end. We then run sched1, which updates things
3365 properly, discovers the wierdness and aborts. */
3366 update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
3367 PROP_DEATH_NOTES | PROP_KILL_DEAD_CODE
3368 | PROP_SCAN_DEAD_CODE);
3370 timevar_pop (TV_FLOW);
3373 close_dump_file (DFI_combine, print_rtl_with_bb, insns);
3374 timevar_pop (TV_COMBINE);
3376 ggc_collect ();
3379 /* Rerun if-conversion, as combine may have simplified things enough to
3380 now meet sequence length restrictions. */
3381 if (optimize > 0)
3383 timevar_push (TV_IFCVT);
3384 open_dump_file (DFI_ce, decl);
3386 no_new_pseudos = 0;
3387 if_convert (1);
3388 no_new_pseudos = 1;
3390 close_dump_file (DFI_ce, print_rtl_with_bb, insns);
3391 timevar_pop (TV_IFCVT);
3394 /* Register allocation pre-pass, to reduce number of moves
3395 necessary for two-address machines. */
3396 if (optimize > 0 && (flag_regmove || flag_expensive_optimizations))
3398 timevar_push (TV_REGMOVE);
3399 open_dump_file (DFI_regmove, decl);
3401 regmove_optimize (insns, max_reg_num (), rtl_dump_file);
3403 close_dump_file (DFI_regmove, print_rtl_with_bb, insns);
3404 timevar_pop (TV_REGMOVE);
3406 ggc_collect ();
3409 /* Any of the several passes since flow1 will have munged register
3410 lifetime data a bit. */
3411 if (optimize > 0)
3412 register_life_up_to_date = 0;
3414 #ifdef OPTIMIZE_MODE_SWITCHING
3415 timevar_push (TV_GCSE);
3417 if (optimize_mode_switching (NULL_PTR))
3419 /* We did work, and so had to regenerate global life information.
3420 Take advantage of this and don't re-recompute register life
3421 information below. */
3422 register_life_up_to_date = 1;
3425 timevar_pop (TV_GCSE);
3426 #endif
3428 #ifdef INSN_SCHEDULING
3430 /* Print function header into sched dump now
3431 because doing the sched analysis makes some of the dump. */
3432 if (optimize > 0 && flag_schedule_insns)
3434 timevar_push (TV_SCHED);
3435 open_dump_file (DFI_sched, decl);
3437 /* Do control and data sched analysis,
3438 and write some of the results to dump file. */
3440 schedule_insns (rtl_dump_file);
3442 close_dump_file (DFI_sched, print_rtl_with_bb, insns);
3443 timevar_pop (TV_SCHED);
3445 ggc_collect ();
3447 /* Register lifetime information was updated as part of verifying
3448 the schedule. */
3449 register_life_up_to_date = 1;
3451 #endif
3453 /* Determine if the current function is a leaf before running reload
3454 since this can impact optimizations done by the prologue and
3455 epilogue thus changing register elimination offsets. */
3456 current_function_is_leaf = leaf_function_p ();
3458 timevar_push (TV_LOCAL_ALLOC);
3459 open_dump_file (DFI_lreg, decl);
3461 /* Allocate pseudo-regs that are used only within 1 basic block.
3463 RUN_JUMP_AFTER_RELOAD records whether or not we need to rerun the
3464 jump optimizer after register allocation and reloading are finished. */
3466 if (! register_life_up_to_date)
3467 recompute_reg_usage (insns, ! optimize_size);
3468 regclass (insns, max_reg_num (), rtl_dump_file);
3469 rebuild_label_notes_after_reload = local_alloc ();
3471 timevar_pop (TV_LOCAL_ALLOC);
3473 if (dump_file[DFI_lreg].enabled)
3475 timevar_push (TV_DUMP);
3477 dump_flow_info (rtl_dump_file);
3478 dump_local_alloc (rtl_dump_file);
3480 close_dump_file (DFI_lreg, print_rtl_with_bb, insns);
3481 timevar_pop (TV_DUMP);
3484 ggc_collect ();
3486 timevar_push (TV_GLOBAL_ALLOC);
3487 open_dump_file (DFI_greg, decl);
3489 /* If optimizing, allocate remaining pseudo-regs. Do the reload
3490 pass fixing up any insns that are invalid. */
3492 if (optimize)
3493 failure = global_alloc (rtl_dump_file);
3494 else
3496 build_insn_chain (insns);
3497 failure = reload (insns, 0);
3500 timevar_pop (TV_GLOBAL_ALLOC);
3502 if (dump_file[DFI_greg].enabled)
3504 timevar_push (TV_DUMP);
3506 dump_global_regs (rtl_dump_file);
3508 close_dump_file (DFI_greg, print_rtl_with_bb, insns);
3509 timevar_pop (TV_DUMP);
3512 if (failure)
3513 goto exit_rest_of_compilation;
3515 ggc_collect ();
3517 open_dump_file (DFI_postreload, decl);
3519 /* Do a very simple CSE pass over just the hard registers. */
3520 if (optimize > 0)
3522 timevar_push (TV_RELOAD_CSE_REGS);
3523 reload_cse_regs (insns);
3524 timevar_pop (TV_RELOAD_CSE_REGS);
3527 /* If optimizing, then go ahead and split insns now since we are about
3528 to recompute flow information anyway. Since we can't split insns after
3529 reload, do the splitting unconditionally here to avoid gcc from losing
3530 REG_DEAD notes. */
3531 #ifdef STACK_REGS
3532 if (1)
3533 #else
3534 if (optimize > 0)
3535 #endif
3537 int old_labelnum = max_label_num ();
3539 split_all_insns (0);
3540 rebuild_label_notes_after_reload |= old_labelnum != max_label_num ();
3543 /* Register allocation and reloading may have turned an indirect jump into
3544 a direct jump. If so, we must rebuild the JUMP_LABEL fields of
3545 jumping instructions. */
3546 if (rebuild_label_notes_after_reload)
3548 timevar_push (TV_JUMP);
3550 rebuild_jump_labels (insns);
3552 timevar_pop (TV_JUMP);
3555 close_dump_file (DFI_postreload, print_rtl_with_bb, insns);
3557 /* Re-create the death notes which were deleted during reload. */
3558 timevar_push (TV_FLOW2);
3559 open_dump_file (DFI_flow2, decl);
3561 jump_optimize (insns, !JUMP_CROSS_JUMP,
3562 JUMP_NOOP_MOVES, !JUMP_AFTER_REGSCAN);
3563 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
3565 /* On some machines, the prologue and epilogue code, or parts thereof,
3566 can be represented as RTL. Doing so lets us schedule insns between
3567 it and the rest of the code and also allows delayed branch
3568 scheduling to operate in the epilogue. */
3569 thread_prologue_and_epilogue_insns (insns);
3571 if (optimize)
3573 cleanup_cfg (insns);
3574 life_analysis (insns, rtl_dump_file, PROP_FINAL);
3576 /* This is kind of a heuristic. We need to run combine_stack_adjustments
3577 even for machines with possibly nonzero RETURN_POPS_ARGS
3578 and ACCUMULATE_OUTGOING_ARGS. We expect that only ports having
3579 push instructions will have popping returns. */
3580 #ifndef PUSH_ROUNDING
3581 if (!ACCUMULATE_OUTGOING_ARGS)
3582 #endif
3583 combine_stack_adjustments ();
3585 ggc_collect ();
3588 flow2_completed = 1;
3590 close_dump_file (DFI_flow2, print_rtl_with_bb, insns);
3591 timevar_pop (TV_FLOW2);
3593 #ifdef HAVE_peephole2
3594 if (optimize > 0 && flag_peephole2)
3596 timevar_push (TV_PEEPHOLE2);
3597 open_dump_file (DFI_peephole2, decl);
3599 peephole2_optimize (rtl_dump_file);
3601 close_dump_file (DFI_peephole2, print_rtl_with_bb, insns);
3602 timevar_pop (TV_PEEPHOLE2);
3604 #endif
3606 if (optimize > 0 && flag_rename_registers)
3608 timevar_push (TV_RENAME_REGISTERS);
3609 open_dump_file (DFI_rnreg, decl);
3611 regrename_optimize ();
3613 close_dump_file (DFI_rnreg, print_rtl_with_bb, insns);
3614 timevar_pop (TV_RENAME_REGISTERS);
3617 if (optimize > 0)
3619 timevar_push (TV_IFCVT2);
3620 open_dump_file (DFI_ce2, decl);
3622 if_convert (1);
3624 close_dump_file (DFI_ce2, print_rtl_with_bb, insns);
3625 timevar_pop (TV_IFCVT2);
3628 #ifdef INSN_SCHEDULING
3629 if (optimize > 0 && flag_schedule_insns_after_reload)
3631 timevar_push (TV_SCHED2);
3632 open_dump_file (DFI_sched2, decl);
3634 /* Do control and data sched analysis again,
3635 and write some more of the results to dump file. */
3637 schedule_insns (rtl_dump_file);
3639 close_dump_file (DFI_sched2, print_rtl_with_bb, insns);
3640 timevar_pop (TV_SCHED2);
3642 ggc_collect ();
3644 #endif
3646 #ifdef LEAF_REGISTERS
3647 current_function_uses_only_leaf_regs
3648 = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
3649 #endif
3651 if (optimize > 0 && flag_reorder_blocks)
3653 timevar_push (TV_REORDER_BLOCKS);
3654 open_dump_file (DFI_bbro, decl);
3656 reorder_basic_blocks ();
3658 close_dump_file (DFI_bbro, print_rtl_with_bb, insns);
3659 timevar_pop (TV_REORDER_BLOCKS);
3662 /* One more attempt to remove jumps to .+1 left by dead-store elimination.
3663 Also do cross-jumping this time and delete no-op move insns. */
3665 if (optimize > 0)
3667 timevar_push (TV_JUMP);
3668 open_dump_file (DFI_jump2, decl);
3670 jump_optimize (insns, JUMP_CROSS_JUMP, JUMP_NOOP_MOVES,
3671 !JUMP_AFTER_REGSCAN);
3673 /* CFG no longer kept up to date. */
3675 close_dump_file (DFI_jump2, print_rtl, insns);
3676 timevar_pop (TV_JUMP);
3679 /* If a machine dependent reorganization is needed, call it. */
3680 #ifdef MACHINE_DEPENDENT_REORG
3681 open_dump_file (DFI_mach, decl);
3683 MACHINE_DEPENDENT_REORG (insns);
3685 close_dump_file (DFI_mach, print_rtl, insns);
3687 ggc_collect ();
3688 #endif
3690 /* If a scheduling pass for delayed branches is to be done,
3691 call the scheduling code. */
3693 #ifdef DELAY_SLOTS
3694 if (optimize > 0 && flag_delayed_branch)
3696 timevar_push (TV_DBR_SCHED);
3697 open_dump_file (DFI_dbr, decl);
3699 dbr_schedule (insns, rtl_dump_file);
3701 close_dump_file (DFI_dbr, print_rtl, insns);
3702 timevar_pop (TV_DBR_SCHED);
3704 ggc_collect ();
3706 #endif
3708 /* Shorten branches.
3710 Note this must run before reg-stack because of death note (ab)use
3711 in the ia32 backend. */
3712 timevar_push (TV_SHORTEN_BRANCH);
3713 shorten_branches (get_insns ());
3714 timevar_pop (TV_SHORTEN_BRANCH);
3716 #ifdef STACK_REGS
3717 timevar_push (TV_REG_STACK);
3718 open_dump_file (DFI_stack, decl);
3720 reg_to_stack (insns, rtl_dump_file);
3722 close_dump_file (DFI_stack, print_rtl, insns);
3723 timevar_pop (TV_REG_STACK);
3725 ggc_collect ();
3726 #endif
3728 current_function_nothrow = nothrow_function_p ();
3729 if (current_function_nothrow)
3730 /* Now we know that this can't throw; set the flag for the benefit
3731 of other functions later in this translation unit. */
3732 TREE_NOTHROW (current_function_decl) = 1;
3734 /* Now turn the rtl into assembler code. */
3736 timevar_push (TV_FINAL);
3738 rtx x;
3739 const char *fnname;
3741 /* Get the function's name, as described by its RTL. This may be
3742 different from the DECL_NAME name used in the source file. */
3744 x = DECL_RTL (decl);
3745 if (GET_CODE (x) != MEM)
3746 abort ();
3747 x = XEXP (x, 0);
3748 if (GET_CODE (x) != SYMBOL_REF)
3749 abort ();
3750 fnname = XSTR (x, 0);
3752 assemble_start_function (decl, fnname);
3753 final_start_function (insns, asm_out_file, optimize);
3754 final (insns, asm_out_file, optimize, 0);
3755 final_end_function (insns, asm_out_file, optimize);
3756 assemble_end_function (decl, fnname);
3757 if (! quiet_flag)
3758 fflush (asm_out_file);
3760 /* Release all memory allocated by flow. */
3761 free_basic_block_vars (0);
3763 /* Release all memory held by regsets now. */
3764 regset_release_memory ();
3766 timevar_pop (TV_FINAL);
3768 ggc_collect ();
3770 /* Write DBX symbols if requested. */
3772 /* Note that for those inline functions where we don't initially
3773 know for certain that we will be generating an out-of-line copy,
3774 the first invocation of this routine (rest_of_compilation) will
3775 skip over this code by doing a `goto exit_rest_of_compilation;'.
3776 Later on, finish_compilation will call rest_of_compilation again
3777 for those inline functions that need to have out-of-line copies
3778 generated. During that call, we *will* be routed past here. */
3780 timevar_push (TV_SYMOUT);
3781 #ifdef DBX_DEBUGGING_INFO
3782 if (write_symbols == DBX_DEBUG)
3783 dbxout_function (decl);
3784 #endif
3786 #ifdef DWARF_DEBUGGING_INFO
3787 if (write_symbols == DWARF_DEBUG)
3788 dwarfout_file_scope_decl (decl, 0);
3789 #endif
3791 #ifdef DWARF2_DEBUGGING_INFO
3792 if (write_symbols == DWARF2_DEBUG)
3793 dwarf2out_decl (decl);
3794 #endif
3795 timevar_pop (TV_SYMOUT);
3797 exit_rest_of_compilation:
3799 /* In case the function was not output,
3800 don't leave any temporary anonymous types
3801 queued up for sdb output. */
3802 #ifdef SDB_DEBUGGING_INFO
3803 if (write_symbols == SDB_DEBUG)
3804 sdbout_types (NULL_TREE);
3805 #endif
3807 reload_completed = 0;
3808 flow2_completed = 0;
3809 no_new_pseudos = 0;
3811 timevar_push (TV_FINAL);
3813 /* Clear out the insn_length contents now that they are no
3814 longer valid. */
3815 init_insn_lengths ();
3817 /* Clear out the real_constant_chain before some of the rtx's
3818 it runs through become garbage. */
3819 clear_const_double_mem ();
3821 /* Show no temporary slots allocated. */
3822 init_temp_slots ();
3824 free_basic_block_vars (0);
3826 timevar_pop (TV_FINAL);
3828 /* Make sure volatile mem refs aren't considered valid operands for
3829 arithmetic insns. We must call this here if this is a nested inline
3830 function, since the above code leaves us in the init_recog state
3831 (from final.c), and the function context push/pop code does not
3832 save/restore volatile_ok.
3834 ??? Maybe it isn't necessary for expand_start_function to call this
3835 anymore if we do it here? */
3837 init_recog_no_volatile ();
3839 /* We're done with this function. Free up memory if we can. */
3840 free_after_parsing (cfun);
3841 if (! DECL_DEFER_OUTPUT (decl))
3842 free_after_compilation (cfun);
3843 cfun = 0;
3845 ggc_collect ();
3847 timevar_pop (TV_REST_OF_COMPILATION);
3850 static void
3851 display_help ()
3853 int undoc;
3854 unsigned long i;
3855 const char *lang;
3857 printf (_(" -ffixed-<register> Mark <register> as being unavailable to the compiler\n"));
3858 printf (_(" -fcall-used-<register> Mark <register> as being corrupted by function calls\n"));
3859 printf (_(" -fcall-saved-<register> Mark <register> as being preserved across functions\n"));
3860 printf (_(" -finline-limit=<number> Limits the size of inlined functions to <number>\n"));
3861 printf (_(" -fmessage-length=<number> Limits diagnostics messages lengths to <number> characters per line. 0 suppresses line-wrapping\n"));
3862 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"));
3864 for (i = ARRAY_SIZE (f_options); i--;)
3866 const char *description = f_options[i].description;
3868 if (description != NULL && * description != 0)
3869 printf (" -f%-21s %s\n",
3870 f_options[i].string, description);
3873 printf (_(" -O[number] Set optimisation level to [number]\n"));
3874 printf (_(" -Os Optimise for space rather than speed\n"));
3875 printf (_(" --param <name>=<value> Set constant controlling optimization\n"));
3876 printf (_(" -pedantic Issue warnings needed by strict compliance to ISO C\n"));
3877 printf (_(" -pedantic-errors Like -pedantic except that errors are produced\n"));
3878 printf (_(" -w Suppress warnings\n"));
3879 printf (_(" -W Enable extra warnings\n"));
3881 for (i = ARRAY_SIZE (W_options); i--;)
3883 const char *description = W_options[i].description;
3885 if (description != NULL && * description != 0)
3886 printf (" -W%-21s %s\n",
3887 W_options[i].string, description);
3890 printf (_(" -Wunused Enable unused warnings\n"));
3891 printf (_(" -Wid-clash-<num> Warn if 2 identifiers have the same first <num> chars\n"));
3892 printf (_(" -Wlarger-than-<number> Warn if an object is larger than <number> bytes\n"));
3893 printf (_(" -p Enable function profiling\n"));
3894 #if defined (BLOCK_PROFILER) || defined (FUNCTION_BLOCK_PROFILER)
3895 printf (_(" -a Enable block profiling \n"));
3896 #endif
3897 #if defined (BLOCK_PROFILER) || defined (FUNCTION_BLOCK_PROFILER) || defined FUNCTION_BLOCK_PROFILER_EXIT
3898 printf (_(" -ax Enable jump profiling \n"));
3899 #endif
3900 printf (_(" -o <file> Place output into <file> \n"));
3901 printf (_("\
3902 -G <number> Put global and static data smaller than <number>\n\
3903 bytes into a special section (on some targets)\n"));
3905 for (i = ARRAY_SIZE (debug_args); i--;)
3907 if (debug_args[i].description != NULL)
3908 printf (" -g%-21s %s\n",
3909 debug_args[i].arg, debug_args[i].description);
3912 printf (_(" -aux-info <file> Emit declaration info into <file>.X\n"));
3913 printf (_(" -quiet Do not display functions compiled or elapsed time\n"));
3914 printf (_(" -version Display the compiler's version\n"));
3915 printf (_(" -d[letters] Enable dumps from specific passes of the compiler\n"));
3916 printf (_(" -dumpbase <file> Base name to be used for dumps from specific passes\n"));
3917 #if defined INSN_SCHEDULING
3918 printf (_(" -fsched-verbose=<number> Set the verbosity level of the scheduler\n"));
3919 #endif
3920 printf (_(" --help Display this information\n"));
3922 undoc = 0;
3923 lang = "language";
3925 /* Display descriptions of language specific options.
3926 If there is no description, note that there is an undocumented option.
3927 If the description is empty, do not display anything. (This allows
3928 options to be deliberately undocumented, for whatever reason).
3929 If the option string is missing, then this is a marker, indicating
3930 that the description string is in fact the name of a language, whose
3931 language specific options are to follow. */
3933 if (ARRAY_SIZE (documented_lang_options) > 1)
3935 printf (_("\nLanguage specific options:\n"));
3937 for (i = 0; i < ARRAY_SIZE (documented_lang_options); i++)
3939 const char *description = documented_lang_options[i].description;
3940 const char *option = documented_lang_options[i].option;
3942 if (description == NULL)
3944 undoc = 1;
3946 if (extra_warnings)
3947 printf (_(" %-23.23s [undocumented]\n"), option);
3949 else if (*description == 0)
3950 continue;
3951 else if (option == NULL)
3953 if (undoc)
3954 printf
3955 (_("\nThere are undocumented %s specific options as well.\n"),
3956 lang);
3957 undoc = 0;
3959 printf (_("\n Options for %s:\n"), description);
3961 lang = description;
3963 else
3964 printf (" %-23.23s %s\n", option, description);
3968 if (undoc)
3969 printf (_("\nThere are undocumented %s specific options as well.\n"),
3970 lang);
3972 display_target_options ();
3975 static void
3976 display_target_options ()
3978 int undoc,i;
3980 if (ARRAY_SIZE (target_switches) > 1
3981 #ifdef TARGET_OPTIONS
3982 || ARRAY_SIZE (target_options) > 1
3983 #endif
3986 int doc = 0;
3988 undoc = 0;
3990 printf (_("\nTarget specific options:\n"));
3992 for (i = ARRAY_SIZE (target_switches); i--;)
3994 const char *option = target_switches[i].name;
3995 const char *description = target_switches[i].description;
3997 if (option == NULL || *option == 0)
3998 continue;
3999 else if (description == NULL)
4001 undoc = 1;
4003 if (extra_warnings)
4004 printf (_(" -m%-23.23s [undocumented]\n"), option);
4006 else if (* description != 0)
4007 doc += printf (" -m%-23.23s %s\n", option, description);
4010 #ifdef TARGET_OPTIONS
4011 for (i = ARRAY_SIZE (target_options); i--;)
4013 const char *option = target_options[i].prefix;
4014 const char *description = target_options[i].description;
4016 if (option == NULL || *option == 0)
4017 continue;
4018 else if (description == NULL)
4020 undoc = 1;
4022 if (extra_warnings)
4023 printf (_(" -m%-23.23s [undocumented]\n"), option);
4025 else if (* description != 0)
4026 doc += printf (" -m%-23.23s %s\n", option, description);
4028 #endif
4029 if (undoc)
4031 if (doc)
4032 printf (_("\nThere are undocumented target specific options as well.\n"));
4033 else
4034 printf (_(" They exist, but they are not documented.\n"));
4039 /* Parse a -d... comand line switch. */
4041 static void
4042 decode_d_option (arg)
4043 const char *arg;
4045 int i, c, matched;
4047 while (*arg)
4048 switch (c = *arg++)
4050 case 'a':
4051 for (i = 0; i < (int) DFI_MAX; ++i)
4052 dump_file[i].enabled = 1;
4053 break;
4054 case 'A':
4055 flag_debug_asm = 1;
4056 break;
4057 case 'm':
4058 flag_print_mem = 1;
4059 break;
4060 case 'p':
4061 flag_print_asm_name = 1;
4062 break;
4063 case 'P':
4064 flag_dump_rtl_in_asm = 1;
4065 flag_print_asm_name = 1;
4066 break;
4067 case 'v':
4068 graph_dump_format = vcg;
4069 break;
4070 case 'x':
4071 rtl_dump_and_exit = 1;
4072 break;
4073 case 'y':
4074 set_yydebug (1);
4075 break;
4076 case 'D': /* These are handled by the preprocessor. */
4077 case 'I':
4078 break;
4080 default:
4081 matched = 0;
4082 for (i = 0; i < (int) DFI_MAX; ++i)
4083 if (c == dump_file[i].debug_switch)
4085 dump_file[i].enabled = 1;
4086 matched = 1;
4089 if (! matched)
4090 warning ("unrecognized gcc debugging option: %c", c);
4091 break;
4095 /* Parse a -f... comand line switch. ARG is the value after the -f.
4096 It is safe to access 'ARG - 2' to generate the full switch name.
4097 Return the number of strings consumed. */
4099 static int
4100 decode_f_option (arg)
4101 const char *arg;
4103 int j;
4104 const char *option_value = NULL;
4106 /* Search for the option in the table of binary f options. */
4107 for (j = ARRAY_SIZE (f_options); j--;)
4109 if (!strcmp (arg, f_options[j].string))
4111 *f_options[j].variable = f_options[j].on_value;
4112 return 1;
4115 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4116 && ! strcmp (arg + 3, f_options[j].string))
4118 *f_options[j].variable = ! f_options[j].on_value;
4119 return 1;
4123 if (!strcmp (arg, "fast-math"))
4124 set_fast_math_flags();
4125 else if (!strcmp (arg, "no-fast-math"))
4126 set_no_fast_math_flags();
4127 else if ((option_value = skip_leading_substring (arg, "inline-limit-"))
4128 || (option_value = skip_leading_substring (arg, "inline-limit=")))
4130 int val =
4131 read_integral_parameter (option_value, arg - 2,
4132 MAX_INLINE_INSNS);
4133 set_param_value ("max-inline-insns", val);
4135 #ifdef INSN_SCHEDULING
4136 else if ((option_value = skip_leading_substring (arg, "sched-verbose=")))
4137 fix_sched_param ("verbose", option_value);
4138 #endif
4139 else if ((option_value = skip_leading_substring (arg, "fixed-")))
4140 fix_register (option_value, 1, 1);
4141 else if ((option_value = skip_leading_substring (arg, "call-used-")))
4142 fix_register (option_value, 0, 1);
4143 else if ((option_value = skip_leading_substring (arg, "call-saved-")))
4144 fix_register (option_value, 0, 0);
4145 else if ((option_value = skip_leading_substring (arg, "align-loops=")))
4146 align_loops = read_integral_parameter (option_value, arg - 2, align_loops);
4147 else if ((option_value = skip_leading_substring (arg, "align-functions=")))
4148 align_functions
4149 = read_integral_parameter (option_value, arg - 2, align_functions);
4150 else if ((option_value = skip_leading_substring (arg, "align-jumps=")))
4151 align_jumps = read_integral_parameter (option_value, arg - 2, align_jumps);
4152 else if ((option_value = skip_leading_substring (arg, "align-labels=")))
4153 align_labels
4154 = read_integral_parameter (option_value, arg - 2, align_labels);
4155 else if ((option_value
4156 = skip_leading_substring (arg, "stack-limit-register=")))
4158 int reg = decode_reg_name (option_value);
4159 if (reg < 0)
4160 error ("unrecognized register name `%s'", option_value);
4161 else
4162 stack_limit_rtx = gen_rtx_REG (Pmode, reg);
4164 else if ((option_value
4165 = skip_leading_substring (arg, "stack-limit-symbol=")))
4167 const char *nm;
4168 nm = ggc_strdup (option_value);
4169 stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, nm);
4171 else if ((option_value
4172 = skip_leading_substring (arg, "message-length=")))
4173 diagnostic_message_length_per_line =
4174 read_integral_parameter (option_value, arg - 2,
4175 diagnostic_message_length_per_line);
4176 else if ((option_value
4177 = skip_leading_substring (arg, "diagnostics-show-location=")))
4179 if (!strcmp (option_value, "once"))
4180 set_message_prefixing_rule (DIAGNOSTICS_SHOW_PREFIX_ONCE);
4181 else if (!strcmp (option_value, "every-line"))
4182 set_message_prefixing_rule (DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE);
4183 else
4184 error ("Unrecognized option `%s'", arg - 2);
4186 else if (!strcmp (arg, "no-stack-limit"))
4187 stack_limit_rtx = NULL_RTX;
4188 else if (!strcmp (arg, "preprocessed"))
4189 /* Recognise this switch but do nothing. This prevents warnings
4190 about an unrecognized switch if cpplib has not been linked in. */
4192 else
4193 return 0;
4195 return 1;
4198 /* Parse a -W... comand line switch. ARG is the value after the -W.
4199 It is safe to access 'ARG - 2' to generate the full switch name.
4200 Return the number of strings consumed. */
4202 static int
4203 decode_W_option (arg)
4204 const char *arg;
4206 const char *option_value = NULL;
4207 int j;
4209 /* Search for the option in the table of binary W options. */
4211 for (j = ARRAY_SIZE (W_options); j--;)
4213 if (!strcmp (arg, W_options[j].string))
4215 *W_options[j].variable = W_options[j].on_value;
4216 return 1;
4219 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4220 && ! strcmp (arg + 3, W_options[j].string))
4222 *W_options[j].variable = ! W_options[j].on_value;
4223 return 1;
4227 if ((option_value = skip_leading_substring (arg, "id-clash-")))
4229 id_clash_len = read_integral_parameter (option_value, arg - 2, -1);
4231 if (id_clash_len != -1)
4232 warn_id_clash = 1;
4234 else if ((option_value = skip_leading_substring (arg, "larger-than-")))
4236 larger_than_size = read_integral_parameter (option_value, arg - 2, -1);
4238 warn_larger_than = larger_than_size != -1;
4240 else if (!strcmp (arg, "unused"))
4242 set_Wunused (1);
4244 else if (!strcmp (arg, "no-unused"))
4246 set_Wunused (0);
4248 else
4249 return 0;
4251 return 1;
4254 /* Parse a -g... comand line switch. ARG is the value after the -g.
4255 It is safe to access 'ARG - 2' to generate the full switch name.
4256 Return the number of strings consumed. */
4258 static int
4259 decode_g_option (arg)
4260 const char *arg;
4262 unsigned level;
4263 /* A lot of code assumes write_symbols == NO_DEBUG if the
4264 debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
4265 of what debugging type has been selected). This records the
4266 selected type. It is an error to specify more than one
4267 debugging type. */
4268 static enum debug_info_type selected_debug_type = NO_DEBUG;
4269 /* Non-zero if debugging format has been explicitly set.
4270 -g and -ggdb don't explicitly set the debugging format so
4271 -gdwarf -g3 is equivalent to -gdwarf3. */
4272 static int type_explicitly_set_p = 0;
4273 /* Indexed by enum debug_info_type. */
4274 static const char *debug_type_names[] =
4276 "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff"
4279 /* The maximum admissible debug level value. */
4280 static const unsigned max_debug_level = 3;
4282 /* Look up ARG in the table. */
4283 for (da = debug_args; da->arg; da++)
4285 const int da_len = strlen (da->arg);
4287 if (da_len == 0 || ! strncmp (arg, da->arg, da_len))
4289 enum debug_info_type type = da->debug_type;
4290 const char *p = arg + da_len;
4292 if (*p && (*p < '0' || *p > '9'))
4293 continue;
4295 /* A debug flag without a level defaults to level 2.
4296 Note we do not want to call read_integral_parameter
4297 for that case since it will call atoi which
4298 will return zero.
4300 ??? We may want to generalize the interface to
4301 read_integral_parameter to better handle this case
4302 if this case shows up often. */
4303 if (*p)
4304 level = read_integral_parameter (p, 0, max_debug_level + 1);
4305 else
4306 level = 2;
4308 if (da_len > 1 && *p && !strncmp (arg, "dwarf", da_len))
4310 error ("use -gdwarf -g%d for DWARF v1, level %d",
4311 level, level);
4312 if (level == 2)
4313 error ("use -gdwarf-2 for DWARF v2");
4316 if (level > max_debug_level)
4318 warning ("\
4319 ignoring option `%s' due to invalid debug level specification",
4320 arg - 2);
4321 level = debug_info_level;
4324 if (type == NO_DEBUG)
4326 type = PREFERRED_DEBUGGING_TYPE;
4328 if (da_len > 1 && strncmp (arg, "gdb", da_len) == 0)
4330 #if defined (DWARF2_DEBUGGING_INFO) && !defined (LINKER_DOES_NOT_WORK_WITH_DWARF2)
4331 type = DWARF2_DEBUG;
4332 #else
4333 #ifdef DBX_DEBUGGING_INFO
4334 type = DBX_DEBUG;
4335 #endif
4336 #endif
4340 if (type == NO_DEBUG)
4341 warning ("`%s': unknown or unsupported -g option", arg - 2);
4343 /* Does it conflict with an already selected type? */
4344 if (type_explicitly_set_p
4345 /* -g/-ggdb don't conflict with anything. */
4346 && da->debug_type != NO_DEBUG
4347 && type != selected_debug_type)
4348 warning ("`%s' ignored, conflicts with `-g%s'",
4349 arg - 2, debug_type_names[(int) selected_debug_type]);
4350 else
4352 /* If the format has already been set, -g/-ggdb
4353 only change the debug level. */
4354 if (type_explicitly_set_p && da->debug_type == NO_DEBUG)
4355 /* Don't change debugging type. */
4357 else
4359 selected_debug_type = type;
4360 type_explicitly_set_p = da->debug_type != NO_DEBUG;
4363 write_symbols = (level == 0
4364 ? NO_DEBUG
4365 : selected_debug_type);
4366 use_gnu_debug_info_extensions = da->use_extensions_p;
4367 debug_info_level = (enum debug_info_level) level;
4370 break;
4374 if (! da->arg)
4375 return 0;
4377 return 1;
4380 /* Decode the first argument in the argv as a language-independent option.
4381 Return the number of strings consumed. */
4383 static unsigned int
4384 independent_decode_option (argc, argv)
4385 int argc;
4386 char **argv;
4388 char *arg = argv[0];
4390 if (arg[0] != '-' || arg[1] == 0)
4392 if (arg[0] == '+')
4393 return 0;
4395 filename = arg;
4397 return 1;
4400 arg++;
4402 if (!strcmp (arg, "-help"))
4404 display_help ();
4405 exit_after_options = 1;
4408 if (!strcmp (arg, "-target-help"))
4410 display_target_options ();
4411 exit_after_options = 1;
4414 if (!strcmp (arg, "-version"))
4416 print_version (stderr, "");
4417 exit_after_options = 1;
4420 /* Handle '--param <name>=<value>'. */
4421 if (strcmp (arg, "-param") == 0)
4423 char *equal;
4425 if (argc == 1)
4427 error ("-param option missing argument");
4428 return 1;
4431 /* Get the '<name>=<value>' parameter. */
4432 arg = argv[1];
4433 /* Look for the `='. */
4434 equal = strchr (arg, '=');
4435 if (!equal)
4436 error ("invalid --param option: %s", arg);
4437 else
4439 int val;
4441 /* Zero out the `=' sign so that we get two separate strings. */
4442 *equal = '\0';
4443 /* Figure out what value is specified. */
4444 val = read_integral_parameter (equal + 1, NULL, INVALID_PARAM_VAL);
4445 if (val != INVALID_PARAM_VAL)
4446 set_param_value (arg, val);
4447 else
4448 error ("invalid parameter value `%s'", equal + 1);
4451 return 2;
4454 if (*arg == 'Y')
4455 arg++;
4457 switch (*arg)
4459 default:
4460 return 0;
4462 case 'O':
4463 /* Already been treated in main (). Do nothing. */
4464 break;
4466 case 'm':
4467 set_target_switch (arg + 1);
4468 break;
4470 case 'f':
4471 return decode_f_option (arg + 1);
4473 case 'g':
4474 return decode_g_option (arg + 1);
4476 case 'd':
4477 if (!strcmp (arg, "dumpbase"))
4479 if (argc == 1)
4480 return 0;
4482 dump_base_name = argv[1];
4483 return 2;
4485 else
4486 decode_d_option (arg + 1);
4487 break;
4489 case 'p':
4490 if (!strcmp (arg, "pedantic"))
4491 pedantic = 1;
4492 else if (!strcmp (arg, "pedantic-errors"))
4493 flag_pedantic_errors = pedantic = 1;
4494 else if (arg[1] == 0)
4495 profile_flag = 1;
4496 else
4497 return 0;
4498 break;
4500 case 'q':
4501 if (!strcmp (arg, "quiet"))
4502 quiet_flag = 1;
4503 else
4504 return 0;
4505 break;
4507 case 'v':
4508 if (!strcmp (arg, "version"))
4509 version_flag = 1;
4510 else
4511 return 0;
4512 break;
4514 case 'w':
4515 if (arg[1] == 0)
4516 inhibit_warnings = 1;
4517 else
4518 return 0;
4519 break;
4521 case 'W':
4522 if (arg[1] == 0)
4524 extra_warnings = 1;
4525 /* We save the value of warn_uninitialized, since if they put
4526 -Wuninitialized on the command line, we need to generate a
4527 warning about not using it without also specifying -O. */
4528 if (warn_uninitialized != 1)
4529 warn_uninitialized = 2;
4531 else
4532 return decode_W_option (arg + 1);
4533 break;
4535 case 'a':
4536 if (arg[1] == 0)
4538 #if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
4539 warning ("`-a' option (basic block profile) not supported");
4540 #else
4541 profile_block_flag = (profile_block_flag < 2) ? 1 : 3;
4542 #endif
4544 else if (!strcmp (arg, "ax"))
4546 #if !defined (FUNCTION_BLOCK_PROFILER_EXIT) || !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
4547 warning ("`-ax' option (jump profiling) not supported");
4548 #else
4549 profile_block_flag = (!profile_block_flag
4550 || profile_block_flag == 2) ? 2 : 3;
4551 #endif
4553 else if (!strncmp (arg, "aux-info", 8))
4555 flag_gen_aux_info = 1;
4556 if (arg[8] == '\0')
4558 if (argc == 1)
4559 return 0;
4561 aux_info_file_name = argv[1];
4562 return 2;
4564 else
4565 aux_info_file_name = arg + 8;
4567 else
4568 return 0;
4569 break;
4571 case 'o':
4572 if (arg[1] == 0)
4574 if (argc == 1)
4575 return 0;
4577 asm_file_name = argv[1];
4578 return 2;
4580 return 0;
4582 case 'G':
4584 int g_switch_val;
4585 int return_val;
4587 if (arg[1] == 0)
4589 if (argc == 1)
4590 return 0;
4592 g_switch_val = read_integral_parameter (argv[1], 0, -1);
4593 return_val = 2;
4595 else
4597 g_switch_val = read_integral_parameter (arg + 1, 0, -1);
4598 return_val = 1;
4601 if (g_switch_val == -1)
4602 return_val = 0;
4603 else
4605 g_switch_set = TRUE;
4606 g_switch_value = g_switch_val;
4609 return return_val;
4613 return 1;
4616 /* Entry point of cc1, cc1plus, jc1, f771, etc.
4617 Decode command args, then call compile_file.
4618 Exit code is FATAL_EXIT_CODE if can't open files or if there were
4619 any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
4621 It is not safe to call this function more than once. */
4624 toplev_main (argc, argv)
4625 int argc;
4626 char **argv;
4628 register int i;
4629 char *p;
4631 /* save in case md file wants to emit args as a comment. */
4632 save_argc = argc;
4633 save_argv = argv;
4635 p = argv[0] + strlen (argv[0]);
4636 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
4637 --p;
4638 progname = p;
4640 xmalloc_set_program_name (progname);
4642 /* LC_CTYPE determines the character set used by the terminal so it has be set
4643 to output messages correctly. */
4645 #ifdef HAVE_LC_MESSAGES
4646 setlocale (LC_CTYPE, "");
4647 setlocale (LC_MESSAGES, "");
4648 #else
4649 setlocale (LC_ALL, "");
4650 #endif
4652 (void) bindtextdomain (PACKAGE, localedir);
4653 (void) textdomain (PACKAGE);
4655 /* Install handler for SIGFPE, which may be received while we do
4656 compile-time floating point arithmetic. */
4657 signal (SIGFPE, float_signal);
4659 /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */
4660 #ifdef SIGSEGV
4661 signal (SIGSEGV, crash_signal);
4662 #endif
4663 #ifdef SIGILL
4664 signal (SIGILL, crash_signal);
4665 #endif
4666 #ifdef SIGBUS
4667 signal (SIGBUS, crash_signal);
4668 #endif
4669 #ifdef SIGABRT
4670 signal (SIGABRT, crash_signal);
4671 #endif
4672 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
4673 signal (SIGIOT, crash_signal);
4674 #endif
4676 decl_printable_name = decl_name;
4677 lang_expand_expr = (lang_expand_expr_t) do_abort;
4679 /* Initialize whether `char' is signed. */
4680 flag_signed_char = DEFAULT_SIGNED_CHAR;
4681 #ifdef DEFAULT_SHORT_ENUMS
4682 /* Initialize how much space enums occupy, by default. */
4683 flag_short_enums = DEFAULT_SHORT_ENUMS;
4684 #endif
4686 /* Initialize the garbage-collector. */
4687 init_ggc ();
4688 init_stringpool ();
4689 ggc_add_rtx_root (&stack_limit_rtx, 1);
4690 ggc_add_tree_root (&current_function_decl, 1);
4691 ggc_add_tree_root (&current_function_func_begin_label, 1);
4693 /* Initialize the diagnostics reporting machinery. */
4694 initialize_diagnostics ();
4696 /* Register the language-independent parameters. */
4697 add_params (lang_independent_params, LAST_PARAM);
4699 /* Perform language-specific options intialization. */
4700 if (lang_hooks.init_options)
4701 (*lang_hooks.init_options) ();
4703 /* Scan to see what optimization level has been specified. That will
4704 determine the default value of many flags. */
4705 for (i = 1; i < argc; i++)
4707 if (!strcmp (argv[i], "-O"))
4709 optimize = 1;
4710 optimize_size = 0;
4712 else if (argv[i][0] == '-' && argv[i][1] == 'O')
4714 /* Handle -Os, -O2, -O3, -O69, ... */
4715 char *p = &argv[i][2];
4717 if ((p[0] == 's') && (p[1] == 0))
4719 optimize_size = 1;
4721 /* Optimizing for size forces optimize to be 2. */
4722 optimize = 2;
4724 else
4726 const int optimize_val = read_integral_parameter (p, p - 2, -1);
4727 if (optimize_val != -1)
4729 optimize = optimize_val;
4730 optimize_size = 0;
4736 if (optimize >= 1)
4738 flag_defer_pop = 1;
4739 flag_thread_jumps = 1;
4740 #ifdef DELAY_SLOTS
4741 flag_delayed_branch = 1;
4742 #endif
4743 #ifdef CAN_DEBUG_WITHOUT_FP
4744 flag_omit_frame_pointer = 1;
4745 #endif
4746 flag_guess_branch_prob = 1;
4749 if (optimize >= 2)
4751 flag_optimize_sibling_calls = 1;
4752 flag_cse_follow_jumps = 1;
4753 flag_cse_skip_blocks = 1;
4754 flag_gcse = 1;
4755 flag_expensive_optimizations = 1;
4756 flag_strength_reduce = 1;
4757 flag_rerun_cse_after_loop = 1;
4758 flag_rerun_loop_opt = 1;
4759 flag_caller_saves = 1;
4760 flag_force_mem = 1;
4761 flag_peephole2 = 1;
4762 #ifdef INSN_SCHEDULING
4763 flag_schedule_insns = 1;
4764 flag_schedule_insns_after_reload = 1;
4765 #endif
4766 flag_regmove = 1;
4767 flag_strict_aliasing = 1;
4768 flag_delete_null_pointer_checks = 1;
4769 flag_reorder_blocks = 1;
4772 if (optimize >= 3)
4774 flag_inline_functions = 1;
4775 flag_rename_registers = 1;
4778 if (optimize < 2 || optimize_size)
4780 align_loops = 1;
4781 align_jumps = 1;
4782 align_labels = 1;
4783 align_functions = 1;
4786 /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
4787 modify it. */
4788 target_flags = 0;
4789 set_target_switch ("");
4791 /* Unwind tables are always present in an ABI-conformant IA-64
4792 object file, so the default should be ON. */
4793 #ifdef IA64_UNWIND_INFO
4794 flag_unwind_tables = IA64_UNWIND_INFO;
4795 #endif
4797 #ifdef OPTIMIZATION_OPTIONS
4798 /* Allow default optimizations to be specified on a per-machine basis. */
4799 OPTIMIZATION_OPTIONS (optimize, optimize_size);
4800 #endif
4802 /* Initialize register usage now so switches may override. */
4803 init_reg_sets ();
4805 /* Perform normal command line switch decoding. */
4806 for (i = 1; i < argc;)
4808 unsigned int lang_processed;
4809 unsigned int indep_processed;
4811 /* Give the language a chance to decode the option for itself. */
4812 lang_processed = (*lang_hooks.decode_option) (argc - i, argv + i);
4814 /* Now see if the option also has a language independent meaning.
4815 Some options are both language specific and language independent,
4816 eg --help. */
4817 indep_processed = independent_decode_option (argc - i, argv + i);
4819 if (lang_processed || indep_processed)
4820 i += MAX (lang_processed, indep_processed);
4821 else
4823 const char *option = NULL;
4824 const char *lang = NULL;
4825 unsigned int j;
4827 /* It is possible that the command line switch is not valid for the
4828 current language, but it is valid for another language. In order
4829 to be compatible with previous versions of the compiler (which
4830 did not issue an error message in this case) we check for this
4831 possibility here. If we do find a match, then if extra_warnings
4832 is set we generate a warning message, otherwise we will just
4833 ignore the option. */
4834 for (j = 0; j < ARRAY_SIZE (documented_lang_options); j++)
4836 option = documented_lang_options[j].option;
4838 if (option == NULL)
4839 lang = documented_lang_options[j].description;
4840 else if (! strncmp (argv[i], option, strlen (option)))
4841 break;
4844 if (j != ARRAY_SIZE (documented_lang_options))
4846 if (extra_warnings)
4848 warning ("Ignoring command line option '%s'", argv[i]);
4849 if (lang)
4850 warning
4851 ("(It is valid for %s but not the selected language)",
4852 lang);
4855 else if (argv[i][0] == '-' && argv[i][1] == 'g')
4856 warning ("`%s': unknown or unsupported -g option", &argv[i][2]);
4857 else
4858 error ("Unrecognized option `%s'", argv[i]);
4860 i++;
4864 /* All command line options have been processed. */
4865 if (lang_hooks.post_options)
4866 (*lang_hooks.post_options) ();
4868 if (exit_after_options)
4869 exit (0);
4871 /* Reflect any language-specific diagnostic option setting. */
4872 reshape_diagnostic_buffer ();
4874 /* Checker uses the frame pointer. */
4875 if (flag_check_memory_usage)
4876 flag_omit_frame_pointer = 0;
4878 if (optimize == 0)
4880 /* Inlining does not work if not optimizing,
4881 so force it not to be done. */
4882 flag_no_inline = 1;
4883 warn_inline = 0;
4885 /* The c_decode_option function and decode_option hook set
4886 this to `2' if -Wall is used, so we can avoid giving out
4887 lots of errors for people who don't realize what -Wall does. */
4888 if (warn_uninitialized == 1)
4889 warning ("-Wuninitialized is not supported without -O");
4892 #ifdef OVERRIDE_OPTIONS
4893 /* Some machines may reject certain combinations of options. */
4894 OVERRIDE_OPTIONS;
4895 #endif
4897 if (exceptions_via_longjmp == 2)
4899 #ifdef DWARF2_UNWIND_INFO
4900 exceptions_via_longjmp = ! DWARF2_UNWIND_INFO;
4901 #else
4902 #ifdef IA64_UNWIND_INFO
4903 exceptions_via_longjmp = ! IA64_UNWIND_INFO;
4904 #else
4905 exceptions_via_longjmp = 1;
4906 #endif
4907 #endif
4910 /* Since each function gets its own handler data, we can't support the
4911 new model currently, since it depend on a specific rethrow label
4912 which is declared at the front of the table, and we can only
4913 have one such symbol in a file. */
4914 #ifdef IA64_UNWIND_INFO
4915 flag_new_exceptions = 0;
4916 #endif
4918 /* Set up the align_*_log variables, defaulting them to 1 if they
4919 were still unset. */
4920 if (align_loops <= 0) align_loops = 1;
4921 align_loops_log = floor_log2 (align_loops * 2 - 1);
4922 if (align_jumps <= 0) align_jumps = 1;
4923 align_jumps_log = floor_log2 (align_jumps * 2 - 1);
4924 if (align_labels <= 0) align_labels = 1;
4925 align_labels_log = floor_log2 (align_labels * 2 - 1);
4926 if (align_functions <= 0) align_functions = 1;
4927 align_functions_log = floor_log2 (align_functions * 2 - 1);
4929 if (profile_block_flag == 3)
4931 warning ("`-ax' and `-a' are conflicting options. `-a' ignored.");
4932 profile_block_flag = 2;
4935 /* Unrolling all loops implies that standard loop unrolling must also
4936 be done. */
4937 if (flag_unroll_all_loops)
4938 flag_unroll_loops = 1;
4939 /* Loop unrolling requires that strength_reduction be on also. Silently
4940 turn on strength reduction here if it isn't already on. Also, the loop
4941 unrolling code assumes that cse will be run after loop, so that must
4942 be turned on also. */
4943 if (flag_unroll_loops)
4945 flag_strength_reduce = 1;
4946 flag_rerun_cse_after_loop = 1;
4949 /* Warn about options that are not supported on this machine. */
4950 #ifndef INSN_SCHEDULING
4951 if (flag_schedule_insns || flag_schedule_insns_after_reload)
4952 warning ("instruction scheduling not supported on this target machine");
4953 #endif
4954 #ifndef DELAY_SLOTS
4955 if (flag_delayed_branch)
4956 warning ("this target machine does not have delayed branches");
4957 #endif
4959 user_label_prefix = USER_LABEL_PREFIX;
4960 if (flag_leading_underscore != -1)
4962 /* If the default prefix is more complicated than "" or "_",
4963 issue a warning and ignore this option. */
4964 if (user_label_prefix[0] == 0 ||
4965 (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
4967 user_label_prefix = flag_leading_underscore ? "_" : "";
4969 else
4970 warning ("-f%sleading-underscore not supported on this target machine",
4971 flag_leading_underscore ? "" : "no-");
4974 /* If we are in verbose mode, write out the version and maybe all the
4975 option flags in use. */
4976 if (version_flag)
4978 print_version (stderr, "");
4979 if (! quiet_flag)
4980 print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
4983 compile_file (filename);
4985 #if !defined(OS2) && !defined(VMS) && (!defined(_WIN32) || defined (__CYGWIN__)) && !defined(__INTERIX)
4986 if (flag_print_mem)
4988 char *lim = (char *) sbrk (0);
4990 fnotice (stderr, "Data size %ld.\n", (long) (lim - (char *) &environ));
4991 fflush (stderr);
4993 #ifndef __MSDOS__
4994 #ifdef USG
4995 system ("ps -l 1>&2");
4996 #else /* not USG */
4997 system ("ps v");
4998 #endif /* not USG */
4999 #endif
5001 #endif /* ! OS2 && ! VMS && (! _WIN32 || CYGWIN) && ! __INTERIX */
5003 if (errorcount)
5004 return (FATAL_EXIT_CODE);
5005 if (sorrycount)
5006 return (FATAL_EXIT_CODE);
5007 return (SUCCESS_EXIT_CODE);
5010 /* Decode -m switches. */
5011 /* Decode the switch -mNAME. */
5013 static void
5014 set_target_switch (name)
5015 const char *name;
5017 register size_t j;
5018 int valid_target_option = 0;
5020 for (j = 0; j < ARRAY_SIZE (target_switches); j++)
5021 if (!strcmp (target_switches[j].name, name))
5023 if (target_switches[j].value < 0)
5024 target_flags &= ~-target_switches[j].value;
5025 else
5026 target_flags |= target_switches[j].value;
5027 valid_target_option = 1;
5030 #ifdef TARGET_OPTIONS
5031 if (!valid_target_option)
5032 for (j = 0; j < ARRAY_SIZE (target_options); j++)
5034 int len = strlen (target_options[j].prefix);
5035 if (!strncmp (target_options[j].prefix, name, len))
5037 *target_options[j].variable = name + len;
5038 valid_target_option = 1;
5041 #endif
5043 if (!valid_target_option)
5044 error ("Invalid option `%s'", name);
5047 /* Print version information to FILE.
5048 Each line begins with INDENT (for the case where FILE is the
5049 assembler output file). */
5051 static void
5052 print_version (file, indent)
5053 FILE *file;
5054 const char *indent;
5056 #ifndef __VERSION__
5057 #define __VERSION__ "[?]"
5058 #endif
5059 fnotice (file,
5060 #ifdef __GNUC__
5061 "%s%s%s version %s (%s)\n%s\tcompiled by GNU C version %s.\n"
5062 #else
5063 "%s%s%s version %s (%s) compiled by CC.\n"
5064 #endif
5065 , indent, *indent != 0 ? " " : "",
5066 language_string, version_string, TARGET_NAME,
5067 indent, __VERSION__);
5070 /* Print an option value and return the adjusted position in the line.
5071 ??? We don't handle error returns from fprintf (disk full); presumably
5072 other code will catch a disk full though. */
5074 static int
5075 print_single_switch (file, pos, max, indent, sep, term, type, name)
5076 FILE *file;
5077 int pos, max;
5078 const char *indent, *sep, *term, *type, *name;
5080 /* The ultrix fprintf returns 0 on success, so compute the result we want
5081 here since we need it for the following test. */
5082 int len = strlen (sep) + strlen (type) + strlen (name);
5084 if (pos != 0
5085 && pos + len > max)
5087 fprintf (file, "%s", term);
5088 pos = 0;
5090 if (pos == 0)
5092 fprintf (file, "%s", indent);
5093 pos = strlen (indent);
5095 fprintf (file, "%s%s%s", sep, type, name);
5096 pos += len;
5097 return pos;
5100 /* Print active target switches to FILE.
5101 POS is the current cursor position and MAX is the size of a "line".
5102 Each line begins with INDENT and ends with TERM.
5103 Each switch is separated from the next by SEP. */
5105 static void
5106 print_switch_values (file, pos, max, indent, sep, term)
5107 FILE *file;
5108 int pos, max;
5109 const char *indent, *sep, *term;
5111 size_t j;
5112 char **p;
5114 /* Print the options as passed. */
5116 pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
5117 _("options passed: "), "");
5119 for (p = &save_argv[1]; *p != NULL; p++)
5120 if (**p == '-')
5122 /* Ignore these. */
5123 if (strcmp (*p, "-o") == 0)
5125 if (p[1] != NULL)
5126 p++;
5127 continue;
5129 if (strcmp (*p, "-quiet") == 0)
5130 continue;
5131 if (strcmp (*p, "-version") == 0)
5132 continue;
5133 if ((*p)[1] == 'd')
5134 continue;
5136 pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
5138 if (pos > 0)
5139 fprintf (file, "%s", term);
5141 /* Print the -f and -m options that have been enabled.
5142 We don't handle language specific options but printing argv
5143 should suffice. */
5145 pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
5146 _("options enabled: "), "");
5148 for (j = 0; j < ARRAY_SIZE (f_options); j++)
5149 if (*f_options[j].variable == f_options[j].on_value)
5150 pos = print_single_switch (file, pos, max, indent, sep, term,
5151 "-f", f_options[j].string);
5153 /* Print target specific options. */
5155 for (j = 0; j < ARRAY_SIZE (target_switches); j++)
5156 if (target_switches[j].name[0] != '\0'
5157 && target_switches[j].value > 0
5158 && ((target_switches[j].value & target_flags)
5159 == target_switches[j].value))
5161 pos = print_single_switch (file, pos, max, indent, sep, term,
5162 "-m", target_switches[j].name);
5165 #ifdef TARGET_OPTIONS
5166 for (j = 0; j < ARRAY_SIZE (target_options); j++)
5167 if (*target_options[j].variable != NULL)
5169 char prefix[256];
5170 sprintf (prefix, "-m%s", target_options[j].prefix);
5171 pos = print_single_switch (file, pos, max, indent, sep, term,
5172 prefix, *target_options[j].variable);
5174 #endif
5176 fprintf (file, "%s", term);
5179 /* Record the beginning of a new source file, named FILENAME. */
5181 void
5182 debug_start_source_file (filename)
5183 register const char *filename ATTRIBUTE_UNUSED;
5185 #ifdef DBX_DEBUGGING_INFO
5186 if (write_symbols == DBX_DEBUG)
5187 dbxout_start_new_source_file (filename);
5188 #endif
5189 #ifdef DWARF_DEBUGGING_INFO
5190 if (debug_info_level == DINFO_LEVEL_VERBOSE
5191 && write_symbols == DWARF_DEBUG)
5192 dwarfout_start_new_source_file (filename);
5193 #endif /* DWARF_DEBUGGING_INFO */
5194 #ifdef DWARF2_DEBUGGING_INFO
5195 if (write_symbols == DWARF2_DEBUG)
5196 dwarf2out_start_source_file (filename);
5197 #endif /* DWARF2_DEBUGGING_INFO */
5198 #ifdef SDB_DEBUGGING_INFO
5199 if (write_symbols == SDB_DEBUG)
5200 sdbout_start_new_source_file (filename);
5201 #endif
5204 /* Record the resumption of a source file. LINENO is the line number in
5205 the source file we are returning to. */
5207 void
5208 debug_end_source_file (lineno)
5209 register unsigned lineno ATTRIBUTE_UNUSED;
5211 #ifdef DBX_DEBUGGING_INFO
5212 if (write_symbols == DBX_DEBUG)
5213 dbxout_resume_previous_source_file ();
5214 #endif
5215 #ifdef DWARF_DEBUGGING_INFO
5216 if (debug_info_level == DINFO_LEVEL_VERBOSE
5217 && write_symbols == DWARF_DEBUG)
5218 dwarfout_resume_previous_source_file (lineno);
5219 #endif /* DWARF_DEBUGGING_INFO */
5220 #ifdef DWARF2_DEBUGGING_INFO
5221 if (write_symbols == DWARF2_DEBUG)
5222 dwarf2out_end_source_file ();
5223 #endif /* DWARF2_DEBUGGING_INFO */
5224 #ifdef SDB_DEBUGGING_INFO
5225 if (write_symbols == SDB_DEBUG)
5226 sdbout_resume_previous_source_file ();
5227 #endif
5230 /* Called from cb_define in c-lex.c. The `buffer' parameter contains
5231 the tail part of the directive line, i.e. the part which is past the
5232 initial whitespace, #, whitespace, directive-name, whitespace part. */
5234 void
5235 debug_define (lineno, buffer)
5236 register unsigned lineno ATTRIBUTE_UNUSED;
5237 register const char *buffer ATTRIBUTE_UNUSED;
5239 #ifdef DWARF_DEBUGGING_INFO
5240 if (write_symbols == DWARF_DEBUG)
5241 dwarfout_define (lineno, buffer);
5242 #endif /* DWARF_DEBUGGING_INFO */
5243 #ifdef DWARF2_DEBUGGING_INFO
5244 if (write_symbols == DWARF2_DEBUG)
5245 dwarf2out_define (lineno, buffer);
5246 #endif /* DWARF2_DEBUGGING_INFO */
5249 /* Called from cb_undef in c-lex.c. The `buffer' parameter contains
5250 the tail part of the directive line, i.e. the part which is past the
5251 initial whitespace, #, whitespace, directive-name, whitespace part. */
5253 void
5254 debug_undef (lineno, buffer)
5255 register unsigned lineno ATTRIBUTE_UNUSED;
5256 register const char *buffer ATTRIBUTE_UNUSED;
5258 #ifdef DWARF_DEBUGGING_INFO
5259 if (write_symbols == DWARF_DEBUG)
5260 dwarfout_undef (lineno, buffer);
5261 #endif /* DWARF_DEBUGGING_INFO */
5262 #ifdef DWARF2_DEBUGGING_INFO
5263 if (write_symbols == DWARF2_DEBUG)
5264 dwarf2out_undef (lineno, buffer);
5265 #endif /* DWARF2_DEBUGGING_INFO */
5268 /* Returns nonzero if it is appropriate not to emit any debugging
5269 information for BLOCK, because it doesn't contain any instructions.
5270 This may not be the case for blocks containing nested functions, since
5271 we may actually call such a function even though the BLOCK information
5272 is messed up. */
5275 debug_ignore_block (block)
5276 tree block ATTRIBUTE_UNUSED;
5278 /* Never delete the BLOCK for the outermost scope
5279 of the function; we can refer to names from
5280 that scope even if the block notes are messed up. */
5281 if (is_body_block (block))
5282 return 0;
5284 #ifdef DWARF2_DEBUGGING_INFO
5285 if (write_symbols == DWARF2_DEBUG)
5286 return dwarf2out_ignore_block (block);
5287 #endif
5289 return 1;