]> gcc.gnu.org Git - gcc.git/blame - gcc/toplev.c
toplev.c (aux_base_name): Moved from toplev.h.
[gcc.git] / gcc / toplev.c
CommitLineData
4291d9c8 1/* Top level of GNU C compiler
4559fd9e 2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
223b87b6 3 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4291d9c8 4
1322177d 5This file is part of GCC.
4291d9c8 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
4291d9c8 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
4291d9c8
RS
16
17You should have received a copy of the GNU General Public License
1322177d
LB
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
4291d9c8 21
4291d9c8
RS
22/* This is the top level of cc1/c++.
23 It parses command args, opens files, invokes the various passes
24 in the proper order, and counts the time used by each.
25 Error messages and low-level interface to malloc also handled here. */
26
27#include "config.h"
670ee920
KG
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"
4977bab6
ZW
31#include "coretypes.h"
32#include "tm.h"
4291d9c8 33#include <signal.h>
956d6950
JL
34
35#ifdef HAVE_SYS_RESOURCE_H
36# include <sys/resource.h>
37#endif
38
39#ifdef HAVE_SYS_TIMES_H
40# include <sys/times.h>
eb910b5a 41#endif
4291d9c8
RS
42
43#include "input.h"
44#include "tree.h"
4291d9c8 45#include "rtl.h"
6baf1cc8 46#include "tm_p.h"
4291d9c8
RS
47#include "flags.h"
48#include "insn-attr.h"
e5e809f4 49#include "insn-config.h"
0dd0e980 50#include "insn-flags.h"
23280139 51#include "hard-reg-set.h"
e5e809f4 52#include "recog.h"
e14417fa 53#include "output.h"
3d195391 54#include "except.h"
49ad7cfa 55#include "function.h"
a0c8e1b2 56#include "toplev.h"
114791ea 57#include "expr.h"
b1eeb243 58#include "basic-block.h"
ab87f8c8 59#include "intl.h"
0a25f1f5 60#include "ggc.h"
6a2cc2ac 61#include "graph.h"
272df862 62#include "loop.h"
d0af450d 63#include "regs.h"
2a9a326b 64#include "timevar.h"
764dbbf2 65#include "diagnostic.h"
b53978a3 66#include "ssa.h"
c6d9a88c 67#include "params.h"
8461e984 68#include "reload.h"
5262d6b6 69#include "dwarf2asm.h"
c0e7830f 70#include "integrate.h"
efdc7e19 71#include "real.h"
a51d908e 72#include "debug.h"
7c262518 73#include "target.h"
d23c55c2 74#include "langhooks.h"
0478a14c 75#include "cfglayout.h"
3d436d2a 76#include "cfgloop.h"
476d9098 77#include "hosthooks.h"
f246a305 78
76ead72b
RL
79#if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
80#include "dwarf2out.h"
81#endif
82
4f70758f 83#if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
76ead72b
RL
84#include "dbxout.h"
85#endif
86
87#ifdef SDB_DEBUGGING_INFO
88#include "sdbout.h"
89#endif
440aabf8
NB
90
91#ifdef XCOFF_DEBUGGING_INFO
92#include "xcoffout.h" /* Needed for external data
93 declarations for e.g. AIX 4.x. */
94#endif
4291d9c8 95\f
b0316e35
RS
96/* Carry information from ASM_DECLARE_OBJECT_NAME
97 to ASM_FINISH_DECLARE_OBJECT. */
98
99extern int size_directive_output;
5e10b3cc 100extern tree last_assemble_variable_decl;
b0316e35 101
ed8d2920
MM
102extern void reg_alloc PARAMS ((void));
103
f5e99456 104static void general_init PARAMS ((char *));
c79043f3 105static void parse_options_and_default_flags PARAMS ((int, char **));
b1cbe78c 106static void do_compile PARAMS ((int));
f5e99456 107static void process_options PARAMS ((void));
c79043f3 108static void backend_init PARAMS ((void));
22703ccc 109static int lang_dependent_init PARAMS ((const char *));
f5e99456 110static void init_asm_output PARAMS ((const char *));
22703ccc 111static void finalize PARAMS ((void));
f5e99456 112
58782098 113static void set_target_switch PARAMS ((const char *));
6ed551b4 114
a7023245 115static void crash_signal PARAMS ((int)) ATTRIBUTE_NORETURN;
886e0865 116static void setup_core_dumping PARAMS ((void));
f5e99456 117static void compile_file PARAMS ((void));
58782098 118static void display_help PARAMS ((void));
10501d8f 119static void display_target_options PARAMS ((void));
58782098
KG
120
121static void decode_d_option PARAMS ((const char *));
61098249
RH
122static int decode_f_option PARAMS ((const char *));
123static int decode_W_option PARAMS ((const char *));
124static int decode_g_option PARAMS ((const char *));
319ea138 125static unsigned int independent_decode_option PARAMS ((int, char **));
58782098
KG
126
127static void print_version PARAMS ((FILE *, const char *));
128static int print_single_switch PARAMS ((FILE *, int, int, const char *,
87e11268
KG
129 const char *, const char *,
130 const char *, const char *));
58782098 131static void print_switch_values PARAMS ((FILE *, int, int, const char *,
87e11268 132 const char *, const char *));
735a0e33 133
ff45c01e
NB
134/* Nonzero to dump debug info whilst parsing (-dy option). */
135static int set_yydebug;
136
3d5cdd42
DE
137/* Length of line when printing switch values. */
138#define MAX_LINE 75
139
4291d9c8
RS
140/* Name of program invoked, sans directories. */
141
7adfcfed 142const char *progname;
4291d9c8 143
aa5b94de 144/* Copy of arguments to toplev_main. */
4291d9c8
RS
145int save_argc;
146char **save_argv;
147\f
148/* Name of current original source file (what was input to cpp).
149 This comes from each #-command in the actual input. */
150
3b304f5b 151const char *input_filename;
4291d9c8
RS
152
153/* Name of top-level original source file (what was input to cpp).
154 This comes from the #-command at the beginning of the actual input.
155 If there isn't any there, then this is the cc1 input file name. */
156
3b304f5b 157const char *main_input_filename;
4291d9c8 158
4291d9c8
RS
159/* Current line number in real source file. */
160
161int lineno;
162
f1db3576
JL
163/* Nonzero if it is unsafe to create any new pseudo registers. */
164int no_new_pseudos;
165
4291d9c8
RS
166/* Stack of currently pending input files. */
167
168struct file_stack *input_file_stack;
169
170/* Incremented on each change to input_file_stack. */
171int input_file_stack_tick;
172
4291d9c8
RS
173/* Name to use as base of names for dump output files. */
174
87e11268 175const char *dump_base_name;
4291d9c8 176
ea67fe71
NS
177/* Name to use as a base for auxiliary output files. */
178
b1cbe78c 179static const char *aux_base_name;
ea67fe71 180
6baf9874
DR
181/* Format to use to print dumpfile index value */
182#ifndef DUMPFILE_FORMAT
183#define DUMPFILE_FORMAT ".%02d."
184#endif
185
4291d9c8
RS
186/* Bit flags that specify the machine subtype we are compiling for.
187 Bits are tested using macros TARGET_... defined in the tm.h file
188 and set by `-m...' switches. Must be defined in rtlanal.c. */
189
190extern int target_flags;
191
a27fb29b
RS
192/* A mask of target_flags that includes bit X if X was set or cleared
193 on the command line. */
194
195int target_flags_explicit;
196
a51d908e
NB
197/* Debug hooks - dependent upon command line options. */
198
54b6670a 199const struct gcc_debug_hooks *debug_hooks = &do_nothing_debug_hooks;
a51d908e 200
61098249
RH
201/* Describes a dump file. */
202
203struct dump_file_info
204{
205 /* The unique extension to apply, e.g. ".jump". */
854a97f0 206 const char *const extension;
61098249
RH
207
208 /* The -d<c> character that enables this dump file. */
209 char const debug_switch;
210
211 /* True if there is a corresponding graph dump file. */
212 char const graph_dump_p;
213
214 /* True if the user selected this dump. */
215 char enabled;
216
217 /* True if the files have been initialized (ie truncated). */
218 char initialized;
219};
220
221/* Enumerate the extant dump files. */
222
223enum dump_file_index
224{
225 DFI_rtl,
48d9ade5 226 DFI_sibling,
52a11cbf 227 DFI_eh,
61098249 228 DFI_jump,
61098249 229 DFI_ssa,
0b47e4c1 230 DFI_ssa_ccp,
62d285ff 231 DFI_ssa_dce,
61098249 232 DFI_ussa,
38c1593d 233 DFI_null,
0826f1d8
JL
234 DFI_cse,
235 DFI_addressof,
61098249
RH
236 DFI_gcse,
237 DFI_loop,
a0134312 238 DFI_bypass,
51891abe 239 DFI_cfg,
61098249 240 DFI_bp,
0fb53e68 241 DFI_ce1,
5c856b23 242 DFI_tracer,
617b465c 243 DFI_loop2,
38c1593d 244 DFI_cse2,
51891abe 245 DFI_life,
61098249 246 DFI_combine,
0fb53e68 247 DFI_ce2,
61098249
RH
248 DFI_regmove,
249 DFI_sched,
250 DFI_lreg,
251 DFI_greg,
8bb16620 252 DFI_postreload,
61098249
RH
253 DFI_flow2,
254 DFI_peephole2,
5fa41e13 255 DFI_rnreg,
0fb53e68 256 DFI_ce3,
b9422b69 257 DFI_bbro,
61098249 258 DFI_sched2,
1e5fd094 259 DFI_stack,
61098249
RH
260 DFI_mach,
261 DFI_dbr,
61098249
RH
262 DFI_MAX
263};
264
265/* Describes all the dump files. Should be kept in order of the
9ec6d7ab
RH
266 pass and in sync with dump_file_index above.
267
268 Remaining -d letters:
269
38c1593d 270 " o q "
1e5fd094 271 " H JK OPQ TUV YZ"
9ec6d7ab 272*/
61098249 273
c083a819 274static struct dump_file_info dump_file[DFI_MAX] =
61098249
RH
275{
276 { "rtl", 'r', 0, 0, 0 },
48d9ade5 277 { "sibling", 'i', 0, 0, 0 },
52a11cbf 278 { "eh", 'h', 0, 0, 0 },
61098249 279 { "jump", 'j', 0, 0, 0 },
61098249 280 { "ssa", 'e', 1, 0, 0 },
0b47e4c1 281 { "ssaccp", 'W', 1, 0, 0 },
62d285ff 282 { "ssadce", 'X', 1, 0, 0 },
61098249 283 { "ussa", 'e', 1, 0, 0 }, /* Yes, duplicate enable switch. */
38c1593d 284 { "null", 'u', 0, 0, 0 },
0826f1d8
JL
285 { "cse", 's', 0, 0, 0 },
286 { "addressof", 'F', 0, 0, 0 },
61098249
RH
287 { "gcse", 'G', 1, 0, 0 },
288 { "loop", 'L', 1, 0, 0 },
a0134312 289 { "bypass", 'G', 1, 0, 0 }, /* Yes, duplicate enable switch. */
51891abe 290 { "cfg", 'f', 1, 0, 0 },
61098249 291 { "bp", 'b', 1, 0, 0 },
a9a4005f 292 { "ce1", 'C', 1, 0, 0 },
5c856b23 293 { "tracer", 'T', 1, 0, 0 },
617b465c 294 { "loop2", 'L', 1, 0, 0 },
38c1593d 295 { "cse2", 't', 1, 0, 0 },
51891abe 296 { "life", 'f', 1, 0, 0 }, /* Yes, duplicate enable switch. */
61098249 297 { "combine", 'c', 1, 0, 0 },
0fb53e68 298 { "ce2", 'C', 1, 0, 0 },
61098249
RH
299 { "regmove", 'N', 1, 0, 0 },
300 { "sched", 'S', 1, 0, 0 },
301 { "lreg", 'l', 1, 0, 0 },
302 { "greg", 'g', 1, 0, 0 },
8bb16620 303 { "postreload", 'o', 1, 0, 0 },
61098249
RH
304 { "flow2", 'w', 1, 0, 0 },
305 { "peephole2", 'z', 1, 0, 0 },
5fa41e13 306 { "rnreg", 'n', 1, 0, 0 },
0fb53e68 307 { "ce3", 'E', 1, 0, 0 },
b9422b69 308 { "bbro", 'B', 1, 0, 0 },
61098249 309 { "sched2", 'R', 1, 0, 0 },
1e5fd094 310 { "stack", 'k', 1, 0, 0 },
61098249
RH
311 { "mach", 'M', 1, 0, 0 },
312 { "dbr", 'd', 0, 0, 0 },
61098249
RH
313};
314
315static int open_dump_file PARAMS ((enum dump_file_index, tree));
316static void close_dump_file PARAMS ((enum dump_file_index,
317 void (*) (FILE *, rtx), rtx));
318
319/* Other flags saying which kinds of debugging dump have been requested. */
320
321int rtl_dump_and_exit;
322int flag_print_asm_name;
61098249 323static int version_flag;
b1cbe78c 324static const char *filename;
735a0e33 325enum graph_dump_types graph_dump_format;
4291d9c8
RS
326
327/* Name for output file of assembly code, specified with -o. */
328
329char *asm_file_name;
330
331/* Value of the -G xx switch, and whether it was passed or not. */
332int g_switch_value;
333int g_switch_set;
334
335/* Type(s) of debugging information we are producing (if any).
336 See flags.h for the definitions of the different possible
337 types of debugging information. */
338enum debug_info_type write_symbols = NO_DEBUG;
339
340/* Level of debugging information we are producing. See flags.h
341 for the definitions of the different possible levels. */
342enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
343
a53d0bcc
RS
344/* Nonzero means use GNU-only extensions in the generated symbolic
345 debugging information. */
346/* Currently, this only has an effect when write_symbols is set to
347 DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
348int use_gnu_debug_info_extensions = 0;
4291d9c8
RS
349
350/* Nonzero means do optimizations. -O.
351 Particular numeric values stand for particular amounts of optimization;
352 thus, -O2 stores 2 here. However, the optimizations beyond the basic
353 ones are not controlled directly by this variable. Instead, they are
354 controlled by individual `flag_...' variables that are defaulted
355 based on this variable. */
356
357int optimize = 0;
358
c6aded7c 359/* Nonzero means optimize for size. -Os.
0e9e1e0a
KH
360 The only valid values are zero and nonzero. When optimize_size is
361 nonzero, optimize defaults to 2, but certain individual code
c6aded7c
AG
362 bloating optimizations are disabled. */
363
364int optimize_size = 0;
365
cb773845
ZW
366/* Nonzero if we should exit after parsing options. */
367static int exit_after_options = 0;
368
00262c8a
ML
369/* The FUNCTION_DECL for the function currently being compiled,
370 or 0 if between functions. */
371tree current_function_decl;
372
373/* Set to the FUNC_BEGIN label of the current function, or NULL_TREE
374 if none. */
375tree current_function_func_begin_label;
376
881c6935
JM
377/* Nonzero if doing dwarf2 duplicate elimination. */
378
379int flag_eliminate_dwarf2_dups = 0;
380
73c68f61
SS
381/* Nonzero if doing unused type elimination. */
382
9552a3e3 383int flag_eliminate_unused_debug_types = 1;
73c68f61 384
4291d9c8
RS
385/* Nonzero if generating code to do profiling. */
386
387int profile_flag = 0;
388
0d332add
DE
389/* Nonzero if generating code to profile program flow graph arcs. */
390
391int profile_arc_flag = 0;
392
393/* Nonzero if generating info for gcov to calculate line test coverage. */
394
395int flag_test_coverage = 0;
396
397/* Nonzero indicates that branch taken probabilities should be calculated. */
398
399int flag_branch_probabilities = 0;
400
854a97f0 401/* Nonzero if basic blocks should be reordered. */
11bdd2ae
SC
402
403int flag_reorder_blocks = 0;
404
194734e9
JH
405/* Nonzero if functions should be reordered. */
406
407int flag_reorder_functions = 0;
408
854a97f0 409/* Nonzero if registers should be renamed. */
7b82b5da
SC
410
411int flag_rename_registers = 0;
8582c27b 412int flag_cprop_registers = 0;
7b82b5da 413
4291d9c8
RS
414/* Nonzero for -pedantic switch: warn about anything
415 that standard spec forbids. */
416
417int pedantic = 0;
418
419/* Temporarily suppress certain warnings.
420 This is set while reading code from a system header file. */
421
422int in_system_header = 0;
423
fba0bfd4 424/* Don't print functions as they are compiled. -quiet. */
4291d9c8
RS
425
426int quiet_flag = 0;
fba0bfd4
ZW
427
428/* Print times taken by the various passes. -ftime-report. */
429
430int time_report = 0;
431
432/* Print memory still in use at end of compilation (which may have little
433 to do with peak memory consumption). -fmem-report. */
434
435int mem_report = 0;
436
272d0bee 437/* Nonzero means to collect statistics which might be expensive
0e5921e8
ZW
438 and to print them when we are done. */
439int flag_detailed_statistics = 0;
440
4291d9c8
RS
441\f
442/* -f flags. */
443
444/* Nonzero means `char' should be signed. */
445
446int flag_signed_char;
447
448/* Nonzero means give an enum type only as many bytes as it needs. */
449
450int flag_short_enums;
451
452/* Nonzero for -fcaller-saves: allocate values in regs that need to
453 be saved across function calls, if that produces overall better code.
454 Optional now, so people can test it. */
455
456#ifdef DEFAULT_CALLER_SAVES
457int flag_caller_saves = 1;
458#else
459int flag_caller_saves = 0;
460#endif
461
958ec8ca
JW
462/* Nonzero if structures and unions should be returned in memory.
463
464 This should only be defined if compatibility with another compiler or
465 with an ABI is needed, because it results in slower code. */
466
467#ifndef DEFAULT_PCC_STRUCT_RETURN
468#define DEFAULT_PCC_STRUCT_RETURN 1
469#endif
470
4291d9c8
RS
471/* Nonzero for -fpcc-struct-return: return values the same way PCC does. */
472
958ec8ca 473int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
4291d9c8
RS
474
475/* Nonzero for -fforce-mem: load memory value into a register
476 before arithmetic on it. This makes better cse but slower compilation. */
477
478int flag_force_mem = 0;
479
480/* Nonzero for -fforce-addr: load memory address into a register before
481 reference to memory. This makes better cse but slower compilation. */
482
483int flag_force_addr = 0;
484
485/* Nonzero for -fdefer-pop: don't pop args after each function call;
486 instead save them up to pop many calls' args with one insns. */
487
6731a3e3 488int flag_defer_pop = 0;
4291d9c8
RS
489
490/* Nonzero for -ffloat-store: don't allocate floats and doubles
491 in extended-precision registers. */
492
493int flag_float_store = 0;
494
495/* Nonzero for -fcse-follow-jumps:
496 have cse follow jumps to do a more extensive job. */
497
498int flag_cse_follow_jumps;
499
8b3686ed
RK
500/* Nonzero for -fcse-skip-blocks:
501 have cse follow a branch around a block. */
502int flag_cse_skip_blocks;
503
4291d9c8
RS
504/* Nonzero for -fexpensive-optimizations:
505 perform miscellaneous relatively-expensive optimizations. */
506int flag_expensive_optimizations;
507
508/* Nonzero for -fthread-jumps:
509 have jump optimize output of loop. */
510
511int flag_thread_jumps;
512
513/* Nonzero enables strength-reduction in loop.c. */
514
515int flag_strength_reduce = 0;
516
517/* Nonzero enables loop unrolling in unroll.c. Only loops for which the
518 number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
519 UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
520 unrolled. */
521
b17d5d7c 522int flag_old_unroll_loops;
4291d9c8
RS
523
524/* Nonzero enables loop unrolling in unroll.c. All loops are unrolled.
525 This is generally not a win. */
526
b17d5d7c
ZD
527int flag_old_unroll_all_loops;
528
529/* Enables unrolling of simple loops in loop-unroll.c. */
530int flag_unroll_loops;
531
532/* Enables unrolling of all loops in loop-unroll.c. */
4291d9c8
RS
533int flag_unroll_all_loops;
534
b17d5d7c
ZD
535/* Nonzero enables loop peeling. */
536int flag_peel_loops;
537
617b465c
ZD
538/* Nonzero enables loop unswitching. */
539int flag_unswitch_loops;
540
0dd0e980
JH
541/* Nonzero enables prefetch optimizations for arrays in loops. */
542
543int flag_prefetch_loop_arrays;
544
e5eb27e5 545/* Nonzero forces all invariant computations in loops to be moved
854a97f0 546 outside the loop. */
e5eb27e5
JL
547
548int flag_move_all_movables = 0;
549
550/* Nonzero forces all general induction variables in loops to be
854a97f0 551 strength reduced. */
e5eb27e5
JL
552
553int flag_reduce_all_givs = 0;
554
9ec36da5
JL
555/* Nonzero to perform full register move optimization passes. This is the
556 default for -O2. */
557
558int flag_regmove = 0;
559
4291d9c8
RS
560/* Nonzero for -fwritable-strings:
561 store string constants in data segment and don't uniquize them. */
562
563int flag_writable_strings = 0;
564
565/* Nonzero means don't put addresses of constant functions in registers.
566 Used for compiling the Unix kernel, where strange substitutions are
567 done on the assembly output. */
568
569int flag_no_function_cse = 0;
570
571/* Nonzero for -fomit-frame-pointer:
572 don't make a frame pointer in simple functions that don't require one. */
573
574int flag_omit_frame_pointer = 0;
575
cf440348
JL
576/* Nonzero means place each function into its own section on those platforms
577 which support arbitrary section names and unlimited numbers of sections. */
578
579int flag_function_sections = 0;
580
fd868572 581/* ... and similar for data. */
854a97f0 582
fd868572
CM
583int flag_data_sections = 0;
584
4291d9c8
RS
585/* Nonzero to inhibit use of define_optimization peephole opts. */
586
587int flag_no_peephole = 0;
588
db8cb48e
JH
589/* Nonzero allows GCC to optimize sibling and tail recursive calls. */
590
591int flag_optimize_sibling_calls = 0;
592
41af162c 593/* Nonzero means the front end generally wants `errno' maintained by math
de6c5979 594 operations, like built-in SQRT. */
41af162c
CB
595
596int flag_errno_math = 1;
597
de6c5979
BL
598/* Nonzero means that unsafe floating-point math optimizations are allowed
599 for the sake of speed. IEEE compliance is not guaranteed, and operations
600 are allowed to assume that their arguments and results are "normal"
601 (e.g., nonnegative for SQRT). */
602
603int flag_unsafe_math_optimizations = 0;
604
2e8f2e8f
TM
605/* Nonzero means that no NaNs or +-Infs are expected. */
606
607int flag_finite_math_only = 0;
608
de6c5979
BL
609/* Zero means that floating-point math operations cannot generate a
610 (user-visible) trap. This is the case, for example, in nonstop
52bfebf0 611 IEEE 754 arithmetic. Trapping conditions include division by zero,
26182e15 612 overflow, underflow, invalid and inexact, but does not include
52bfebf0 613 operations on signaling NaNs (see below). */
de6c5979
BL
614
615int flag_trapping_math = 1;
616
52bfebf0
RS
617/* Nonzero means disable transformations observable by signaling NaNs.
618 This option implies that any operation on a IEEE signaling NaN can
619 generate a (user-visible) trap. */
620
621int flag_signaling_nans = 0;
622
c64f913e
CB
623/* 0 means straightforward implementation of complex divide acceptable.
624 1 means wide ranges of inputs must work for complex divide.
526aba28 625 2 means C99-like requirements for complex divide (not yet implemented). */
c64f913e
CB
626
627int flag_complex_divide_method = 0;
628
4291d9c8
RS
629/* Nonzero means just do syntax checking; don't output anything. */
630
631int flag_syntax_only = 0;
632
96327cdc
JH
633/* Nonzero means perform loop optimizer. */
634
635static int flag_loop_optimize;
636
637/* Nonzero means perform crossjumping. */
638
639static int flag_crossjumping;
640
2c4b77f3
JH
641/* Nonzero means perform if conversion. */
642
643static int flag_if_conversion;
644
645/* Nonzero means perform if conversion after reload. */
646
647static int flag_if_conversion2;
648
b6d24183
JL
649/* Nonzero means to use global dataflow analysis to eliminate
650 useless null pointer tests. */
651
652static int flag_delete_null_pointer_checks;
653
34ee7f82
RS
654/* Nonzero means perform global CSE. */
655
656int flag_gcse = 0;
657
a13d4ebf
AM
658/* Nonzero means to do the enhanced load motion during gcse, which trys
659 to hoist loads by not killing them when a store to the same location
660 is seen. */
661
662int flag_gcse_lm = 1;
663
664/* Nonzero means to perform store motion after gcse, which will try to
665 move stores closer to the exit block. Its not very effective without
666 flag_gcse_lm. */
667
668int flag_gcse_sm = 1;
669
4291d9c8
RS
670/* Nonzero means to rerun cse after loop optimization. This increases
671 compilation time about 20% and picks up a few more common expressions. */
672
673static int flag_rerun_cse_after_loop;
674
6d6d0fa0
JL
675/* Nonzero means to run loop optimizations twice. */
676
64fde701 677int flag_rerun_loop_opt;
6d6d0fa0 678
4291d9c8
RS
679/* Nonzero for -finline-functions: ok to inline functions that look like
680 good inline candidates. */
681
682int flag_inline_functions;
683
684/* Nonzero for -fkeep-inline-functions: even if we make a function
ac2a9454 685 go inline everywhere, keep its definition around for debugging
4291d9c8
RS
686 purposes. */
687
688int flag_keep_inline_functions;
689
fadb3bc9 690/* Nonzero means that functions will not be inlined. */
4291d9c8 691
b0148884 692int flag_no_inline = 2;
4291d9c8 693
2cb921f4
AH
694/* Nonzero means that we don't want inlining by virtue of -fno-inline,
695 not just because the tree inliner turned us off. */
696
b0148884 697int flag_really_no_inline = 2;
2cb921f4 698
fbe912dd
BK
699/* Nonzero means that we should emit static const variables
700 regardless of whether or not optimization is turned on. */
701
702int flag_keep_static_consts = 1;
703
4291d9c8
RS
704/* Nonzero means we should be saving declaration info into a .X file. */
705
706int flag_gen_aux_info = 0;
707
f246a305
RS
708/* Specified name of aux-info file. */
709
710static char *aux_info_file_name;
711
4291d9c8
RS
712/* Nonzero means make the text shared if supported. */
713
714int flag_shared_data;
715
716/* Nonzero means schedule into delayed branch slots if supported. */
717
718int flag_delayed_branch;
719
720/* Nonzero if we are compiling pure (sharable) code.
3d78f2e9
RH
721 Value is 1 if we are doing "small" pic; value is 2 if we're doing
722 "large" pic. */
4291d9c8
RS
723
724int flag_pic;
725
3d78f2e9
RH
726/* Set to the default thread-local storage (tls) model to use. */
727
755ac5d4 728enum tls_model flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
3d78f2e9 729
3d195391
MS
730/* Nonzero means generate extra code for exception handling and enable
731 exception handling. */
732
b53beeb2 733int flag_exceptions;
3d195391 734
854a97f0 735/* Nonzero means generate frame unwind info table when supported. */
14a774a9
RK
736
737int flag_unwind_tables = 0;
738
b932f770
JH
739/* Nonzero means generate frame unwind info table exact at each insn boundary */
740
741int flag_asynchronous_unwind_tables = 0;
742
2786cbad 743/* Nonzero means don't place uninitialized global data in common storage
3d195391 744 by default. */
4291d9c8
RS
745
746int flag_no_common;
747
4291d9c8
RS
748/* Nonzero means change certain warnings into errors.
749 Usually these are warnings about failure to conform to some standard. */
750
751int flag_pedantic_errors = 0;
752
753/* flag_schedule_insns means schedule insns within basic blocks (before
754 local_alloc).
755 flag_schedule_insns_after_reload means schedule insns after
756 global_alloc. */
757
758int flag_schedule_insns = 0;
759int flag_schedule_insns_after_reload = 0;
760
b9422b69
JH
761/* When flag_schedule_insns_after_reload is set, use EBB scheduler. */
762int flag_sched2_use_superblocks = 0;
763
764/* When flag_schedule_insns_after_reload is set, construct traces and EBB
765 scheduler. */
766int flag_sched2_use_traces = 0;
767
8c660648
JL
768/* The following flags have effect only for scheduling before register
769 allocation:
770
14b493d6 771 flag_schedule_interblock means schedule insns across basic blocks.
8c660648
JL
772 flag_schedule_speculative means allow speculative motion of non-load insns.
773 flag_schedule_speculative_load means allow speculative motion of some
774 load insns.
775 flag_schedule_speculative_load_dangerous allows speculative motion of more
8e7336f8 776 load insns. */
8c660648
JL
777
778int flag_schedule_interblock = 1;
779int flag_schedule_speculative = 1;
780int flag_schedule_speculative_load = 0;
781int flag_schedule_speculative_load_dangerous = 0;
8c660648 782
46d3a873
CC
783int flag_single_precision_constant;
784
5527bf14 785/* flag_branch_on_count_reg means try to replace add-1,compare,branch tupple
854a97f0 786 by a cheaper branch on a count register. */
5527bf14 787int flag_branch_on_count_reg = 1;
8c660648 788
4291d9c8 789/* -finhibit-size-directive inhibits output of .size for ELF.
854a97f0 790 This is used only for compiling crtstuff.c,
4291d9c8
RS
791 and it may be extended to other effects
792 needed for crtstuff.c on other systems. */
793int flag_inhibit_size_directive = 0;
794
9a631e8e
RS
795/* -fverbose-asm causes extra commentary information to be produced in
796 the generated assembly code (to make it more readable). This option
797 is generally only of use to those who actually need to read the
3d5cdd42 798 generated assembly code (perhaps while debugging the compiler itself).
c85f7c16 799 -fno-verbose-asm, the default, causes the extra information
3d5cdd42
DE
800 to be omitted and is useful when comparing two assembler files. */
801
c85f7c16 802int flag_verbose_asm = 0;
9a631e8e 803
3d5cdd42
DE
804/* -dA causes debug commentary information to be produced in
805 the generated assembly code (to make it more readable). This option
806 is generally only of use to those who actually need to read the
807 generated assembly code (perhaps while debugging the compiler itself).
808 Currently, this switch is only used by dwarfout.c; however, it is intended
809 to be a catchall for printing debug information in the assembler file. */
810
811int flag_debug_asm = 0;
9a631e8e 812
c349e40b
SC
813/* -dP causes the rtl to be emitted as a comment in assembly. */
814
815int flag_dump_rtl_in_asm = 0;
816
4291d9c8 817/* -fgnu-linker specifies use of the GNU linker for initializations.
d68c507d
RS
818 (Or, more generally, a linker that handles initializations.)
819 -fno-gnu-linker says that collect2 will be used. */
820#ifdef USE_COLLECT2
821int flag_gnu_linker = 0;
822#else
4291d9c8 823int flag_gnu_linker = 1;
d68c507d 824#endif
4291d9c8 825
27b41650
KG
826/* Nonzero means put zero initialized data in the bss section. */
827int flag_zero_initialized_in_bss = 1;
828
d9d4fb43
AS
829/* Enable SSA. */
830int flag_ssa = 0;
831
0b47e4c1
JL
832/* Enable ssa conditional constant propagation. */
833int flag_ssa_ccp = 0;
834
835/* Enable ssa aggressive dead code elimination. */
62d285ff 836int flag_ssa_dce = 0;
b53978a3 837
854a97f0 838/* Tag all structures with __attribute__(packed). */
566cdc73
MM
839int flag_pack_struct = 0;
840
bd83d0ac
RK
841/* Emit code to check for stack overflow; also may cause large objects
842 to be allocated dynamically. */
843int flag_stack_check;
844
a157febd
GK
845/* When non-NULL, indicates that whenever space is allocated on the
846 stack, the resulting stack pointer must not pass this
847 address---that is, for stacks that grow downward, the stack pointer
848 must always be greater than or equal to this address; for stacks
849 that grow upward, the stack pointer must be less than this address.
850 At present, the rtx may be either a REG or a SYMBOL_REF, although
851 the support provided depends on the backend. */
852rtx stack_limit_rtx;
853
9ae8ffe7
JL
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. */
860int flag_argument_noalias = 0;
861
41472af8
MM
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. */
866int flag_strict_aliasing = 0;
867
07417085
KR
868/* Instrument functions with calls at entry and exit, for profiling. */
869int flag_instrument_function_entry_exit = 0;
870
be163a70
ZW
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. */
874
875int flag_no_ident = 0;
b8468bc7 876
854a97f0 877/* This will perform a peephole pass before sched2. */
ede7cd44
RH
878int flag_peephole2 = 0;
879
3ff51205
AH
880/* This will try to guess branch probabilities. */
881int flag_guess_branch_prob = 0;
882
a8aa7975 883/* -fcheck-bounds causes gcc to generate array bounds checks.
e03b7153 884 For C, C++, ObjC: defaults to off.
a8aa7975 885 For Java: defaults to on.
e03b7153 886 For Fortran: defaults to off. */
a8aa7975
GM
887int flag_bounds_check = 0;
888
201556f0
JJ
889/* This will attempt to merge constant section constants, if 1 only
890 string constants and constants from constant pool, if 2 also constant
891 variables. */
892int flag_merge_constants = 1;
893
673b5311
MM
894/* If one, renumber instruction UIDs to reduce the number of
895 unused UIDs if there are a lot of instructions. If greater than
896 one, unconditionally renumber instruction UIDs. */
897int flag_renumber_insns = 1;
898
ed8d2920
MM
899/* If nonzero, use the graph coloring register allocator. */
900int flag_new_regalloc = 0;
901
5c856b23
JH
902/* Nonzero if we perform superblock formation. */
903
904int flag_tracer = 0;
905
e72fcfe8
JH
906/* Nonzero if we perform whole unit at a time compilation. */
907
908int flag_unit_at_a_time = 0;
909
854a97f0
KH
910/* Values of the -falign-* flags: how much to align labels in code.
911 0 means `use default', 1 means `don't align'.
efa3896a
GK
912 For each variable, there is an _log variant which is the power
913 of two not less than the variable, for .align output. */
914
915int align_loops;
916int align_loops_log;
2cca7283 917int align_loops_max_skip;
efa3896a
GK
918int align_jumps;
919int align_jumps_log;
2cca7283 920int align_jumps_max_skip;
efa3896a
GK
921int align_labels;
922int align_labels_log;
2cca7283 923int align_labels_max_skip;
efa3896a
GK
924int align_functions;
925int align_functions_log;
926
f963b5d9
RS
927/* Like align_functions_log above, but used by front-ends to force the
928 minimum function alignment. Zero means no alignment is forced. */
929int force_align_functions_log;
930
b8468bc7 931/* Table of supported debugging formats. */
8b60264b 932static const struct
b8468bc7 933{
8b60264b 934 const char *const arg;
b8468bc7
NC
935 /* Since PREFERRED_DEBUGGING_TYPE isn't necessarily a
936 constant expression, we use NO_DEBUG in its place. */
8b60264b
KG
937 const enum debug_info_type debug_type;
938 const int use_extensions_p;
939 const char *const description;
b8468bc7
NC
940} *da,
941debug_args[] =
942{
39dd8003 943 { "", NO_DEBUG, DEFAULT_GDB_EXTENSIONS,
a6371940
ZW
944 N_("Generate debugging info in default format") },
945 { "gdb", NO_DEBUG, 1, N_("Generate debugging info in default extended format") },
b8468bc7 946#ifdef DBX_DEBUGGING_INFO
a6371940
ZW
947 { "stabs", DBX_DEBUG, 0, N_("Generate STABS format debug info") },
948 { "stabs+", DBX_DEBUG, 1, N_("Generate extended STABS format debug info") },
b8468bc7
NC
949#endif
950#ifdef DWARF_DEBUGGING_INFO
a6371940 951 { "dwarf", DWARF_DEBUG, 0, N_("Generate DWARF-1 format debug info") },
39dd8003 952 { "dwarf+", DWARF_DEBUG, 1,
a6371940 953 N_("Generate extended DWARF-1 format debug info") },
b8468bc7
NC
954#endif
955#ifdef DWARF2_DEBUGGING_INFO
a6371940 956 { "dwarf-2", DWARF2_DEBUG, 0, N_("Generate DWARF-2 debug info") },
b8468bc7
NC
957#endif
958#ifdef XCOFF_DEBUGGING_INFO
a6371940
ZW
959 { "xcoff", XCOFF_DEBUG, 0, N_("Generate XCOFF format debug info") },
960 { "xcoff+", XCOFF_DEBUG, 1, N_("Generate extended XCOFF format debug info") },
b8468bc7
NC
961#endif
962#ifdef SDB_DEBUGGING_INFO
a6371940 963 { "coff", SDB_DEBUG, 0, N_("Generate COFF format debug info") },
1682dbb1
DR
964#endif
965#ifdef VMS_DEBUGGING_INFO
966 { "vms", VMS_DEBUG, 0, N_("Generate VMS format debug info") },
b8468bc7 967#endif
c84e2712 968 { 0, 0, 0, 0 }
b8468bc7
NC
969};
970
971typedef struct
972{
c083a819
KG
973 const char *const string;
974 int *const variable;
975 const int on_value;
976 const char *const description;
b8468bc7
NC
977}
978lang_independent_options;
979
91ce572a
CC
980int flag_trapv = 0;
981
19283265
RH
982/* Add or remove a leading underscore from user symbols. */
983int flag_leading_underscore = -1;
984
985/* The user symbol prefix after having resolved same. */
87e11268 986const char *user_label_prefix;
19283265 987
c6d9a88c
MM
988static const param_info lang_independent_params[] = {
989#define DEFPARAM(ENUM, OPTION, HELP, DEFAULT) \
1c4c47db 990 { OPTION, DEFAULT, HELP },
c6d9a88c
MM
991#include "params.def"
992#undef DEFPARAM
1c4c47db 993 { NULL, 0, NULL }
c6d9a88c
MM
994};
995
4291d9c8
RS
996/* Table of language-independent -f options.
997 STRING is the option name. VARIABLE is the address of the variable.
998 ON_VALUE is the value to store in VARIABLE
999 if `-fSTRING' is seen as an option.
1000 (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
1001
c083a819 1002static const lang_independent_options f_options[] =
4291d9c8 1003{
21c7361e 1004 {"eliminate-dwarf2-dups", &flag_eliminate_dwarf2_dups, 1,
a6371940 1005 N_("Perform DWARF2 duplicate elimination") },
73c68f61
SS
1006 {"eliminate-unused-debug-types", &flag_eliminate_unused_debug_types, 1,
1007 N_("Perform unused type elimination in debug info") },
b8468bc7 1008 {"float-store", &flag_float_store, 1,
a6371940 1009 N_("Do not store floats in registers") },
b8468bc7 1010 {"defer-pop", &flag_defer_pop, 1,
a6371940 1011 N_("Defer popping functions args from stack until later") },
b8468bc7 1012 {"omit-frame-pointer", &flag_omit_frame_pointer, 1,
a6371940 1013 N_("When possible do not generate stack frames") },
db8cb48e 1014 {"optimize-sibling-calls", &flag_optimize_sibling_calls, 1,
a6371940 1015 N_("Optimize sibling and tail recursive calls") },
5c856b23
JH
1016 {"tracer", &flag_tracer, 1,
1017 N_("Perform superblock formation via tail duplication") },
e72fcfe8
JH
1018 {"unit-at-a-time", &flag_unit_at_a_time, 1,
1019 N_("Compile whole compilation unit at a time") },
b8468bc7 1020 {"cse-follow-jumps", &flag_cse_follow_jumps, 1,
a6371940 1021 N_("When running CSE, follow jumps to their targets") },
b8468bc7 1022 {"cse-skip-blocks", &flag_cse_skip_blocks, 1,
a6371940 1023 N_("When running CSE, follow conditional jumps") },
b8468bc7 1024 {"expensive-optimizations", &flag_expensive_optimizations, 1,
1737c953 1025 N_("Perform a number of minor, expensive optimizations") },
b8468bc7 1026 {"thread-jumps", &flag_thread_jumps, 1,
1737c953 1027 N_("Perform jump threading optimizations") },
b8468bc7 1028 {"strength-reduce", &flag_strength_reduce, 1,
1737c953 1029 N_("Perform strength reduction optimizations") },
b8468bc7 1030 {"unroll-loops", &flag_unroll_loops, 1,
a6371940 1031 N_("Perform loop unrolling when iteration count is known") },
b8468bc7 1032 {"unroll-all-loops", &flag_unroll_all_loops, 1,
a6371940 1033 N_("Perform loop unrolling for all loops") },
b17d5d7c
ZD
1034 {"old-unroll-loops", &flag_old_unroll_loops, 1,
1035 N_("Perform loop unrolling when iteration count is known") },
1036 {"old-unroll-all-loops", &flag_old_unroll_all_loops, 1,
1037 N_("Perform loop unrolling for all loops") },
1038 {"peel-loops", &flag_peel_loops, 1,
1039 N_("Perform loop peeling") },
617b465c
ZD
1040 {"unswitch-loops", &flag_unswitch_loops, 1,
1041 N_("Perform loop unswitching") },
0dd0e980
JH
1042 {"prefetch-loop-arrays", &flag_prefetch_loop_arrays, 1,
1043 N_("Generate prefetch instructions, if available, for arrays in loops") },
b8468bc7 1044 {"move-all-movables", &flag_move_all_movables, 1,
a6371940 1045 N_("Force all loop invariant computations out of loops") },
b8468bc7 1046 {"reduce-all-givs", &flag_reduce_all_givs, 1,
a6371940 1047 N_("Strength reduce all loop general induction variables") },
b8468bc7 1048 {"writable-strings", &flag_writable_strings, 1,
a6371940 1049 N_("Store strings in writable data section") },
b8468bc7 1050 {"peephole", &flag_no_peephole, 0,
1737c953 1051 N_("Enable machine specific peephole optimizations") },
b8468bc7 1052 {"force-mem", &flag_force_mem, 1,
a6371940 1053 N_("Copy memory operands into registers before using") },
b8468bc7 1054 {"force-addr", &flag_force_addr, 1,
a6371940 1055 N_("Copy memory address constants into regs before using") },
b8468bc7 1056 {"function-cse", &flag_no_function_cse, 0,
a6371940 1057 N_("Allow function addresses to be held in registers") },
b8468bc7 1058 {"inline-functions", &flag_inline_functions, 1,
a6371940 1059 N_("Integrate simple functions into their callers") },
b8468bc7 1060 {"keep-inline-functions", &flag_keep_inline_functions, 1,
a6371940 1061 N_("Generate code for funcs even if they are fully inlined") },
b8468bc7 1062 {"inline", &flag_no_inline, 0,
a6371940 1063 N_("Pay attention to the 'inline' keyword") },
b8468bc7 1064 {"keep-static-consts", &flag_keep_static_consts, 1,
a6371940 1065 N_("Emit static const variables even if they are not used") },
b8468bc7 1066 {"syntax-only", &flag_syntax_only, 1,
a6371940 1067 N_("Check for syntax errors, then stop") },
b8468bc7 1068 {"shared-data", &flag_shared_data, 1,
a6371940 1069 N_("Mark data as shared rather than private") },
b8468bc7 1070 {"caller-saves", &flag_caller_saves, 1,
a6371940 1071 N_("Enable saving registers around function calls") },
b8468bc7 1072 {"pcc-struct-return", &flag_pcc_struct_return, 1,
a6371940 1073 N_("Return 'short' aggregates in memory, not registers") },
b8468bc7 1074 {"reg-struct-return", &flag_pcc_struct_return, 0,
a6371940 1075 N_("Return 'short' aggregates in registers") },
b8468bc7 1076 {"delayed-branch", &flag_delayed_branch, 1,
a6371940 1077 N_("Attempt to fill delay slots of branch instructions") },
b8468bc7 1078 {"gcse", &flag_gcse, 1,
a6371940 1079 N_("Perform the global common subexpression elimination") },
a13d4ebf 1080 {"gcse-lm", &flag_gcse_lm, 1,
a6371940 1081 N_("Perform enhanced load motion during global subexpression elimination") },
a13d4ebf 1082 {"gcse-sm", &flag_gcse_sm, 1,
a6371940 1083 N_("Perform store motion after global subexpression elimination") },
96327cdc
JH
1084 {"loop-optimize", &flag_loop_optimize, 1,
1085 N_("Perform the loop optimizations") },
1086 {"crossjumping", &flag_crossjumping, 1,
1087 N_("Perform cross-jumping optimization") },
2c4b77f3
JH
1088 {"if-conversion", &flag_if_conversion, 1,
1089 N_("Perform conversion of conditional jumps to branchless equivalents") },
1090 {"if-conversion2", &flag_if_conversion2, 1,
1091 N_("Perform conversion of conditional jumps to conditional execution") },
b8468bc7 1092 {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1,
1737c953 1093 N_("Run CSE pass after loop optimizations") },
b8468bc7 1094 {"rerun-loop-opt", &flag_rerun_loop_opt, 1,
1737c953 1095 N_("Run the loop optimizer twice") },
b6d24183 1096 {"delete-null-pointer-checks", &flag_delete_null_pointer_checks, 1,
a6371940 1097 N_("Delete useless null pointer checks") },
b8468bc7 1098 {"schedule-insns", &flag_schedule_insns, 1,
a6371940 1099 N_("Reschedule instructions before register allocation") },
b8468bc7 1100 {"schedule-insns2", &flag_schedule_insns_after_reload, 1,
a6371940 1101 N_("Reschedule instructions after register allocation") },
b8468bc7 1102 {"sched-interblock",&flag_schedule_interblock, 1,
a6371940 1103 N_("Enable scheduling across basic blocks") },
b8468bc7 1104 {"sched-spec",&flag_schedule_speculative, 1,
a6371940 1105 N_("Allow speculative motion of non-loads") },
b8468bc7 1106 {"sched-spec-load",&flag_schedule_speculative_load, 1,
a6371940 1107 N_("Allow speculative motion of some loads") },
b8468bc7 1108 {"sched-spec-load-dangerous",&flag_schedule_speculative_load_dangerous, 1,
a6371940 1109 N_("Allow speculative motion of more loads") },
b9422b69
JH
1110 {"sched2-use-superblocks", &flag_sched2_use_superblocks, 1,
1111 N_("If scheduling post reload, do superblock sheduling") },
1112 {"sched2-use-traces", &flag_sched2_use_traces, 1,
1113 N_("If scheduling post reload, do trace sheduling") },
b8468bc7 1114 {"branch-count-reg",&flag_branch_on_count_reg, 1,
a6371940 1115 N_("Replace add,compare,branch with branch on count reg") },
b8468bc7 1116 {"pic", &flag_pic, 1,
a6371940 1117 N_("Generate position independent code, if possible") },
b8468bc7
NC
1118 {"PIC", &flag_pic, 2, ""},
1119 {"exceptions", &flag_exceptions, 1,
a6371940 1120 N_("Enable exception handling") },
14a774a9 1121 {"unwind-tables", &flag_unwind_tables, 1,
a6371940 1122 N_("Just generate unwind tables for exception handling") },
b932f770
JH
1123 {"asynchronous-unwind-tables", &flag_asynchronous_unwind_tables, 1,
1124 N_("Generate unwind tables exact at each instruction boundary") },
c1e9f663 1125 {"non-call-exceptions", &flag_non_call_exceptions, 1,
a6371940 1126 N_("Support synchronous non-call exceptions") },
b8468bc7 1127 {"profile-arcs", &profile_arc_flag, 1,
a6371940 1128 N_("Insert arc based program profiling code") },
b8468bc7 1129 {"test-coverage", &flag_test_coverage, 1,
a6371940 1130 N_("Create data files needed by gcov") },
b8468bc7 1131 {"branch-probabilities", &flag_branch_probabilities, 1,
a6371940 1132 N_("Use profiling information for branch probabilities") },
1034407f
NC
1133 {"profile", &profile_flag, 1,
1134 N_("Enable basic program profiling code") },
11bdd2ae 1135 {"reorder-blocks", &flag_reorder_blocks, 1,
a6371940 1136 N_("Reorder basic blocks to improve code placement") },
194734e9
JH
1137 {"reorder-functions", &flag_reorder_functions, 1,
1138 N_("Reorder functions to improve code placement") },
7b82b5da 1139 {"rename-registers", &flag_rename_registers, 1,
a6371940 1140 N_("Do the register renaming optimization pass") },
8582c27b
RH
1141 {"cprop-registers", &flag_cprop_registers, 1,
1142 N_("Do the register copy-propagation optimization pass") },
b8468bc7 1143 {"common", &flag_no_common, 0,
ff7cc307 1144 N_("Do not put uninitialized globals in the common section") },
b8468bc7 1145 {"inhibit-size-directive", &flag_inhibit_size_directive, 1,
a6371940 1146 N_("Do not generate .size directives") },
b8468bc7 1147 {"function-sections", &flag_function_sections, 1,
a6371940 1148 N_("place each function into its own section") },
257441db 1149 {"data-sections", &flag_data_sections, 1,
a6371940 1150 N_("place data items into their own section") },
b8468bc7 1151 {"verbose-asm", &flag_verbose_asm, 1,
a6371940 1152 N_("Add extra commentry to assembler output") },
b8468bc7 1153 {"gnu-linker", &flag_gnu_linker, 1,
1737c953 1154 N_("Output GNU ld formatted global initializers") },
b8468bc7 1155 {"regmove", &flag_regmove, 1,
1737c953 1156 N_("Enables a register move optimization") },
c84e2712 1157 {"optimize-register-move", &flag_regmove, 1,
a6371940 1158 N_("Do the full regmove optimization pass") },
b8468bc7 1159 {"pack-struct", &flag_pack_struct, 1,
a6371940 1160 N_("Pack structure members together without holes") },
b8468bc7 1161 {"stack-check", &flag_stack_check, 1,
a6371940 1162 N_("Insert stack checking code into the program") },
b8468bc7 1163 {"argument-alias", &flag_argument_noalias, 0,
a6371940 1164 N_("Specify that arguments may alias each other & globals") },
b8468bc7 1165 {"argument-noalias", &flag_argument_noalias, 1,
a6371940 1166 N_("Assume arguments may alias globals but not each other") },
b8468bc7 1167 {"argument-noalias-global", &flag_argument_noalias, 2,
a6371940 1168 N_("Assume arguments do not alias each other or globals") },
b8468bc7 1169 {"strict-aliasing", &flag_strict_aliasing, 1,
a6371940 1170 N_("Assume strict aliasing rules apply") },
854a97f0 1171 {"align-loops", &align_loops, 0,
a6371940 1172 N_("Align the start of loops") },
854a97f0 1173 {"align-jumps", &align_jumps, 0,
a6371940 1174 N_("Align labels which are only reached by jumping") },
efa3896a 1175 {"align-labels", &align_labels, 0,
a6371940 1176 N_("Align all labels") },
efa3896a 1177 {"align-functions", &align_functions, 0,
a6371940 1178 N_("Align the start of functions") },
201556f0
JJ
1179 {"merge-constants", &flag_merge_constants, 1,
1180 N_("Attempt to merge identical constants accross compilation units") },
1181 {"merge-all-constants", &flag_merge_constants, 2,
1182 N_("Attempt to merge identical constants and constant variables") },
c84e2712 1183 {"dump-unnumbered", &flag_dump_unnumbered, 1,
a6371940 1184 N_("Suppress output of instruction numbers and line number notes in debugging dumps") },
07417085 1185 {"instrument-functions", &flag_instrument_function_entry_exit, 1,
a6371940 1186 N_("Instrument function entry/exit with profiling calls") },
27b41650
KG
1187 {"zero-initialized-in-bss", &flag_zero_initialized_in_bss, 1,
1188 N_("Put zero initialized data in the bss section") },
d9d4fb43 1189 {"ssa", &flag_ssa, 1,
a6371940 1190 N_("Enable SSA optimizations") },
0b47e4c1 1191 {"ssa-ccp", &flag_ssa_ccp, 1,
eaec9b3d 1192 N_("Enable SSA conditional constant propagation") },
62d285ff
JL
1193 {"ssa-dce", &flag_ssa_dce, 1,
1194 N_("Enable aggressive SSA dead code elimination") },
19283265 1195 {"leading-underscore", &flag_leading_underscore, 1,
a6371940 1196 N_("External symbols have a leading underscore") },
be163a70 1197 {"ident", &flag_no_ident, 0,
a6371940 1198 N_("Process #ident directives") },
ede7cd44 1199 { "peephole2", &flag_peephole2, 1,
a6371940 1200 N_("Enables an rtl peephole pass run before sched2") },
2e8f2e8f
TM
1201 {"finite-math-only", &flag_finite_math_only, 1,
1202 N_("Assume no NaNs or +-Infs are generated") },
3ff51205 1203 { "guess-branch-probability", &flag_guess_branch_prob, 1,
a6371940 1204 N_("Enables guessing of branch probabilities") },
9605da8a 1205 {"math-errno", &flag_errno_math, 1,
a6371940 1206 N_("Set errno after built-in math functions") },
de6c5979 1207 {"trapping-math", &flag_trapping_math, 1,
a6371940 1208 N_("Floating-point operations can trap") },
de6c5979 1209 {"unsafe-math-optimizations", &flag_unsafe_math_optimizations, 1,
a6371940 1210 N_("Allow math optimizations that may violate IEEE or ANSI standards") },
52bfebf0
RS
1211 {"signaling-nans", &flag_signaling_nans, 1,
1212 N_("Disable optimizations observable by IEEE signaling NaNs") },
a8aa7975 1213 {"bounds-check", &flag_bounds_check, 1,
e03b7153 1214 N_("Generate code to check bounds before indexing arrays") },
46d3a873 1215 {"single-precision-constant", &flag_single_precision_constant, 1,
a6371940 1216 N_("Convert floating point constant to single precision constant") },
94b23dd5 1217 {"time-report", &time_report, 1,
a6371940 1218 N_("Report time taken by each compiler pass at end of run") },
94b23dd5 1219 {"mem-report", &mem_report, 1,
a6371940 1220 N_("Report on permanent memory allocation at end of run") },
91ce572a 1221 { "trapv", &flag_trapv, 1,
4d6baafa 1222 N_("Trap for signed overflow in addition / subtraction / multiplication") },
ed8d2920
MM
1223 { "new-ra", &flag_new_regalloc, 1,
1224 N_("Use graph coloring register allocation.") },
4291d9c8 1225};
b99933c7
RS
1226
1227/* Table of language-specific options. */
1228
8b60264b 1229static const struct lang_opt
b8468bc7 1230{
8b60264b
KG
1231 const char *const option;
1232 const char *const description;
b8468bc7
NC
1233}
1234documented_lang_options[] =
b99933c7 1235{
b8468bc7
NC
1236 /* In order not to overload the --help output, the convention
1237 used here is to only describe those options which are not
1238 enabled by default. */
1239
9cabb1d8 1240 { "-ansi",
56508306 1241 N_("Compile just for ISO C90") },
9cabb1d8 1242 { "-std= ",
a6371940 1243 N_("Determine language standard") },
b8468bc7
NC
1244
1245 { "-fsigned-bitfields", "" },
a6371940 1246 { "-funsigned-bitfields",
b0287a90 1247 N_("Make bit-fields by unsigned by default") },
b8468bc7
NC
1248 { "-fno-signed-bitfields", "" },
1249 { "-fno-unsigned-bitfields","" },
9cabb1d8 1250 { "-fsigned-char",
a6371940 1251 N_("Make 'char' be signed by default") },
9cabb1d8 1252 { "-funsigned-char",
a6371940 1253 N_("Make 'char' be unsigned by default") },
b8468bc7
NC
1254 { "-fno-signed-char", "" },
1255 { "-fno-unsigned-char", "" },
1256
b8468bc7 1257 { "-fasm", "" },
9cabb1d8 1258 { "-fno-asm",
1737c953 1259 N_("Do not recognize the 'asm' keyword") },
b8468bc7 1260 { "-fbuiltin", "" },
9cabb1d8 1261 { "-fno-builtin",
1737c953 1262 N_("Do not recognize any built in functions") },
9cabb1d8 1263 { "-fhosted",
a6371940 1264 N_("Assume normal C execution environment") },
b8468bc7
NC
1265 { "-fno-hosted", "" },
1266 { "-ffreestanding",
a6371940 1267 N_("Assume that standard libraries & main might not exist") },
b8468bc7 1268 { "-fno-freestanding", "" },
9cabb1d8 1269 { "-fcond-mismatch",
a6371940 1270 N_("Allow different types as args of ? operator") },
b8468bc7 1271 { "-fno-cond-mismatch", "" },
9cabb1d8 1272 { "-fdollars-in-identifiers",
a6371940 1273 N_("Allow the use of $ inside identifiers") },
b8468bc7 1274 { "-fno-dollars-in-identifiers", "" },
3773a46b
JM
1275 { "-fpreprocessed", "" },
1276 { "-fno-preprocessed", "" },
9cabb1d8 1277 { "-fshort-double",
a6371940 1278 N_("Use the same size for double as for float") },
b8468bc7 1279 { "-fno-short-double", "" },
9cabb1d8 1280 { "-fshort-enums",
a6371940 1281 N_("Use the smallest fitting integer to hold enums") },
b8468bc7 1282 { "-fno-short-enums", "" },
9cabb1d8 1283 { "-fshort-wchar",
a6371940 1284 N_("Override the underlying type for wchar_t to `unsigned short'") },
12a39b12 1285 { "-fno-short-wchar", "" },
b8468bc7 1286
9cabb1d8 1287 { "-Wall",
a6371940 1288 N_("Enable most warning messages") },
b8468bc7 1289 { "-Wbad-function-cast",
a6371940 1290 N_("Warn about casting functions to incompatible types") },
b8468bc7 1291 { "-Wno-bad-function-cast", "" },
74ff4629 1292 { "-Wmissing-format-attribute",
a6371940 1293 N_("Warn about functions which might be candidates for format attributes") },
74ff4629 1294 { "-Wno-missing-format-attribute", "" },
9cabb1d8 1295 { "-Wcast-qual",
a6371940 1296 N_("Warn about casts which discard qualifiers") },
b8468bc7 1297 { "-Wno-cast-qual", "" },
9cabb1d8 1298 { "-Wchar-subscripts",
a6371940 1299 N_("Warn about subscripts whose type is 'char'") },
b8468bc7 1300 { "-Wno-char-subscripts", "" },
9cabb1d8 1301 { "-Wcomment",
a6371940 1302 N_("Warn if nested comments are detected") },
c84e2712 1303 { "-Wno-comment", "" },
9cabb1d8 1304 { "-Wcomments",
a6371940 1305 N_("Warn if nested comments are detected") },
c84e2712 1306 { "-Wno-comments", "" },
9cabb1d8 1307 { "-Wconversion",
a6371940 1308 N_("Warn about possibly confusing type conversions") },
b8468bc7 1309 { "-Wno-conversion", "" },
75227a33 1310 { "-Wdiv-by-zero", "" },
9cabb1d8 1311 { "-Wno-div-by-zero",
75227a33 1312 N_("Do not warn about compile-time integer division by zero") },
9cabb1d8 1313 { "-Wfloat-equal",
75227a33
GK
1314 N_("Warn about testing equality of floating point numbers") },
1315 { "-Wno-float-equal", "" },
9cabb1d8 1316 { "-Wformat",
a6371940 1317 N_("Warn about printf/scanf/strftime/strfmon format anomalies") },
b8468bc7 1318 { "-Wno-format", "" },
4d808927
JM
1319 { "-Wformat-extra-args", "" },
1320 { "-Wno-format-extra-args",
a6371940 1321 N_("Don't warn about too many arguments to format functions") },
9cabb1d8 1322 { "-Wformat-nonliteral",
a6371940 1323 N_("Warn about non-string-literal format strings") },
4d808927 1324 { "-Wno-format-nonliteral", "" },
c907e684 1325 { "-Wformat-security",
a6371940 1326 N_("Warn about possible security problems with format functions") },
c907e684 1327 { "-Wno-format-security", "" },
75227a33
GK
1328 { "-Wformat-y2k", "" },
1329 { "-Wno-format-y2k",
1330 N_("Don't warn about strftime formats yielding 2 digit years") },
b8468bc7 1331 { "-Wimplicit-function-declaration",
a6371940 1332 N_("Warn about implicit function declarations") },
b8468bc7
NC
1333 { "-Wno-implicit-function-declaration", "" },
1334 { "-Werror-implicit-function-declaration", "" },
9cabb1d8 1335 { "-Wimplicit-int",
a6371940 1336 N_("Warn when a declaration does not specify a type") },
b8468bc7
NC
1337 { "-Wno-implicit-int", "" },
1338 { "-Wimplicit", "" },
1339 { "-Wno-implicit", "" },
9cabb1d8 1340 { "-Wimport",
a6371940 1341 N_("Warn about the use of the #import directive") },
b8468bc7 1342 { "-Wno-import", "" },
223b87b6
GK
1343 { "-Winvalid-pch",
1344 N_("Warn about PCH files that are found but not used") },
b8468bc7 1345 { "-Wlong-long","" },
9cabb1d8 1346 { "-Wno-long-long",
a6371940 1347 N_("Do not warn about using 'long long' when -pedantic") },
9cabb1d8 1348 { "-Wmain",
a6371940 1349 N_("Warn about suspicious declarations of main") },
b8468bc7
NC
1350 { "-Wno-main", "" },
1351 { "-Wmissing-braces",
1737c953 1352 N_("Warn about possibly missing braces around initializers") },
b8468bc7
NC
1353 { "-Wno-missing-braces", "" },
1354 { "-Wmissing-declarations",
a6371940 1355 N_("Warn about global funcs without previous declarations") },
b8468bc7 1356 { "-Wno-missing-declarations", "" },
9cabb1d8 1357 { "-Wmissing-prototypes",
a6371940 1358 N_("Warn about global funcs without prototypes") },
b8468bc7 1359 { "-Wno-missing-prototypes", "" },
9cabb1d8 1360 { "-Wmultichar",
a6371940 1361 N_("Warn about use of multicharacter literals") },
b8468bc7 1362 { "-Wno-multichar", "" },
9cabb1d8 1363 { "-Wnested-externs",
a6371940 1364 N_("Warn about externs not at file scope level") },
b8468bc7 1365 { "-Wno-nested-externs", "" },
9cabb1d8 1366 { "-Wparentheses",
a6371940 1367 N_("Warn about possible missing parentheses") },
b8468bc7 1368 { "-Wno-parentheses", "" },
9cabb1d8 1369 { "-Wpointer-arith",
a6371940 1370 N_("Warn about function pointer arithmetic") },
b8468bc7
NC
1371 { "-Wno-pointer-arith", "" },
1372 { "-Wredundant-decls",
a6371940 1373 N_("Warn about multiple declarations of the same object") },
b8468bc7 1374 { "-Wno-redundant-decls", "" },
75227a33
GK
1375 { "-Wreturn-type",
1376 N_("Warn whenever a function's return-type defaults to int") },
1377 { "-Wno-return-type", "" },
1378 { "-Wsequence-point",
1379 N_("Warn about possible violations of sequence point rules") },
1380 { "-Wno-sequence-point", "" },
9cabb1d8 1381 { "-Wsign-compare",
a6371940 1382 N_("Warn about signed/unsigned comparisons") },
b8468bc7 1383 { "-Wno-sign-compare", "" },
9cabb1d8 1384 { "-Wstrict-prototypes",
a6371940 1385 N_("Warn about non-prototyped function decls") },
b8468bc7 1386 { "-Wno-strict-prototypes", "" },
9cabb1d8 1387 { "-Wtraditional",
f458d1d5 1388 N_("Warn about constructs whose meanings change in ISO C") },
b8468bc7 1389 { "-Wno-traditional", "" },
9cabb1d8 1390 { "-Wtrigraphs",
a6371940 1391 N_("Warn when trigraphs are encountered") },
b8468bc7
NC
1392 { "-Wno-trigraphs", "" },
1393 { "-Wundef", "" },
1394 { "-Wno-undef", "" },
9cabb1d8 1395 { "-Wunknown-pragmas",
75227a33
GK
1396 N_("Warn about unrecognized pragmas") },
1397 { "-Wno-unknown-pragmas", "" },
9cabb1d8 1398 { "-Wwrite-strings",
a6371940 1399 N_("Mark strings as 'const char *'") },
b8468bc7 1400 { "-Wno-write-strings", "" },
854a97f0 1401
b8468bc7 1402#define DEFINE_LANG_NAME(NAME) { NULL, NAME },
854a97f0 1403
2a95de17 1404#include "options.h"
854a97f0 1405
b99933c7 1406};
b8468bc7
NC
1407
1408/* Here is a table, controlled by the tm.h file, listing each -m switch
1409 and which bits in `target_switches' it should set or clear.
1410 If VALUE is positive, it is bits to set.
1411 If VALUE is negative, -VALUE is bits to clear.
1412 (The sign bit is not used so there is no confusion.) */
1413
8b60264b 1414static const struct
b8468bc7 1415{
8b60264b
KG
1416 const char *const name;
1417 const int value;
1418 const char *const description;
b8468bc7 1419}
9cabb1d8 1420target_switches[] = TARGET_SWITCHES;
b8468bc7
NC
1421
1422/* This table is similar, but allows the switch to have a value. */
1423
1424#ifdef TARGET_OPTIONS
8b60264b 1425static const struct
b8468bc7 1426{
8b60264b
KG
1427 const char *const prefix;
1428 const char **const variable;
1429 const char *const description;
b8468bc7 1430}
9cabb1d8 1431target_options[] = TARGET_OPTIONS;
b8468bc7 1432#endif
4291d9c8 1433\f
854a97f0 1434/* Options controlling warnings. */
4291d9c8
RS
1435
1436/* Don't print warning messages. -w. */
1437
1438int inhibit_warnings = 0;
1439
317639a8
BC
1440/* Don't suppress warnings from system headers. -Wsystem-headers. */
1441
1442int warn_system_headers = 0;
1443
65ca2d60 1444/* Print various extra warnings. -W/-Wextra. */
4291d9c8
RS
1445
1446int extra_warnings = 0;
1447
1448/* Treat warnings as errors. -Werror. */
1449
1450int warnings_are_errors = 0;
1451
078721e1 1452/* Nonzero to warn about unused variables, functions et.al. */
4291d9c8 1453
078721e1
AC
1454int warn_unused_function;
1455int warn_unused_label;
1456int warn_unused_parameter;
1457int warn_unused_variable;
1458int warn_unused_value;
1459
312f6255
GK
1460/* Nonzero to warn about code which is never reached. */
1461
1462int warn_notreached;
1463
4291d9c8
RS
1464/* Nonzero to warn about variables used before they are initialized. */
1465
1466int warn_uninitialized;
1467
6d2f8887 1468/* Nonzero means warn about all declarations which shadow others. */
4291d9c8
RS
1469
1470int warn_shadow;
1471
d6961341
AC
1472/* Warn if a switch on an enum, that does not have a default case,
1473 fails to have a case for every enum value. */
4291d9c8
RS
1474
1475int warn_switch;
1476
d6961341
AC
1477/* Warn if a switch does not have a default case. */
1478
1479int warn_switch_default;
1480
173028e5
AC
1481/* Warn if a switch on an enum fails to have a case for every enum
1482 value (regardless of the presence or otherwise of a default case). */
1483
1484int warn_switch_enum;
1485
4291d9c8
RS
1486/* Nonzero means warn about function definitions that default the return type
1487 or that use a null return and have a return-type other than void. */
1488
1489int warn_return_type;
1490
1491/* Nonzero means warn about pointer casts that increase the required
1492 alignment of the target type (and might therefore lead to a crash
1493 due to a misaligned access). */
1494
1495int warn_cast_align;
1496
b51e9c62
RK
1497/* Nonzero means warn about any objects definitions whose size is larger
1498 than N bytes. Also want about function definitions whose returned
1499 values are larger than N bytes. The value N is in `larger_than_size'. */
854a97f0 1500
b51e9c62 1501int warn_larger_than;
4559fd9e 1502HOST_WIDE_INT larger_than_size;
4291d9c8
RS
1503
1504/* Nonzero means warn if inline function is too large. */
1505
1506int warn_inline;
1507
1508/* Warn if a function returns an aggregate,
1509 since there are often incompatible calling conventions for doing this. */
1510
1511int warn_aggregate_return;
1512
3c12fcc2
GM
1513/* Warn if packed attribute on struct is unnecessary and inefficient. */
1514
1515int warn_packed;
1516
1517/* Warn when gcc pads a structure to an alignment boundary. */
1518
1519int warn_padded;
1520
18424ae1
BL
1521/* Warn when an optimization pass is disabled. */
1522
1523int warn_disabled_optimization;
1524
b313a0fe
RH
1525/* Warn about functions which might be candidates for attribute noreturn. */
1526
1527int warn_missing_noreturn;
1528
9cabb1d8 1529/* Nonzero means warn about uses of __attribute__((deprecated))
e23bd218
IR
1530 declarations. */
1531
1532int warn_deprecated_decl = 1;
1533
bf52f899
NS
1534/* Nonzero means warn about constructs which might not be
1535 strict-aliasing safe. */
1536
1537int warn_strict_aliasing;
1538
65ca2d60 1539/* Like f_options, but for -W. */
4291d9c8 1540
c083a819 1541static const lang_independent_options W_options[] =
4291d9c8 1542{
a6371940
ZW
1543 {"unused-function", &warn_unused_function, 1,
1544 N_("Warn when a function is unused") },
1545 {"unused-label", &warn_unused_label, 1,
1546 N_("Warn when a label is unused") },
1547 {"unused-parameter", &warn_unused_parameter, 1,
1548 N_("Warn when a function parameter is unused") },
1549 {"unused-variable", &warn_unused_variable, 1,
1550 N_("Warn when a variable is unused") },
1551 {"unused-value", &warn_unused_value, 1,
1552 N_("Warn when an expression value is unused") },
1553 {"system-headers", &warn_system_headers, 1,
1554 N_("Do not suppress warnings from system headers") },
1555 {"error", &warnings_are_errors, 1,
1556 N_("Treat all warnings as errors") },
1557 {"shadow", &warn_shadow, 1,
1558 N_("Warn when one local variable shadows another") },
b8468bc7 1559 {"switch", &warn_switch, 1,
d6961341
AC
1560 N_("Warn about enumerated switches, with no default, missing a case") },
1561 {"switch-default", &warn_switch_default, 1,
1562 N_("Warn about enumerated switches missing a default case") },
173028e5
AC
1563 {"switch-enum", &warn_switch_enum, 1,
1564 N_("Warn about all enumerated switches missing a specific case") },
b8468bc7 1565 {"aggregate-return", &warn_aggregate_return, 1,
a6371940 1566 N_("Warn about returning structures, unions or arrays") },
b8468bc7 1567 {"cast-align", &warn_cast_align, 1,
a6371940 1568 N_("Warn about pointer casts which increase alignment") },
854a97f0 1569 {"unreachable-code", &warn_notreached, 1,
a6371940 1570 N_("Warn about code that will never be executed") },
b8468bc7 1571 {"uninitialized", &warn_uninitialized, 1,
ff7cc307 1572 N_("Warn about uninitialized automatic variables") },
b8468bc7 1573 {"inline", &warn_inline, 1,
a6371940 1574 N_("Warn when an inlined function cannot be inlined") },
3c12fcc2 1575 {"packed", &warn_packed, 1,
a6371940 1576 N_("Warn when the packed attribute has no effect on struct layout") },
3c12fcc2 1577 {"padded", &warn_padded, 1,
a6371940 1578 N_("Warn when padding is required to align struct members") },
18424ae1 1579 {"disabled-optimization", &warn_disabled_optimization, 1,
a6371940 1580 N_("Warn when an optimization pass is disabled") },
e23bd218
IR
1581 {"deprecated-declarations", &warn_deprecated_decl, 1,
1582 N_("Warn about uses of __attribute__((deprecated)) declarations") },
65ca2d60
PE
1583 {"extra", &extra_warnings, 1,
1584 N_("Print extra (possibly unwanted) warnings") },
21c7361e 1585 {"missing-noreturn", &warn_missing_noreturn, 1,
bf52f899
NS
1586 N_("Warn about functions which might be candidates for attribute noreturn") },
1587 {"strict-aliasing", &warn_strict_aliasing, 1,
1588 N_ ("Warn about code which might break the strict aliasing rules") }
4291d9c8 1589};
de6c5979 1590
f5e99456
NB
1591void
1592set_Wunused (setting)
1593 int setting;
1594{
1595 warn_unused_function = setting;
1596 warn_unused_label = setting;
1597 /* Unused function parameter warnings are reported when either ``-W
1598 -Wunused'' or ``-Wunused-parameter'' is specified. Differentiate
1599 -Wunused by setting WARN_UNUSED_PARAMETER to -1. */
1600 if (!setting)
1601 warn_unused_parameter = 0;
1602 else if (!warn_unused_parameter)
1603 warn_unused_parameter = -1;
1604 warn_unused_variable = setting;
1605 warn_unused_value = setting;
1606}
1607
de6c5979
BL
1608/* The following routines are useful in setting all the flags that
1609 -ffast-math and -fno-fast-math imply. */
1610
1611void
ef171ead
AJ
1612set_fast_math_flags (set)
1613 int set;
de6c5979 1614{
748d29c1
NB
1615 flag_trapping_math = !set;
1616 flag_unsafe_math_optimizations = set;
2e8f2e8f 1617 flag_finite_math_only = set;
748d29c1 1618 flag_errno_math = !set;
52bfebf0
RS
1619 if (set)
1620 flag_signaling_nans = 0;
de6c5979
BL
1621}
1622
748d29c1
NB
1623/* Return true iff flags are set as if -ffast-math. */
1624bool
1625fast_math_flags_set_p ()
de6c5979 1626{
748d29c1
NB
1627 return (!flag_trapping_math
1628 && flag_unsafe_math_optimizations
2e8f2e8f 1629 && flag_finite_math_only
748d29c1 1630 && !flag_errno_math);
de6c5979
BL
1631}
1632
4291d9c8
RS
1633\f
1634/* Output files for assembler code (real compiler output)
1635 and debugging dumps. */
1636
1637FILE *asm_out_file;
1638FILE *aux_info_file;
032713aa 1639FILE *rtl_dump_file = NULL;
4291d9c8 1640
132e01b1
TP
1641/* Decode the string P as an integral parameter.
1642 If the string is indeed an integer return its numeric value else
192babfd 1643 issue an Invalid Option error for the option PNAME and return DEFVAL.
854a97f0
KH
1644 If PNAME is zero just return DEFVAL, do not call error. */
1645
132e01b1
TP
1646int
1647read_integral_parameter (p, pname, defval)
192babfd
TP
1648 const char *p;
1649 const char *pname;
1650 const int defval;
132e01b1 1651{
192babfd 1652 const char *endp = p;
132e01b1
TP
1653
1654 while (*endp)
1655 {
0df6c2c7 1656 if (ISDIGIT (*endp))
132e01b1
TP
1657 endp++;
1658 else
192babfd
TP
1659 break;
1660 }
1661
1662 if (*endp != 0)
1663 {
1664 if (pname != 0)
1f978f5f 1665 error ("invalid option `%s'", pname);
192babfd 1666 return defval;
132e01b1
TP
1667 }
1668
1669 return atoi (p);
1670}
4291d9c8 1671\f
387c9294 1672/* This calls abort and is used to avoid problems when abort is a macro.
4291d9c8
RS
1673 It is used when we need to pass the address of abort. */
1674
1675void
1676do_abort ()
1677{
1678 abort ();
1679}
1680
1681/* When `malloc.c' is compiled with `rcheck' defined,
1682 it calls this function to report clobberage. */
1683
1684void
1685botch (s)
854a97f0 1686 const char *s ATTRIBUTE_UNUSED;
4291d9c8
RS
1687{
1688 abort ();
1689}
4291d9c8
RS
1690\f
1691/* Return the logarithm of X, base 2, considering X unsigned,
37366632
RK
1692 if X is a power of 2. Otherwise, returns -1.
1693
1694 This should be used via the `exact_log2' macro. */
4291d9c8
RS
1695
1696int
37366632 1697exact_log2_wide (x)
b3694847 1698 unsigned HOST_WIDE_INT x;
4291d9c8 1699{
b3694847 1700 int log = 0;
4291d9c8
RS
1701 /* Test for 0 or a power of 2. */
1702 if (x == 0 || x != (x & -x))
1703 return -1;
1704 while ((x >>= 1) != 0)
1705 log++;
1706 return log;
1707}
1708
1709/* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
37366632
RK
1710 If X is 0, return -1.
1711
1712 This should be used via the floor_log2 macro. */
4291d9c8
RS
1713
1714int
37366632 1715floor_log2_wide (x)
b3694847 1716 unsigned HOST_WIDE_INT x;
4291d9c8 1717{
b3694847 1718 int log = -1;
4291d9c8
RS
1719 while (x != 0)
1720 log++,
1721 x >>= 1;
1722 return log;
1723}
1724
a7023245
ZW
1725/* Handler for fatal signals, such as SIGSEGV. These are transformed
1726 into ICE messages, which is much more user friendly. */
4291d9c8
RS
1727
1728static void
a7023245 1729crash_signal (signo)
a7023245 1730 int signo;
4291d9c8 1731{
9d533cb5 1732 internal_error ("%s", strsignal (signo));
4291d9c8
RS
1733}
1734
886e0865
GK
1735/* Arrange to dump core on error. (The regular error message is still
1736 printed first, except in the case of abort().) */
1737
1738static void
1739setup_core_dumping ()
1740{
1741#ifdef SIGABRT
1742 signal (SIGABRT, SIG_DFL);
1743#endif
1744#if defined(HAVE_SETRLIMIT)
1745 {
1746 struct rlimit rlim;
1747 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
1748 fatal_io_error ("getting core file size maximum limit");
1749 rlim.rlim_cur = rlim.rlim_max;
1750 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
1751 fatal_io_error ("setting core file size limit to maximum");
1752 }
1753#endif
1754 diagnostic_abort_on_error (global_dc);
1755}
1756
1757
4291d9c8 1758/* Strip off a legitimate source ending from the input string NAME of
c62bdc79 1759 length LEN. Rather than having to know the names used by all of
2290e0ec 1760 our front ends, we strip off an ending of a period followed by
854a97f0 1761 up to five characters. (Java uses ".class".) */
4291d9c8
RS
1762
1763void
1764strip_off_ending (name, len)
1765 char *name;
1766 int len;
1767{
2290e0ec 1768 int i;
41077ce4 1769 for (i = 2; i < 6 && len > i; i++)
2290e0ec
PB
1770 {
1771 if (name[len - i] == '.')
1772 {
1773 name[len - i] = '\0';
1774 break;
1775 }
1776 }
4291d9c8
RS
1777}
1778
7dce5088 1779/* Output a quoted string. */
0f41302f 1780
7dce5088
PE
1781void
1782output_quoted_string (asm_file, string)
1783 FILE *asm_file;
87e11268 1784 const char *string;
7dce5088 1785{
e9a25f70
JL
1786#ifdef OUTPUT_QUOTED_STRING
1787 OUTPUT_QUOTED_STRING (asm_file, string);
1788#else
7dce5088
PE
1789 char c;
1790
1791 putc ('\"', asm_file);
1792 while ((c = *string++) != 0)
1793 {
042cdf71
ZW
1794 if (ISPRINT (c))
1795 {
1796 if (c == '\"' || c == '\\')
1797 putc ('\\', asm_file);
1798 putc (c, asm_file);
1799 }
1800 else
211a0cbe 1801 fprintf (asm_file, "\\%03o", (unsigned char) c);
7dce5088
PE
1802 }
1803 putc ('\"', asm_file);
e9a25f70 1804#endif
7dce5088
PE
1805}
1806
211a0cbe
GDR
1807/* Output NAME into FILE after having turned it into something
1808 usable as an identifier in a target's assembly file. */
1809void
1810output_clean_symbol_name (file, name)
41077ce4
KH
1811 FILE *file;
1812 const char *name;
211a0cbe
GDR
1813{
1814 /* Make a copy of NAME. */
da7ac8f1 1815 char *id = xstrdup (name);
211a0cbe
GDR
1816
1817 /* Make it look like a valid identifier for an assembler. */
1818 clean_symbol_name (id);
41077ce4 1819
ce9e3a6d 1820 fputs (id, file);
211a0cbe
GDR
1821 free (id);
1822}
1823
1824
4291d9c8
RS
1825/* Output a file name in the form wanted by System V. */
1826
1827void
1828output_file_directive (asm_file, input_name)
1829 FILE *asm_file;
87e11268 1830 const char *input_name;
4291d9c8
RS
1831{
1832 int len = strlen (input_name);
87e11268 1833 const char *na = input_name + len;
4291d9c8
RS
1834
1835 /* NA gets INPUT_NAME sans directory names. */
1836 while (na > input_name)
1837 {
1a8bb3dd 1838 if (IS_DIR_SEPARATOR (na[-1]))
9cabb1d8 1839 break;
4291d9c8
RS
1840 na--;
1841 }
1842
1843#ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
1844 ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
1845#else
1846#ifdef ASM_OUTPUT_SOURCE_FILENAME
1847 ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
1848#else
7dce5088
PE
1849 fprintf (asm_file, "\t.file\t");
1850 output_quoted_string (asm_file, na);
1851 fputc ('\n', asm_file);
4291d9c8
RS
1852#endif
1853#endif
1854}
1855\f
61098249
RH
1856/* Routine to open a dump file. Return true if the dump file is enabled. */
1857
1858static int
1859open_dump_file (index, decl)
1860 enum dump_file_index index;
1861 tree decl;
032713aa 1862{
61098249
RH
1863 char *dump_name;
1864 const char *open_arg;
1865 char seq[16];
1866
1867 if (! dump_file[index].enabled)
1868 return 0;
0f41302f 1869
2a9a326b
AS
1870 timevar_push (TV_DUMP);
1871 if (rtl_dump_file != NULL)
1872 fclose (rtl_dump_file);
854a97f0 1873
6baf9874 1874 sprintf (seq, DUMPFILE_FORMAT, index);
61098249 1875
2a9a326b
AS
1876 if (! dump_file[index].initialized)
1877 {
1878 /* If we've not initialized the files, do so now. */
1879 if (graph_dump_format != no_graph
1880 && dump_file[index].graph_dump_p)
1881 {
1882 dump_name = concat (seq, dump_file[index].extension, NULL);
1883 clean_graph_dump_file (dump_base_name, dump_name);
1884 free (dump_name);
1885 }
1886 dump_file[index].initialized = 1;
1887 open_arg = "w";
1888 }
1889 else
1890 open_arg = "a";
61098249 1891
2a9a326b
AS
1892 dump_name = concat (dump_base_name, seq,
1893 dump_file[index].extension, NULL);
61098249 1894
2a9a326b
AS
1895 rtl_dump_file = fopen (dump_name, open_arg);
1896 if (rtl_dump_file == NULL)
400500c4 1897 fatal_io_error ("can't open %s", dump_name);
854a97f0 1898
2a9a326b 1899 free (dump_name);
032713aa 1900
2a9a326b 1901 if (decl)
0f72964f
JH
1902 fprintf (rtl_dump_file, "\n;; Function %s%s\n\n",
1903 (*lang_hooks.decl_printable_name) (decl, 2),
1904 cfun->function_frequency == FUNCTION_FREQUENCY_HOT
1905 ? " (hot)"
1906 : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
1907 ? " (unlikely executed)"
1908 : "");
2a9a326b
AS
1909
1910 timevar_pop (TV_DUMP);
61098249 1911 return 1;
032713aa
NC
1912}
1913
1914/* Routine to close a dump file. */
61098249 1915
032713aa 1916static void
61098249
RH
1917close_dump_file (index, func, insns)
1918 enum dump_file_index index;
58782098 1919 void (*func) PARAMS ((FILE *, rtx));
854a97f0 1920 rtx insns;
032713aa 1921{
61098249
RH
1922 if (! rtl_dump_file)
1923 return;
1924
2a9a326b
AS
1925 timevar_push (TV_DUMP);
1926 if (insns
1927 && graph_dump_format != no_graph
1928 && dump_file[index].graph_dump_p)
1929 {
1930 char seq[16];
1931 char *suffix;
61098249 1932
6baf9874 1933 sprintf (seq, DUMPFILE_FORMAT, index);
2a9a326b
AS
1934 suffix = concat (seq, dump_file[index].extension, NULL);
1935 print_rtl_graph_with_bb (dump_base_name, suffix, insns);
1936 free (suffix);
1937 }
61098249 1938
2a9a326b
AS
1939 if (func && insns)
1940 func (rtl_dump_file, insns);
854a97f0 1941
2a9a326b
AS
1942 fflush (rtl_dump_file);
1943 fclose (rtl_dump_file);
854a97f0 1944
2a9a326b
AS
1945 rtl_dump_file = NULL;
1946 timevar_pop (TV_DUMP);
dfe1a916
DE
1947}
1948
32291f94
MM
1949/* Do any final processing required for the declarations in VEC, of
1950 which there are LEN. We write out inline functions and variables
1951 that have been deferred until this point, but which are required.
0e9e1e0a 1952 Returns nonzero if anything was put out. */
854a97f0 1953
32291f94
MM
1954int
1955wrapup_global_declarations (vec, len)
1956 tree *vec;
1957 int len;
1958{
1959 tree decl;
1960 int i;
1961 int reconsider;
1962 int output_something = 0;
1963
1964 for (i = 0; i < len; i++)
1965 {
1966 decl = vec[i];
854a97f0 1967
2b59501b
MA
1968 /* We're not deferring this any longer. Assignment is
1969 conditional to avoid needlessly dirtying PCH pages. */
1970 if (DECL_DEFER_OUTPUT (decl) != 0)
1971 DECL_DEFER_OUTPUT (decl) = 0;
854a97f0 1972
48a7a235
NB
1973 if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0)
1974 (*lang_hooks.finish_incomplete_decl) (decl);
32291f94
MM
1975 }
1976
1977 /* Now emit any global variables or functions that we have been
1978 putting off. We need to loop in case one of the things emitted
1979 here references another one which comes earlier in the list. */
1980 do
1981 {
1982 reconsider = 0;
1983 for (i = 0; i < len; i++)
1984 {
1985 decl = vec[i];
1986
1987 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
1988 continue;
1989
1990 /* Don't write out static consts, unless we still need them.
1991
1992 We also keep static consts if not optimizing (for debugging),
1993 unless the user specified -fno-keep-static-consts.
1994 ??? They might be better written into the debug information.
1995 This is possible when using DWARF.
1996
1997 A language processor that wants static constants to be always
1998 written out (even if it is not used) is responsible for
1999 calling rest_of_decl_compilation itself. E.g. the C front-end
2000 calls rest_of_decl_compilation from finish_decl.
2001 One motivation for this is that is conventional in some
2002 environments to write things like:
2003 static const char rcsid[] = "... version string ...";
2004 intending to force the string to be in the executable.
2005
2006 A language processor that would prefer to have unneeded
2007 static constants "optimized away" would just defer writing
2008 them out until here. E.g. C++ does this, because static
2009 constants are often defined in header files.
2010
2011 ??? A tempting alternative (for both C and C++) would be
2012 to force a constant to be written if and only if it is
2013 defined in a main file, as opposed to an include file. */
2014
5cc90635 2015 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
32291f94 2016 {
5cc90635
JM
2017 bool needed = 1;
2018
2019 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2020 /* needed */;
2021 else if (DECL_COMDAT (decl))
2022 needed = 0;
2023 else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
2024 && (optimize || !flag_keep_static_consts
2025 || DECL_ARTIFICIAL (decl)))
2026 needed = 0;
2027
2028 if (needed)
2029 {
2030 reconsider = 1;
2031 rest_of_decl_compilation (decl, NULL, 1, 1);
2032 }
32291f94
MM
2033 }
2034
2035 if (TREE_CODE (decl) == FUNCTION_DECL
2036 && DECL_INITIAL (decl) != 0
2037 && DECL_SAVED_INSNS (decl) != 0
2038 && (flag_keep_inline_functions
59182242 2039 || (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
32291f94
MM
2040 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2041 {
2042 reconsider = 1;
32291f94 2043 output_inline_function (decl);
32291f94
MM
2044 }
2045 }
2046
2047 if (reconsider)
2048 output_something = 1;
2049 }
2050 while (reconsider);
2051
2052 return output_something;
2053}
2054
2055/* Issue appropriate warnings for the global declarations in VEC (of
2056 which there are LEN). Output debugging information for them. */
854a97f0 2057
32291f94
MM
2058void
2059check_global_declarations (vec, len)
2060 tree *vec;
2061 int len;
2062{
2063 tree decl;
2064 int i;
2065
2066 for (i = 0; i < len; i++)
2067 {
2068 decl = vec[i];
2069
2070 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2071 && ! TREE_ASM_WRITTEN (decl))
2072 /* Cancel the RTL for this decl so that, if debugging info
2073 output for global variables is still to come,
2074 this one will be omitted. */
19e7881c 2075 SET_DECL_RTL (decl, NULL_RTX);
32291f94
MM
2076
2077 /* Warn about any function
2078 declared static but not defined.
2079 We don't warn about variables,
2080 because many programs have static variables
2081 that exist only to get some text into the object file. */
2082 if (TREE_CODE (decl) == FUNCTION_DECL
078721e1 2083 && (warn_unused_function
32291f94
MM
2084 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2085 && DECL_INITIAL (decl) == 0
2086 && DECL_EXTERNAL (decl)
2087 && ! DECL_ARTIFICIAL (decl)
2088 && ! TREE_PUBLIC (decl))
2089 {
2090 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
2091 pedwarn_with_decl (decl,
2092 "`%s' used but never defined");
2093 else
2094 warning_with_decl (decl,
2095 "`%s' declared `static' but never defined");
2096 /* This symbol is effectively an "extern" declaration now. */
2097 TREE_PUBLIC (decl) = 1;
2098 assemble_external (decl);
2099 }
2100
ef4f94ac
RH
2101 /* Warn about static fns or vars defined but not used. */
2102 if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
2103 || (warn_unused_variable && TREE_CODE (decl) == VAR_DECL))
2104 && ! TREE_USED (decl)
2105 /* The TREE_USED bit for file-scope decls is kept in the identifier,
2106 to handle multiple external decls in different scopes. */
2107 && ! TREE_USED (DECL_NAME (decl))
32291f94
MM
2108 && ! DECL_EXTERNAL (decl)
2109 && ! TREE_PUBLIC (decl)
ef4f94ac
RH
2110 /* Global register variables must be declared to reserve them. */
2111 && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
2112 /* Otherwise, ask the language. */
2113 && (*lang_hooks.decls.warn_unused_global) (decl))
32291f94
MM
2114 warning_with_decl (decl, "`%s' defined but not used");
2115
33c21f5c
HPN
2116 /* Avoid confusing the debug information machinery when there are
2117 errors. */
2118 if (errorcount == 0 && sorrycount == 0)
2119 {
2120 timevar_push (TV_SYMOUT);
2121 (*debug_hooks->global_decl) (decl);
2122 timevar_pop (TV_SYMOUT);
2123 }
32291f94
MM
2124 }
2125}
032713aa 2126
68723fae
MM
2127/* Save the current INPUT_FILENAME and LINENO on the top entry in the
2128 INPUT_FILE_STACK. Push a new entry for FILE and LINE, and set the
2129 INPUT_FILENAME and LINENO accordingly. */
2130
2131void
2132push_srcloc (file, line)
3b304f5b 2133 const char *file;
68723fae
MM
2134 int line;
2135{
2136 struct file_stack *fs;
2137
2138 if (input_file_stack)
2139 {
2140 input_file_stack->name = input_filename;
2141 input_file_stack->line = lineno;
2142 }
2143
2144 fs = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2145 fs->name = input_filename = file;
2146 fs->line = lineno = line;
68723fae
MM
2147 fs->next = input_file_stack;
2148 input_file_stack = fs;
2149 input_file_stack_tick++;
2150}
2151
2152/* Pop the top entry off the stack of presently open source files.
2153 Restore the INPUT_FILENAME and LINENO from the new topmost entry on
2154 the stack. */
2155
2156void
2157pop_srcloc ()
2158{
2159 struct file_stack *fs;
854a97f0 2160
68723fae
MM
2161 fs = input_file_stack;
2162 input_file_stack = fs->next;
2163 free (fs);
2164 input_file_stack_tick++;
ebc7f293 2165 /* The initial source file is never popped. */
68723fae
MM
2166 if (!input_file_stack)
2167 abort ();
2168 input_filename = input_file_stack->name;
2169 lineno = input_file_stack->line;
2170}
2171
f5e99456
NB
2172/* Compile an entire translation unit. Write a file of assembly
2173 output and various debugging dumps. */
4291d9c8
RS
2174
2175static void
f5e99456 2176compile_file ()
4291d9c8 2177{
4291d9c8
RS
2178 /* Initialize yet another pass. */
2179
b93a436e 2180 init_final (main_input_filename);
ea67fe71 2181 init_branch_prob (aux_base_name);
4291d9c8 2182
2a9a326b 2183 timevar_push (TV_PARSE);
4291d9c8 2184
52dabb6c
NB
2185 /* Call the parser, which parses the entire file (calling
2186 rest_of_compilation for each function). */
ff45c01e 2187 (*lang_hooks.parse_file) (set_yydebug);
4291d9c8 2188
7cb4ff28
ZW
2189 /* In case there were missing block closers,
2190 get us back to the global binding level. */
37207ee7 2191 (*lang_hooks.clear_binding_stack) ();
4291d9c8
RS
2192
2193 /* Compilation is now finished except for writing
2194 what's left of the symbol table output. */
2a9a326b 2195 timevar_pop (TV_PARSE);
4291d9c8 2196
1fe65c00 2197 if (flag_syntax_only)
22703ccc 2198 return;
1fe65c00 2199
2b59501b 2200 (*lang_hooks.decls.final_write_globals)();
4291d9c8 2201
4977bab6
ZW
2202 if (profile_arc_flag)
2203 /* This must occur after the loop to output deferred functions.
2204 Else the profiler initializer would not be emitted if all the
2205 functions in this compilation unit were deferred. */
2206 create_profiler ();
2668793e 2207
4b8af8d9
JM
2208 /* Write out any pending weak symbol declarations. */
2209
2210 weak_finish ();
2211
854a97f0 2212 /* Do dbx symbols. */
2a9a326b 2213 timevar_push (TV_SYMOUT);
7f905405 2214
0021b564
JM
2215#ifdef DWARF2_UNWIND_INFO
2216 if (dwarf2out_do_frame ())
2217 dwarf2out_frame_finish ();
2218#endif
2219
e2a12aca 2220 (*debug_hooks->finish) (main_input_filename);
2a9a326b 2221 timevar_pop (TV_SYMOUT);
9a666dda 2222
4291d9c8
RS
2223 /* Output some stuff at end of file if nec. */
2224
2a1ee410
RH
2225 dw2_output_indirect_constants ();
2226
51891abe 2227 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
61098249 2228 {
2a9a326b 2229 timevar_push (TV_DUMP);
61098249 2230 open_dump_file (DFI_bp, NULL);
51891abe
JH
2231
2232 end_branch_prob ();
2233
61098249 2234 close_dump_file (DFI_bp, NULL, NULL_RTX);
2a9a326b 2235 timevar_pop (TV_DUMP);
61098249 2236 }
854a97f0 2237
4291d9c8 2238#ifdef ASM_FILE_END
b93a436e 2239 ASM_FILE_END (asm_out_file);
4291d9c8
RS
2240#endif
2241
acb0db7b
ZW
2242 /* Attach a special .ident directive to the end of the file to identify
2243 the version of GCC which compiled this code. The format of the .ident
2244 string is patterned after the ones produced by native SVR4 compilers. */
2245#ifdef IDENT_ASM_OP
2246 if (!flag_no_ident)
2247 fprintf (asm_out_file, "%s\"GCC: (GNU) %s\"\n",
2248 IDENT_ASM_OP, version_string);
2249#endif
2250
61098249 2251 if (optimize > 0 && open_dump_file (DFI_combine, NULL))
4291d9c8 2252 {
2a9a326b
AS
2253 timevar_push (TV_DUMP);
2254 dump_combine_total_stats (rtl_dump_file);
61098249 2255 close_dump_file (DFI_combine, NULL, NULL_RTX);
2a9a326b 2256 timevar_pop (TV_DUMP);
4291d9c8 2257 }
4291d9c8
RS
2258}
2259\f
2260/* This is called from various places for FUNCTION_DECL, VAR_DECL,
2261 and TYPE_DECL nodes.
2262
ef6748cb
MM
2263 This does nothing for local (non-static) variables, unless the
2264 variable is a register variable with an ASMSPEC. In that case, or
d558416e 2265 if the variable is not an automatic, it sets up the RTL and
ef6748cb
MM
2266 outputs any assembler code (label definition, storage allocation
2267 and initialization).
4291d9c8
RS
2268
2269 DECL is the declaration. If ASMSPEC is nonzero, it specifies
2270 the assembler symbol name to be used. TOP_LEVEL is nonzero
2271 if this declaration is not within a function. */
2272
2273void
2274rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2275 tree decl;
87e11268 2276 const char *asmspec;
4291d9c8
RS
2277 int top_level;
2278 int at_end;
2279{
b14707c3
RH
2280 /* We deferred calling assemble_alias so that we could collect
2281 other attributes such as visibility. Emit the alias now. */
2282 {
2283 tree alias;
2284 alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
2285 if (alias)
2286 {
2287 alias = TREE_VALUE (TREE_VALUE (alias));
2288 alias = get_identifier (TREE_STRING_POINTER (alias));
9cabb1d8 2289 assemble_alias (decl, alias);
b14707c3
RH
2290 }
2291 }
2292
4291d9c8
RS
2293 /* Forward declarations for nested functions are not "external",
2294 but we need to treat them as if they were. */
216d5cdd 2295 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
4291d9c8 2296 || TREE_CODE (decl) == FUNCTION_DECL)
2a9a326b
AS
2297 {
2298 timevar_push (TV_VARCONST);
b14707c3 2299
8ce0a8a5 2300 if (asmspec)
9cabb1d8 2301 make_decl_rtl (decl, asmspec);
b14707c3
RH
2302
2303 /* Don't output anything when a tentative file-scope definition
2304 is seen. But at end of compilation, do output code for them. */
8cf8d8a2
JM
2305 if (at_end || !DECL_DEFER_OUTPUT (decl))
2306 assemble_variable (decl, top_level, at_end, 0);
35d8c8e2
SB
2307
2308#ifdef ASM_FINISH_DECLARE_OBJECT
2a9a326b
AS
2309 if (decl == last_assemble_variable_decl)
2310 {
2311 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2312 top_level, at_end);
2313 }
35d8c8e2 2314#endif
b14707c3 2315
2a9a326b
AS
2316 timevar_pop (TV_VARCONST);
2317 }
216d5cdd 2318 else if (DECL_REGISTER (decl) && asmspec != 0)
4291d9c8
RS
2319 {
2320 if (decode_reg_name (asmspec) >= 0)
2321 {
19e7881c 2322 SET_DECL_RTL (decl, NULL_RTX);
6c418184 2323 make_decl_rtl (decl, asmspec);
4291d9c8
RS
2324 }
2325 else
8f17b5c5
MM
2326 {
2327 error ("invalid register name `%s' for register variable", asmspec);
2328 DECL_REGISTER (decl) = 0;
19e7881c
MM
2329 if (!top_level)
2330 expand_decl (decl);
8f17b5c5 2331 }
4291d9c8 2332 }
f246a305
RS
2333#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2334 else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2335 && TREE_CODE (decl) == TYPE_DECL)
2a9a326b
AS
2336 {
2337 timevar_push (TV_SYMOUT);
2338 dbxout_symbol (decl, 0);
2339 timevar_pop (TV_SYMOUT);
2340 }
4291d9c8
RS
2341#endif
2342#ifdef SDB_DEBUGGING_INFO
2343 else if (write_symbols == SDB_DEBUG && top_level
2344 && TREE_CODE (decl) == TYPE_DECL)
2a9a326b
AS
2345 {
2346 timevar_push (TV_SYMOUT);
2347 sdbout_symbol (decl, 0);
2348 timevar_pop (TV_SYMOUT);
2349 }
4291d9c8 2350#endif
cc0017a9
ZD
2351#ifdef DWARF2_DEBUGGING_INFO
2352 else if ((write_symbols == DWARF2_DEBUG
2353 || write_symbols == VMS_AND_DWARF2_DEBUG)
2354 && top_level
2355 && TREE_CODE (decl) == TYPE_DECL)
2356 {
2357 timevar_push (TV_SYMOUT);
2358 dwarf2out_decl (decl);
2359 timevar_pop (TV_SYMOUT);
2360 }
2361#endif
4291d9c8
RS
2362}
2363
2364/* Called after finishing a record, union or enumeral type. */
2365
2366void
2367rest_of_type_compilation (type, toplev)
35d8c8e2
SB
2368#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO) \
2369 || defined (SDB_DEBUGGING_INFO) || defined (DWARF2_DEBUGGING_INFO)
4291d9c8
RS
2370 tree type;
2371 int toplev;
114791ea
KG
2372#else
2373 tree type ATTRIBUTE_UNUSED;
2374 int toplev ATTRIBUTE_UNUSED;
2375#endif
4291d9c8 2376{
33c21f5c
HPN
2377 /* Avoid confusing the debug information machinery when there are
2378 errors. */
2379 if (errorcount != 0 || sorrycount != 0)
2380 return;
2381
2a9a326b 2382 timevar_push (TV_SYMOUT);
f246a305
RS
2383#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2384 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2a9a326b 2385 dbxout_symbol (TYPE_STUB_DECL (type), !toplev);
4291d9c8
RS
2386#endif
2387#ifdef SDB_DEBUGGING_INFO
2388 if (write_symbols == SDB_DEBUG)
d8d1d62b 2389 sdbout_symbol (TYPE_STUB_DECL (type), !toplev);
881c6935
JM
2390#endif
2391#ifdef DWARF2_DEBUGGING_INFO
7a0c8d71
DR
2392 if ((write_symbols == DWARF2_DEBUG
2393 || write_symbols == VMS_AND_DWARF2_DEBUG)
2394 && toplev)
881c6935 2395 dwarf2out_decl (TYPE_STUB_DECL (type));
4291d9c8 2396#endif
2a9a326b 2397 timevar_pop (TV_SYMOUT);
4291d9c8
RS
2398}
2399
52dabb6c 2400/* This is called from finish_function (within langhooks.parse_file)
4291d9c8
RS
2401 after each top-level definition is parsed.
2402 It is supposed to compile that function or variable
2403 and output the assembler code for it.
2404 After we return, the tree storage is freed. */
2405
2406void
2407rest_of_compilation (decl)
2408 tree decl;
2409{
b3694847 2410 rtx insns;
4291d9c8 2411 int tem;
ab40ad2b 2412 int failure = 0;
c4403371 2413 int rebuild_label_notes_after_reload;
4291d9c8 2414
2a9a326b
AS
2415 timevar_push (TV_REST_OF_COMPILATION);
2416
1b3d8f8a
GK
2417 /* Now that we're out of the frontend, we shouldn't have any more
2418 CONCATs anywhere. */
2419 generating_concat_p = 0;
2420
d511f9d5
AO
2421 /* When processing delayed functions, prepare_function_start() won't
2422 have been run to re-initialize it. */
2423 cse_not_expected = ! optimize;
2424
fcd7f76b
JM
2425 /* First, make sure that NOTE_BLOCK is set correctly for each
2426 NOTE_INSN_BLOCK_BEG/NOTE_INSN_BLOCK_END note. */
116eebd6
MM
2427 if (!cfun->x_whole_function_mode_p)
2428 identify_blocks ();
fcd7f76b 2429
e619323d
DM
2430 /* In function-at-a-time mode, we do not attempt to keep the BLOCK
2431 tree in sensible shape. So, we just recalculate it here. */
01d939e8 2432 if (cfun->x_whole_function_mode_p)
116eebd6 2433 reorder_blocks ();
e619323d 2434
1f8f4a0b
MM
2435 init_flow ();
2436
4291d9c8
RS
2437 /* If we are reconsidering an inline function
2438 at the end of compilation, skip the stuff for making it inline. */
2439
2440 if (DECL_SAVED_INSNS (decl) == 0)
2441 {
956d6950 2442 int inlinable = 0;
14a774a9 2443 tree parent;
dff01034 2444 const char *lose;
4291d9c8 2445
14a774a9
RK
2446 /* If this is nested inside an inlined external function, pretend
2447 it was only declared. Since we cannot inline such functions,
2448 generating code for this one is not only not necessary but will
2449 confuse some debugging output writers. */
2450 for (parent = DECL_CONTEXT (current_function_decl);
854a97f0 2451 parent != NULL_TREE;
140b60b4 2452 parent = get_containing_scope (parent))
3e038608
MM
2453 if (TREE_CODE (parent) == FUNCTION_DECL
2454 && DECL_INLINE (parent) && DECL_EXTERNAL (parent))
14a774a9
RK
2455 {
2456 DECL_INITIAL (decl) = 0;
2457 goto exit_rest_of_compilation;
2458 }
bec80a45
MM
2459 else if (TYPE_P (parent))
2460 /* A function in a local class should be treated normally. */
2461 break;
14a774a9 2462
4291d9c8 2463 /* If requested, consider whether to make this function inline. */
5262d6b6 2464 if ((DECL_INLINE (decl) && !flag_no_inline)
b850de4f 2465 || flag_inline_functions)
2a9a326b
AS
2466 {
2467 timevar_push (TV_INTEGRATION);
2468 lose = function_cannot_inline_p (decl);
2469 timevar_pop (TV_INTEGRATION);
2470 if (lose || ! optimize)
2471 {
2472 if (warn_inline && DECL_INLINE (decl))
2473 warning_with_decl (decl, lose);
2474 DECL_ABSTRACT_ORIGIN (decl) = 0;
2475 /* Don't really compile an extern inline function.
2476 If we can't make it inline, pretend
2477 it was only declared. */
2478 if (DECL_EXTERNAL (decl))
2479 {
2480 DECL_INITIAL (decl) = 0;
2481 goto exit_rest_of_compilation;
2482 }
2483 }
2484 else
2485 /* ??? Note that this has the effect of making it look
2486 like "inline" was specified for a function if we choose
2487 to inline it. This isn't quite right, but it's
2488 probably not worth the trouble to fix. */
2489 inlinable = DECL_INLINE (decl) = 1;
2490 }
4291d9c8
RS
2491
2492 insns = get_insns ();
2493
2494 /* Dump the rtl code if we are dumping rtl. */
2495
61098249 2496 if (open_dump_file (DFI_rtl, decl))
032713aa 2497 {
032713aa
NC
2498 if (DECL_SAVED_INSNS (decl))
2499 fprintf (rtl_dump_file, ";; (integrable)\n\n");
61098249 2500 close_dump_file (DFI_rtl, print_rtl, insns);
032713aa 2501 }
4291d9c8 2502
52a11cbf
RH
2503 /* Convert from NOTE_INSN_EH_REGION style notes, and do other
2504 sorts of eh initialization. Delay this until after the
2505 initial rtl dump so that we can see the original nesting. */
2506 convert_from_eh_region_ranges ();
2507
4291d9c8 2508 /* If function is inline, and we don't yet know whether to
2bb74773
DJ
2509 compile it by itself, defer decision till end of compilation.
2510 wrapup_global_declarations will (indirectly) call
2511 rest_of_compilation again for those functions that need to
2512 be output. Also defer those functions that we are supposed
2513 to defer. */
36edd3cc 2514
fcd7f76b 2515 if (inlinable
36edd3cc
BS
2516 || (DECL_INLINE (decl)
2517 && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
303a3927 2518 && ! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
36edd3cc
BS
2519 && ! flag_keep_inline_functions)
2520 || DECL_EXTERNAL (decl))))
fcd7f76b 2521 DECL_DEFER_OUTPUT (decl) = 1;
951af26e 2522
f1f39752 2523 if (DECL_INLINE (decl))
cc712abf 2524 /* DWARF wants separate debugging info for abstract and
f1f39752
JM
2525 concrete instances of all inline functions, including those
2526 declared inline but not inlined, and those inlined even
2527 though they weren't declared inline. Conveniently, that's
2528 what DECL_INLINE means at this point. */
2b85879e 2529 (*debug_hooks->deferred_inline_function) (decl);
f1f39752 2530
fcd7f76b
JM
2531 if (DECL_DEFER_OUTPUT (decl))
2532 {
f93dacbd 2533 /* If -Wreturn-type, we have to do a bit of compilation. We just
4793dca1 2534 want to call cleanup the cfg to figure out whether or not we can
f93dacbd 2535 fall off the end of the function; we do the minimum amount of
4793dca1 2536 work necessary to make that safe. */
a701efba 2537 if (warn_return_type)
937522b5 2538 {
a701efba 2539 int saved_optimize = optimize;
f93dacbd 2540
a701efba 2541 optimize = 0;
4793dca1 2542 rebuild_jump_labels (insns);
a701efba 2543 find_exception_handler_labels ();
4793dca1 2544 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
0068fd96 2545 cleanup_cfg (CLEANUP_PRE_SIBCALL | CLEANUP_PRE_LOOP);
a701efba 2546 optimize = saved_optimize;
3c030e88 2547
f5143c46 2548 /* CFG is no longer maintained up-to-date. */
3c030e88 2549 free_bb_for_insn ();
a701efba
MM
2550 }
2551
b6128b8c 2552 set_nothrow_function_flags ();
dd1ba632
JM
2553 if (current_function_nothrow)
2554 /* Now we know that this can't throw; set the flag for the benefit
2555 of other functions later in this translation unit. */
2556 TREE_NOTHROW (current_function_decl) = 1;
2557
2a9a326b 2558 timevar_push (TV_INTEGRATION);
f93dacbd 2559 save_for_inline (decl);
2a9a326b 2560 timevar_pop (TV_INTEGRATION);
49ad7cfa 2561 DECL_SAVED_INSNS (decl)->inlinable = inlinable;
a701efba 2562 goto exit_rest_of_compilation;
4291d9c8
RS
2563 }
2564
b8471b65 2565 /* If specified extern inline but we aren't inlining it, we are
1cbe6eb6
JM
2566 done. This goes for anything that gets here with DECL_EXTERNAL
2567 set, not just things with DECL_INLINE. */
2568 if (DECL_EXTERNAL (decl))
b8471b65
RK
2569 goto exit_rest_of_compilation;
2570 }
07af9d16 2571
c28abdf0
RH
2572 /* If we're emitting a nested function, make sure its parent gets
2573 emitted as well. Doing otherwise confuses debug info. */
2574 {
2575 tree parent;
2576 for (parent = DECL_CONTEXT (current_function_decl);
2577 parent != NULL_TREE;
2578 parent = get_containing_scope (parent))
2579 if (TREE_CODE (parent) == FUNCTION_DECL)
2580 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
2581 }
2582
2583 /* We are now committed to emitting code for this function. Do any
2584 preparation, such as emitting abstract debug info for the inline
2585 before it gets mangled by optimization. */
2586 if (DECL_INLINE (decl))
2587 (*debug_hooks->outlining_inline_function) (decl);
2588
2589 /* Remove any notes we don't need. That will make iterating
2590 over the instruction sequence faster, and allow the garbage
2591 collector to reclaim the memory used by the notes. */
2592 remove_unnecessary_notes ();
2593 reorder_blocks ();
2594
1f8f4a0b 2595 ggc_collect ();
0a1c58a2 2596
49ad7cfa
BS
2597 /* Initialize some variables used by the optimizers. */
2598 init_function_for_compilation ();
2599
951af26e
JM
2600 if (! DECL_DEFER_OUTPUT (decl))
2601 TREE_ASM_WRITTEN (decl) = 1;
4291d9c8 2602
659e47fb
AH
2603 /* Now that integrate will no longer see our rtl, we need not
2604 distinguish between the return value of this function and the
2605 return value of called functions. Also, we can remove all SETs
2606 of subregs of hard registers; they are only here because of
9cabb1d8 2607 integrate. Also, we can now initialize pseudos intended to
c0e7830f 2608 carry magic hard reg data throughout the function. */
4291d9c8 2609 rtx_equal_function_value_matters = 0;
659e47fb 2610 purge_hard_subreg_sets (get_insns ());
21c7361e 2611
6c40858f
RH
2612 /* Early return if there were errors. We can run afoul of our
2613 consistency checks, and there's not really much point in fixing them.
2614 Don't return yet if -Wreturn-type; we need to do cleanup_cfg. */
2615 if (((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
2616 || errorcount || sorrycount)
a18820c6 2617 goto exit_rest_of_compilation;
4291d9c8 2618
969d70ca
JH
2619 timevar_push (TV_JUMP);
2620 open_dump_file (DFI_sibling, decl);
2621 insns = get_insns ();
2622 rebuild_jump_labels (insns);
2623 find_exception_handler_labels ();
2624 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
d92b4486 2625
969d70ca
JH
2626 delete_unreachable_blocks ();
2627
2628 /* Turn NOTE_INSN_PREDICTIONs into branch predictions. */
d50672ef
JH
2629 if (flag_guess_branch_prob)
2630 {
2631 timevar_push (TV_BRANCH_PROB);
2632 note_prediction_to_br_prob ();
2633 timevar_pop (TV_BRANCH_PROB);
2634 }
969d70ca 2635
9d9e5c09
RH
2636 /* We may have potential sibling or tail recursion sites. Select one
2637 (of possibly multiple) methods of performing the call. */
2638 if (flag_optimize_sibling_calls)
2639 {
969d70ca 2640 rtx insn;
2a9a326b 2641 optimize_sibling_and_tail_recursive_calls ();
9d9e5c09 2642
5204d665
JH
2643 /* Recompute the CFG as sibling optimization clobbers it randomly. */
2644 free_bb_for_insn ();
2645 find_exception_handler_labels ();
2646 rebuild_jump_labels (insns);
2647 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2648
969d70ca
JH
2649 /* There is pass ordering problem - we must lower NOTE_INSN_PREDICTION
2650 notes before simplifying cfg and we must do lowering after sibcall
2651 that unhides parts of RTL chain and cleans up the CFG.
d92b4486 2652
969d70ca
JH
2653 Until sibcall is replaced by tree-level optimizer, lets just
2654 sweep away the NOTE_INSN_PREDICTION notes that leaked out. */
2655 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2656 if (GET_CODE (insn) == NOTE
2657 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_PREDICTION)
2658 delete_insn (insn);
9d9e5c09 2659 }
ba4f7968
JH
2660 close_dump_file (DFI_sibling, print_rtl, get_insns ());
2661 timevar_pop (TV_JUMP);
2a9a326b 2662
ba4f7968 2663 scope_to_insns_initialize ();
52a11cbf 2664 /* Complete generation of exception handling code. */
52a11cbf
RH
2665 if (doing_eh (0))
2666 {
2667 timevar_push (TV_JUMP);
2668 open_dump_file (DFI_eh, decl);
2669
2670 finish_eh_generation ();
2671
2672 close_dump_file (DFI_eh, print_rtl, get_insns ());
2673 timevar_pop (TV_JUMP);
2674 }
2675
1eefb6c1
RH
2676 /* Delay emitting hard_reg_initial_value sets until after EH landing pad
2677 generation, which might create new sets. */
2678 emit_initial_value_sets ();
2679
4291d9c8
RS
2680#ifdef FINALIZE_PIC
2681 /* If we are doing position-independent code generation, now
2682 is the time to output special prologues and epilogues.
2683 We do not want to do this earlier, because it just clutters
2684 up inline functions with meaningless insns. */
2685 if (flag_pic)
2686 FINALIZE_PIC;
2687#endif
2688
2689 insns = get_insns ();
2690
2691 /* Copy any shared structure that should not be shared. */
d1b81779 2692 unshare_all_rtl (current_function_decl, insns);
4291d9c8 2693
c9ec4f99 2694#ifdef SETJMP_VIA_SAVE_AREA
95479831
DM
2695 /* This must be performed before virtual register instantiation.
2696 Please be aware the everything in the compiler that can look
2697 at the RTL up to this point must understand that REG_SAVE_AREA
2698 is just like a use of the REG contained inside. */
c9ec4f99
DM
2699 if (current_function_calls_alloca)
2700 optimize_save_area_alloca (insns);
2701#endif
2702
4291d9c8 2703 /* Instantiate all virtual registers. */
a18820c6 2704 instantiate_virtual_regs (current_function_decl, insns);
4291d9c8 2705
61098249 2706 open_dump_file (DFI_jump, decl);
02db399d 2707
cc4e79d8
JL
2708 /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
2709 are initialized and to compute whether control can drop off the end
2710 of the function. */
994a57cd 2711
2a9a326b
AS
2712 timevar_push (TV_JUMP);
2713 /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB. Do this
2714 before jump optimization switches branch directions. */
d50672ef
JH
2715 if (flag_guess_branch_prob)
2716 expected_value_to_br_prob ();
2a9a326b
AS
2717
2718 reg_scan (insns, max_reg_num (), 0);
0045d504
JH
2719 rebuild_jump_labels (insns);
2720 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
1c4a429a 2721 delete_trivially_dead_insns (insns, max_reg_num ());
38c1593d
JH
2722 if (rtl_dump_file)
2723 dump_flow_info (rtl_dump_file);
2ca6672b
JH
2724 cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_PRE_LOOP
2725 | (flag_thread_jumps ? CLEANUP_THREADING : 0));
3c030e88 2726
1c4a429a
JH
2727 if (optimize)
2728 {
2729 free_bb_for_insn ();
2730 copy_loop_headers (insns);
2731 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
2732 }
0045d504 2733 purge_line_number_notes (insns);
2a9a326b
AS
2734
2735 timevar_pop (TV_JUMP);
38c1593d 2736 close_dump_file (DFI_jump, print_rtl, insns);
673b5311 2737
32235b30 2738 /* Now is when we stop if -fsyntax-only and -Wreturn-type. */
951af26e 2739 if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
a18820c6 2740 {
a18820c6
RH
2741 goto exit_rest_of_compilation;
2742 }
2743
0826f1d8
JL
2744 /* Long term, this should probably move before the jump optimizer too,
2745 but I didn't want to disturb the rtl_dump_and_exit and related
2746 stuff at this time. */
2747 if (optimize > 0 && flag_ssa)
2748 {
2749 /* Convert to SSA form. */
2750
2751 timevar_push (TV_TO_SSA);
2752 open_dump_file (DFI_ssa, decl);
2753
0068fd96 2754 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
0826f1d8
JL
2755 convert_to_ssa ();
2756
2757 close_dump_file (DFI_ssa, print_rtl_with_bb, insns);
2758 timevar_pop (TV_TO_SSA);
2759
0b47e4c1
JL
2760 /* Perform sparse conditional constant propagation, if requested. */
2761 if (flag_ssa_ccp)
2762 {
2763 timevar_push (TV_SSA_CCP);
2764 open_dump_file (DFI_ssa_ccp, decl);
2765
2766 ssa_const_prop ();
2767
2768 close_dump_file (DFI_ssa_ccp, print_rtl_with_bb, get_insns ());
2769 timevar_pop (TV_SSA_CCP);
2770 }
2771
2772 /* It would be useful to cleanup the CFG at this point, but block
2773 merging and possibly other transformations might leave a PHI
2774 node in the middle of a basic block, which is a strict no-no. */
2775
0826f1d8
JL
2776 /* The SSA implementation uses basic block numbers in its phi
2777 nodes. Thus, changing the control-flow graph or the basic
2778 blocks, e.g., calling find_basic_blocks () or cleanup_cfg (),
2779 may cause problems. */
2780
2781 if (flag_ssa_dce)
2782 {
2d76cb1a 2783 /* Remove dead code. */
0826f1d8
JL
2784
2785 timevar_push (TV_SSA_DCE);
2786 open_dump_file (DFI_ssa_dce, decl);
2787
2788 insns = get_insns ();
9cabb1d8 2789 ssa_eliminate_dead_code ();
0826f1d8
JL
2790
2791 close_dump_file (DFI_ssa_dce, print_rtl_with_bb, insns);
2792 timevar_pop (TV_SSA_DCE);
2793 }
2794
2795 /* Convert from SSA form. */
2796
2797 timevar_push (TV_FROM_SSA);
2798 open_dump_file (DFI_ussa, decl);
2799
2800 convert_from_ssa ();
2801 /* New registers have been created. Rescan their usage. */
2802 reg_scan (insns, max_reg_num (), 1);
0826f1d8
JL
2803
2804 close_dump_file (DFI_ussa, print_rtl_with_bb, insns);
2805 timevar_pop (TV_FROM_SSA);
2806
2807 ggc_collect ();
2808 }
2809
2a9a326b 2810 timevar_push (TV_JUMP);
038c7976 2811 cleanup_cfg (optimize ? CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP: 0);
9ec6d7ab 2812
2181005d
RS
2813 /* Try to identify useless null pointer tests and delete them. */
2814 if (flag_delete_null_pointer_checks)
2a9a326b 2815 {
38c1593d 2816 open_dump_file (DFI_null, decl);
38c1593d
JH
2817 if (rtl_dump_file)
2818 dump_flow_info (rtl_dump_file);
9ec6d7ab 2819
99a15921
JL
2820 if (delete_null_pointer_checks (insns))
2821 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
38c1593d 2822
38c1593d 2823 close_dump_file (DFI_null, print_rtl_with_bb, insns);
2a9a326b
AS
2824 }
2825
2826 /* Jump optimization, and the removal of NULL pointer checks, may
2827 have reduced the number of instructions substantially. CSE, and
2828 future passes, allocate arrays whose dimensions involve the
2829 maximum instruction UID, so if we can reduce the maximum UID
2830 we'll save big on memory. */
2831 renumber_insns (rtl_dump_file);
2832 timevar_pop (TV_JUMP);
a18820c6 2833
38c1593d 2834 close_dump_file (DFI_jump, print_rtl_with_bb, insns);
dfdb644f 2835
1f8f4a0b 2836 ggc_collect ();
a3770a81 2837
4291d9c8
RS
2838 /* Perform common subexpression elimination.
2839 Nonzero value from `cse_main' means that jumps were simplified
2840 and some code may now be unreachable, so do
2841 jump optimization again. */
2842
4291d9c8
RS
2843 if (optimize > 0)
2844 {
61098249 2845 open_dump_file (DFI_cse, decl);
38c1593d
JH
2846 if (rtl_dump_file)
2847 dump_flow_info (rtl_dump_file);
2a9a326b 2848 timevar_push (TV_CSE);
032713aa 2849
2a9a326b 2850 reg_scan (insns, max_reg_num (), 1);
4291d9c8 2851
2a9a326b 2852 tem = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
38c1593d
JH
2853 if (tem)
2854 rebuild_jump_labels (insns);
2855 purge_all_dead_edges (0);
a18820c6 2856
2ca6672b
JH
2857 delete_trivially_dead_insns (insns, max_reg_num ());
2858
48aba75b
RK
2859 /* If we are not running more CSE passes, then we are no longer
2860 expecting CSE to be run. But always rerun it in a cheap mode. */
2861 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
c5c76735 2862
534bfae4 2863 if (tem || optimize > 1)
38c1593d 2864 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
dfdb644f 2865 /* Try to identify useless null pointer tests and delete them. */
99a15921 2866 if (flag_delete_null_pointer_checks)
2a9a326b
AS
2867 {
2868 timevar_push (TV_JUMP);
2a9a326b 2869
006a94b0
JL
2870 if (delete_null_pointer_checks (insns))
2871 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2a9a326b
AS
2872 timevar_pop (TV_JUMP);
2873 }
4291d9c8 2874
673b5311
MM
2875 /* The second pass of jump optimization is likely to have
2876 removed a bunch more instructions. */
2877 renumber_insns (rtl_dump_file);
735a0e33 2878
2a9a326b 2879 timevar_pop (TV_CSE);
38c1593d 2880 close_dump_file (DFI_cse, print_rtl_with_bb, insns);
032713aa 2881 }
4291d9c8 2882
61098249
RH
2883 open_dump_file (DFI_addressof, decl);
2884
e9a25f70 2885 purge_addressof (insns);
38c1593d
JH
2886 if (optimize)
2887 purge_all_dead_edges (0);
e9a25f70
JL
2888 reg_scan (insns, max_reg_num (), 1);
2889
61098249 2890 close_dump_file (DFI_addressof, print_rtl, insns);
735a0e33 2891
1f8f4a0b 2892 ggc_collect ();
a3770a81 2893
7506f491
DE
2894 /* Perform global cse. */
2895
2896 if (optimize > 0 && flag_gcse)
2897 {
791f5e8d 2898 int save_csb, save_cfj;
48aba75b
RK
2899 int tem2 = 0;
2900
2a9a326b 2901 timevar_push (TV_GCSE);
61098249 2902 open_dump_file (DFI_gcse, decl);
735a0e33 2903
2a9a326b 2904 tem = gcse_main (insns, rtl_dump_file);
b90e45ae 2905 rebuild_jump_labels (insns);
2ca6672b 2906 delete_trivially_dead_insns (insns, max_reg_num ());
e78d9500 2907
791f5e8d
BS
2908 save_csb = flag_cse_skip_blocks;
2909 save_cfj = flag_cse_follow_jumps;
2910 flag_cse_skip_blocks = flag_cse_follow_jumps = 0;
2911
48aba75b
RK
2912 /* If -fexpensive-optimizations, re-run CSE to clean up things done
2913 by gcse. */
2914 if (flag_expensive_optimizations)
2915 {
2916 timevar_push (TV_CSE);
2917 reg_scan (insns, max_reg_num (), 1);
2918 tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
38c1593d 2919 purge_all_dead_edges (0);
2ca6672b 2920 delete_trivially_dead_insns (insns, max_reg_num ());
48aba75b
RK
2921 timevar_pop (TV_CSE);
2922 cse_not_expected = !flag_rerun_cse_after_loop;
2923 }
5262d6b6 2924
48aba75b
RK
2925 /* If gcse or cse altered any jumps, rerun jump optimizations to clean
2926 things up. Then possibly re-run CSE again. */
2927 while (tem || tem2)
e78d9500 2928 {
48aba75b 2929 tem = tem2 = 0;
2a9a326b 2930 timevar_push (TV_JUMP);
0045d504 2931 rebuild_jump_labels (insns);
0068fd96 2932 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
2a9a326b 2933 timevar_pop (TV_JUMP);
48aba75b
RK
2934
2935 if (flag_expensive_optimizations)
2936 {
2937 timevar_push (TV_CSE);
2938 reg_scan (insns, max_reg_num (), 1);
2939 tem2 = cse_main (insns, max_reg_num (), 0, rtl_dump_file);
38c1593d 2940 purge_all_dead_edges (0);
2ca6672b 2941 delete_trivially_dead_insns (insns, max_reg_num ());
48aba75b
RK
2942 timevar_pop (TV_CSE);
2943 }
854a97f0 2944 }
7506f491 2945
38c1593d 2946 close_dump_file (DFI_gcse, print_rtl_with_bb, insns);
2a9a326b 2947 timevar_pop (TV_GCSE);
a3770a81 2948
1f8f4a0b 2949 ggc_collect ();
791f5e8d
BS
2950 flag_cse_skip_blocks = save_csb;
2951 flag_cse_follow_jumps = save_cfj;
38c1593d
JH
2952#ifdef ENABLE_CHECKING
2953 verify_flow_info ();
2954#endif
a01da83b 2955 }
a18820c6 2956
34ee7f82 2957 /* Instantiate any remaining CONSTANT_P_RTX nodes. */
07d9b20d 2958 if (optimize > 0 && flag_gcse && current_function_calls_constant_p)
41559112 2959 purge_builtin_constant_p ();
34ee7f82 2960
4291d9c8
RS
2961 /* Move constant computations out of loops. */
2962
96327cdc 2963 if (optimize > 0 && flag_loop_optimize)
4291d9c8 2964 {
5e1afb11
RH
2965 int do_unroll, do_prefetch;
2966
2a9a326b 2967 timevar_push (TV_LOOP);
0010687d 2968 delete_dead_jumptables ();
974a7f56 2969 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
61098249 2970 open_dump_file (DFI_loop, decl);
38c1593d 2971 /* CFG is no longer maintained up-to-date. */
3c030e88 2972 free_bb_for_insn ();
854a97f0 2973
b17d5d7c
ZD
2974 if (flag_unroll_loops)
2975 do_unroll = 0; /* Having two unrollers is useless. */
2976 else
2977 do_unroll = flag_old_unroll_loops ? LOOP_UNROLL : LOOP_AUTO_UNROLL;
5e1afb11 2978 do_prefetch = flag_prefetch_loop_arrays ? LOOP_PREFETCH : 0;
2a9a326b
AS
2979 if (flag_rerun_loop_opt)
2980 {
01f62f01
JH
2981 cleanup_barriers ();
2982
2a9a326b 2983 /* We only want to perform unrolling once. */
5e1afb11
RH
2984 loop_optimize (insns, rtl_dump_file, do_unroll);
2985 do_unroll = 0;
a18820c6 2986
2a9a326b
AS
2987 /* The first call to loop_optimize makes some instructions
2988 trivially dead. We delete those instructions now in the
2989 hope that doing so will make the heuristics in loop work
2990 better and possibly speed up compilation. */
3dec4024 2991 delete_trivially_dead_insns (insns, max_reg_num ());
c6a26dc4 2992
2a9a326b 2993 /* The regscan pass is currently necessary as the alias
c6a26dc4 2994 analysis code depends on this information. */
2a9a326b
AS
2995 reg_scan (insns, max_reg_num (), 1);
2996 }
01f62f01 2997 cleanup_barriers ();
5e1afb11 2998 loop_optimize (insns, rtl_dump_file, do_unroll | LOOP_BCT | do_prefetch);
735a0e33 2999
38c1593d 3000 /* Loop can create trivially dead instructions. */
3dec4024 3001 delete_trivially_dead_insns (insns, max_reg_num ());
61098249 3002 close_dump_file (DFI_loop, print_rtl, insns);
2a9a326b 3003 timevar_pop (TV_LOOP);
495333a6 3004 find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
a3770a81 3005
1f8f4a0b 3006 ggc_collect ();
4291d9c8
RS
3007 }
3008
a0134312
RS
3009 /* Perform jump bypassing and control flow optimizations. */
3010 if (optimize > 0 && flag_gcse)
3011 {
3012 timevar_push (TV_BYPASS);
3013 open_dump_file (DFI_bypass, decl);
3014
3015 cleanup_cfg (CLEANUP_EXPENSIVE);
3016 tem = bypass_jumps (rtl_dump_file);
3017
3018 if (tem)
3019 {
3020 rebuild_jump_labels (insns);
3021 cleanup_cfg (CLEANUP_EXPENSIVE);
3022 delete_trivially_dead_insns (insns, max_reg_num ());
3023 }
3024
3025 close_dump_file (DFI_bypass, print_rtl_with_bb, insns);
3026 timevar_pop (TV_BYPASS);
3027
3028 ggc_collect ();
3029
3030#ifdef ENABLE_CHECKING
3031 verify_flow_info ();
3032#endif
3033 }
3034
38c1593d
JH
3035 /* Do control and data flow analysis; wrote some of the results to
3036 the dump file. */
3037
3038 timevar_push (TV_FLOW);
3039 open_dump_file (DFI_cfg, decl);
38c1593d
JH
3040 if (rtl_dump_file)
3041 dump_flow_info (rtl_dump_file);
3042 cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
3043 | (flag_thread_jumps ? CLEANUP_THREADING : 0));
3044
3045 /* It may make more sense to mark constant functions after dead code is
14b493d6 3046 eliminated by life_analysis, but we need to do it early, as -fprofile-arcs
38c1593d
JH
3047 may insert code making function non-constant, but we still must consider
3048 it as constant, otherwise -fbranch-probabilities will not read data back.
3049
14b493d6 3050 life_analysis rarely eliminates modification of external memory.
38c1593d 3051 */
1540f9eb
JH
3052 if (optimize)
3053 mark_constant_function ();
38c1593d
JH
3054
3055 close_dump_file (DFI_cfg, print_rtl_with_bb, insns);
3056
3057 /* Do branch profiling and static profile estimation passes. */
b7c9bf28 3058 if (optimize > 0 || cfun->arc_profile || flag_branch_probabilities)
38c1593d
JH
3059 {
3060 struct loops loops;
3061
3062 timevar_push (TV_BRANCH_PROB);
3063 open_dump_file (DFI_bp, decl);
b7c9bf28 3064 if (cfun->arc_profile || flag_branch_probabilities)
38c1593d
JH
3065 branch_prob ();
3066
3067 /* Discover and record the loop depth at the head of each basic
3068 block. The loop infrastructure does the real job for us. */
3069 flow_loops_find (&loops, LOOP_TREE);
3070
7e51e626
JH
3071 if (rtl_dump_file)
3072 flow_loops_dump (&loops, rtl_dump_file, NULL, 0);
3073
38c1593d
JH
3074 /* Estimate using heuristics if no profiling info is available. */
3075 if (flag_guess_branch_prob)
3076 estimate_probability (&loops);
3077
38c1593d
JH
3078 flow_loops_free (&loops);
3079 close_dump_file (DFI_bp, print_rtl_with_bb, insns);
3080 timevar_pop (TV_BRANCH_PROB);
3081 }
1c4a429a 3082 if (optimize > 0)
0fb53e68 3083 {
0fb53e68 3084 open_dump_file (DFI_ce1, decl);
fc8dfa20
JH
3085 if (flag_if_conversion)
3086 {
3087 timevar_push (TV_IFCVT);
3088 if (rtl_dump_file)
3089 dump_flow_info (rtl_dump_file);
3090 cleanup_cfg (CLEANUP_EXPENSIVE);
3091 reg_scan (insns, max_reg_num (), 0);
3092 if_convert (0);
3093 timevar_pop (TV_IFCVT);
3094 }
3095 timevar_push (TV_JUMP);
0fb53e68
JH
3096 cleanup_cfg (CLEANUP_EXPENSIVE);
3097 reg_scan (insns, max_reg_num (), 0);
fc8dfa20 3098 timevar_pop (TV_JUMP);
0fb53e68 3099 close_dump_file (DFI_ce1, print_rtl_with_bb, get_insns ());
0fb53e68 3100 }
5c856b23
JH
3101 if (flag_tracer)
3102 {
3103 timevar_push (TV_TRACER);
3104 open_dump_file (DFI_tracer, decl);
3105 if (rtl_dump_file)
3106 dump_flow_info (rtl_dump_file);
5c856b23
JH
3107 tracer ();
3108 cleanup_cfg (CLEANUP_EXPENSIVE);
fc8dfa20 3109 reg_scan (insns, max_reg_num (), 0);
5c856b23
JH
3110 close_dump_file (DFI_tracer, print_rtl_with_bb, get_insns ());
3111 timevar_pop (TV_TRACER);
5c856b23 3112 }
38c1593d 3113
617b465c
ZD
3114 /* Perform loop optimalizations. It might be better to do them a bit
3115 sooner, but we want the profile feedback to work more efficiently. */
3116 if (optimize > 0
b17d5d7c
ZD
3117 && (flag_unswitch_loops
3118 || flag_peel_loops
3119 || flag_unroll_loops))
617b465c
ZD
3120 {
3121 struct loops *loops;
3122 timevar_push (TV_LOOP);
3123 open_dump_file (DFI_loop2, decl);
3124 if (rtl_dump_file)
3125 dump_flow_info (rtl_dump_file);
3126
3127 loops = loop_optimizer_init (rtl_dump_file);
3128
3129 if (loops)
3130 {
3131 /* The optimalizations: */
3132 if (flag_unswitch_loops)
3133 unswitch_loops (loops);
3134
b17d5d7c
ZD
3135 if (flag_peel_loops || flag_unroll_loops)
3136 unroll_and_peel_loops (loops,
3137 (flag_peel_loops ? UAP_PEEL : 0) |
3138 (flag_unroll_loops ? UAP_UNROLL : 0) |
3139 (flag_unroll_all_loops ? UAP_UNROLL_ALL : 0));
3140
617b465c
ZD
3141 loop_optimizer_finalize (loops, rtl_dump_file);
3142 }
3143
3144 cleanup_cfg (CLEANUP_EXPENSIVE);
3145 delete_trivially_dead_insns (insns, max_reg_num ());
3146 reg_scan (insns, max_reg_num (), 0);
3147 if (rtl_dump_file)
3148 dump_flow_info (rtl_dump_file);
3149 close_dump_file (DFI_loop2, print_rtl_with_bb, get_insns ());
3150 timevar_pop (TV_LOOP);
3151 ggc_collect ();
3152 }
3153
fc8dfa20 3154 if (flag_rerun_cse_after_loop)
c2f006ec 3155 {
2a9a326b 3156 timevar_push (TV_CSE2);
61098249 3157 open_dump_file (DFI_cse2, decl);
38c1593d
JH
3158 if (rtl_dump_file)
3159 dump_flow_info (rtl_dump_file);
fc8dfa20
JH
3160 /* CFG is no longer maintained up-to-date. */
3161 tem = cse_main (insns, max_reg_num (), 1, rtl_dump_file);
3162 purge_all_dead_edges (0);
3163 delete_trivially_dead_insns (insns, max_reg_num ());
735a0e33 3164
fc8dfa20 3165 if (tem)
032713aa 3166 {
2a9a326b 3167 timevar_push (TV_JUMP);
fc8dfa20 3168 rebuild_jump_labels (insns);
46fac664 3169 cleanup_cfg (CLEANUP_EXPENSIVE);
fc8dfa20 3170 timevar_pop (TV_JUMP);
032713aa 3171 }
fc8dfa20 3172 reg_scan (insns, max_reg_num (), 0);
38c1593d 3173 close_dump_file (DFI_cse2, print_rtl_with_bb, insns);
1f8f4a0b 3174 ggc_collect ();
fc8dfa20 3175 timevar_pop (TV_CSE2);
032713aa 3176 }
735a0e33 3177
9ec6d7ab
RH
3178 cse_not_expected = 1;
3179
2ca6672b 3180 open_dump_file (DFI_life, decl);
4291d9c8
RS
3181 regclass_init ();
3182
b313a0fe 3183 check_function_return_warnings ();
51891abe 3184
38c1593d
JH
3185#ifdef ENABLE_CHECKING
3186 verify_flow_info ();
3187#endif
2a9a326b 3188 life_analysis (insns, rtl_dump_file, PROP_FINAL);
38c1593d 3189 if (optimize)
1e3881c2 3190 cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_UPDATE_LIFE
fe477d8b 3191 | (flag_thread_jumps ? CLEANUP_THREADING : 0));
2a9a326b 3192 timevar_pop (TV_FLOW);
5ece9746 3193
7b40bc6b
RH
3194 no_new_pseudos = 1;
3195
d29c259b
RH
3196 if (warn_uninitialized || extra_warnings)
3197 {
3198 uninitialized_vars_warning (DECL_INITIAL (decl));
3199 if (extra_warnings)
3200 setjmp_args_warning ();
4291d9c8
RS
3201 }
3202
0626ef8a
AM
3203 if (optimize)
3204 {
38c1593d 3205 clear_bb_flags ();
ed8d2920 3206 if (!flag_new_regalloc && initialize_uninitialized_subregs ())
0626ef8a
AM
3207 {
3208 /* Insns were inserted, so things might look a bit different. */
a01da83b 3209 insns = get_insns ();
38c1593d
JH
3210 update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
3211 PROP_LOG_LINKS | PROP_REG_INFO
3212 | PROP_DEATH_NOTES);
0626ef8a
AM
3213 }
3214 }
3215
51891abe 3216 close_dump_file (DFI_life, print_rtl_with_bb, insns);
735a0e33 3217
1f8f4a0b 3218 ggc_collect ();
a3770a81 3219
4291d9c8
RS
3220 /* If -opt, try combining insns through substitution. */
3221
3222 if (optimize > 0)
032713aa 3223 {
44a76fc8
AG
3224 int rebuild_jump_labels_after_combine = 0;
3225
2a9a326b 3226 timevar_push (TV_COMBINE);
61098249
RH
3227 open_dump_file (DFI_combine, decl);
3228
2a9a326b
AS
3229 rebuild_jump_labels_after_combine
3230 = combine_instructions (insns, max_reg_num ());
854a97f0 3231
44a76fc8 3232 /* Combining insns may have turned an indirect jump into a
3d042e77 3233 direct jump. Rebuild the JUMP_LABEL fields of jumping
44a76fc8
AG
3234 instructions. */
3235 if (rebuild_jump_labels_after_combine)
3236 {
2a9a326b
AS
3237 timevar_push (TV_JUMP);
3238 rebuild_jump_labels (insns);
3239 timevar_pop (TV_JUMP);
9ec6d7ab 3240
635559ab 3241 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
44a76fc8 3242 }
735a0e33 3243
61098249 3244 close_dump_file (DFI_combine, print_rtl_with_bb, insns);
2a9a326b 3245 timevar_pop (TV_COMBINE);
a3770a81 3246
1f8f4a0b 3247 ggc_collect ();
032713aa 3248 }
8c660648 3249
9ec6d7ab
RH
3250 /* Rerun if-conversion, as combine may have simplified things enough to
3251 now meet sequence length restrictions. */
2c4b77f3 3252 if (flag_if_conversion)
9ec6d7ab
RH
3253 {
3254 timevar_push (TV_IFCVT);
0fb53e68 3255 open_dump_file (DFI_ce2, decl);
9ec6d7ab 3256
7b40bc6b 3257 no_new_pseudos = 0;
9ec6d7ab 3258 if_convert (1);
7b40bc6b 3259 no_new_pseudos = 1;
9ec6d7ab 3260
0fb53e68 3261 close_dump_file (DFI_ce2, print_rtl_with_bb, insns);
9ec6d7ab
RH
3262 timevar_pop (TV_IFCVT);
3263 }
3264
8c660648
JL
3265 /* Register allocation pre-pass, to reduce number of moves
3266 necessary for two-address machines. */
1230327b 3267 if (optimize > 0 && (flag_regmove || flag_expensive_optimizations))
032713aa 3268 {
2a9a326b 3269 timevar_push (TV_REGMOVE);
61098249 3270 open_dump_file (DFI_regmove, decl);
735a0e33 3271
2a9a326b 3272 regmove_optimize (insns, max_reg_num (), rtl_dump_file);
735a0e33 3273
38c1593d 3274 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
61098249 3275 close_dump_file (DFI_regmove, print_rtl_with_bb, insns);
2a9a326b 3276 timevar_pop (TV_REGMOVE);
a3770a81 3277
1f8f4a0b 3278 ggc_collect ();
032713aa 3279 }
8c660648 3280
22fb740d
JH
3281 /* Do unconditional splitting before register allocation to allow machine
3282 description to add extra information not needed previously. */
3283 split_all_insns (1);
3284
97d36f45 3285#ifdef OPTIMIZE_MODE_SWITCHING
b932f770 3286 timevar_push (TV_MODE_SWITCH);
97d36f45 3287
22fb740d 3288 no_new_pseudos = 0;
38c1593d 3289 optimize_mode_switching (NULL);
22fb740d 3290 no_new_pseudos = 1;
bd675859 3291
b932f770 3292 timevar_pop (TV_MODE_SWITCH);
97d36f45 3293#endif
9f09b1f2 3294
2382b79f
RS
3295 /* Any of the several passes since flow1 will have munged register
3296 lifetime data a bit. We need it to be up to date for scheduling
3297 (see handling of reg_known_equiv in init_alias_analysis). */
3298 recompute_reg_usage (insns, !optimize_size);
3299
05b432db
JH
3300 timevar_push (TV_SCHED);
3301
375e2d5c 3302#ifdef INSN_SCHEDULING
97726216
RK
3303
3304 /* Print function header into sched dump now
3305 because doing the sched analysis makes some of the dump. */
4291d9c8
RS
3306 if (optimize > 0 && flag_schedule_insns)
3307 {
61098249 3308 open_dump_file (DFI_sched, decl);
735a0e33 3309
4291d9c8
RS
3310 /* Do control and data sched analysis,
3311 and write some of the results to dump file. */
3312
2a9a326b 3313 schedule_insns (rtl_dump_file);
735a0e33 3314
61098249 3315 close_dump_file (DFI_sched, print_rtl_with_bb, insns);
4291d9c8 3316 }
375e2d5c 3317#endif
05b432db
JH
3318 timevar_pop (TV_SCHED);
3319
3320 ggc_collect ();
4291d9c8 3321
54ff41b7
JW
3322 /* Determine if the current function is a leaf before running reload
3323 since this can impact optimizations done by the prologue and
3324 epilogue thus changing register elimination offsets. */
3325 current_function_is_leaf = leaf_function_p ();
3326
2a9a326b 3327 timevar_push (TV_LOCAL_ALLOC);
61098249 3328 open_dump_file (DFI_lreg, decl);
246fd41f 3329
854a97f0 3330 /* Allocate pseudo-regs that are used only within 1 basic block.
3f1b9b1b
JL
3331
3332 RUN_JUMP_AFTER_RELOAD records whether or not we need to rerun the
3333 jump optimizer after register allocation and reloading are finished. */
4291d9c8 3334
ed8d2920
MM
3335 if (flag_new_regalloc)
3336 {
3337 delete_trivially_dead_insns (insns, max_reg_num ());
3338 reg_alloc ();
385b6e2d 3339
ed8d2920
MM
3340 timevar_pop (TV_LOCAL_ALLOC);
3341 if (dump_file[DFI_lreg].enabled)
3342 {
3343 timevar_push (TV_DUMP);
385b6e2d 3344
ed8d2920
MM
3345 close_dump_file (DFI_lreg, NULL, NULL);
3346 timevar_pop (TV_DUMP);
3347 }
385b6e2d 3348
ed8d2920
MM
3349 /* XXX clean up the whole mess to bring live info in shape again. */
3350 timevar_push (TV_GLOBAL_ALLOC);
3351 open_dump_file (DFI_greg, decl);
2a9a326b 3352
ed8d2920
MM
3353 build_insn_chain (insns);
3354 failure = reload (insns, 0);
4291d9c8 3355
ed8d2920 3356 timevar_pop (TV_GLOBAL_ALLOC);
2a9a326b 3357
ed8d2920
MM
3358 if (dump_file[DFI_greg].enabled)
3359 {
3360 timevar_push (TV_DUMP);
735a0e33 3361
ed8d2920
MM
3362 dump_global_regs (rtl_dump_file);
3363
3364 close_dump_file (DFI_greg, print_rtl_with_bb, insns);
3365 timevar_pop (TV_DUMP);
3366 }
3367
3368 if (failure)
3369 goto exit_rest_of_compilation;
3370 reload_completed = 1;
3371 rebuild_label_notes_after_reload = 0;
032713aa 3372 }
ed8d2920
MM
3373 else
3374 {
3375 /* Allocate the reg_renumber array. */
3376 allocate_reg_info (max_regno, FALSE, TRUE);
4291d9c8 3377
ed8d2920
MM
3378 /* And the reg_equiv_memory_loc array. */
3379 reg_equiv_memory_loc = (rtx *) xcalloc (max_regno, sizeof (rtx));
a3770a81 3380
ed8d2920 3381 allocate_initial_values (reg_equiv_memory_loc);
4291d9c8 3382
ed8d2920
MM
3383 regclass (insns, max_reg_num (), rtl_dump_file);
3384 rebuild_label_notes_after_reload = local_alloc ();
4291d9c8 3385
ed8d2920
MM
3386 timevar_pop (TV_LOCAL_ALLOC);
3387
3388 if (dump_file[DFI_lreg].enabled)
3389 {
3390 timevar_push (TV_DUMP);
2a9a326b 3391
ed8d2920
MM
3392 dump_flow_info (rtl_dump_file);
3393 dump_local_alloc (rtl_dump_file);
4291d9c8 3394
ed8d2920
MM
3395 close_dump_file (DFI_lreg, print_rtl_with_bb, insns);
3396 timevar_pop (TV_DUMP);
3397 }
8bb16620 3398
ed8d2920 3399 ggc_collect ();
8bb16620 3400
ed8d2920
MM
3401 timevar_push (TV_GLOBAL_ALLOC);
3402 open_dump_file (DFI_greg, decl);
8bb16620 3403
ed8d2920
MM
3404 /* If optimizing, allocate remaining pseudo-regs. Do the reload
3405 pass fixing up any insns that are invalid. */
3406
3407 if (optimize)
3408 failure = global_alloc (rtl_dump_file);
3409 else
3410 {
3411 build_insn_chain (insns);
3412 failure = reload (insns, 0);
3413 }
3414
3415 timevar_pop (TV_GLOBAL_ALLOC);
3416
3417 if (dump_file[DFI_greg].enabled)
3418 {
3419 timevar_push (TV_DUMP);
3420
3421 dump_global_regs (rtl_dump_file);
3422
3423 close_dump_file (DFI_greg, print_rtl_with_bb, insns);
3424 timevar_pop (TV_DUMP);
3425 }
3426
3427 if (failure)
3428 goto exit_rest_of_compilation;
3429 }
ab40ad2b 3430
1f8f4a0b 3431 ggc_collect ();
a3770a81 3432
8bb16620
BS
3433 open_dump_file (DFI_postreload, decl);
3434
c8ed219d
RK
3435 /* Do a very simple CSE pass over just the hard registers. */
3436 if (optimize > 0)
2a9a326b
AS
3437 {
3438 timevar_push (TV_RELOAD_CSE_REGS);
3439 reload_cse_regs (insns);
854a97f0 3440 timevar_pop (TV_RELOAD_CSE_REGS);
2a9a326b 3441 }
c8ed219d 3442
0edaaa41
HB
3443 /* Register allocation and reloading may have turned an indirect jump into
3444 a direct jump. If so, we must rebuild the JUMP_LABEL fields of
3445 jumping instructions. */
3446 if (rebuild_label_notes_after_reload)
2a9a326b
AS
3447 {
3448 timevar_push (TV_JUMP);
3449
3450 rebuild_jump_labels (insns);
44d3eb5b 3451 purge_all_dead_edges (0);
2a9a326b
AS
3452
3453 timevar_pop (TV_JUMP);
3454 }
0edaaa41 3455
8bb16620 3456 close_dump_file (DFI_postreload, print_rtl_with_bb, insns);
e881bb1b 3457
6764d250 3458 /* Re-create the death notes which were deleted during reload. */
2a9a326b 3459 timevar_push (TV_FLOW2);
61098249 3460 open_dump_file (DFI_flow2, decl);
2a9a326b 3461
6f862f2f
JH
3462#ifdef ENABLE_CHECKING
3463 verify_flow_info ();
3464#endif
0005550b
JH
3465
3466 /* If optimizing, then go ahead and split insns now. */
10a3fdd9 3467#ifndef STACK_REGS
0005550b 3468 if (optimize > 0)
10a3fdd9 3469#endif
0005550b
JH
3470 split_all_insns (0);
3471
0ecf09f9 3472 cleanup_cfg (optimize ? CLEANUP_EXPENSIVE : 0);
19d3c25c
RH
3473
3474 /* On some machines, the prologue and epilogue code, or parts thereof,
3475 can be represented as RTL. Doing so lets us schedule insns between
3476 it and the rest of the code and also allows delayed branch
3477 scheduling to operate in the epilogue. */
3478 thread_prologue_and_epilogue_insns (insns);
3479
6764d250 3480 if (optimize)
e881bb1b 3481 {
2a9a326b 3482 life_analysis (insns, rtl_dump_file, PROP_FINAL);
96327cdc
JH
3483 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE
3484 | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
1e7f0a48 3485
5fa41e13 3486 /* This is kind of a heuristic. We need to run combine_stack_adjustments
f73ad30e
JH
3487 even for machines with possibly nonzero RETURN_POPS_ARGS
3488 and ACCUMULATE_OUTGOING_ARGS. We expect that only ports having
3489 push instructions will have popping returns. */
3490#ifndef PUSH_ROUNDING
3491 if (!ACCUMULATE_OUTGOING_ARGS)
1e7f0a48 3492#endif
2a9a326b 3493 combine_stack_adjustments ();
1e7f0a48 3494
1f8f4a0b 3495 ggc_collect ();
e881bb1b 3496 }
6764d250 3497
56744d1a
JL
3498 flow2_completed = 1;
3499
61098249 3500 close_dump_file (DFI_flow2, print_rtl_with_bb, insns);
2a9a326b 3501 timevar_pop (TV_FLOW2);
e881bb1b 3502
ede7cd44
RH
3503#ifdef HAVE_peephole2
3504 if (optimize > 0 && flag_peephole2)
3505 {
2a9a326b 3506 timevar_push (TV_PEEPHOLE2);
2a9a326b 3507 open_dump_file (DFI_peephole2, decl);
9ec6d7ab 3508
2a9a326b 3509 peephole2_optimize (rtl_dump_file);
ede7cd44 3510
61098249 3511 close_dump_file (DFI_peephole2, print_rtl_with_bb, insns);
2a9a326b 3512 timevar_pop (TV_PEEPHOLE2);
ede7cd44
RH
3513 }
3514#endif
3515
06990986 3516 if (optimize > 0 && (flag_rename_registers || flag_cprop_registers))
5fa41e13
SC
3517 {
3518 timevar_push (TV_RENAME_REGISTERS);
3519 open_dump_file (DFI_rnreg, decl);
3520
8582c27b 3521 if (flag_rename_registers)
9cabb1d8 3522 regrename_optimize ();
8582c27b 3523 if (flag_cprop_registers)
9cabb1d8 3524 copyprop_hardreg_forward ();
5fa41e13
SC
3525
3526 close_dump_file (DFI_rnreg, print_rtl_with_bb, insns);
3527 timevar_pop (TV_RENAME_REGISTERS);
854a97f0 3528 }
5fa41e13 3529
b9422b69
JH
3530 if (optimize > 0)
3531 {
3532 timevar_push (TV_REORDER_BLOCKS);
3533 open_dump_file (DFI_bbro, decl);
3534
3535 /* Last attempt to optimize CFG, as scheduling, peepholing and insn
3536 splitting possibly introduced more crossjumping opportunities. */
3537 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE
3538 | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
3539
3540 if (flag_sched2_use_traces && flag_schedule_insns_after_reload)
3541 tracer ();
3542 if (flag_reorder_blocks)
3543 reorder_basic_blocks ();
3544 if (flag_reorder_blocks
3545 || (flag_sched2_use_traces && flag_schedule_insns_after_reload))
3546 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
3547
3548 close_dump_file (DFI_bbro, print_rtl_with_bb, insns);
3549 timevar_pop (TV_REORDER_BLOCKS);
3550 }
3551
fa1a0d02
JH
3552 if (flag_if_conversion2)
3553 {
3554 timevar_push (TV_IFCVT2);
3555 open_dump_file (DFI_ce3, decl);
3556
3557 if_convert (1);
3558
3559 close_dump_file (DFI_ce3, print_rtl_with_bb, insns);
3560 timevar_pop (TV_IFCVT2);
3561 }
fa1a0d02 3562
375e2d5c 3563#ifdef INSN_SCHEDULING
4291d9c8
RS
3564 if (optimize > 0 && flag_schedule_insns_after_reload)
3565 {
2a9a326b 3566 timevar_push (TV_SCHED2);
61098249 3567 open_dump_file (DFI_sched2, decl);
4291d9c8
RS
3568
3569 /* Do control and data sched analysis again,
3570 and write some more of the results to dump file. */
3571
05b432db
JH
3572 split_all_insns (1);
3573
b9422b69
JH
3574 if (flag_sched2_use_superblocks || flag_sched2_use_traces)
3575 {
3576 schedule_ebbs (rtl_dump_file);
3577 /* No liveness updating code yet, but it should be easy to do.
3578 reg-stack recompute the liveness when needed for now. */
3579 count_or_remove_death_notes (NULL, 1);
3580 cleanup_cfg (CLEANUP_EXPENSIVE);
3581 }
3582 else
3583 schedule_insns (rtl_dump_file);
4291d9c8 3584
61098249 3585 close_dump_file (DFI_sched2, print_rtl_with_bb, insns);
2a9a326b 3586 timevar_pop (TV_SCHED2);
a3770a81 3587
1f8f4a0b 3588 ggc_collect ();
4291d9c8 3589 }
375e2d5c 3590#endif
4291d9c8
RS
3591
3592#ifdef LEAF_REGISTERS
5ad9b85f
JW
3593 current_function_uses_only_leaf_regs
3594 = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
4291d9c8
RS
3595#endif
3596
1e5fd094
JH
3597#ifdef STACK_REGS
3598 timevar_push (TV_REG_STACK);
3599 open_dump_file (DFI_stack, decl);
3600
b9422b69
JH
3601 if (reg_to_stack (insns, rtl_dump_file) && optimize)
3602 {
3603 if (cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK
3604 | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0))
3605 && flag_reorder_blocks)
3606 {
3607 reorder_basic_blocks ();
b3de7382 3608 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_POST_REGSTACK);
b9422b69
JH
3609 }
3610 }
1e5fd094 3611
3c030e88 3612 close_dump_file (DFI_stack, print_rtl_with_bb, insns);
1e5fd094
JH
3613 timevar_pop (TV_REG_STACK);
3614
3615 ggc_collect ();
3616#endif
247a370b 3617 compute_alignments ();
11bdd2ae 3618
f5143c46 3619 /* CFG is no longer maintained up-to-date. */
3c030e88
JH
3620 free_bb_for_insn ();
3621
2c65021a
RK
3622 /* If a machine dependent reorganization is needed, call it. */
3623#ifdef MACHINE_DEPENDENT_REORG
eced69b5 3624 timevar_push (TV_MACH_DEP);
61098249 3625 open_dump_file (DFI_mach, decl);
88924698 3626
61098249 3627 MACHINE_DEPENDENT_REORG (insns);
032713aa 3628
232a132f 3629 close_dump_file (DFI_mach, print_rtl, insns);
eced69b5 3630 timevar_pop (TV_MACH_DEP);
a3770a81 3631
1f8f4a0b 3632 ggc_collect ();
2c65021a
RK
3633#endif
3634
0045d504 3635 purge_line_number_notes (insns);
01f62f01 3636 cleanup_barriers ();
0045d504 3637
4291d9c8 3638 /* If a scheduling pass for delayed branches is to be done,
0f41302f 3639 call the scheduling code. */
4291d9c8
RS
3640
3641#ifdef DELAY_SLOTS
3642 if (optimize > 0 && flag_delayed_branch)
3643 {
2a9a326b 3644 timevar_push (TV_DBR_SCHED);
61098249 3645 open_dump_file (DFI_dbr, decl);
bbd2180d 3646
2a9a326b 3647 dbr_schedule (insns, rtl_dump_file);
735a0e33 3648
232a132f 3649 close_dump_file (DFI_dbr, print_rtl, insns);
2a9a326b 3650 timevar_pop (TV_DBR_SCHED);
a3770a81 3651
1f8f4a0b 3652 ggc_collect ();
61098249 3653 }
4291d9c8
RS
3654#endif
3655
1e5fd094 3656#if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
d7e5d7fe 3657 timevar_push (TV_SHORTEN_BRANCH);
6f862f2f 3658 split_all_insns_noflow ();
2a9a326b 3659 timevar_pop (TV_SHORTEN_BRANCH);
932f0847 3660#endif
52a11cbf
RH
3661
3662 convert_to_eh_region_ranges ();
932f0847
JH
3663
3664 /* Shorten branches. */
3665 timevar_push (TV_SHORTEN_BRANCH);
3666 shorten_branches (get_insns ());
3667 timevar_pop (TV_SHORTEN_BRANCH);
4291d9c8 3668
b6128b8c 3669 set_nothrow_function_flags ();
12a22e76
JM
3670 if (current_function_nothrow)
3671 /* Now we know that this can't throw; set the flag for the benefit
3672 of other functions later in this translation unit. */
3673 TREE_NOTHROW (current_function_decl) = 1;
fb13d4d0 3674
4291d9c8
RS
3675 /* Now turn the rtl into assembler code. */
3676
2a9a326b
AS
3677 timevar_push (TV_FINAL);
3678 {
3679 rtx x;
3680 const char *fnname;
4291d9c8 3681
d171a5fb
RK
3682 /* Get the function's name, as described by its RTL. This may be
3683 different from the DECL_NAME name used in the source file. */
4291d9c8 3684
2a9a326b
AS
3685 x = DECL_RTL (decl);
3686 if (GET_CODE (x) != MEM)
3687 abort ();
3688 x = XEXP (x, 0);
3689 if (GET_CODE (x) != SYMBOL_REF)
3690 abort ();
3691 fnname = XSTR (x, 0);
3692
3693 assemble_start_function (decl, fnname);
3694 final_start_function (insns, asm_out_file, optimize);
3695 final (insns, asm_out_file, optimize, 0);
e2a12aca 3696 final_end_function ();
2a1ee410
RH
3697
3698#ifdef IA64_UNWIND_INFO
3699 /* ??? The IA-64 ".handlerdata" directive must be issued before
3700 the ".endp" directive that closes the procedure descriptor. */
3701 output_function_exception_table ();
3702#endif
3703
2a9a326b 3704 assemble_end_function (decl, fnname);
52a11cbf 3705
2a1ee410
RH
3706#ifndef IA64_UNWIND_INFO
3707 /* Otherwise, it feels unclean to switch sections in the middle. */
52a11cbf 3708 output_function_exception_table ();
2a1ee410 3709#endif
52a11cbf 3710
2a9a326b
AS
3711 if (! quiet_flag)
3712 fflush (asm_out_file);
9ddca353 3713
854a97f0 3714 /* Release all memory allocated by flow. */
2a9a326b 3715 free_basic_block_vars (0);
e881bb1b 3716
854a97f0 3717 /* Release all memory held by regsets now. */
2a9a326b
AS
3718 regset_release_memory ();
3719 }
3720 timevar_pop (TV_FINAL);
4291d9c8 3721
1f8f4a0b 3722 ggc_collect ();
a3770a81 3723
854a97f0 3724 /* Write DBX symbols if requested. */
4291d9c8
RS
3725
3726 /* Note that for those inline functions where we don't initially
3727 know for certain that we will be generating an out-of-line copy,
3728 the first invocation of this routine (rest_of_compilation) will
3729 skip over this code by doing a `goto exit_rest_of_compilation;'.
2bb74773
DJ
3730 Later on, wrapup_global_declarations will (indirectly) call
3731 rest_of_compilation again for those inline functions that need
3732 to have out-of-line copies generated. During that call, we
3733 *will* be routed past here. */
4291d9c8 3734
2a9a326b 3735 timevar_push (TV_SYMOUT);
2b85879e 3736 (*debug_hooks->function_decl) (decl);
2a9a326b 3737 timevar_pop (TV_SYMOUT);
9a666dda 3738
4291d9c8
RS
3739 exit_rest_of_compilation:
3740
f246a305
RS
3741 /* In case the function was not output,
3742 don't leave any temporary anonymous types
3743 queued up for sdb output. */
3744#ifdef SDB_DEBUGGING_INFO
3745 if (write_symbols == SDB_DEBUG)
37366632 3746 sdbout_types (NULL_TREE);
f246a305
RS
3747#endif
3748
4291d9c8 3749 reload_completed = 0;
56744d1a 3750 flow2_completed = 0;
f1db3576 3751 no_new_pseudos = 0;
4291d9c8 3752
2a9a326b 3753 timevar_push (TV_FINAL);
4291d9c8 3754
2a9a326b
AS
3755 /* Clear out the insn_length contents now that they are no
3756 longer valid. */
3757 init_insn_lengths ();
3758
2a9a326b
AS
3759 /* Show no temporary slots allocated. */
3760 init_temp_slots ();
adcd38c9 3761
2a9a326b 3762 free_basic_block_vars (0);
5652450c 3763 free_bb_for_insn ();
fa51b01b 3764
2a9a326b 3765 timevar_pop (TV_FINAL);
adcd38c9 3766
c8d86b9a
JW
3767 /* Make sure volatile mem refs aren't considered valid operands for
3768 arithmetic insns. We must call this here if this is a nested inline
3769 function, since the above code leaves us in the init_recog state
3770 (from final.c), and the function context push/pop code does not
3771 save/restore volatile_ok.
3772
3773 ??? Maybe it isn't necessary for expand_start_function to call this
3774 anymore if we do it here? */
3775
3776 init_recog_no_volatile ();
3777
21cd906e 3778 /* We're done with this function. Free up memory if we can. */
01d939e8 3779 free_after_parsing (cfun);
fa51b01b 3780 if (! DECL_DEFER_OUTPUT (decl))
ae6f2a1c
ZW
3781 {
3782 free_after_compilation (cfun);
3783
3784 /* Clear integrate.c's pointer to the cfun structure we just
3785 destroyed. */
3786 DECL_SAVED_INSNS (decl) = 0;
3787 }
01d939e8 3788 cfun = 0;
a3770a81 3789
1f8f4a0b 3790 ggc_collect ();
a3770a81 3791
2a9a326b 3792 timevar_pop (TV_REST_OF_COMPILATION);
4291d9c8
RS
3793}
3794\f
b8468bc7
NC
3795static void
3796display_help ()
3797{
854a97f0
KH
3798 int undoc;
3799 unsigned long i;
3800 const char *lang;
3801
5e4adfba
PT
3802 printf (_(" -ffixed-<register> Mark <register> as being unavailable to the compiler\n"));
3803 printf (_(" -fcall-used-<register> Mark <register> as being corrupted by function calls\n"));
3804 printf (_(" -fcall-saved-<register> Mark <register> as being preserved across functions\n"));
3805 printf (_(" -finline-limit=<number> Limits the size of inlined functions to <number>\n"));
3806 printf (_(" -fmessage-length=<number> Limits diagnostics messages lengths to <number> characters per line. 0 suppresses line-wrapping\n"));
e6513023 3807 printf (_(" -fdiagnostics-show-location=[once | every-line] Indicates how often source location information should be emitted, as prefix, at the beginning of diagnostics when line-wrapping\n"));
3d78f2e9 3808 printf (_(" -ftls-model=[global-dynamic | local-dynamic | initial-exec | local-exec] Indicates the default thread-local storage code generation model\n"));
b8468bc7 3809
b6a1cbae 3810 for (i = ARRAY_SIZE (f_options); i--;)
b8468bc7 3811 {
854a97f0
KH
3812 const char *description = f_options[i].description;
3813
9cabb1d8 3814 if (description != NULL && *description != 0)
b8468bc7 3815 printf (" -f%-21s %s\n",
a6371940 3816 f_options[i].string, _(description));
b8468bc7 3817 }
854a97f0 3818
1737c953
JM
3819 printf (_(" -O[number] Set optimization level to [number]\n"));
3820 printf (_(" -Os Optimize for space rather than speed\n"));
639bc36c 3821 for (i = LAST_PARAM; i--;)
1c4c47db
JO
3822 {
3823 const char *description = compiler_params[i].help;
9cabb1d8 3824 const int length = 21 - strlen (compiler_params[i].option);
1c4c47db 3825
9cabb1d8 3826 if (description != NULL && *description != 0)
1c4c47db
JO
3827 printf (" --param %s=<value>%.*s%s\n",
3828 compiler_params[i].option,
3829 length > 0 ? length : 1, " ",
a6371940 3830 _(description));
1c4c47db 3831 }
89abf8d1 3832 printf (_(" -pedantic Issue warnings needed by strict compliance to ISO C\n"));
5e4adfba
PT
3833 printf (_(" -pedantic-errors Like -pedantic except that errors are produced\n"));
3834 printf (_(" -w Suppress warnings\n"));
854a97f0 3835
b6a1cbae 3836 for (i = ARRAY_SIZE (W_options); i--;)
b8468bc7 3837 {
854a97f0
KH
3838 const char *description = W_options[i].description;
3839
9cabb1d8 3840 if (description != NULL && *description != 0)
b8468bc7 3841 printf (" -W%-21s %s\n",
a6371940 3842 W_options[i].string, _(description));
b8468bc7 3843 }
854a97f0 3844
5e4adfba 3845 printf (_(" -Wunused Enable unused warnings\n"));
5e4adfba
PT
3846 printf (_(" -Wlarger-than-<number> Warn if an object is larger than <number> bytes\n"));
3847 printf (_(" -p Enable function profiling\n"));
5e4adfba
PT
3848 printf (_(" -o <file> Place output into <file> \n"));
3849 printf (_("\
3850 -G <number> Put global and static data smaller than <number>\n\
3851 bytes into a special section (on some targets)\n"));
854a97f0 3852
b6a1cbae 3853 for (i = ARRAY_SIZE (debug_args); i--;)
b8468bc7
NC
3854 {
3855 if (debug_args[i].description != NULL)
854a97f0 3856 printf (" -g%-21s %s\n",
a6371940 3857 debug_args[i].arg, _(debug_args[i].description));
b8468bc7 3858 }
854a97f0 3859
c47af4b7 3860 printf (_(" -aux-info <file> Emit declaration info into <file>\n"));
5e4adfba
PT
3861 printf (_(" -quiet Do not display functions compiled or elapsed time\n"));
3862 printf (_(" -version Display the compiler's version\n"));
3863 printf (_(" -d[letters] Enable dumps from specific passes of the compiler\n"));
3864 printf (_(" -dumpbase <file> Base name to be used for dumps from specific passes\n"));
7b5efe21 3865#if defined INSN_SCHEDULING
5e4adfba 3866 printf (_(" -fsched-verbose=<number> Set the verbosity level of the scheduler\n"));
b8468bc7 3867#endif
5e4adfba 3868 printf (_(" --help Display this information\n"));
b8468bc7
NC
3869
3870 undoc = 0;
3871 lang = "language";
854a97f0 3872
b8468bc7
NC
3873 /* Display descriptions of language specific options.
3874 If there is no description, note that there is an undocumented option.
3875 If the description is empty, do not display anything. (This allows
3876 options to be deliberately undocumented, for whatever reason).
3877 If the option string is missing, then this is a marker, indicating
630962bf 3878 that the description string is in fact the name of a language, whose
b8468bc7 3879 language specific options are to follow. */
854a97f0 3880
b6a1cbae 3881 if (ARRAY_SIZE (documented_lang_options) > 1)
b8468bc7 3882 {
5e4adfba 3883 printf (_("\nLanguage specific options:\n"));
b8468bc7 3884
b6a1cbae 3885 for (i = 0; i < ARRAY_SIZE (documented_lang_options); i++)
b8468bc7 3886 {
854a97f0
KH
3887 const char *description = documented_lang_options[i].description;
3888 const char *option = documented_lang_options[i].option;
b8468bc7
NC
3889
3890 if (description == NULL)
844642e6
NC
3891 {
3892 undoc = 1;
3893
3894 if (extra_warnings)
5e4adfba 3895 printf (_(" %-23.23s [undocumented]\n"), option);
844642e6 3896 }
854a97f0 3897 else if (*description == 0)
b8468bc7
NC
3898 continue;
3899 else if (option == NULL)
3900 {
3901 if (undoc)
3902 printf
5e4adfba 3903 (_("\nThere are undocumented %s specific options as well.\n"),
b8468bc7
NC
3904 lang);
3905 undoc = 0;
854a97f0 3906
5e4adfba 3907 printf (_("\n Options for %s:\n"), description);
b8468bc7
NC
3908
3909 lang = description;
3910 }
3911 else
a6371940 3912 printf (" %-23.23s %s\n", option, _(description));
b8468bc7
NC
3913 }
3914 }
3915
3916 if (undoc)
854a97f0
KH
3917 printf (_("\nThere are undocumented %s specific options as well.\n"),
3918 lang);
b8468bc7 3919
10501d8f
CC
3920 display_target_options ();
3921}
3922
8f54374e 3923static void
10501d8f
CC
3924display_target_options ()
3925{
a01da83b 3926 int undoc, i;
76306300
NB
3927 static bool displayed = false;
3928
3929 /* Avoid double printing for --help --target-help. */
3930 if (displayed)
3931 return;
3932 displayed = true;
10501d8f 3933
b6a1cbae 3934 if (ARRAY_SIZE (target_switches) > 1
b8468bc7 3935#ifdef TARGET_OPTIONS
b6a1cbae 3936 || ARRAY_SIZE (target_options) > 1
b8468bc7
NC
3937#endif
3938 )
3939 {
3940 int doc = 0;
854a97f0 3941
b8468bc7 3942 undoc = 0;
854a97f0 3943
5e4adfba 3944 printf (_("\nTarget specific options:\n"));
b8468bc7 3945
b6a1cbae 3946 for (i = ARRAY_SIZE (target_switches); i--;)
b8468bc7 3947 {
854a97f0
KH
3948 const char *option = target_switches[i].name;
3949 const char *description = target_switches[i].description;
b8468bc7 3950
854a97f0 3951 if (option == NULL || *option == 0)
b8468bc7
NC
3952 continue;
3953 else if (description == NULL)
844642e6
NC
3954 {
3955 undoc = 1;
854a97f0 3956
844642e6 3957 if (extra_warnings)
10501d8f 3958 printf (_(" -m%-23.23s [undocumented]\n"), option);
844642e6 3959 }
9cabb1d8 3960 else if (*description != 0)
a6371940 3961 doc += printf (" -m%-23.23s %s\n", option, _(description));
b8468bc7 3962 }
854a97f0
KH
3963
3964#ifdef TARGET_OPTIONS
b6a1cbae 3965 for (i = ARRAY_SIZE (target_options); i--;)
b8468bc7 3966 {
854a97f0
KH
3967 const char *option = target_options[i].prefix;
3968 const char *description = target_options[i].description;
b8468bc7 3969
854a97f0 3970 if (option == NULL || *option == 0)
b8468bc7
NC
3971 continue;
3972 else if (description == NULL)
844642e6
NC
3973 {
3974 undoc = 1;
854a97f0 3975
844642e6 3976 if (extra_warnings)
10501d8f 3977 printf (_(" -m%-23.23s [undocumented]\n"), option);
844642e6 3978 }
9cabb1d8 3979 else if (*description != 0)
a6371940 3980 doc += printf (" -m%-23.23s %s\n", option, _(description));
b8468bc7
NC
3981 }
3982#endif
3983 if (undoc)
ff59bfe6
JM
3984 {
3985 if (doc)
5e4adfba 3986 printf (_("\nThere are undocumented target specific options as well.\n"));
ff59bfe6 3987 else
5e4adfba 3988 printf (_(" They exist, but they are not documented.\n"));
ff59bfe6 3989 }
b8468bc7
NC
3990 }
3991}
39dd8003 3992\f
f63d1bf7 3993/* Parse a -d... command line switch. */
39dd8003
NC
3994
3995static void
3996decode_d_option (arg)
854a97f0 3997 const char *arg;
39dd8003 3998{
61098249
RH
3999 int i, c, matched;
4000
4001 while (*arg)
4002 switch (c = *arg++)
39dd8003
NC
4003 {
4004 case 'a':
dbbbbf3b 4005 for (i = 0; i < (int) DFI_MAX; ++i)
61098249 4006 dump_file[i].enabled = 1;
39dd8003
NC
4007 break;
4008 case 'A':
4009 flag_debug_asm = 1;
4010 break;
39dd8003
NC
4011 case 'p':
4012 flag_print_asm_name = 1;
4013 break;
c349e40b 4014 case 'P':
9cabb1d8
KH
4015 flag_dump_rtl_in_asm = 1;
4016 flag_print_asm_name = 1;
4017 break;
39dd8003
NC
4018 case 'v':
4019 graph_dump_format = vcg;
4020 break;
39dd8003
NC
4021 case 'x':
4022 rtl_dump_and_exit = 1;
4023 break;
4024 case 'y':
ff45c01e 4025 set_yydebug = 1;
39dd8003 4026 break;
39dd8003
NC
4027 case 'D': /* These are handled by the preprocessor. */
4028 case 'I':
4029 break;
886e0865
GK
4030 case 'H':
4031 setup_core_dumping();
4032 break;
61098249 4033
39dd8003 4034 default:
61098249 4035 matched = 0;
dbbbbf3b 4036 for (i = 0; i < (int) DFI_MAX; ++i)
61098249
RH
4037 if (c == dump_file[i].debug_switch)
4038 {
4039 dump_file[i].enabled = 1;
4040 matched = 1;
4041 }
4042
4043 if (! matched)
4044 warning ("unrecognized gcc debugging option: %c", c);
39dd8003
NC
4045 break;
4046 }
4047}
b8468bc7 4048
f63d1bf7 4049/* Parse a -f... command line switch. ARG is the value after the -f.
39dd8003
NC
4050 It is safe to access 'ARG - 2' to generate the full switch name.
4051 Return the number of strings consumed. */
b8468bc7
NC
4052
4053static int
39dd8003 4054decode_f_option (arg)
854a97f0 4055 const char *arg;
b8468bc7 4056{
39dd8003 4057 int j;
6f5ef761 4058 const char *option_value = NULL;
39dd8003
NC
4059
4060 /* Search for the option in the table of binary f options. */
b6a1cbae 4061 for (j = ARRAY_SIZE (f_options); j--;)
39dd8003
NC
4062 {
4063 if (!strcmp (arg, f_options[j].string))
4064 {
4065 *f_options[j].variable = f_options[j].on_value;
4066 return 1;
4067 }
854a97f0 4068
39dd8003
NC
4069 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4070 && ! strcmp (arg + 3, f_options[j].string))
4071 {
4072 *f_options[j].variable = ! f_options[j].on_value;
4073 return 1;
4074 }
4075 }
b8468bc7 4076
de6c5979 4077 if (!strcmp (arg, "fast-math"))
748d29c1 4078 set_fast_math_flags (1);
de6c5979 4079 else if (!strcmp (arg, "no-fast-math"))
748d29c1 4080 set_fast_math_flags (0);
de6c5979
BL
4081 else if ((option_value = skip_leading_substring (arg, "inline-limit-"))
4082 || (option_value = skip_leading_substring (arg, "inline-limit=")))
c6d9a88c 4083 {
5262d6b6 4084 int val =
c6d9a88c
MM
4085 read_integral_parameter (option_value, arg - 2,
4086 MAX_INLINE_INSNS);
4087 set_param_value ("max-inline-insns", val);
4088 }
3d78f2e9
RH
4089 else if ((option_value = skip_leading_substring (arg, "tls-model=")))
4090 {
4091 if (strcmp (option_value, "global-dynamic") == 0)
4092 flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
4093 else if (strcmp (option_value, "local-dynamic") == 0)
4094 flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
4095 else if (strcmp (option_value, "initial-exec") == 0)
4096 flag_tls_default = TLS_MODEL_INITIAL_EXEC;
4097 else if (strcmp (option_value, "local-exec") == 0)
4098 flag_tls_default = TLS_MODEL_LOCAL_EXEC;
4099 else
4100 warning ("`%s': unknown tls-model option", arg - 2);
4101 }
39dd8003 4102#ifdef INSN_SCHEDULING
6f5ef761
GDR
4103 else if ((option_value = skip_leading_substring (arg, "sched-verbose=")))
4104 fix_sched_param ("verbose", option_value);
4105#endif
4106 else if ((option_value = skip_leading_substring (arg, "fixed-")))
4107 fix_register (option_value, 1, 1);
4108 else if ((option_value = skip_leading_substring (arg, "call-used-")))
4109 fix_register (option_value, 0, 1);
4110 else if ((option_value = skip_leading_substring (arg, "call-saved-")))
4111 fix_register (option_value, 0, 0);
4112 else if ((option_value = skip_leading_substring (arg, "align-loops=")))
4113 align_loops = read_integral_parameter (option_value, arg - 2, align_loops);
4114 else if ((option_value = skip_leading_substring (arg, "align-functions=")))
4559fd9e 4115 align_functions
6f5ef761
GDR
4116 = read_integral_parameter (option_value, arg - 2, align_functions);
4117 else if ((option_value = skip_leading_substring (arg, "align-jumps=")))
4118 align_jumps = read_integral_parameter (option_value, arg - 2, align_jumps);
4119 else if ((option_value = skip_leading_substring (arg, "align-labels=")))
4120 align_labels
4121 = read_integral_parameter (option_value, arg - 2, align_labels);
4122 else if ((option_value
854a97f0 4123 = skip_leading_substring (arg, "stack-limit-register=")))
6f5ef761
GDR
4124 {
4125 int reg = decode_reg_name (option_value);
a157febd 4126 if (reg < 0)
6f5ef761 4127 error ("unrecognized register name `%s'", option_value);
a157febd
GK
4128 else
4129 stack_limit_rtx = gen_rtx_REG (Pmode, reg);
4130 }
6f5ef761 4131 else if ((option_value
854a97f0 4132 = skip_leading_substring (arg, "stack-limit-symbol=")))
a157febd 4133 {
520a57c8 4134 const char *nm;
1f8f4a0b 4135 nm = ggc_strdup (option_value);
a157febd
GK
4136 stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, nm);
4137 }
764dbbf2 4138 else if ((option_value
d92b4486 4139 = skip_leading_substring (arg, "message-length=")))
9596ddd6
GDR
4140 output_set_maximum_length
4141 (&global_dc->buffer, read_integral_parameter
4142 (option_value, arg - 2, diagnostic_line_cutoff (global_dc)));
764dbbf2 4143 else if ((option_value
854a97f0 4144 = skip_leading_substring (arg, "diagnostics-show-location=")))
764dbbf2
GDR
4145 {
4146 if (!strcmp (option_value, "once"))
9cabb1d8 4147 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
764dbbf2 4148 else if (!strcmp (option_value, "every-line"))
9cabb1d8
KH
4149 diagnostic_prefixing_rule (global_dc)
4150 = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
764dbbf2 4151 else
1f978f5f 4152 error ("unrecognized option `%s'", arg - 2);
764dbbf2 4153 }
a157febd
GK
4154 else if (!strcmp (arg, "no-stack-limit"))
4155 stack_limit_rtx = NULL_RTX;
39dd8003 4156 else if (!strcmp (arg, "preprocessed"))
05713b80 4157 /* Recognize this switch but do nothing. This prevents warnings
4dbba876 4158 about an unrecognized switch if cpplib has not been linked in. */
39dd8003 4159 ;
1f50b029 4160 else
39dd8003
NC
4161 return 0;
4162
4163 return 1;
4164}
4165
f63d1bf7 4166/* Parse a -W... command line switch. ARG is the value after the -W.
39dd8003
NC
4167 It is safe to access 'ARG - 2' to generate the full switch name.
4168 Return the number of strings consumed. */
4559fd9e 4169
39dd8003
NC
4170static int
4171decode_W_option (arg)
854a97f0 4172 const char *arg;
39dd8003 4173{
6f5ef761 4174 const char *option_value = NULL;
39dd8003 4175 int j;
854a97f0 4176
39dd8003
NC
4177 /* Search for the option in the table of binary W options. */
4178
b6a1cbae 4179 for (j = ARRAY_SIZE (W_options); j--;)
39dd8003
NC
4180 {
4181 if (!strcmp (arg, W_options[j].string))
4182 {
4183 *W_options[j].variable = W_options[j].on_value;
4184 return 1;
4185 }
4186
4187 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-'
4188 && ! strcmp (arg + 3, W_options[j].string))
4189 {
4190 *W_options[j].variable = ! W_options[j].on_value;
4191 return 1;
4192 }
4193 }
4194
6f5ef761 4195 if ((option_value = skip_leading_substring (arg, "id-clash-")))
84b77836 4196 warning ("-Wid-clash-LEN is no longer supported");
6f5ef761 4197 else if ((option_value = skip_leading_substring (arg, "larger-than-")))
39dd8003 4198 {
6f5ef761 4199 larger_than_size = read_integral_parameter (option_value, arg - 2, -1);
4559fd9e 4200
e9770d51 4201 warn_larger_than = larger_than_size != -1;
39dd8003 4202 }
078721e1
AC
4203 else if (!strcmp (arg, "unused"))
4204 {
4205 set_Wunused (1);
4206 }
4207 else if (!strcmp (arg, "no-unused"))
4208 {
4209 set_Wunused (0);
4210 }
65ca2d60
PE
4211 else if (!strcmp (arg, "extra"))
4212 {
4213 /* We save the value of warn_uninitialized, since if they put
4214 -Wuninitialized on the command line, we need to generate a
4215 warning about not using it without also specifying -O. */
4216 if (warn_uninitialized != 1)
4217 warn_uninitialized = 2;
4218 }
39dd8003 4219 else
b8468bc7 4220 return 0;
39dd8003
NC
4221
4222 return 1;
4223}
4224
f63d1bf7 4225/* Parse a -g... command line switch. ARG is the value after the -g.
39dd8003
NC
4226 It is safe to access 'ARG - 2' to generate the full switch name.
4227 Return the number of strings consumed. */
14a774a9 4228
39dd8003
NC
4229static int
4230decode_g_option (arg)
854a97f0 4231 const char *arg;
39dd8003 4232{
9cabb1d8 4233 static unsigned level = 0;
39dd8003
NC
4234 /* A lot of code assumes write_symbols == NO_DEBUG if the
4235 debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
4236 of what debugging type has been selected). This records the
4237 selected type. It is an error to specify more than one
4238 debugging type. */
4239 static enum debug_info_type selected_debug_type = NO_DEBUG;
272d0bee 4240 /* Nonzero if debugging format has been explicitly set.
39dd8003
NC
4241 -g and -ggdb don't explicitly set the debugging format so
4242 -gdwarf -g3 is equivalent to -gdwarf3. */
4243 static int type_explicitly_set_p = 0;
4244 /* Indexed by enum debug_info_type. */
27c38fbe 4245 static const char *const debug_type_names[] =
39dd8003 4246 {
7a0c8d71 4247 "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff", "vms"
39dd8003 4248 };
854a97f0 4249
39dd8003
NC
4250 /* The maximum admissible debug level value. */
4251 static const unsigned max_debug_level = 3;
854a97f0 4252
39dd8003
NC
4253 /* Look up ARG in the table. */
4254 for (da = debug_args; da->arg; da++)
4255 {
4256 const int da_len = strlen (da->arg);
4257
4258 if (da_len == 0 || ! strncmp (arg, da->arg, da_len))
4259 {
4260 enum debug_info_type type = da->debug_type;
854a97f0
KH
4261 const char *p = arg + da_len;
4262
0df6c2c7 4263 if (*p && ! ISDIGIT (*p))
39dd8003 4264 continue;
854a97f0 4265
39dd8003
NC
4266 /* A debug flag without a level defaults to level 2.
4267 Note we do not want to call read_integral_parameter
854a97f0 4268 for that case since it will call atoi which
39dd8003 4269 will return zero.
854a97f0
KH
4270
4271 ??? We may want to generalize the interface to
39dd8003
NC
4272 read_integral_parameter to better handle this case
4273 if this case shows up often. */
4274 if (*p)
4275 level = read_integral_parameter (p, 0, max_debug_level + 1);
4276 else
84a5b4f8 4277 level = (level == 0) ? 2 : level;
854a97f0 4278
39dd8003
NC
4279 if (da_len > 1 && *p && !strncmp (arg, "dwarf", da_len))
4280 {
4281 error ("use -gdwarf -g%d for DWARF v1, level %d",
4282 level, level);
4283 if (level == 2)
4284 error ("use -gdwarf-2 for DWARF v2");
4285 }
854a97f0 4286
39dd8003
NC
4287 if (level > max_debug_level)
4288 {
4289 warning ("\
4290ignoring option `%s' due to invalid debug level specification",
4291 arg - 2);
4292 level = debug_info_level;
4293 }
4294
4295 if (type == NO_DEBUG)
4296 {
4297 type = PREFERRED_DEBUGGING_TYPE;
854a97f0 4298
39dd8003
NC
4299 if (da_len > 1 && strncmp (arg, "gdb", da_len) == 0)
4300 {
3fc602a0 4301#ifdef DWARF2_DEBUGGING_INFO
39dd8003
NC
4302 type = DWARF2_DEBUG;
4303#else
4304#ifdef DBX_DEBUGGING_INFO
4305 type = DBX_DEBUG;
4306#endif
4307#endif
4308 }
4309 }
854a97f0 4310
39dd8003 4311 if (type == NO_DEBUG)
14a774a9 4312 warning ("`%s': unknown or unsupported -g option", arg - 2);
39dd8003
NC
4313
4314 /* Does it conflict with an already selected type? */
4315 if (type_explicitly_set_p
854a97f0 4316 /* -g/-ggdb don't conflict with anything. */
39dd8003
NC
4317 && da->debug_type != NO_DEBUG
4318 && type != selected_debug_type)
4319 warning ("`%s' ignored, conflicts with `-g%s'",
4320 arg - 2, debug_type_names[(int) selected_debug_type]);
4321 else
4322 {
4323 /* If the format has already been set, -g/-ggdb
4324 only change the debug level. */
4325 if (type_explicitly_set_p && da->debug_type == NO_DEBUG)
854a97f0
KH
4326 /* Don't change debugging type. */
4327 ;
39dd8003
NC
4328 else
4329 {
4330 selected_debug_type = type;
4331 type_explicitly_set_p = da->debug_type != NO_DEBUG;
4332 }
854a97f0 4333
39dd8003
NC
4334 write_symbols = (level == 0
4335 ? NO_DEBUG
4336 : selected_debug_type);
4337 use_gnu_debug_info_extensions = da->use_extensions_p;
4338 debug_info_level = (enum debug_info_level) level;
4339 }
854a97f0 4340
39dd8003
NC
4341 break;
4342 }
4343 }
854a97f0 4344
39dd8003 4345 if (! da->arg)
04324727 4346 return 0;
39dd8003
NC
4347
4348 return 1;
4349}
4350
4351/* Decode the first argument in the argv as a language-independent option.
319ea138 4352 Return the number of strings consumed. */
854a97f0 4353
13eb1f7f 4354static unsigned int
319ea138 4355independent_decode_option (argc, argv)
39dd8003 4356 int argc;
13eb1f7f 4357 char **argv;
39dd8003 4358{
13eb1f7f 4359 char *arg = argv[0];
854a97f0 4360
39dd8003 4361 if (arg[0] != '-' || arg[1] == 0)
b8468bc7 4362 {
39dd8003
NC
4363 if (arg[0] == '+')
4364 return 0;
854a97f0 4365
39dd8003
NC
4366 filename = arg;
4367
4368 return 1;
b8468bc7 4369 }
39dd8003 4370
854a97f0
KH
4371 arg++;
4372
39dd8003
NC
4373 if (!strcmp (arg, "-help"))
4374 {
4375 display_help ();
cb773845 4376 exit_after_options = 1;
39dd8003
NC
4377 }
4378
10501d8f
CC
4379 if (!strcmp (arg, "-target-help"))
4380 {
4381 display_target_options ();
cb773845 4382 exit_after_options = 1;
10501d8f
CC
4383 }
4384
f4cdc368
ZW
4385 if (!strcmp (arg, "-version"))
4386 {
4387 print_version (stderr, "");
cb773845 4388 exit_after_options = 1;
f4cdc368
ZW
4389 }
4390
c6d9a88c
MM
4391 /* Handle '--param <name>=<value>'. */
4392 if (strcmp (arg, "-param") == 0)
4393 {
4394 char *equal;
4395
4396 if (argc == 1)
4397 {
4398 error ("-param option missing argument");
4399 return 1;
4400 }
4401
7521b913 4402 /* Get the '<name>=<value>' parameter. */
c6d9a88c
MM
4403 arg = argv[1];
4404 /* Look for the `='. */
4405 equal = strchr (arg, '=');
5262d6b6 4406 if (!equal)
c6d9a88c 4407 error ("invalid --param option: %s", arg);
5262d6b6 4408 else
c6d9a88c
MM
4409 {
4410 int val;
4411
4412 /* Zero out the `=' sign so that we get two separate strings. */
4413 *equal = '\0';
4414 /* Figure out what value is specified. */
4415 val = read_integral_parameter (equal + 1, NULL, INVALID_PARAM_VAL);
4416 if (val != INVALID_PARAM_VAL)
4417 set_param_value (arg, val);
4418 else
4419 error ("invalid parameter value `%s'", equal + 1);
4420 }
4421
4422 return 2;
4423 }
5262d6b6 4424
854a97f0
KH
4425 if (*arg == 'Y')
4426 arg++;
4427
13eb1f7f 4428 switch (*arg)
b8468bc7 4429 {
39dd8003
NC
4430 default:
4431 return 0;
854a97f0 4432
39dd8003
NC
4433 case 'O':
4434 /* Already been treated in main (). Do nothing. */
4435 break;
854a97f0 4436
39dd8003
NC
4437 case 'm':
4438 set_target_switch (arg + 1);
4439 break;
4440
4441 case 'f':
4442 return decode_f_option (arg + 1);
854a97f0 4443
39dd8003 4444 case 'g':
319ea138 4445 return decode_g_option (arg + 1);
39dd8003
NC
4446
4447 case 'd':
4448 if (!strcmp (arg, "dumpbase"))
4449 {
4450 if (argc == 1)
4451 return 0;
854a97f0 4452
ea67fe71
NS
4453 if (argv[1][0])
4454 dump_base_name = argv[1];
26182e15 4455
39dd8003
NC
4456 return 2;
4457 }
4458 else
4459 decode_d_option (arg + 1);
4460 break;
4461
4462 case 'p':
4463 if (!strcmp (arg, "pedantic"))
4464 pedantic = 1;
4465 else if (!strcmp (arg, "pedantic-errors"))
4466 flag_pedantic_errors = pedantic = 1;
4467 else if (arg[1] == 0)
4468 profile_flag = 1;
4469 else
4470 return 0;
4471 break;
4472
4473 case 'q':
4474 if (!strcmp (arg, "quiet"))
4475 quiet_flag = 1;
4476 else
4477 return 0;
4478 break;
4479
4480 case 'v':
4481 if (!strcmp (arg, "version"))
4482 version_flag = 1;
4483 else
4484 return 0;
4485 break;
4486
4487 case 'w':
4488 if (arg[1] == 0)
4489 inhibit_warnings = 1;
4490 else
4491 return 0;
4492 break;
4493
4494 case 'W':
4495 if (arg[1] == 0)
4496 {
4497 extra_warnings = 1;
4498 /* We save the value of warn_uninitialized, since if they put
4499 -Wuninitialized on the command line, we need to generate a
4500 warning about not using it without also specifying -O. */
4501 if (warn_uninitialized != 1)
4502 warn_uninitialized = 2;
4503 }
4504 else
4505 return decode_W_option (arg + 1);
4506 break;
854a97f0 4507
3db83e32
JJ
4508 case 'a':
4509 if (!strncmp (arg, "aux-info", 8))
4510 {
4511 if (arg[8] == '\0')
4512 {
4513 if (argc == 1)
4514 return 0;
4515
4516 aux_info_file_name = argv[1];
4517 flag_gen_aux_info = 1;
4518 return 2;
4519 }
4520 else if (arg[8] == '=')
4521 {
4522 aux_info_file_name = arg + 9;
4523 flag_gen_aux_info = 1;
4524 }
4525 else
4526 return 0;
4527 }
ea67fe71
NS
4528 else if (!strcmp (arg, "auxbase"))
4529 {
4530 if (argc == 1)
4531 return 0;
4532
4533 if (argv[1][0])
4534 aux_base_name = argv[1];
26182e15 4535
ea67fe71
NS
4536 return 2;
4537 }
4538 else if (!strcmp (arg, "auxbase-strip"))
4539 {
4540 if (argc == 1)
4541 return 0;
4542
4543 if (argv[1][0])
4544 {
4545 strip_off_ending (argv[1], strlen (argv[1]));
4546 if (argv[1][0])
4547 aux_base_name = argv[1];
4548 }
26182e15 4549
ea67fe71
NS
4550 return 2;
4551 }
3db83e32
JJ
4552 else
4553 return 0;
4554 break;
4555
39dd8003
NC
4556 case 'o':
4557 if (arg[1] == 0)
4558 {
4559 if (argc == 1)
4560 return 0;
854a97f0 4561
39dd8003
NC
4562 asm_file_name = argv[1];
4563 return 2;
b8468bc7 4564 }
39dd8003
NC
4565 return 0;
4566
4567 case 'G':
4568 {
4569 int g_switch_val;
4570 int return_val;
854a97f0 4571
39dd8003
NC
4572 if (arg[1] == 0)
4573 {
4574 if (argc == 1)
4575 return 0;
854a97f0 4576
39dd8003
NC
4577 g_switch_val = read_integral_parameter (argv[1], 0, -1);
4578 return_val = 2;
4579 }
4580 else
4581 {
4582 g_switch_val = read_integral_parameter (arg + 1, 0, -1);
4583 return_val = 1;
4584 }
854a97f0 4585
39dd8003
NC
4586 if (g_switch_val == -1)
4587 return_val = 0;
4588 else
4589 {
4590 g_switch_set = TRUE;
4591 g_switch_value = g_switch_val;
4592 }
854a97f0 4593
39dd8003
NC
4594 return return_val;
4595 }
b8468bc7 4596 }
854a97f0 4597
b8468bc7
NC
4598 return 1;
4599}
4600\f
f5e99456
NB
4601/* Decode -m switches. */
4602/* Decode the switch -mNAME. */
7adfcfed 4603
f5e99456
NB
4604static void
4605set_target_switch (name)
4606 const char *name;
4291d9c8 4607{
f5e99456
NB
4608 size_t j;
4609 int valid_target_option = 0;
4291d9c8 4610
f5e99456
NB
4611 for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4612 if (!strcmp (target_switches[j].name, name))
4613 {
4614 if (target_switches[j].value < 0)
4615 target_flags &= ~-target_switches[j].value;
4616 else
4617 target_flags |= target_switches[j].value;
a27fb29b
RS
4618 if (name[0] != 0)
4619 {
4620 if (target_switches[j].value < 0)
4621 target_flags_explicit |= -target_switches[j].value;
4622 else
4623 target_flags_explicit |= target_switches[j].value;
4624 }
f5e99456
NB
4625 valid_target_option = 1;
4626 }
4291d9c8 4627
f5e99456
NB
4628#ifdef TARGET_OPTIONS
4629 if (!valid_target_option)
4630 for (j = 0; j < ARRAY_SIZE (target_options); j++)
4631 {
4632 int len = strlen (target_options[j].prefix);
4633 if (!strncmp (target_options[j].prefix, name, len))
4634 {
4635 *target_options[j].variable = name + len;
4636 valid_target_option = 1;
4637 }
4638 }
4639#endif
4291d9c8 4640
f5e99456 4641 if (!valid_target_option)
1f978f5f 4642 error ("invalid option `%s'", name);
f5e99456
NB
4643}
4644\f
4645/* Print version information to FILE.
4646 Each line begins with INDENT (for the case where FILE is the
4647 assembler output file). */
4648
4649static void
4650print_version (file, indent)
4651 FILE *file;
4652 const char *indent;
4653{
4654#ifndef __VERSION__
4655#define __VERSION__ "[?]"
4656#endif
4657 fnotice (file,
4658#ifdef __GNUC__
4659 "%s%s%s version %s (%s)\n%s\tcompiled by GNU C version %s.\n"
4660#else
4661 "%s%s%s version %s (%s) compiled by CC.\n"
4662#endif
4663 , indent, *indent != 0 ? " " : "",
4664 lang_hooks.name, version_string, TARGET_NAME,
4665 indent, __VERSION__);
7a69a172
GB
4666 fnotice (file, "%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n",
4667 indent, *indent != 0 ? " " : "",
4668 PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
f5e99456
NB
4669}
4670
4671/* Print an option value and return the adjusted position in the line.
4672 ??? We don't handle error returns from fprintf (disk full); presumably
4673 other code will catch a disk full though. */
4674
4675static int
4676print_single_switch (file, pos, max, indent, sep, term, type, name)
4677 FILE *file;
4678 int pos, max;
4679 const char *indent, *sep, *term, *type, *name;
4680{
4681 /* The ultrix fprintf returns 0 on success, so compute the result we want
4682 here since we need it for the following test. */
4683 int len = strlen (sep) + strlen (type) + strlen (name);
4684
4685 if (pos != 0
4686 && pos + len > max)
4687 {
4688 fprintf (file, "%s", term);
4689 pos = 0;
4690 }
4691 if (pos == 0)
4692 {
4693 fprintf (file, "%s", indent);
4694 pos = strlen (indent);
4695 }
4696 fprintf (file, "%s%s%s", sep, type, name);
4697 pos += len;
4698 return pos;
4699}
4700
4701/* Print active target switches to FILE.
4702 POS is the current cursor position and MAX is the size of a "line".
4703 Each line begins with INDENT and ends with TERM.
4704 Each switch is separated from the next by SEP. */
4705
4706static void
4707print_switch_values (file, pos, max, indent, sep, term)
4708 FILE *file;
4709 int pos, max;
4710 const char *indent, *sep, *term;
4711{
4712 size_t j;
4713 char **p;
4714
4715 /* Print the options as passed. */
4716
4717 pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
4718 _("options passed: "), "");
4719
4720 for (p = &save_argv[1]; *p != NULL; p++)
4721 if (**p == '-')
4722 {
4723 /* Ignore these. */
4724 if (strcmp (*p, "-o") == 0)
4725 {
4726 if (p[1] != NULL)
4727 p++;
4728 continue;
4729 }
4730 if (strcmp (*p, "-quiet") == 0)
4731 continue;
4732 if (strcmp (*p, "-version") == 0)
4733 continue;
4734 if ((*p)[1] == 'd')
4735 continue;
4736
4737 pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
4738 }
4739 if (pos > 0)
4740 fprintf (file, "%s", term);
4741
4742 /* Print the -f and -m options that have been enabled.
4743 We don't handle language specific options but printing argv
4744 should suffice. */
4745
4746 pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
4747 _("options enabled: "), "");
4748
4749 for (j = 0; j < ARRAY_SIZE (f_options); j++)
4750 if (*f_options[j].variable == f_options[j].on_value)
4751 pos = print_single_switch (file, pos, max, indent, sep, term,
4752 "-f", f_options[j].string);
4753
4754 /* Print target specific options. */
4755
4756 for (j = 0; j < ARRAY_SIZE (target_switches); j++)
4757 if (target_switches[j].name[0] != '\0'
4758 && target_switches[j].value > 0
4759 && ((target_switches[j].value & target_flags)
4760 == target_switches[j].value))
4761 {
4762 pos = print_single_switch (file, pos, max, indent, sep, term,
4763 "-m", target_switches[j].name);
4764 }
4765
4766#ifdef TARGET_OPTIONS
4767 for (j = 0; j < ARRAY_SIZE (target_options); j++)
4768 if (*target_options[j].variable != NULL)
4769 {
4770 char prefix[256];
4771 sprintf (prefix, "-m%s", target_options[j].prefix);
4772 pos = print_single_switch (file, pos, max, indent, sep, term,
4773 prefix, *target_options[j].variable);
4774 }
4775#endif
4776
4777 fprintf (file, "%s", term);
4778}
4779\f
4780/* Open assembly code output file. Do this even if -fsyntax-only is
4781 on, because then the driver will have provided the name of a
4782 temporary file or bit bucket for us. NAME is the file specified on
4783 the command line, possibly NULL. */
4784static void
4785init_asm_output (name)
4786 const char *name;
4787{
4788 if (name == NULL && asm_file_name == 0)
4789 asm_out_file = stdout;
4790 else
4791 {
4792 if (asm_file_name == 0)
9cabb1d8
KH
4793 {
4794 int len = strlen (dump_base_name);
4795 char *dumpname = (char *) xmalloc (len + 6);
4796 memcpy (dumpname, dump_base_name, len + 1);
4797 strip_off_ending (dumpname, len);
4798 strcat (dumpname, ".s");
4799 asm_file_name = dumpname;
4800 }
f5e99456 4801 if (!strcmp (asm_file_name, "-"))
9cabb1d8 4802 asm_out_file = stdout;
f5e99456 4803 else
17211ab5 4804 asm_out_file = fopen (asm_file_name, "w+");
f5e99456
NB
4805 if (asm_out_file == 0)
4806 fatal_io_error ("can't open %s for writing", asm_file_name);
4807 }
4808
4809#ifdef IO_BUFFER_SIZE
4810 setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
9cabb1d8 4811 _IOFBF, IO_BUFFER_SIZE);
f5e99456
NB
4812#endif
4813
4814 if (!flag_syntax_only)
4815 {
4816#ifdef ASM_FILE_START
4817 ASM_FILE_START (asm_out_file);
4818#endif
4819
4820#ifdef ASM_COMMENT_START
4821 if (flag_verbose_asm)
4822 {
4823 /* Print the list of options in effect. */
4824 print_version (asm_out_file, ASM_COMMENT_START);
4825 print_switch_values (asm_out_file, 0, MAX_LINE,
4826 ASM_COMMENT_START, " ", "\n");
4827 /* Add a blank line here so it appears in assembler output but not
4828 screen output. */
4829 fprintf (asm_out_file, "\n");
4830 }
4831#endif
4832 }
4833}
4834\f
4835/* Initialization of the front end environment, before command line
4836 options are parsed. Signal handlers, internationalization etc.
4837 ARGV0 is main's argv[0]. */
4838static void
4839general_init (argv0)
4840 char *argv0;
4841{
4842 char *p;
4843
4844 p = argv0 + strlen (argv0);
4845 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
4846 --p;
4847 progname = p;
4848
4849 xmalloc_set_program_name (progname);
e1a132c6 4850
5351f1ca
NB
4851 hex_init ();
4852
191bf464 4853 gcc_init_libintl ();
ab87f8c8 4854
a7023245
ZW
4855 /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */
4856#ifdef SIGSEGV
4857 signal (SIGSEGV, crash_signal);
935d4b07 4858#endif
a7023245
ZW
4859#ifdef SIGILL
4860 signal (SIGILL, crash_signal);
4861#endif
4862#ifdef SIGBUS
4863 signal (SIGBUS, crash_signal);
4864#endif
4865#ifdef SIGABRT
4866 signal (SIGABRT, crash_signal);
4867#endif
4868#if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
4869 signal (SIGIOT, crash_signal);
4870#endif
15e5ad76
ZW
4871#ifdef SIGFPE
4872 signal (SIGFPE, crash_signal);
4873#endif
854a97f0 4874
476d9098
GK
4875 /* Other host-specific signal setup. */
4876 (*host_hooks.extra_signals)();
4877
f5e99456
NB
4878 /* Initialize the diagnostics reporting machinery, so option parsing
4879 can give warnings and errors. */
4880 diagnostic_initialize (global_dc);
c79043f3
NB
4881
4882 /* Initialize the garbage-collector, string pools and tree type hash
4883 table. */
4884 init_ggc ();
4885 init_stringpool ();
4886 init_ttree ();
f5e99456
NB
4887}
4888\f
4889/* Parse command line options and set default flag values, called
a1f300c0 4890 after language-independent option-independent initialization. Do
f5e99456 4891 minimal options processing. Outputting diagnostics is OK, but GC
5351f1ca
NB
4892 and identifier hashtables etc. are not initialized yet.
4893
0e9e1e0a 4894 Return nonzero to suppress compiler back end initialization. */
c79043f3 4895static void
f5e99456
NB
4896parse_options_and_default_flags (argc, argv)
4897 int argc;
4898 char **argv;
4899{
4900 int i;
3ac88239 4901
f5e99456
NB
4902 /* Save in case md file wants to emit args as a comment. */
4903 save_argc = argc;
4904 save_argv = argv;
afe3d090 4905
f5e99456
NB
4906 /* Initialize register usage now so switches may override. */
4907 init_reg_sets ();
764dbbf2 4908
c6d9a88c
MM
4909 /* Register the language-independent parameters. */
4910 add_params (lang_independent_params, LAST_PARAM);
4911
9ac121af
KG
4912 /* This must be done after add_params but before argument processing. */
4913 init_ggc_heuristics();
4914
eaec9b3d 4915 /* Perform language-specific options initialization. */
77b1a921 4916 (*lang_hooks.init_options) ();
b53beeb2 4917
4291d9c8
RS
4918 /* Scan to see what optimization level has been specified. That will
4919 determine the default value of many flags. */
4920 for (i = 1; i < argc; i++)
4921 {
4922 if (!strcmp (argv[i], "-O"))
4923 {
4924 optimize = 1;
16b6e120 4925 optimize_size = 0;
4291d9c8
RS
4926 }
4927 else if (argv[i][0] == '-' && argv[i][1] == 'O')
4928 {
c6aded7c 4929 /* Handle -Os, -O2, -O3, -O69, ... */
4291d9c8 4930 char *p = &argv[i][2];
854a97f0 4931
c6aded7c 4932 if ((p[0] == 's') && (p[1] == 0))
16b6e120
NC
4933 {
4934 optimize_size = 1;
854a97f0
KH
4935
4936 /* Optimizing for size forces optimize to be 2. */
16b6e120
NC
4937 optimize = 2;
4938 }
c6aded7c 4939 else
854a97f0 4940 {
192babfd
TP
4941 const int optimize_val = read_integral_parameter (p, p - 2, -1);
4942 if (optimize_val != -1)
16b6e120 4943 {
192babfd 4944 optimize = optimize_val;
16b6e120
NC
4945 optimize_size = 0;
4946 }
c6aded7c 4947 }
4291d9c8
RS
4948 }
4949 }
4950
201556f0
JJ
4951 if (!optimize)
4952 {
4953 flag_merge_constants = 0;
4954 }
4955
4291d9c8
RS
4956 if (optimize >= 1)
4957 {
6731a3e3 4958 flag_defer_pop = 1;
4291d9c8
RS
4959 flag_thread_jumps = 1;
4960#ifdef DELAY_SLOTS
4961 flag_delayed_branch = 1;
7e89c3a3
RK
4962#endif
4963#ifdef CAN_DEBUG_WITHOUT_FP
4964 flag_omit_frame_pointer = 1;
4291d9c8 4965#endif
3ff51205 4966 flag_guess_branch_prob = 1;
57d1019b 4967 flag_cprop_registers = 1;
96327cdc
JH
4968 flag_loop_optimize = 1;
4969 flag_crossjumping = 1;
2c4b77f3
JH
4970 flag_if_conversion = 1;
4971 flag_if_conversion2 = 1;
4291d9c8
RS
4972 }
4973
4974 if (optimize >= 2)
4975 {
db8cb48e 4976 flag_optimize_sibling_calls = 1;
4291d9c8 4977 flag_cse_follow_jumps = 1;
8b3686ed 4978 flag_cse_skip_blocks = 1;
7506f491 4979 flag_gcse = 1;
4291d9c8
RS
4980 flag_expensive_optimizations = 1;
4981 flag_strength_reduce = 1;
4982 flag_rerun_cse_after_loop = 1;
6d6d0fa0 4983 flag_rerun_loop_opt = 1;
ac266247 4984 flag_caller_saves = 1;
4ac8e06e 4985 flag_force_mem = 1;
ede7cd44 4986 flag_peephole2 = 1;
4291d9c8
RS
4987#ifdef INSN_SCHEDULING
4988 flag_schedule_insns = 1;
4989 flag_schedule_insns_after_reload = 1;
4990#endif
8c660648 4991 flag_regmove = 1;
3f9a83a9 4992 flag_strict_aliasing = 1;
b6d24183 4993 flag_delete_null_pointer_checks = 1;
58d8c980 4994 flag_reorder_blocks = 1;
194734e9 4995 flag_reorder_functions = 1;
4291d9c8
RS
4996 }
4997
7e89c3a3
RK
4998 if (optimize >= 3)
4999 {
5000 flag_inline_functions = 1;
2b2a8f1f 5001 flag_rename_registers = 1;
617b465c 5002 flag_unswitch_loops = 1;
7e89c3a3
RK
5003 }
5004
efa3896a
GK
5005 if (optimize < 2 || optimize_size)
5006 {
5007 align_loops = 1;
5008 align_jumps = 1;
5009 align_labels = 1;
5010 align_functions = 1;
de273d3f
RH
5011
5012 /* Don't reorder blocks when optimizing for size because extra
5013 jump insns may be created; also barrier may create extra padding.
5014
5015 More correctly we should have a block reordering mode that tried
5016 to minimize the combined size of all the jumps. This would more
5017 or less automatically remove extra jumps, but would also try to
5018 use more short jumps instead of long jumps. */
5019 flag_reorder_blocks = 0;
efa3896a
GK
5020 }
5021
f5e99456
NB
5022 /* Initialize whether `char' is signed. */
5023 flag_signed_char = DEFAULT_SIGNED_CHAR;
5024#ifdef DEFAULT_SHORT_ENUMS
5025 /* Initialize how much space enums occupy, by default. */
5026 flag_short_enums = DEFAULT_SHORT_ENUMS;
5027#endif
5028
c1da383f
DE
5029 /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
5030 modify it. */
5031 target_flags = 0;
5032 set_target_switch ("");
5033
fc85e1ad 5034 /* Unwind tables are always present in an ABI-conformant IA-64
854a97f0 5035 object file, so the default should be ON. */
fc85e1ad
AH
5036#ifdef IA64_UNWIND_INFO
5037 flag_unwind_tables = IA64_UNWIND_INFO;
5038#endif
5039
4291d9c8
RS
5040#ifdef OPTIMIZATION_OPTIONS
5041 /* Allow default optimizations to be specified on a per-machine basis. */
c6aded7c 5042 OPTIMIZATION_OPTIONS (optimize, optimize_size);
4291d9c8
RS
5043#endif
5044
39dd8003
NC
5045 /* Perform normal command line switch decoding. */
5046 for (i = 1; i < argc;)
4291d9c8 5047 {
57883c53
MM
5048 int lang_processed;
5049 int indep_processed;
f88b51fc 5050
39dd8003 5051 /* Give the language a chance to decode the option for itself. */
ee811cfd 5052 lang_processed = (*lang_hooks.decode_option) (argc - i, argv + i);
43a8f6d5 5053
57883c53
MM
5054 if (lang_processed >= 0)
5055 /* Now see if the option also has a language independent meaning.
5056 Some options are both language specific and language independent,
5057 eg --help. */
5058 indep_processed = independent_decode_option (argc - i, argv + i);
5059 else
5060 {
5061 lang_processed = -lang_processed;
5062 indep_processed = 0;
5063 }
39dd8003
NC
5064
5065 if (lang_processed || indep_processed)
04324727 5066 i += MAX (lang_processed, indep_processed);
39dd8003 5067 else
43a8f6d5 5068 {
854a97f0
KH
5069 const char *option = NULL;
5070 const char *lang = NULL;
0c70c30f 5071 unsigned int j;
854a97f0 5072
0c70c30f
NC
5073 /* It is possible that the command line switch is not valid for the
5074 current language, but it is valid for another language. In order
5075 to be compatible with previous versions of the compiler (which
5076 did not issue an error message in this case) we check for this
bc83ee59 5077 possibility here. If we do find a match, then if extra_warnings
0c70c30f
NC
5078 is set we generate a warning message, otherwise we will just
5079 ignore the option. */
b6a1cbae 5080 for (j = 0; j < ARRAY_SIZE (documented_lang_options); j++)
0c70c30f
NC
5081 {
5082 option = documented_lang_options[j].option;
854a97f0 5083
0c70c30f
NC
5084 if (option == NULL)
5085 lang = documented_lang_options[j].description;
5086 else if (! strncmp (argv[i], option, strlen (option)))
5087 break;
5088 }
5089
b6a1cbae 5090 if (j != ARRAY_SIZE (documented_lang_options))
0c70c30f
NC
5091 {
5092 if (extra_warnings)
5093 {
1f978f5f 5094 warning ("ignoring command line option '%s'", argv[i]);
0c70c30f 5095 if (lang)
04324727 5096 warning
1f978f5f 5097 ("(it is valid for %s but not the selected language)",
04324727 5098 lang);
0c70c30f
NC
5099 }
5100 }
337aa8ed 5101 else if (argv[i][0] == '-' && argv[i][1] == 'g')
04324727 5102 warning ("`%s': unknown or unsupported -g option", &argv[i][2]);
0c70c30f 5103 else
1f978f5f 5104 error ("unrecognized option `%s'", argv[i]);
854a97f0 5105
43a8f6d5
JM
5106 i++;
5107 }
4291d9c8 5108 }
854a97f0 5109
b0148884
JM
5110 if (flag_no_inline == 2)
5111 flag_no_inline = 0;
5112 else
5113 flag_really_no_inline = flag_no_inline;
5114
a32274ad
NB
5115 /* Set flag_no_inline before the post_options () hook. The C front
5116 ends use it to determine tree inlining defaults. FIXME: such
5117 code should be lang-independent when all front ends use tree
5118 inlining, in which case it, and this condition, should be moved
5119 to the top of process_options() instead. */
f246a305
RS
5120 if (optimize == 0)
5121 {
a2468e45
BK
5122 /* Inlining does not work if not optimizing,
5123 so force it not to be done. */
f246a305
RS
5124 flag_no_inline = 1;
5125 warn_inline = 0;
a2468e45 5126
ee811cfd 5127 /* The c_decode_option function and decode_option hook set
a2468e45
BK
5128 this to `2' if -Wall is used, so we can avoid giving out
5129 lots of errors for people who don't realize what -Wall does. */
5130 if (warn_uninitialized == 1)
5131 warning ("-Wuninitialized is not supported without -O");
f246a305
RS
5132 }
5133
b0148884
JM
5134 if (flag_really_no_inline == 2)
5135 flag_really_no_inline = flag_no_inline;
a32274ad
NB
5136}
5137\f
5138/* Process the options that have been parsed. */
5139static void
5140process_options ()
5141{
4291d9c8
RS
5142#ifdef OVERRIDE_OPTIONS
5143 /* Some machines may reject certain combinations of options. */
5144 OVERRIDE_OPTIONS;
5145#endif
5146
b1cbe78c
NB
5147 /* Set aux_base_name if not already set. */
5148 if (aux_base_name)
5149 ;
5150 else if (filename)
5151 {
5152 char *name = xstrdup (lbasename (filename));
5153
5154 strip_off_ending (name, strlen (name));
5155 aux_base_name = name;
5156 }
5157 else
5158 aux_base_name = "gccaux";
5159
efa3896a
GK
5160 /* Set up the align_*_log variables, defaulting them to 1 if they
5161 were still unset. */
5162 if (align_loops <= 0) align_loops = 1;
2cca7283
JH
5163 if (align_loops_max_skip > align_loops || !align_loops)
5164 align_loops_max_skip = align_loops - 1;
854a97f0 5165 align_loops_log = floor_log2 (align_loops * 2 - 1);
efa3896a 5166 if (align_jumps <= 0) align_jumps = 1;
2cca7283
JH
5167 if (align_jumps_max_skip > align_jumps || !align_jumps)
5168 align_jumps_max_skip = align_jumps - 1;
854a97f0 5169 align_jumps_log = floor_log2 (align_jumps * 2 - 1);
efa3896a 5170 if (align_labels <= 0) align_labels = 1;
854a97f0 5171 align_labels_log = floor_log2 (align_labels * 2 - 1);
2cca7283
JH
5172 if (align_labels_max_skip > align_labels || !align_labels)
5173 align_labels_max_skip = align_labels - 1;
efa3896a 5174 if (align_functions <= 0) align_functions = 1;
854a97f0
KH
5175 align_functions_log = floor_log2 (align_functions * 2 - 1);
5176
4291d9c8
RS
5177 /* Unrolling all loops implies that standard loop unrolling must also
5178 be done. */
5179 if (flag_unroll_all_loops)
5180 flag_unroll_loops = 1;
b17d5d7c
ZD
5181
5182 if (flag_unroll_loops)
5183 {
5184 flag_old_unroll_loops = 0;
5185 flag_old_unroll_all_loops = 0;
5186 }
5187
5188 if (flag_old_unroll_all_loops)
5189 flag_old_unroll_loops = 1;
5190
5191 /* Old loop unrolling requires that strength_reduction be on also. Silently
4291d9c8
RS
5192 turn on strength reduction here if it isn't already on. Also, the loop
5193 unrolling code assumes that cse will be run after loop, so that must
5194 be turned on also. */
b17d5d7c 5195 if (flag_old_unroll_loops)
4291d9c8
RS
5196 {
5197 flag_strength_reduce = 1;
5198 flag_rerun_cse_after_loop = 1;
5199 }
b17d5d7c
ZD
5200 if (flag_unroll_loops || flag_peel_loops)
5201 flag_rerun_cse_after_loop = 1;
4291d9c8 5202
b932f770
JH
5203 if (flag_non_call_exceptions)
5204 flag_asynchronous_unwind_tables = 1;
5205 if (flag_asynchronous_unwind_tables)
5206 flag_unwind_tables = 1;
5207
e72fcfe8
JH
5208 /* Disable unit-at-a-time mode for frontends not supporting callgraph
5209 interface. */
5210 if (flag_unit_at_a_time && ! lang_hooks.callgraph.expand_function)
5211 flag_unit_at_a_time = 0;
5212
4291d9c8
RS
5213 /* Warn about options that are not supported on this machine. */
5214#ifndef INSN_SCHEDULING
5215 if (flag_schedule_insns || flag_schedule_insns_after_reload)
5216 warning ("instruction scheduling not supported on this target machine");
5217#endif
5218#ifndef DELAY_SLOTS
5219 if (flag_delayed_branch)
5220 warning ("this target machine does not have delayed branches");
5221#endif
5222
19283265
RH
5223 user_label_prefix = USER_LABEL_PREFIX;
5224 if (flag_leading_underscore != -1)
5225 {
854a97f0 5226 /* If the default prefix is more complicated than "" or "_",
19283265
RH
5227 issue a warning and ignore this option. */
5228 if (user_label_prefix[0] == 0 ||
5229 (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
5230 {
5231 user_label_prefix = flag_leading_underscore ? "_" : "";
5232 }
5233 else
5234 warning ("-f%sleading-underscore not supported on this target machine",
5235 flag_leading_underscore ? "" : "no-");
5236 }
5237
4291d9c8
RS
5238 /* If we are in verbose mode, write out the version and maybe all the
5239 option flags in use. */
5240 if (version_flag)
5241 {
3d5cdd42 5242 print_version (stderr, "");
4291d9c8 5243 if (! quiet_flag)
3d5cdd42 5244 print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
4291d9c8
RS
5245 }
5246
26182e15 5247 if (! quiet_flag || flag_detailed_statistics)
f5e99456 5248 time_report = 1;
4291d9c8 5249
f5e99456
NB
5250 if (flag_syntax_only)
5251 {
5252 write_symbols = NO_DEBUG;
5253 profile_flag = 0;
f5e99456 5254 }
4291d9c8 5255
f5e99456
NB
5256 /* Now we know write_symbols, set up the debug hooks based on it.
5257 By default we do nothing for debug output. */
5258#if defined(DBX_DEBUGGING_INFO)
5259 if (write_symbols == DBX_DEBUG)
5260 debug_hooks = &dbx_debug_hooks;
4291d9c8 5261#endif
f5e99456
NB
5262#if defined(XCOFF_DEBUGGING_INFO)
5263 if (write_symbols == XCOFF_DEBUG)
5264 debug_hooks = &xcoff_debug_hooks;
3d5cdd42 5265#endif
f5e99456
NB
5266#ifdef SDB_DEBUGGING_INFO
5267 if (write_symbols == SDB_DEBUG)
5268 debug_hooks = &sdb_debug_hooks;
5269#endif
5270#ifdef DWARF_DEBUGGING_INFO
5271 if (write_symbols == DWARF_DEBUG)
5272 debug_hooks = &dwarf_debug_hooks;
5273#endif
5274#ifdef DWARF2_DEBUGGING_INFO
5275 if (write_symbols == DWARF2_DEBUG)
5276 debug_hooks = &dwarf2_debug_hooks;
3d5cdd42 5277#endif
7a0c8d71
DR
5278#ifdef VMS_DEBUGGING_INFO
5279 if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
5280 debug_hooks = &vmsdbg_debug_hooks;
5281#endif
4291d9c8 5282
f5e99456
NB
5283 /* If auxiliary info generation is desired, open the output file.
5284 This goes in the same directory as the source file--unlike
5285 all the other output files. */
5286 if (flag_gen_aux_info)
5287 {
5288 aux_info_file = fopen (aux_info_file_name, "w");
5289 if (aux_info_file == 0)
5290 fatal_io_error ("can't open %s", aux_info_file_name);
5291 }
309a8875 5292
f5e99456 5293 if (! targetm.have_named_sections)
4291d9c8 5294 {
f5e99456
NB
5295 if (flag_function_sections)
5296 {
4d6baafa 5297 warning ("-ffunction-sections not supported for this target");
f5e99456
NB
5298 flag_function_sections = 0;
5299 }
5300 if (flag_data_sections)
5301 {
4d6baafa 5302 warning ("-fdata-sections not supported for this target");
f5e99456
NB
5303 flag_data_sections = 0;
5304 }
4291d9c8 5305 }
f5e99456 5306
8456b95a 5307 if (flag_function_sections && profile_flag)
3d5cdd42 5308 {
4d6baafa 5309 warning ("-ffunction-sections disabled; it makes profiling impossible");
f5e99456 5310 flag_function_sections = 0;
3d5cdd42 5311 }
f5e99456 5312
0dd0e980
JH
5313#ifndef HAVE_prefetch
5314 if (flag_prefetch_loop_arrays)
5315 {
5316 warning ("-fprefetch-loop-arrays not supported for this target");
5317 flag_prefetch_loop_arrays = 0;
5318 }
5319#else
5320 if (flag_prefetch_loop_arrays && !HAVE_prefetch)
5321 {
5322 warning ("-fprefetch-loop-arrays not supported for this target (try -march switches)");
5323 flag_prefetch_loop_arrays = 0;
5324 }
5325#endif
5326
1398974c
JJ
5327 /* This combination of options isn't handled for i386 targets and doesn't
5328 make much sense anyway, so don't allow it. */
5329 if (flag_prefetch_loop_arrays && optimize_size)
5330 {
5331 warning ("-fprefetch-loop-arrays is not supported with -Os");
5332 flag_prefetch_loop_arrays = 0;
5333 }
5334
f5e99456
NB
5335#ifndef OBJECT_FORMAT_ELF
5336 if (flag_function_sections && write_symbols != NO_DEBUG)
4d6baafa 5337 warning ("-ffunction-sections may affect debugging on some targets");
f5e99456 5338#endif
52bfebf0
RS
5339
5340 /* The presence of IEEE signaling NaNs, implies all math can trap. */
5341 if (flag_signaling_nans)
5342 flag_trapping_math = 1;
4291d9c8 5343}
f5e99456 5344\f
c79043f3 5345/* Initialize the compiler back end. */
f5e99456 5346static void
c79043f3 5347backend_init ()
f5e99456 5348{
6cde4876
JL
5349 /* init_emit_once uses reg_raw_mode and therefore must be called
5350 after init_regs which initialized reg_raw_mode. */
5351 init_regs ();
f5e99456
NB
5352 init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
5353 || debug_info_level == DINFO_LEVEL_VERBOSE
7a0c8d71
DR
5354#ifdef VMS_DEBUGGING_INFO
5355 /* Enable line number info for traceback */
5356 || debug_info_level > DINFO_LEVEL_NONE
5357#endif
5358 || flag_test_coverage
5359 || warn_notreached);
6cde4876 5360 init_fake_stack_mems ();
f5e99456 5361 init_alias_once ();
f5e99456
NB
5362 init_loop ();
5363 init_reload ();
5364 init_function_once ();
f5e99456 5365 init_varasm_once ();
f5e99456
NB
5366
5367 /* The following initialization functions need to generate rtl, so
5368 provide a dummy function context for them. */
5369 init_dummy_function_start ();
5370 init_expmed ();
f5e99456
NB
5371 if (flag_caller_saves)
5372 init_caller_save ();
5373 expand_dummy_function_end ();
5374}
5375\f
0e9e1e0a 5376/* Language-dependent initialization. Returns nonzero on success. */
22703ccc 5377static int
f5e99456
NB
5378lang_dependent_init (name)
5379 const char *name;
4291d9c8 5380{
f5e99456
NB
5381 if (dump_base_name == 0)
5382 dump_base_name = name ? name : "gccdump";
26182e15 5383
f5e99456
NB
5384 /* Front-end initialization. This hook can assume that GC,
5385 identifier hashes etc. are set up, but debug initialization is
5386 not done yet. This routine must return the original filename
5387 (e.g. foo.i -> foo.c) so can correctly initialize debug output. */
5388 name = (*lang_hooks.init) (name);
22703ccc
NB
5389 if (name == NULL)
5390 return 0;
4291d9c8 5391
f5e99456
NB
5392 main_input_filename = input_filename = name;
5393 init_asm_output (name);
3d5cdd42 5394
f5e99456
NB
5395 /* These create various _DECL nodes, so need to be called after the
5396 front end is initialized. */
5397 init_eh ();
5398 init_optabs ();
7ab0121e
JW
5399
5400 /* The following initialization functions need to generate rtl, so
5401 provide a dummy function context for them. */
5402 init_dummy_function_start ();
1f8c3c5b 5403 init_expr_once ();
7ab0121e 5404 expand_dummy_function_end ();
3d5cdd42 5405
f5e99456
NB
5406 /* Put an entry on the input file stack for the main input file. */
5407 push_srcloc (input_filename, 0);
3d5cdd42 5408
f5e99456
NB
5409 /* If dbx symbol table desired, initialize writing it and output the
5410 predefined types. */
5411 timevar_push (TV_SYMOUT);
4291d9c8 5412
f5e99456
NB
5413#ifdef DWARF2_UNWIND_INFO
5414 if (dwarf2out_do_frame ())
5415 dwarf2out_frame_init ();
5416#endif
4291d9c8 5417
f5e99456
NB
5418 /* Now we have the correct original filename, we can initialize
5419 debug output. */
5420 (*debug_hooks->init) (name);
4291d9c8 5421
f5e99456 5422 timevar_pop (TV_SYMOUT);
22703ccc
NB
5423
5424 return 1;
5425}
5426\f
5427/* Clean up: close opened files, etc. */
5428
5429static void
5430finalize ()
5431{
5432 /* Close the dump files. */
5433 if (flag_gen_aux_info)
5434 {
5435 fclose (aux_info_file);
5436 if (errorcount)
5437 unlink (aux_info_file_name);
5438 }
5439
5440 /* Close non-debugging input and output files. Take special care to note
5441 whether fclose returns an error, since the pages might still be on the
5442 buffer chain while the file is open. */
5443
5444 if (asm_out_file)
5445 {
5446 if (ferror (asm_out_file) != 0)
5447 fatal_io_error ("error writing to %s", asm_file_name);
5448 if (fclose (asm_out_file) != 0)
5449 fatal_io_error ("error closing %s", asm_file_name);
5450 }
5451
5452 /* Do whatever is necessary to finish printing the graphs. */
5453 if (graph_dump_format != no_graph)
5454 {
5455 int i;
5456
5457 for (i = 0; i < (int) DFI_MAX; ++i)
5458 if (dump_file[i].initialized && dump_file[i].graph_dump_p)
5459 {
5460 char seq[16];
5461 char *suffix;
5462
6baf9874 5463 sprintf (seq, DUMPFILE_FORMAT, i);
22703ccc
NB
5464 suffix = concat (seq, dump_file[i].extension, NULL);
5465 finish_graph_dump_file (dump_base_name, suffix);
5466 free (suffix);
5467 }
5468 }
5469
5470 if (mem_report)
5471 {
5472 ggc_print_statistics ();
5473 stringpool_statistics ();
5474 dump_tree_statistics ();
5475 }
5476
5477 /* Free up memory for the benefit of leak detectors. */
5478 free_reg_info ();
5479
5480 /* Language-specific end of compilation actions. */
5481 (*lang_hooks.finish) ();
f5e99456
NB
5482}
5483\f
4d6baafa
NB
5484/* Initialize the compiler, and compile the input file. */
5485static void
b1cbe78c
NB
5486do_compile (no_backend)
5487 int no_backend;
f5e99456 5488{
a9915c78
RK
5489 /* We cannot start timing until after options are processed since that
5490 says if we run timers or not. */
5491 init_timevar ();
5492 timevar_start (TV_TOTAL);
5493
c79043f3
NB
5494 /* Set up the back-end if requested. */
5495 if (!no_backend)
5496 backend_init ();
f5e99456 5497
22703ccc
NB
5498 /* Language-dependent initialization. Returns true on success. */
5499 if (lang_dependent_init (filename))
5500 compile_file ();
f5e99456 5501
22703ccc 5502 finalize ();
f5e99456
NB
5503
5504 /* Stop timing and print the times. */
5505 timevar_stop (TV_TOTAL);
5506 timevar_print (stderr);
4d6baafa
NB
5507}
5508\f
5509/* Entry point of cc1, cc1plus, jc1, f771, etc.
5510 Decode command args, then call compile_file.
5511 Exit code is FATAL_EXIT_CODE if can't open files or if there were
5512 any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
5513
5514 It is not safe to call this function more than once. */
5515
5516int
5517toplev_main (argc, argv)
5518 int argc;
5519 char **argv;
5520{
5521 /* Initialization of GCC's environment, and diagnostics. */
9cabb1d8 5522 general_init (argv[0]);
4d6baafa
NB
5523
5524 /* Parse the options and do minimal processing; basically just
5525 enough to default flags appropriately. */
c79043f3 5526 parse_options_and_default_flags (argc, argv);
4d6baafa
NB
5527
5528 /* Exit early if we can (e.g. -help). */
c79043f3 5529 if (!exit_after_options)
b1cbe78c
NB
5530 {
5531 /* All command line options have been parsed; allow the front
5532 end to perform consistency checks, etc. */
5533 bool no_backend = (*lang_hooks.post_options) ();
5534
5535 /* The bulk of command line switch processing. */
5536 process_options ();
5537
5538 /* Don't do any more if an error has already occurred. */
5539 if (!errorcount)
5540 do_compile (no_backend);
5541 }
f5e99456
NB
5542
5543 if (errorcount || sorrycount)
5544 return (FATAL_EXIT_CODE);
5545
5546 return (SUCCESS_EXIT_CODE);
4291d9c8 5547}
This page took 3.332779 seconds and 5 git commands to generate.