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