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