xref: /dflybsd-src/contrib/gcc-4.7/gcc/toplev.c (revision e4b17023d31ea40e02fa06b141db27753ecc6934)
1*e4b17023SJohn Marino /* Top level of GCC compilers (cc1, cc1plus, etc.)
2*e4b17023SJohn Marino    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3*e4b17023SJohn Marino    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4*e4b17023SJohn Marino    2011 Free Software Foundation, Inc.
5*e4b17023SJohn Marino 
6*e4b17023SJohn Marino This file is part of GCC.
7*e4b17023SJohn Marino 
8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
9*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
10*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
11*e4b17023SJohn Marino version.
12*e4b17023SJohn Marino 
13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
15*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16*e4b17023SJohn Marino for more details.
17*e4b17023SJohn Marino 
18*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
19*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
20*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
21*e4b17023SJohn Marino 
22*e4b17023SJohn Marino /* This is the top level of cc1/c++.
23*e4b17023SJohn Marino    It parses command args, opens files, invokes the various passes
24*e4b17023SJohn Marino    in the proper order, and counts the time used by each.
25*e4b17023SJohn Marino    Error messages and low-level interface to malloc also handled here.  */
26*e4b17023SJohn Marino 
27*e4b17023SJohn Marino #include "config.h"
28*e4b17023SJohn Marino #include "system.h"
29*e4b17023SJohn Marino #include "coretypes.h"
30*e4b17023SJohn Marino #include "tm.h"
31*e4b17023SJohn Marino #include "line-map.h"
32*e4b17023SJohn Marino #include "input.h"
33*e4b17023SJohn Marino #include "tree.h"
34*e4b17023SJohn Marino #include "realmpfr.h"	/* For GMP/MPFR/MPC versions, in print_version.  */
35*e4b17023SJohn Marino #include "version.h"
36*e4b17023SJohn Marino #include "rtl.h"
37*e4b17023SJohn Marino #include "tm_p.h"
38*e4b17023SJohn Marino #include "flags.h"
39*e4b17023SJohn Marino #include "insn-attr.h"
40*e4b17023SJohn Marino #include "insn-config.h"
41*e4b17023SJohn Marino #include "insn-flags.h"
42*e4b17023SJohn Marino #include "hard-reg-set.h"
43*e4b17023SJohn Marino #include "recog.h"
44*e4b17023SJohn Marino #include "output.h"
45*e4b17023SJohn Marino #include "except.h"
46*e4b17023SJohn Marino #include "function.h"
47*e4b17023SJohn Marino #include "toplev.h"
48*e4b17023SJohn Marino #include "expr.h"
49*e4b17023SJohn Marino #include "basic-block.h"
50*e4b17023SJohn Marino #include "intl.h"
51*e4b17023SJohn Marino #include "ggc.h"
52*e4b17023SJohn Marino #include "graph.h"
53*e4b17023SJohn Marino #include "regs.h"
54*e4b17023SJohn Marino #include "timevar.h"
55*e4b17023SJohn Marino #include "diagnostic.h"
56*e4b17023SJohn Marino #include "tree-diagnostic.h"
57*e4b17023SJohn Marino #include "tree-pretty-print.h"
58*e4b17023SJohn Marino #include "params.h"
59*e4b17023SJohn Marino #include "reload.h"
60*e4b17023SJohn Marino #include "ira.h"
61*e4b17023SJohn Marino #include "dwarf2asm.h"
62*e4b17023SJohn Marino #include "integrate.h"
63*e4b17023SJohn Marino #include "debug.h"
64*e4b17023SJohn Marino #include "target.h"
65*e4b17023SJohn Marino #include "common/common-target.h"
66*e4b17023SJohn Marino #include "langhooks.h"
67*e4b17023SJohn Marino #include "cfglayout.h"
68*e4b17023SJohn Marino #include "cfgloop.h"
69*e4b17023SJohn Marino #include "hosthooks.h"
70*e4b17023SJohn Marino #include "cgraph.h"
71*e4b17023SJohn Marino #include "opts.h"
72*e4b17023SJohn Marino #include "opts-diagnostic.h"
73*e4b17023SJohn Marino #include "coverage.h"
74*e4b17023SJohn Marino #include "value-prof.h"
75*e4b17023SJohn Marino #include "alloc-pool.h"
76*e4b17023SJohn Marino #include "tree-mudflap.h"
77*e4b17023SJohn Marino #include "tree-pass.h"
78*e4b17023SJohn Marino #include "gimple.h"
79*e4b17023SJohn Marino #include "tree-ssa-alias.h"
80*e4b17023SJohn Marino #include "plugin.h"
81*e4b17023SJohn Marino 
82*e4b17023SJohn Marino #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
83*e4b17023SJohn Marino #include "dwarf2out.h"
84*e4b17023SJohn Marino #endif
85*e4b17023SJohn Marino 
86*e4b17023SJohn Marino #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
87*e4b17023SJohn Marino #include "dbxout.h"
88*e4b17023SJohn Marino #endif
89*e4b17023SJohn Marino 
90*e4b17023SJohn Marino #ifdef SDB_DEBUGGING_INFO
91*e4b17023SJohn Marino #include "sdbout.h"
92*e4b17023SJohn Marino #endif
93*e4b17023SJohn Marino 
94*e4b17023SJohn Marino #ifdef XCOFF_DEBUGGING_INFO
95*e4b17023SJohn Marino #include "xcoffout.h"		/* Needed for external data
96*e4b17023SJohn Marino 				   declarations for e.g. AIX 4.x.  */
97*e4b17023SJohn Marino #endif
98*e4b17023SJohn Marino 
99*e4b17023SJohn Marino static void general_init (const char *);
100*e4b17023SJohn Marino static void do_compile (void);
101*e4b17023SJohn Marino static void process_options (void);
102*e4b17023SJohn Marino static void backend_init (void);
103*e4b17023SJohn Marino static int lang_dependent_init (const char *);
104*e4b17023SJohn Marino static void init_asm_output (const char *);
105*e4b17023SJohn Marino static void finalize (bool);
106*e4b17023SJohn Marino 
107*e4b17023SJohn Marino static void crash_signal (int) ATTRIBUTE_NORETURN;
108*e4b17023SJohn Marino static void compile_file (void);
109*e4b17023SJohn Marino 
110*e4b17023SJohn Marino /* True if we don't need a backend (e.g. preprocessing only).  */
111*e4b17023SJohn Marino static bool no_backend;
112*e4b17023SJohn Marino 
113*e4b17023SJohn Marino /* Length of line when printing switch values.  */
114*e4b17023SJohn Marino #define MAX_LINE 75
115*e4b17023SJohn Marino 
116*e4b17023SJohn Marino /* Decoded options, and number of such options.  */
117*e4b17023SJohn Marino struct cl_decoded_option *save_decoded_options;
118*e4b17023SJohn Marino unsigned int save_decoded_options_count;
119*e4b17023SJohn Marino 
120*e4b17023SJohn Marino /* Used to enable -fvar-tracking, -fweb and -frename-registers according
121*e4b17023SJohn Marino    to optimize in process_options ().  */
122*e4b17023SJohn Marino #define AUTODETECT_VALUE 2
123*e4b17023SJohn Marino 
124*e4b17023SJohn Marino /* Debug hooks - dependent upon command line options.  */
125*e4b17023SJohn Marino 
126*e4b17023SJohn Marino const struct gcc_debug_hooks *debug_hooks;
127*e4b17023SJohn Marino 
128*e4b17023SJohn Marino /* The FUNCTION_DECL for the function currently being compiled,
129*e4b17023SJohn Marino    or 0 if between functions.  */
130*e4b17023SJohn Marino tree current_function_decl;
131*e4b17023SJohn Marino 
132*e4b17023SJohn Marino /* Set to the FUNC_BEGIN label of the current function, or NULL
133*e4b17023SJohn Marino    if none.  */
134*e4b17023SJohn Marino const char * current_function_func_begin_label;
135*e4b17023SJohn Marino 
136*e4b17023SJohn Marino /* A random sequence of characters, unless overridden by user.  */
137*e4b17023SJohn Marino static const char *flag_random_seed;
138*e4b17023SJohn Marino 
139*e4b17023SJohn Marino /* A local time stamp derived from the time of compilation. It will be
140*e4b17023SJohn Marino    zero if the system cannot provide a time.  It will be -1u, if the
141*e4b17023SJohn Marino    user has specified a particular random seed.  */
142*e4b17023SJohn Marino unsigned local_tick;
143*e4b17023SJohn Marino 
144*e4b17023SJohn Marino /* Random number for this compilation */
145*e4b17023SJohn Marino HOST_WIDE_INT random_seed;
146*e4b17023SJohn Marino 
147*e4b17023SJohn Marino /* -f flags.  */
148*e4b17023SJohn Marino 
149*e4b17023SJohn Marino /* Nonzero means make permerror produce warnings instead of errors.  */
150*e4b17023SJohn Marino 
151*e4b17023SJohn Marino int flag_permissive = 0;
152*e4b17023SJohn Marino 
153*e4b17023SJohn Marino /* When non-NULL, indicates that whenever space is allocated on the
154*e4b17023SJohn Marino    stack, the resulting stack pointer must not pass this
155*e4b17023SJohn Marino    address---that is, for stacks that grow downward, the stack pointer
156*e4b17023SJohn Marino    must always be greater than or equal to this address; for stacks
157*e4b17023SJohn Marino    that grow upward, the stack pointer must be less than this address.
158*e4b17023SJohn Marino    At present, the rtx may be either a REG or a SYMBOL_REF, although
159*e4b17023SJohn Marino    the support provided depends on the backend.  */
160*e4b17023SJohn Marino rtx stack_limit_rtx;
161*e4b17023SJohn Marino 
162*e4b17023SJohn Marino /* True if the user has tagged the function with the 'section'
163*e4b17023SJohn Marino    attribute.  */
164*e4b17023SJohn Marino 
165*e4b17023SJohn Marino bool user_defined_section_attribute = false;
166*e4b17023SJohn Marino 
167*e4b17023SJohn Marino struct target_flag_state default_target_flag_state;
168*e4b17023SJohn Marino #if SWITCHABLE_TARGET
169*e4b17023SJohn Marino struct target_flag_state *this_target_flag_state = &default_target_flag_state;
170*e4b17023SJohn Marino #else
171*e4b17023SJohn Marino #define this_target_flag_state (&default_target_flag_state)
172*e4b17023SJohn Marino #endif
173*e4b17023SJohn Marino 
174*e4b17023SJohn Marino /* The user symbol prefix after having resolved same.  */
175*e4b17023SJohn Marino const char *user_label_prefix;
176*e4b17023SJohn Marino 
177*e4b17023SJohn Marino /* Output files for assembler code (real compiler output)
178*e4b17023SJohn Marino    and debugging dumps.  */
179*e4b17023SJohn Marino 
180*e4b17023SJohn Marino FILE *asm_out_file;
181*e4b17023SJohn Marino FILE *aux_info_file;
182*e4b17023SJohn Marino FILE *stack_usage_file = NULL;
183*e4b17023SJohn Marino FILE *dump_file = NULL;
184*e4b17023SJohn Marino const char *dump_file_name;
185*e4b17023SJohn Marino 
186*e4b17023SJohn Marino /* The current working directory of a translation.  It's generally the
187*e4b17023SJohn Marino    directory from which compilation was initiated, but a preprocessed
188*e4b17023SJohn Marino    file may specify the original directory in which it was
189*e4b17023SJohn Marino    created.  */
190*e4b17023SJohn Marino 
191*e4b17023SJohn Marino static const char *src_pwd;
192*e4b17023SJohn Marino 
193*e4b17023SJohn Marino /* Initialize src_pwd with the given string, and return true.  If it
194*e4b17023SJohn Marino    was already initialized, return false.  As a special case, it may
195*e4b17023SJohn Marino    be called with a NULL argument to test whether src_pwd has NOT been
196*e4b17023SJohn Marino    initialized yet.  */
197*e4b17023SJohn Marino 
198*e4b17023SJohn Marino bool
199*e4b17023SJohn Marino set_src_pwd (const char *pwd)
200*e4b17023SJohn Marino {
201*e4b17023SJohn Marino   if (src_pwd)
202*e4b17023SJohn Marino     {
203*e4b17023SJohn Marino       if (strcmp (src_pwd, pwd) == 0)
204*e4b17023SJohn Marino 	return true;
205*e4b17023SJohn Marino       else
206*e4b17023SJohn Marino 	return false;
207*e4b17023SJohn Marino     }
208*e4b17023SJohn Marino 
209*e4b17023SJohn Marino   src_pwd = xstrdup (pwd);
210*e4b17023SJohn Marino   return true;
211*e4b17023SJohn Marino }
212*e4b17023SJohn Marino 
213*e4b17023SJohn Marino /* Return the directory from which the translation unit was initiated,
214*e4b17023SJohn Marino    in case set_src_pwd() was not called before to assign it a
215*e4b17023SJohn Marino    different value.  */
216*e4b17023SJohn Marino 
217*e4b17023SJohn Marino const char *
218*e4b17023SJohn Marino get_src_pwd (void)
219*e4b17023SJohn Marino {
220*e4b17023SJohn Marino   if (! src_pwd)
221*e4b17023SJohn Marino     {
222*e4b17023SJohn Marino       src_pwd = getpwd ();
223*e4b17023SJohn Marino       if (!src_pwd)
224*e4b17023SJohn Marino 	src_pwd = ".";
225*e4b17023SJohn Marino     }
226*e4b17023SJohn Marino 
227*e4b17023SJohn Marino    return src_pwd;
228*e4b17023SJohn Marino }
229*e4b17023SJohn Marino 
230*e4b17023SJohn Marino /* Called when the start of a function definition is parsed,
231*e4b17023SJohn Marino    this function prints on stderr the name of the function.  */
232*e4b17023SJohn Marino void
233*e4b17023SJohn Marino announce_function (tree decl)
234*e4b17023SJohn Marino {
235*e4b17023SJohn Marino   if (!quiet_flag)
236*e4b17023SJohn Marino     {
237*e4b17023SJohn Marino       if (rtl_dump_and_exit)
238*e4b17023SJohn Marino 	fprintf (stderr, "%s ",
239*e4b17023SJohn Marino 		 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl))));
240*e4b17023SJohn Marino       else
241*e4b17023SJohn Marino 	fprintf (stderr, " %s",
242*e4b17023SJohn Marino 		 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2)));
243*e4b17023SJohn Marino       fflush (stderr);
244*e4b17023SJohn Marino       pp_needs_newline (global_dc->printer) = true;
245*e4b17023SJohn Marino       diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL);
246*e4b17023SJohn Marino     }
247*e4b17023SJohn Marino }
248*e4b17023SJohn Marino 
249*e4b17023SJohn Marino /* Initialize local_tick with a random number or -1 if
250*e4b17023SJohn Marino    flag_random_seed is set.  */
251*e4b17023SJohn Marino 
252*e4b17023SJohn Marino static void
253*e4b17023SJohn Marino init_local_tick (void)
254*e4b17023SJohn Marino {
255*e4b17023SJohn Marino   if (!flag_random_seed)
256*e4b17023SJohn Marino     {
257*e4b17023SJohn Marino       /* Try urandom first. Time of day is too likely to collide.
258*e4b17023SJohn Marino 	 In case of any error we just use the local tick. */
259*e4b17023SJohn Marino 
260*e4b17023SJohn Marino       int fd = open ("/dev/urandom", O_RDONLY);
261*e4b17023SJohn Marino       if (fd >= 0)
262*e4b17023SJohn Marino         {
263*e4b17023SJohn Marino           read (fd, &random_seed, sizeof (random_seed));
264*e4b17023SJohn Marino           close (fd);
265*e4b17023SJohn Marino         }
266*e4b17023SJohn Marino 
267*e4b17023SJohn Marino       /* Now get the tick anyways  */
268*e4b17023SJohn Marino #ifdef HAVE_GETTIMEOFDAY
269*e4b17023SJohn Marino       {
270*e4b17023SJohn Marino 	struct timeval tv;
271*e4b17023SJohn Marino 
272*e4b17023SJohn Marino 	gettimeofday (&tv, NULL);
273*e4b17023SJohn Marino 	local_tick = tv.tv_sec * 1000 + tv.tv_usec / 1000;
274*e4b17023SJohn Marino       }
275*e4b17023SJohn Marino #else
276*e4b17023SJohn Marino       {
277*e4b17023SJohn Marino 	time_t now = time (NULL);
278*e4b17023SJohn Marino 
279*e4b17023SJohn Marino 	if (now != (time_t)-1)
280*e4b17023SJohn Marino 	  local_tick = (unsigned) now;
281*e4b17023SJohn Marino       }
282*e4b17023SJohn Marino #endif
283*e4b17023SJohn Marino     }
284*e4b17023SJohn Marino   else
285*e4b17023SJohn Marino     local_tick = -1;
286*e4b17023SJohn Marino }
287*e4b17023SJohn Marino 
288*e4b17023SJohn Marino /* Set up a default flag_random_seed and local_tick, unless the user
289*e4b17023SJohn Marino    already specified one.  Must be called after init_local_tick.  */
290*e4b17023SJohn Marino 
291*e4b17023SJohn Marino static void
292*e4b17023SJohn Marino init_random_seed (void)
293*e4b17023SJohn Marino {
294*e4b17023SJohn Marino   if (flag_random_seed)
295*e4b17023SJohn Marino     {
296*e4b17023SJohn Marino       char *endp;
297*e4b17023SJohn Marino 
298*e4b17023SJohn Marino       /* When the driver passed in a hex number don't crc it again */
299*e4b17023SJohn Marino       random_seed = strtoul (flag_random_seed, &endp, 0);
300*e4b17023SJohn Marino       if (!(endp > flag_random_seed && *endp == 0))
301*e4b17023SJohn Marino         random_seed = crc32_string (0, flag_random_seed);
302*e4b17023SJohn Marino     }
303*e4b17023SJohn Marino   else if (!random_seed)
304*e4b17023SJohn Marino     random_seed = local_tick ^ getpid ();  /* Old racey fallback method */
305*e4b17023SJohn Marino }
306*e4b17023SJohn Marino 
307*e4b17023SJohn Marino /* Obtain the random_seed.  Unless NOINIT, initialize it if
308*e4b17023SJohn Marino    it's not provided in the command line.  */
309*e4b17023SJohn Marino 
310*e4b17023SJohn Marino HOST_WIDE_INT
311*e4b17023SJohn Marino get_random_seed (bool noinit)
312*e4b17023SJohn Marino {
313*e4b17023SJohn Marino   if (!flag_random_seed && !noinit)
314*e4b17023SJohn Marino     init_random_seed ();
315*e4b17023SJohn Marino   return random_seed;
316*e4b17023SJohn Marino }
317*e4b17023SJohn Marino 
318*e4b17023SJohn Marino /* Modify the random_seed string to VAL.  Return its previous
319*e4b17023SJohn Marino    value.  */
320*e4b17023SJohn Marino 
321*e4b17023SJohn Marino const char *
322*e4b17023SJohn Marino set_random_seed (const char *val)
323*e4b17023SJohn Marino {
324*e4b17023SJohn Marino   const char *old = flag_random_seed;
325*e4b17023SJohn Marino   flag_random_seed = val;
326*e4b17023SJohn Marino   return old;
327*e4b17023SJohn Marino }
328*e4b17023SJohn Marino 
329*e4b17023SJohn Marino /* Handler for fatal signals, such as SIGSEGV.  These are transformed
330*e4b17023SJohn Marino    into ICE messages, which is much more user friendly.  In case the
331*e4b17023SJohn Marino    error printer crashes, reset the signal to prevent infinite recursion.  */
332*e4b17023SJohn Marino 
333*e4b17023SJohn Marino static void
334*e4b17023SJohn Marino crash_signal (int signo)
335*e4b17023SJohn Marino {
336*e4b17023SJohn Marino   signal (signo, SIG_DFL);
337*e4b17023SJohn Marino 
338*e4b17023SJohn Marino   /* If we crashed while processing an ASM statement, then be a little more
339*e4b17023SJohn Marino      graceful.  It's most likely the user's fault.  */
340*e4b17023SJohn Marino   if (this_is_asm_operands)
341*e4b17023SJohn Marino     {
342*e4b17023SJohn Marino       output_operand_lossage ("unrecoverable error");
343*e4b17023SJohn Marino       exit (FATAL_EXIT_CODE);
344*e4b17023SJohn Marino     }
345*e4b17023SJohn Marino 
346*e4b17023SJohn Marino   internal_error ("%s", strsignal (signo));
347*e4b17023SJohn Marino }
348*e4b17023SJohn Marino 
349*e4b17023SJohn Marino /* A subroutine of wrapup_global_declarations.  We've come to the end of
350*e4b17023SJohn Marino    the compilation unit.  All deferred variables should be undeferred,
351*e4b17023SJohn Marino    and all incomplete decls should be finalized.  */
352*e4b17023SJohn Marino 
353*e4b17023SJohn Marino void
354*e4b17023SJohn Marino wrapup_global_declaration_1 (tree decl)
355*e4b17023SJohn Marino {
356*e4b17023SJohn Marino   /* We're not deferring this any longer.  Assignment is conditional to
357*e4b17023SJohn Marino      avoid needlessly dirtying PCH pages.  */
358*e4b17023SJohn Marino   if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS)
359*e4b17023SJohn Marino       && DECL_DEFER_OUTPUT (decl) != 0)
360*e4b17023SJohn Marino     DECL_DEFER_OUTPUT (decl) = 0;
361*e4b17023SJohn Marino 
362*e4b17023SJohn Marino   if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0)
363*e4b17023SJohn Marino     lang_hooks.finish_incomplete_decl (decl);
364*e4b17023SJohn Marino }
365*e4b17023SJohn Marino 
366*e4b17023SJohn Marino /* A subroutine of wrapup_global_declarations.  Decide whether or not DECL
367*e4b17023SJohn Marino    needs to be output.  Return true if it is output.  */
368*e4b17023SJohn Marino 
369*e4b17023SJohn Marino bool
370*e4b17023SJohn Marino wrapup_global_declaration_2 (tree decl)
371*e4b17023SJohn Marino {
372*e4b17023SJohn Marino   if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
373*e4b17023SJohn Marino     return false;
374*e4b17023SJohn Marino 
375*e4b17023SJohn Marino   /* Don't write out static consts, unless we still need them.
376*e4b17023SJohn Marino 
377*e4b17023SJohn Marino      We also keep static consts if not optimizing (for debugging),
378*e4b17023SJohn Marino      unless the user specified -fno-keep-static-consts.
379*e4b17023SJohn Marino      ??? They might be better written into the debug information.
380*e4b17023SJohn Marino      This is possible when using DWARF.
381*e4b17023SJohn Marino 
382*e4b17023SJohn Marino      A language processor that wants static constants to be always
383*e4b17023SJohn Marino      written out (even if it is not used) is responsible for
384*e4b17023SJohn Marino      calling rest_of_decl_compilation itself.  E.g. the C front-end
385*e4b17023SJohn Marino      calls rest_of_decl_compilation from finish_decl.
386*e4b17023SJohn Marino      One motivation for this is that is conventional in some
387*e4b17023SJohn Marino      environments to write things like:
388*e4b17023SJohn Marino      static const char rcsid[] = "... version string ...";
389*e4b17023SJohn Marino      intending to force the string to be in the executable.
390*e4b17023SJohn Marino 
391*e4b17023SJohn Marino      A language processor that would prefer to have unneeded
392*e4b17023SJohn Marino      static constants "optimized away" would just defer writing
393*e4b17023SJohn Marino      them out until here.  E.g. C++ does this, because static
394*e4b17023SJohn Marino      constants are often defined in header files.
395*e4b17023SJohn Marino 
396*e4b17023SJohn Marino      ??? A tempting alternative (for both C and C++) would be
397*e4b17023SJohn Marino      to force a constant to be written if and only if it is
398*e4b17023SJohn Marino      defined in a main file, as opposed to an include file.  */
399*e4b17023SJohn Marino 
400*e4b17023SJohn Marino   if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
401*e4b17023SJohn Marino     {
402*e4b17023SJohn Marino       struct varpool_node *node;
403*e4b17023SJohn Marino       bool needed = true;
404*e4b17023SJohn Marino       node = varpool_get_node (decl);
405*e4b17023SJohn Marino 
406*e4b17023SJohn Marino       if (!node && flag_ltrans)
407*e4b17023SJohn Marino 	needed = false;
408*e4b17023SJohn Marino       else if (node && node->finalized)
409*e4b17023SJohn Marino 	needed = false;
410*e4b17023SJohn Marino       else if (node && node->alias)
411*e4b17023SJohn Marino 	needed = false;
412*e4b17023SJohn Marino       else if (!cgraph_global_info_ready
413*e4b17023SJohn Marino 	       && (TREE_USED (decl)
414*e4b17023SJohn Marino 		   || TREE_USED (DECL_ASSEMBLER_NAME (decl))))
415*e4b17023SJohn Marino 	/* needed */;
416*e4b17023SJohn Marino       else if (node && node->needed)
417*e4b17023SJohn Marino 	/* needed */;
418*e4b17023SJohn Marino       else if (DECL_COMDAT (decl))
419*e4b17023SJohn Marino 	needed = false;
420*e4b17023SJohn Marino       else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
421*e4b17023SJohn Marino 	       && (optimize || !flag_keep_static_consts
422*e4b17023SJohn Marino 		   || DECL_ARTIFICIAL (decl)))
423*e4b17023SJohn Marino 	needed = false;
424*e4b17023SJohn Marino 
425*e4b17023SJohn Marino       if (needed)
426*e4b17023SJohn Marino 	{
427*e4b17023SJohn Marino 	  rest_of_decl_compilation (decl, 1, 1);
428*e4b17023SJohn Marino 	  return true;
429*e4b17023SJohn Marino 	}
430*e4b17023SJohn Marino     }
431*e4b17023SJohn Marino 
432*e4b17023SJohn Marino   return false;
433*e4b17023SJohn Marino }
434*e4b17023SJohn Marino 
435*e4b17023SJohn Marino /* Do any final processing required for the declarations in VEC, of
436*e4b17023SJohn Marino    which there are LEN.  We write out inline functions and variables
437*e4b17023SJohn Marino    that have been deferred until this point, but which are required.
438*e4b17023SJohn Marino    Returns nonzero if anything was put out.  */
439*e4b17023SJohn Marino 
440*e4b17023SJohn Marino bool
441*e4b17023SJohn Marino wrapup_global_declarations (tree *vec, int len)
442*e4b17023SJohn Marino {
443*e4b17023SJohn Marino   bool reconsider, output_something = false;
444*e4b17023SJohn Marino   int i;
445*e4b17023SJohn Marino 
446*e4b17023SJohn Marino   for (i = 0; i < len; i++)
447*e4b17023SJohn Marino     wrapup_global_declaration_1 (vec[i]);
448*e4b17023SJohn Marino 
449*e4b17023SJohn Marino   /* Now emit any global variables or functions that we have been
450*e4b17023SJohn Marino      putting off.  We need to loop in case one of the things emitted
451*e4b17023SJohn Marino      here references another one which comes earlier in the list.  */
452*e4b17023SJohn Marino   do
453*e4b17023SJohn Marino     {
454*e4b17023SJohn Marino       reconsider = false;
455*e4b17023SJohn Marino       for (i = 0; i < len; i++)
456*e4b17023SJohn Marino 	reconsider |= wrapup_global_declaration_2 (vec[i]);
457*e4b17023SJohn Marino       if (reconsider)
458*e4b17023SJohn Marino 	output_something = true;
459*e4b17023SJohn Marino     }
460*e4b17023SJohn Marino   while (reconsider);
461*e4b17023SJohn Marino 
462*e4b17023SJohn Marino   return output_something;
463*e4b17023SJohn Marino }
464*e4b17023SJohn Marino 
465*e4b17023SJohn Marino /* A subroutine of check_global_declarations.  Issue appropriate warnings
466*e4b17023SJohn Marino    for the global declaration DECL.  */
467*e4b17023SJohn Marino 
468*e4b17023SJohn Marino void
469*e4b17023SJohn Marino check_global_declaration_1 (tree decl)
470*e4b17023SJohn Marino {
471*e4b17023SJohn Marino   /* Warn about any function declared static but not defined.  We don't
472*e4b17023SJohn Marino      warn about variables, because many programs have static variables
473*e4b17023SJohn Marino      that exist only to get some text into the object file.  */
474*e4b17023SJohn Marino   if (TREE_CODE (decl) == FUNCTION_DECL
475*e4b17023SJohn Marino       && DECL_INITIAL (decl) == 0
476*e4b17023SJohn Marino       && DECL_EXTERNAL (decl)
477*e4b17023SJohn Marino       && ! DECL_ARTIFICIAL (decl)
478*e4b17023SJohn Marino       && ! TREE_NO_WARNING (decl)
479*e4b17023SJohn Marino       && ! TREE_PUBLIC (decl)
480*e4b17023SJohn Marino       && (warn_unused_function
481*e4b17023SJohn Marino 	  || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
482*e4b17023SJohn Marino     {
483*e4b17023SJohn Marino       if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
484*e4b17023SJohn Marino 	pedwarn (input_location, 0, "%q+F used but never defined", decl);
485*e4b17023SJohn Marino       else
486*e4b17023SJohn Marino 	warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl);
487*e4b17023SJohn Marino       /* This symbol is effectively an "extern" declaration now.  */
488*e4b17023SJohn Marino       TREE_PUBLIC (decl) = 1;
489*e4b17023SJohn Marino       assemble_external (decl);
490*e4b17023SJohn Marino     }
491*e4b17023SJohn Marino 
492*e4b17023SJohn Marino   /* Warn about static fns or vars defined but not used.  */
493*e4b17023SJohn Marino   if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
494*e4b17023SJohn Marino        /* We don't warn about "static const" variables because the
495*e4b17023SJohn Marino 	  "rcs_id" idiom uses that construction.  */
496*e4b17023SJohn Marino        || (warn_unused_variable
497*e4b17023SJohn Marino 	   && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
498*e4b17023SJohn Marino       && ! DECL_IN_SYSTEM_HEADER (decl)
499*e4b17023SJohn Marino       && ! TREE_USED (decl)
500*e4b17023SJohn Marino       /* The TREE_USED bit for file-scope decls is kept in the identifier,
501*e4b17023SJohn Marino 	 to handle multiple external decls in different scopes.  */
502*e4b17023SJohn Marino       && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl)))
503*e4b17023SJohn Marino       && ! DECL_EXTERNAL (decl)
504*e4b17023SJohn Marino       && ! TREE_PUBLIC (decl)
505*e4b17023SJohn Marino       /* A volatile variable might be used in some non-obvious way.  */
506*e4b17023SJohn Marino       && ! TREE_THIS_VOLATILE (decl)
507*e4b17023SJohn Marino       /* Global register variables must be declared to reserve them.  */
508*e4b17023SJohn Marino       && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
509*e4b17023SJohn Marino       /* Otherwise, ask the language.  */
510*e4b17023SJohn Marino       && lang_hooks.decls.warn_unused_global (decl))
511*e4b17023SJohn Marino     warning ((TREE_CODE (decl) == FUNCTION_DECL)
512*e4b17023SJohn Marino 	     ? OPT_Wunused_function
513*e4b17023SJohn Marino              : OPT_Wunused_variable,
514*e4b17023SJohn Marino 	     "%q+D defined but not used", decl);
515*e4b17023SJohn Marino }
516*e4b17023SJohn Marino 
517*e4b17023SJohn Marino /* Issue appropriate warnings for the global declarations in VEC (of
518*e4b17023SJohn Marino    which there are LEN).  */
519*e4b17023SJohn Marino 
520*e4b17023SJohn Marino void
521*e4b17023SJohn Marino check_global_declarations (tree *vec, int len)
522*e4b17023SJohn Marino {
523*e4b17023SJohn Marino   int i;
524*e4b17023SJohn Marino 
525*e4b17023SJohn Marino   for (i = 0; i < len; i++)
526*e4b17023SJohn Marino     check_global_declaration_1 (vec[i]);
527*e4b17023SJohn Marino }
528*e4b17023SJohn Marino 
529*e4b17023SJohn Marino /* Emit debugging information for all global declarations in VEC.  */
530*e4b17023SJohn Marino 
531*e4b17023SJohn Marino void
532*e4b17023SJohn Marino emit_debug_global_declarations (tree *vec, int len)
533*e4b17023SJohn Marino {
534*e4b17023SJohn Marino   int i;
535*e4b17023SJohn Marino 
536*e4b17023SJohn Marino   /* Avoid confusing the debug information machinery when there are errors.  */
537*e4b17023SJohn Marino   if (seen_error ())
538*e4b17023SJohn Marino     return;
539*e4b17023SJohn Marino 
540*e4b17023SJohn Marino   timevar_push (TV_SYMOUT);
541*e4b17023SJohn Marino   for (i = 0; i < len; i++)
542*e4b17023SJohn Marino     debug_hooks->global_decl (vec[i]);
543*e4b17023SJohn Marino   timevar_pop (TV_SYMOUT);
544*e4b17023SJohn Marino }
545*e4b17023SJohn Marino 
546*e4b17023SJohn Marino /* Compile an entire translation unit.  Write a file of assembly
547*e4b17023SJohn Marino    output and various debugging dumps.  */
548*e4b17023SJohn Marino 
549*e4b17023SJohn Marino static void
550*e4b17023SJohn Marino compile_file (void)
551*e4b17023SJohn Marino {
552*e4b17023SJohn Marino   timevar_start (TV_PHASE_PARSING);
553*e4b17023SJohn Marino   timevar_push (TV_PARSE_GLOBAL);
554*e4b17023SJohn Marino 
555*e4b17023SJohn Marino   /* Call the parser, which parses the entire file (calling
556*e4b17023SJohn Marino      rest_of_compilation for each function).  */
557*e4b17023SJohn Marino   lang_hooks.parse_file ();
558*e4b17023SJohn Marino 
559*e4b17023SJohn Marino   timevar_pop (TV_PARSE_GLOBAL);
560*e4b17023SJohn Marino   timevar_stop (TV_PHASE_PARSING);
561*e4b17023SJohn Marino 
562*e4b17023SJohn Marino   /* Compilation is now finished except for writing
563*e4b17023SJohn Marino      what's left of the symbol table output.  */
564*e4b17023SJohn Marino 
565*e4b17023SJohn Marino   if (flag_syntax_only || flag_wpa)
566*e4b17023SJohn Marino     return;
567*e4b17023SJohn Marino 
568*e4b17023SJohn Marino   timevar_start (TV_PHASE_GENERATE);
569*e4b17023SJohn Marino 
570*e4b17023SJohn Marino   ggc_protect_identifiers = false;
571*e4b17023SJohn Marino 
572*e4b17023SJohn Marino   /* This must also call cgraph_finalize_compilation_unit.  */
573*e4b17023SJohn Marino   lang_hooks.decls.final_write_globals ();
574*e4b17023SJohn Marino 
575*e4b17023SJohn Marino   if (seen_error ())
576*e4b17023SJohn Marino     {
577*e4b17023SJohn Marino       timevar_stop (TV_PHASE_GENERATE);
578*e4b17023SJohn Marino       return;
579*e4b17023SJohn Marino     }
580*e4b17023SJohn Marino 
581*e4b17023SJohn Marino   /* Compilation unit is finalized.  When producing non-fat LTO object, we are
582*e4b17023SJohn Marino      basically finished.  */
583*e4b17023SJohn Marino   if (in_lto_p || !flag_lto || flag_fat_lto_objects)
584*e4b17023SJohn Marino     {
585*e4b17023SJohn Marino       varpool_assemble_pending_decls ();
586*e4b17023SJohn Marino       finish_aliases_2 ();
587*e4b17023SJohn Marino 
588*e4b17023SJohn Marino       /* Likewise for mudflap static object registrations.  */
589*e4b17023SJohn Marino       if (flag_mudflap)
590*e4b17023SJohn Marino 	mudflap_finish_file ();
591*e4b17023SJohn Marino 
592*e4b17023SJohn Marino       output_shared_constant_pool ();
593*e4b17023SJohn Marino       output_object_blocks ();
594*e4b17023SJohn Marino   finish_tm_clone_pairs ();
595*e4b17023SJohn Marino 
596*e4b17023SJohn Marino       /* Write out any pending weak symbol declarations.  */
597*e4b17023SJohn Marino       weak_finish ();
598*e4b17023SJohn Marino 
599*e4b17023SJohn Marino       /* This must be at the end before unwind and debug info.
600*e4b17023SJohn Marino 	 Some target ports emit PIC setup thunks here.  */
601*e4b17023SJohn Marino       targetm.asm_out.code_end ();
602*e4b17023SJohn Marino 
603*e4b17023SJohn Marino       /* Do dbx symbols.  */
604*e4b17023SJohn Marino       timevar_push (TV_SYMOUT);
605*e4b17023SJohn Marino 
606*e4b17023SJohn Marino     #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
607*e4b17023SJohn Marino       if (dwarf2out_do_frame ())
608*e4b17023SJohn Marino 	dwarf2out_frame_finish ();
609*e4b17023SJohn Marino     #endif
610*e4b17023SJohn Marino 
611*e4b17023SJohn Marino       (*debug_hooks->finish) (main_input_filename);
612*e4b17023SJohn Marino       timevar_pop (TV_SYMOUT);
613*e4b17023SJohn Marino 
614*e4b17023SJohn Marino       /* Output some stuff at end of file if nec.  */
615*e4b17023SJohn Marino 
616*e4b17023SJohn Marino       dw2_output_indirect_constants ();
617*e4b17023SJohn Marino 
618*e4b17023SJohn Marino       /* Flush any pending external directives.  */
619*e4b17023SJohn Marino       process_pending_assemble_externals ();
620*e4b17023SJohn Marino    }
621*e4b17023SJohn Marino 
622*e4b17023SJohn Marino   /* Emit LTO marker if LTO info has been previously emitted.  This is
623*e4b17023SJohn Marino      used by collect2 to determine whether an object file contains IL.
624*e4b17023SJohn Marino      We used to emit an undefined reference here, but this produces
625*e4b17023SJohn Marino      link errors if an object file with IL is stored into a shared
626*e4b17023SJohn Marino      library without invoking lto1.  */
627*e4b17023SJohn Marino   if (flag_generate_lto)
628*e4b17023SJohn Marino     {
629*e4b17023SJohn Marino #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
630*e4b17023SJohn Marino       ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
631*e4b17023SJohn Marino 				      "__gnu_lto_v1",
632*e4b17023SJohn Marino 				      (unsigned HOST_WIDE_INT) 1, 8);
633*e4b17023SJohn Marino #elif defined ASM_OUTPUT_ALIGNED_COMMON
634*e4b17023SJohn Marino       ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_v1",
635*e4b17023SJohn Marino 				 (unsigned HOST_WIDE_INT) 1, 8);
636*e4b17023SJohn Marino #else
637*e4b17023SJohn Marino       ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_v1",
638*e4b17023SJohn Marino 			 (unsigned HOST_WIDE_INT) 1,
639*e4b17023SJohn Marino 			 (unsigned HOST_WIDE_INT) 1);
640*e4b17023SJohn Marino #endif
641*e4b17023SJohn Marino       /* Let linker plugin know that this is a slim object and must be LTOed
642*e4b17023SJohn Marino          even when user did not ask for it.  */
643*e4b17023SJohn Marino       if (!flag_fat_lto_objects)
644*e4b17023SJohn Marino         {
645*e4b17023SJohn Marino #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
646*e4b17023SJohn Marino 	  ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
647*e4b17023SJohn Marino 					  "__gnu_lto_slim",
648*e4b17023SJohn Marino 					  (unsigned HOST_WIDE_INT) 1, 8);
649*e4b17023SJohn Marino #elif defined ASM_OUTPUT_ALIGNED_COMMON
650*e4b17023SJohn Marino 	  ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
651*e4b17023SJohn Marino 				     (unsigned HOST_WIDE_INT) 1, 8);
652*e4b17023SJohn Marino #else
653*e4b17023SJohn Marino 	  ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
654*e4b17023SJohn Marino 			     (unsigned HOST_WIDE_INT) 1,
655*e4b17023SJohn Marino 			     (unsigned HOST_WIDE_INT) 1);
656*e4b17023SJohn Marino #endif
657*e4b17023SJohn Marino         }
658*e4b17023SJohn Marino     }
659*e4b17023SJohn Marino 
660*e4b17023SJohn Marino   /* Attach a special .ident directive to the end of the file to identify
661*e4b17023SJohn Marino      the version of GCC which compiled this code.  The format of the .ident
662*e4b17023SJohn Marino      string is patterned after the ones produced by native SVR4 compilers.  */
663*e4b17023SJohn Marino #ifdef IDENT_ASM_OP
664*e4b17023SJohn Marino   if (!flag_no_ident)
665*e4b17023SJohn Marino     {
666*e4b17023SJohn Marino       const char *pkg_version = "(GNU) ";
667*e4b17023SJohn Marino 
668*e4b17023SJohn Marino       if (strcmp ("(GCC) ", pkgversion_string))
669*e4b17023SJohn Marino 	pkg_version = pkgversion_string;
670*e4b17023SJohn Marino       fprintf (asm_out_file, "%s\"GCC: %s%s\"\n",
671*e4b17023SJohn Marino 	       IDENT_ASM_OP, pkg_version, version_string);
672*e4b17023SJohn Marino     }
673*e4b17023SJohn Marino #endif
674*e4b17023SJohn Marino 
675*e4b17023SJohn Marino   /* Invoke registered plugin callbacks.  */
676*e4b17023SJohn Marino   invoke_plugin_callbacks (PLUGIN_FINISH_UNIT, NULL);
677*e4b17023SJohn Marino 
678*e4b17023SJohn Marino   /* This must be at the end.  Some target ports emit end of file directives
679*e4b17023SJohn Marino      into the assembly file here, and hence we can not output anything to the
680*e4b17023SJohn Marino      assembly file after this point.  */
681*e4b17023SJohn Marino   targetm.asm_out.file_end ();
682*e4b17023SJohn Marino 
683*e4b17023SJohn Marino   timevar_stop (TV_PHASE_GENERATE);
684*e4b17023SJohn Marino }
685*e4b17023SJohn Marino 
686*e4b17023SJohn Marino /* Print version information to FILE.
687*e4b17023SJohn Marino    Each line begins with INDENT (for the case where FILE is the
688*e4b17023SJohn Marino    assembler output file).  */
689*e4b17023SJohn Marino 
690*e4b17023SJohn Marino void
691*e4b17023SJohn Marino print_version (FILE *file, const char *indent)
692*e4b17023SJohn Marino {
693*e4b17023SJohn Marino   static const char fmt1[] =
694*e4b17023SJohn Marino #ifdef __GNUC__
695*e4b17023SJohn Marino     N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
696*e4b17023SJohn Marino #else
697*e4b17023SJohn Marino     N_("%s%s%s %sversion %s (%s) compiled by CC, ")
698*e4b17023SJohn Marino #endif
699*e4b17023SJohn Marino     ;
700*e4b17023SJohn Marino   static const char fmt2[] =
701*e4b17023SJohn Marino     N_("GMP version %s, MPFR version %s, MPC version %s\n");
702*e4b17023SJohn Marino   static const char fmt3[] =
703*e4b17023SJohn Marino     N_("%s%swarning: %s header version %s differs from library version %s.\n");
704*e4b17023SJohn Marino   static const char fmt4[] =
705*e4b17023SJohn Marino     N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n");
706*e4b17023SJohn Marino #ifndef __VERSION__
707*e4b17023SJohn Marino #define __VERSION__ "[?]"
708*e4b17023SJohn Marino #endif
709*e4b17023SJohn Marino   fprintf (file,
710*e4b17023SJohn Marino 	   file == stderr ? _(fmt1) : fmt1,
711*e4b17023SJohn Marino 	   indent, *indent != 0 ? " " : "",
712*e4b17023SJohn Marino 	   lang_hooks.name, pkgversion_string, version_string, TARGET_NAME,
713*e4b17023SJohn Marino 	   indent, __VERSION__);
714*e4b17023SJohn Marino 
715*e4b17023SJohn Marino   /* We need to stringify the GMP macro values.  Ugh, gmp_version has
716*e4b17023SJohn Marino      two string formats, "i.j.k" and "i.j" when k is zero.  As of
717*e4b17023SJohn Marino      gmp-4.3.0, GMP always uses the 3 number format.  */
718*e4b17023SJohn Marino #define GCC_GMP_STRINGIFY_VERSION3(X) #X
719*e4b17023SJohn Marino #define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3(X)
720*e4b17023SJohn Marino #define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z))
721*e4b17023SJohn Marino #define GCC_GMP_VERSION \
722*e4b17023SJohn Marino   GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
723*e4b17023SJohn Marino #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0
724*e4b17023SJohn Marino #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
725*e4b17023SJohn Marino   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR)
726*e4b17023SJohn Marino #else
727*e4b17023SJohn Marino #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
728*e4b17023SJohn Marino   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR) "." \
729*e4b17023SJohn Marino   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_PATCHLEVEL)
730*e4b17023SJohn Marino #endif
731*e4b17023SJohn Marino   fprintf (file,
732*e4b17023SJohn Marino 	   file == stderr ? _(fmt2) : fmt2,
733*e4b17023SJohn Marino 	   GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING);
734*e4b17023SJohn Marino   if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
735*e4b17023SJohn Marino     fprintf (file,
736*e4b17023SJohn Marino 	     file == stderr ? _(fmt3) : fmt3,
737*e4b17023SJohn Marino 	     indent, *indent != 0 ? " " : "",
738*e4b17023SJohn Marino 	     "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version);
739*e4b17023SJohn Marino   if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ()))
740*e4b17023SJohn Marino     fprintf (file,
741*e4b17023SJohn Marino 	     file == stderr ? _(fmt3) : fmt3,
742*e4b17023SJohn Marino 	     indent, *indent != 0 ? " " : "",
743*e4b17023SJohn Marino 	     "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
744*e4b17023SJohn Marino   if (strcmp (MPC_VERSION_STRING, mpc_get_version ()))
745*e4b17023SJohn Marino     fprintf (file,
746*e4b17023SJohn Marino 	     file == stderr ? _(fmt3) : fmt3,
747*e4b17023SJohn Marino 	     indent, *indent != 0 ? " " : "",
748*e4b17023SJohn Marino 	     "MPC", MPC_VERSION_STRING, mpc_get_version ());
749*e4b17023SJohn Marino   fprintf (file,
750*e4b17023SJohn Marino 	   file == stderr ? _(fmt4) : fmt4,
751*e4b17023SJohn Marino 	   indent, *indent != 0 ? " " : "",
752*e4b17023SJohn Marino 	   PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
753*e4b17023SJohn Marino 
754*e4b17023SJohn Marino   print_plugins_versions (file, indent);
755*e4b17023SJohn Marino }
756*e4b17023SJohn Marino 
757*e4b17023SJohn Marino static int
758*e4b17023SJohn Marino print_to_asm_out_file (print_switch_type type, const char * text)
759*e4b17023SJohn Marino {
760*e4b17023SJohn Marino   bool prepend_sep = true;
761*e4b17023SJohn Marino 
762*e4b17023SJohn Marino   switch (type)
763*e4b17023SJohn Marino     {
764*e4b17023SJohn Marino     case SWITCH_TYPE_LINE_END:
765*e4b17023SJohn Marino       putc ('\n', asm_out_file);
766*e4b17023SJohn Marino       return 1;
767*e4b17023SJohn Marino 
768*e4b17023SJohn Marino     case SWITCH_TYPE_LINE_START:
769*e4b17023SJohn Marino       fputs (ASM_COMMENT_START, asm_out_file);
770*e4b17023SJohn Marino       return strlen (ASM_COMMENT_START);
771*e4b17023SJohn Marino 
772*e4b17023SJohn Marino     case SWITCH_TYPE_DESCRIPTIVE:
773*e4b17023SJohn Marino       if (ASM_COMMENT_START[0] == 0)
774*e4b17023SJohn Marino 	prepend_sep = false;
775*e4b17023SJohn Marino       /* Drop through.  */
776*e4b17023SJohn Marino     case SWITCH_TYPE_PASSED:
777*e4b17023SJohn Marino     case SWITCH_TYPE_ENABLED:
778*e4b17023SJohn Marino       if (prepend_sep)
779*e4b17023SJohn Marino 	fputc (' ', asm_out_file);
780*e4b17023SJohn Marino       fputs (text, asm_out_file);
781*e4b17023SJohn Marino       /* No need to return the length here as
782*e4b17023SJohn Marino 	 print_single_switch has already done it.  */
783*e4b17023SJohn Marino       return 0;
784*e4b17023SJohn Marino 
785*e4b17023SJohn Marino     default:
786*e4b17023SJohn Marino       return -1;
787*e4b17023SJohn Marino     }
788*e4b17023SJohn Marino }
789*e4b17023SJohn Marino 
790*e4b17023SJohn Marino static int
791*e4b17023SJohn Marino print_to_stderr (print_switch_type type, const char * text)
792*e4b17023SJohn Marino {
793*e4b17023SJohn Marino   switch (type)
794*e4b17023SJohn Marino     {
795*e4b17023SJohn Marino     case SWITCH_TYPE_LINE_END:
796*e4b17023SJohn Marino       putc ('\n', stderr);
797*e4b17023SJohn Marino       return 1;
798*e4b17023SJohn Marino 
799*e4b17023SJohn Marino     case SWITCH_TYPE_LINE_START:
800*e4b17023SJohn Marino       return 0;
801*e4b17023SJohn Marino 
802*e4b17023SJohn Marino     case SWITCH_TYPE_PASSED:
803*e4b17023SJohn Marino     case SWITCH_TYPE_ENABLED:
804*e4b17023SJohn Marino       fputc (' ', stderr);
805*e4b17023SJohn Marino       /* Drop through.  */
806*e4b17023SJohn Marino 
807*e4b17023SJohn Marino     case SWITCH_TYPE_DESCRIPTIVE:
808*e4b17023SJohn Marino       fputs (text, stderr);
809*e4b17023SJohn Marino       /* No need to return the length here as
810*e4b17023SJohn Marino 	 print_single_switch has already done it.  */
811*e4b17023SJohn Marino       return 0;
812*e4b17023SJohn Marino 
813*e4b17023SJohn Marino     default:
814*e4b17023SJohn Marino       return -1;
815*e4b17023SJohn Marino     }
816*e4b17023SJohn Marino }
817*e4b17023SJohn Marino 
818*e4b17023SJohn Marino /* Print an option value and return the adjusted position in the line.
819*e4b17023SJohn Marino    ??? print_fn doesn't handle errors, eg disk full; presumably other
820*e4b17023SJohn Marino    code will catch a disk full though.  */
821*e4b17023SJohn Marino 
822*e4b17023SJohn Marino static int
823*e4b17023SJohn Marino print_single_switch (print_switch_fn_type print_fn,
824*e4b17023SJohn Marino 		     int pos,
825*e4b17023SJohn Marino 		     print_switch_type type,
826*e4b17023SJohn Marino 		     const char * text)
827*e4b17023SJohn Marino {
828*e4b17023SJohn Marino   /* The ultrix fprintf returns 0 on success, so compute the result
829*e4b17023SJohn Marino      we want here since we need it for the following test.  The +1
830*e4b17023SJohn Marino      is for the separator character that will probably be emitted.  */
831*e4b17023SJohn Marino   int len = strlen (text) + 1;
832*e4b17023SJohn Marino 
833*e4b17023SJohn Marino   if (pos != 0
834*e4b17023SJohn Marino       && pos + len > MAX_LINE)
835*e4b17023SJohn Marino     {
836*e4b17023SJohn Marino       print_fn (SWITCH_TYPE_LINE_END, NULL);
837*e4b17023SJohn Marino       pos = 0;
838*e4b17023SJohn Marino     }
839*e4b17023SJohn Marino 
840*e4b17023SJohn Marino   if (pos == 0)
841*e4b17023SJohn Marino     pos += print_fn (SWITCH_TYPE_LINE_START, NULL);
842*e4b17023SJohn Marino 
843*e4b17023SJohn Marino   print_fn (type, text);
844*e4b17023SJohn Marino   return pos + len;
845*e4b17023SJohn Marino }
846*e4b17023SJohn Marino 
847*e4b17023SJohn Marino /* Print active target switches using PRINT_FN.
848*e4b17023SJohn Marino    POS is the current cursor position and MAX is the size of a "line".
849*e4b17023SJohn Marino    Each line begins with INDENT and ends with TERM.
850*e4b17023SJohn Marino    Each switch is separated from the next by SEP.  */
851*e4b17023SJohn Marino 
852*e4b17023SJohn Marino static void
853*e4b17023SJohn Marino print_switch_values (print_switch_fn_type print_fn)
854*e4b17023SJohn Marino {
855*e4b17023SJohn Marino   int pos = 0;
856*e4b17023SJohn Marino   size_t j;
857*e4b17023SJohn Marino 
858*e4b17023SJohn Marino   /* Fill in the -frandom-seed option, if the user didn't pass it, so
859*e4b17023SJohn Marino      that it can be printed below.  This helps reproducibility.  */
860*e4b17023SJohn Marino   if (!flag_random_seed)
861*e4b17023SJohn Marino     init_random_seed ();
862*e4b17023SJohn Marino 
863*e4b17023SJohn Marino   /* Print the options as passed.  */
864*e4b17023SJohn Marino   pos = print_single_switch (print_fn, pos,
865*e4b17023SJohn Marino 			     SWITCH_TYPE_DESCRIPTIVE, _("options passed: "));
866*e4b17023SJohn Marino 
867*e4b17023SJohn Marino   for (j = 1; j < save_decoded_options_count; j++)
868*e4b17023SJohn Marino     {
869*e4b17023SJohn Marino       switch (save_decoded_options[j].opt_index)
870*e4b17023SJohn Marino 	{
871*e4b17023SJohn Marino 	case OPT_o:
872*e4b17023SJohn Marino 	case OPT_d:
873*e4b17023SJohn Marino 	case OPT_dumpbase:
874*e4b17023SJohn Marino 	case OPT_dumpdir:
875*e4b17023SJohn Marino 	case OPT_auxbase:
876*e4b17023SJohn Marino 	case OPT_quiet:
877*e4b17023SJohn Marino 	case OPT_version:
878*e4b17023SJohn Marino 	  /* Ignore these.  */
879*e4b17023SJohn Marino 	  continue;
880*e4b17023SJohn Marino 	}
881*e4b17023SJohn Marino 
882*e4b17023SJohn Marino       pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED,
883*e4b17023SJohn Marino 				 save_decoded_options[j].orig_option_with_args_text);
884*e4b17023SJohn Marino     }
885*e4b17023SJohn Marino 
886*e4b17023SJohn Marino   if (pos > 0)
887*e4b17023SJohn Marino     print_fn (SWITCH_TYPE_LINE_END, NULL);
888*e4b17023SJohn Marino 
889*e4b17023SJohn Marino   /* Print the -f and -m options that have been enabled.
890*e4b17023SJohn Marino      We don't handle language specific options but printing argv
891*e4b17023SJohn Marino      should suffice.  */
892*e4b17023SJohn Marino   pos = print_single_switch (print_fn, 0,
893*e4b17023SJohn Marino 			     SWITCH_TYPE_DESCRIPTIVE, _("options enabled: "));
894*e4b17023SJohn Marino 
895*e4b17023SJohn Marino   for (j = 0; j < cl_options_count; j++)
896*e4b17023SJohn Marino     if (cl_options[j].cl_report
897*e4b17023SJohn Marino 	&& option_enabled (j, &global_options) > 0)
898*e4b17023SJohn Marino       pos = print_single_switch (print_fn, pos,
899*e4b17023SJohn Marino 				 SWITCH_TYPE_ENABLED, cl_options[j].opt_text);
900*e4b17023SJohn Marino 
901*e4b17023SJohn Marino   print_fn (SWITCH_TYPE_LINE_END, NULL);
902*e4b17023SJohn Marino }
903*e4b17023SJohn Marino 
904*e4b17023SJohn Marino /* Open assembly code output file.  Do this even if -fsyntax-only is
905*e4b17023SJohn Marino    on, because then the driver will have provided the name of a
906*e4b17023SJohn Marino    temporary file or bit bucket for us.  NAME is the file specified on
907*e4b17023SJohn Marino    the command line, possibly NULL.  */
908*e4b17023SJohn Marino static void
909*e4b17023SJohn Marino init_asm_output (const char *name)
910*e4b17023SJohn Marino {
911*e4b17023SJohn Marino   if (name == NULL && asm_file_name == 0)
912*e4b17023SJohn Marino     asm_out_file = stdout;
913*e4b17023SJohn Marino   else
914*e4b17023SJohn Marino     {
915*e4b17023SJohn Marino       if (asm_file_name == 0)
916*e4b17023SJohn Marino 	{
917*e4b17023SJohn Marino 	  int len = strlen (dump_base_name);
918*e4b17023SJohn Marino 	  char *dumpname = XNEWVEC (char, len + 6);
919*e4b17023SJohn Marino 
920*e4b17023SJohn Marino 	  memcpy (dumpname, dump_base_name, len + 1);
921*e4b17023SJohn Marino 	  strip_off_ending (dumpname, len);
922*e4b17023SJohn Marino 	  strcat (dumpname, ".s");
923*e4b17023SJohn Marino 	  asm_file_name = dumpname;
924*e4b17023SJohn Marino 	}
925*e4b17023SJohn Marino       if (!strcmp (asm_file_name, "-"))
926*e4b17023SJohn Marino 	asm_out_file = stdout;
927*e4b17023SJohn Marino       else
928*e4b17023SJohn Marino 	asm_out_file = fopen (asm_file_name, "w+b");
929*e4b17023SJohn Marino       if (asm_out_file == 0)
930*e4b17023SJohn Marino 	fatal_error ("can%'t open %s for writing: %m", asm_file_name);
931*e4b17023SJohn Marino     }
932*e4b17023SJohn Marino 
933*e4b17023SJohn Marino   if (!flag_syntax_only)
934*e4b17023SJohn Marino     {
935*e4b17023SJohn Marino       targetm.asm_out.file_start ();
936*e4b17023SJohn Marino 
937*e4b17023SJohn Marino       if (flag_record_gcc_switches)
938*e4b17023SJohn Marino 	{
939*e4b17023SJohn Marino 	  if (targetm.asm_out.record_gcc_switches)
940*e4b17023SJohn Marino 	    {
941*e4b17023SJohn Marino 	      /* Let the target know that we are about to start recording.  */
942*e4b17023SJohn Marino 	      targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
943*e4b17023SJohn Marino 						   NULL);
944*e4b17023SJohn Marino 	      /* Now record the switches.  */
945*e4b17023SJohn Marino 	      print_switch_values (targetm.asm_out.record_gcc_switches);
946*e4b17023SJohn Marino 	      /* Let the target know that the recording is over.  */
947*e4b17023SJohn Marino 	      targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
948*e4b17023SJohn Marino 						   NULL);
949*e4b17023SJohn Marino 	    }
950*e4b17023SJohn Marino 	  else
951*e4b17023SJohn Marino 	    inform (input_location, "-frecord-gcc-switches is not supported by the current target");
952*e4b17023SJohn Marino 	}
953*e4b17023SJohn Marino 
954*e4b17023SJohn Marino       if (flag_verbose_asm)
955*e4b17023SJohn Marino 	{
956*e4b17023SJohn Marino 	  /* Print the list of switches in effect
957*e4b17023SJohn Marino 	     into the assembler file as comments.  */
958*e4b17023SJohn Marino 	  print_version (asm_out_file, ASM_COMMENT_START);
959*e4b17023SJohn Marino 	  print_switch_values (print_to_asm_out_file);
960*e4b17023SJohn Marino 	  putc ('\n', asm_out_file);
961*e4b17023SJohn Marino 	}
962*e4b17023SJohn Marino     }
963*e4b17023SJohn Marino }
964*e4b17023SJohn Marino 
965*e4b17023SJohn Marino /* Default tree printer.   Handles declarations only.  */
966*e4b17023SJohn Marino bool
967*e4b17023SJohn Marino default_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
968*e4b17023SJohn Marino 		      int precision, bool wide, bool set_locus, bool hash)
969*e4b17023SJohn Marino {
970*e4b17023SJohn Marino   tree t;
971*e4b17023SJohn Marino 
972*e4b17023SJohn Marino   /* FUTURE: %+x should set the locus.  */
973*e4b17023SJohn Marino   if (precision != 0 || wide || hash)
974*e4b17023SJohn Marino     return false;
975*e4b17023SJohn Marino 
976*e4b17023SJohn Marino   switch (*spec)
977*e4b17023SJohn Marino     {
978*e4b17023SJohn Marino     case 'E':
979*e4b17023SJohn Marino       t = va_arg (*text->args_ptr, tree);
980*e4b17023SJohn Marino       if (TREE_CODE (t) == IDENTIFIER_NODE)
981*e4b17023SJohn Marino 	{
982*e4b17023SJohn Marino 	  pp_identifier (pp, IDENTIFIER_POINTER (t));
983*e4b17023SJohn Marino 	  return true;
984*e4b17023SJohn Marino 	}
985*e4b17023SJohn Marino       break;
986*e4b17023SJohn Marino 
987*e4b17023SJohn Marino     case 'D':
988*e4b17023SJohn Marino       t = va_arg (*text->args_ptr, tree);
989*e4b17023SJohn Marino       if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
990*e4b17023SJohn Marino 	t = DECL_DEBUG_EXPR (t);
991*e4b17023SJohn Marino       break;
992*e4b17023SJohn Marino 
993*e4b17023SJohn Marino     case 'F':
994*e4b17023SJohn Marino     case 'T':
995*e4b17023SJohn Marino       t = va_arg (*text->args_ptr, tree);
996*e4b17023SJohn Marino       break;
997*e4b17023SJohn Marino 
998*e4b17023SJohn Marino     case 'K':
999*e4b17023SJohn Marino       percent_K_format (text);
1000*e4b17023SJohn Marino       return true;
1001*e4b17023SJohn Marino 
1002*e4b17023SJohn Marino     default:
1003*e4b17023SJohn Marino       return false;
1004*e4b17023SJohn Marino     }
1005*e4b17023SJohn Marino 
1006*e4b17023SJohn Marino   if (set_locus && text->locus)
1007*e4b17023SJohn Marino     *text->locus = DECL_SOURCE_LOCATION (t);
1008*e4b17023SJohn Marino 
1009*e4b17023SJohn Marino   if (DECL_P (t))
1010*e4b17023SJohn Marino     {
1011*e4b17023SJohn Marino       const char *n = DECL_NAME (t)
1012*e4b17023SJohn Marino         ? identifier_to_locale (lang_hooks.decl_printable_name (t, 2))
1013*e4b17023SJohn Marino         : _("<anonymous>");
1014*e4b17023SJohn Marino       pp_string (pp, n);
1015*e4b17023SJohn Marino     }
1016*e4b17023SJohn Marino   else
1017*e4b17023SJohn Marino     dump_generic_node (pp, t, 0, TDF_DIAGNOSTIC, 0);
1018*e4b17023SJohn Marino 
1019*e4b17023SJohn Marino   return true;
1020*e4b17023SJohn Marino }
1021*e4b17023SJohn Marino 
1022*e4b17023SJohn Marino /* A helper function; used as the reallocator function for cpp's line
1023*e4b17023SJohn Marino    table.  */
1024*e4b17023SJohn Marino static void *
1025*e4b17023SJohn Marino realloc_for_line_map (void *ptr, size_t len)
1026*e4b17023SJohn Marino {
1027*e4b17023SJohn Marino   return GGC_RESIZEVAR (void, ptr, len);
1028*e4b17023SJohn Marino }
1029*e4b17023SJohn Marino 
1030*e4b17023SJohn Marino /* A helper function: used as the allocator function for
1031*e4b17023SJohn Marino    identifier_to_locale.  */
1032*e4b17023SJohn Marino static void *
1033*e4b17023SJohn Marino alloc_for_identifier_to_locale (size_t len)
1034*e4b17023SJohn Marino {
1035*e4b17023SJohn Marino   return ggc_alloc_atomic (len);
1036*e4b17023SJohn Marino }
1037*e4b17023SJohn Marino 
1038*e4b17023SJohn Marino /* Output stack usage information.  */
1039*e4b17023SJohn Marino void
1040*e4b17023SJohn Marino output_stack_usage (void)
1041*e4b17023SJohn Marino {
1042*e4b17023SJohn Marino   static bool warning_issued = false;
1043*e4b17023SJohn Marino   enum stack_usage_kind_type { STATIC = 0, DYNAMIC, DYNAMIC_BOUNDED };
1044*e4b17023SJohn Marino   const char *stack_usage_kind_str[] = {
1045*e4b17023SJohn Marino     "static",
1046*e4b17023SJohn Marino     "dynamic",
1047*e4b17023SJohn Marino     "dynamic,bounded"
1048*e4b17023SJohn Marino   };
1049*e4b17023SJohn Marino   HOST_WIDE_INT stack_usage = current_function_static_stack_size;
1050*e4b17023SJohn Marino   enum stack_usage_kind_type stack_usage_kind;
1051*e4b17023SJohn Marino 
1052*e4b17023SJohn Marino   if (stack_usage < 0)
1053*e4b17023SJohn Marino     {
1054*e4b17023SJohn Marino       if (!warning_issued)
1055*e4b17023SJohn Marino 	{
1056*e4b17023SJohn Marino 	  warning (0, "stack usage computation not supported for this target");
1057*e4b17023SJohn Marino 	  warning_issued = true;
1058*e4b17023SJohn Marino 	}
1059*e4b17023SJohn Marino       return;
1060*e4b17023SJohn Marino     }
1061*e4b17023SJohn Marino 
1062*e4b17023SJohn Marino   stack_usage_kind = STATIC;
1063*e4b17023SJohn Marino 
1064*e4b17023SJohn Marino   /* Add the maximum amount of space pushed onto the stack.  */
1065*e4b17023SJohn Marino   if (current_function_pushed_stack_size > 0)
1066*e4b17023SJohn Marino     {
1067*e4b17023SJohn Marino       stack_usage += current_function_pushed_stack_size;
1068*e4b17023SJohn Marino       stack_usage_kind = DYNAMIC_BOUNDED;
1069*e4b17023SJohn Marino     }
1070*e4b17023SJohn Marino 
1071*e4b17023SJohn Marino   /* Now on to the tricky part: dynamic stack allocation.  */
1072*e4b17023SJohn Marino   if (current_function_allocates_dynamic_stack_space)
1073*e4b17023SJohn Marino     {
1074*e4b17023SJohn Marino       if (current_function_has_unbounded_dynamic_stack_size)
1075*e4b17023SJohn Marino 	stack_usage_kind = DYNAMIC;
1076*e4b17023SJohn Marino       else
1077*e4b17023SJohn Marino 	stack_usage_kind = DYNAMIC_BOUNDED;
1078*e4b17023SJohn Marino 
1079*e4b17023SJohn Marino       /* Add the size even in the unbounded case, this can't hurt.  */
1080*e4b17023SJohn Marino       stack_usage += current_function_dynamic_stack_size;
1081*e4b17023SJohn Marino     }
1082*e4b17023SJohn Marino 
1083*e4b17023SJohn Marino   if (flag_stack_usage)
1084*e4b17023SJohn Marino     {
1085*e4b17023SJohn Marino       expanded_location loc
1086*e4b17023SJohn Marino 	= expand_location (DECL_SOURCE_LOCATION (current_function_decl));
1087*e4b17023SJohn Marino       const char *raw_id, *id;
1088*e4b17023SJohn Marino 
1089*e4b17023SJohn Marino       /* Strip the scope prefix if any.  */
1090*e4b17023SJohn Marino       raw_id = lang_hooks.decl_printable_name (current_function_decl, 2);
1091*e4b17023SJohn Marino       id = strrchr (raw_id, '.');
1092*e4b17023SJohn Marino       if (id)
1093*e4b17023SJohn Marino 	id++;
1094*e4b17023SJohn Marino       else
1095*e4b17023SJohn Marino 	id = raw_id;
1096*e4b17023SJohn Marino 
1097*e4b17023SJohn Marino       fprintf (stack_usage_file,
1098*e4b17023SJohn Marino 	       "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n",
1099*e4b17023SJohn Marino 	       lbasename (loc.file),
1100*e4b17023SJohn Marino 	       loc.line,
1101*e4b17023SJohn Marino 	       loc.column,
1102*e4b17023SJohn Marino 	       id,
1103*e4b17023SJohn Marino 	       stack_usage,
1104*e4b17023SJohn Marino 	       stack_usage_kind_str[stack_usage_kind]);
1105*e4b17023SJohn Marino     }
1106*e4b17023SJohn Marino 
1107*e4b17023SJohn Marino   if (warn_stack_usage >= 0)
1108*e4b17023SJohn Marino     {
1109*e4b17023SJohn Marino       if (stack_usage_kind == DYNAMIC)
1110*e4b17023SJohn Marino 	warning (OPT_Wstack_usage_, "stack usage might be unbounded");
1111*e4b17023SJohn Marino       else if (stack_usage > warn_stack_usage)
1112*e4b17023SJohn Marino 	{
1113*e4b17023SJohn Marino 	  if (stack_usage_kind == DYNAMIC_BOUNDED)
1114*e4b17023SJohn Marino 	    warning (OPT_Wstack_usage_, "stack usage might be %wd bytes",
1115*e4b17023SJohn Marino 		     stack_usage);
1116*e4b17023SJohn Marino 	  else
1117*e4b17023SJohn Marino 	    warning (OPT_Wstack_usage_, "stack usage is %wd bytes",
1118*e4b17023SJohn Marino 		     stack_usage);
1119*e4b17023SJohn Marino 	}
1120*e4b17023SJohn Marino     }
1121*e4b17023SJohn Marino }
1122*e4b17023SJohn Marino 
1123*e4b17023SJohn Marino /* Open an auxiliary output file.  */
1124*e4b17023SJohn Marino static FILE *
1125*e4b17023SJohn Marino open_auxiliary_file (const char *ext)
1126*e4b17023SJohn Marino {
1127*e4b17023SJohn Marino   char *filename;
1128*e4b17023SJohn Marino   FILE *file;
1129*e4b17023SJohn Marino 
1130*e4b17023SJohn Marino   filename = concat (aux_base_name, ".", ext, NULL);
1131*e4b17023SJohn Marino   file = fopen (filename, "w");
1132*e4b17023SJohn Marino   if (!file)
1133*e4b17023SJohn Marino     fatal_error ("can%'t open %s for writing: %m", filename);
1134*e4b17023SJohn Marino   free (filename);
1135*e4b17023SJohn Marino   return file;
1136*e4b17023SJohn Marino }
1137*e4b17023SJohn Marino 
1138*e4b17023SJohn Marino /* Initialization of the front end environment, before command line
1139*e4b17023SJohn Marino    options are parsed.  Signal handlers, internationalization etc.
1140*e4b17023SJohn Marino    ARGV0 is main's argv[0].  */
1141*e4b17023SJohn Marino static void
1142*e4b17023SJohn Marino general_init (const char *argv0)
1143*e4b17023SJohn Marino {
1144*e4b17023SJohn Marino   const char *p;
1145*e4b17023SJohn Marino 
1146*e4b17023SJohn Marino   p = argv0 + strlen (argv0);
1147*e4b17023SJohn Marino   while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
1148*e4b17023SJohn Marino     --p;
1149*e4b17023SJohn Marino   progname = p;
1150*e4b17023SJohn Marino 
1151*e4b17023SJohn Marino   xmalloc_set_program_name (progname);
1152*e4b17023SJohn Marino 
1153*e4b17023SJohn Marino   hex_init ();
1154*e4b17023SJohn Marino 
1155*e4b17023SJohn Marino   /* Unlock the stdio streams.  */
1156*e4b17023SJohn Marino   unlock_std_streams ();
1157*e4b17023SJohn Marino 
1158*e4b17023SJohn Marino   gcc_init_libintl ();
1159*e4b17023SJohn Marino 
1160*e4b17023SJohn Marino   identifier_to_locale_alloc = alloc_for_identifier_to_locale;
1161*e4b17023SJohn Marino   identifier_to_locale_free = ggc_free;
1162*e4b17023SJohn Marino 
1163*e4b17023SJohn Marino   /* Initialize the diagnostics reporting machinery, so option parsing
1164*e4b17023SJohn Marino      can give warnings and errors.  */
1165*e4b17023SJohn Marino   diagnostic_initialize (global_dc, N_OPTS);
1166*e4b17023SJohn Marino   diagnostic_starter (global_dc) = default_tree_diagnostic_starter;
1167*e4b17023SJohn Marino   /* By default print macro expansion contexts in the diagnostic
1168*e4b17023SJohn Marino      finalizer -- for tokens resulting from macro macro expansion.  */
1169*e4b17023SJohn Marino   diagnostic_finalizer (global_dc) = virt_loc_aware_diagnostic_finalizer;
1170*e4b17023SJohn Marino   /* Set a default printer.  Language specific initializations will
1171*e4b17023SJohn Marino      override it later.  */
1172*e4b17023SJohn Marino   pp_format_decoder (global_dc->printer) = &default_tree_printer;
1173*e4b17023SJohn Marino   global_dc->show_option_requested
1174*e4b17023SJohn Marino     = global_options_init.x_flag_diagnostics_show_option;
1175*e4b17023SJohn Marino   global_dc->show_column
1176*e4b17023SJohn Marino     = global_options_init.x_flag_show_column;
1177*e4b17023SJohn Marino   global_dc->internal_error = plugins_internal_error_function;
1178*e4b17023SJohn Marino   global_dc->option_enabled = option_enabled;
1179*e4b17023SJohn Marino   global_dc->option_state = &global_options;
1180*e4b17023SJohn Marino   global_dc->option_name = option_name;
1181*e4b17023SJohn Marino 
1182*e4b17023SJohn Marino   /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
1183*e4b17023SJohn Marino #ifdef SIGSEGV
1184*e4b17023SJohn Marino   signal (SIGSEGV, crash_signal);
1185*e4b17023SJohn Marino #endif
1186*e4b17023SJohn Marino #ifdef SIGILL
1187*e4b17023SJohn Marino   signal (SIGILL, crash_signal);
1188*e4b17023SJohn Marino #endif
1189*e4b17023SJohn Marino #ifdef SIGBUS
1190*e4b17023SJohn Marino   signal (SIGBUS, crash_signal);
1191*e4b17023SJohn Marino #endif
1192*e4b17023SJohn Marino #ifdef SIGABRT
1193*e4b17023SJohn Marino   signal (SIGABRT, crash_signal);
1194*e4b17023SJohn Marino #endif
1195*e4b17023SJohn Marino #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
1196*e4b17023SJohn Marino   signal (SIGIOT, crash_signal);
1197*e4b17023SJohn Marino #endif
1198*e4b17023SJohn Marino #ifdef SIGFPE
1199*e4b17023SJohn Marino   signal (SIGFPE, crash_signal);
1200*e4b17023SJohn Marino #endif
1201*e4b17023SJohn Marino 
1202*e4b17023SJohn Marino   /* Other host-specific signal setup.  */
1203*e4b17023SJohn Marino   (*host_hooks.extra_signals)();
1204*e4b17023SJohn Marino 
1205*e4b17023SJohn Marino   /* Initialize the garbage-collector, string pools and tree type hash
1206*e4b17023SJohn Marino      table.  */
1207*e4b17023SJohn Marino   init_ggc ();
1208*e4b17023SJohn Marino   init_stringpool ();
1209*e4b17023SJohn Marino   line_table = ggc_alloc_line_maps ();
1210*e4b17023SJohn Marino   linemap_init (line_table);
1211*e4b17023SJohn Marino   line_table->reallocator = realloc_for_line_map;
1212*e4b17023SJohn Marino   line_table->round_alloc_size = ggc_round_alloc_size;
1213*e4b17023SJohn Marino   init_ttree ();
1214*e4b17023SJohn Marino 
1215*e4b17023SJohn Marino   /* Initialize register usage now so switches may override.  */
1216*e4b17023SJohn Marino   init_reg_sets ();
1217*e4b17023SJohn Marino 
1218*e4b17023SJohn Marino   /* Register the language-independent parameters.  */
1219*e4b17023SJohn Marino   global_init_params ();
1220*e4b17023SJohn Marino 
1221*e4b17023SJohn Marino   /* This must be done after global_init_params but before argument
1222*e4b17023SJohn Marino      processing.  */
1223*e4b17023SJohn Marino   init_ggc_heuristics();
1224*e4b17023SJohn Marino   init_optimization_passes ();
1225*e4b17023SJohn Marino   statistics_early_init ();
1226*e4b17023SJohn Marino   finish_params ();
1227*e4b17023SJohn Marino }
1228*e4b17023SJohn Marino 
1229*e4b17023SJohn Marino /* Return true if the current target supports -fsection-anchors.  */
1230*e4b17023SJohn Marino 
1231*e4b17023SJohn Marino static bool
1232*e4b17023SJohn Marino target_supports_section_anchors_p (void)
1233*e4b17023SJohn Marino {
1234*e4b17023SJohn Marino   if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0)
1235*e4b17023SJohn Marino     return false;
1236*e4b17023SJohn Marino 
1237*e4b17023SJohn Marino   if (targetm.asm_out.output_anchor == NULL)
1238*e4b17023SJohn Marino     return false;
1239*e4b17023SJohn Marino 
1240*e4b17023SJohn Marino   return true;
1241*e4b17023SJohn Marino }
1242*e4b17023SJohn Marino 
1243*e4b17023SJohn Marino /* Default the align_* variables to 1 if they're still unset, and
1244*e4b17023SJohn Marino    set up the align_*_log variables.  */
1245*e4b17023SJohn Marino static void
1246*e4b17023SJohn Marino init_alignments (void)
1247*e4b17023SJohn Marino {
1248*e4b17023SJohn Marino   if (align_loops <= 0)
1249*e4b17023SJohn Marino     align_loops = 1;
1250*e4b17023SJohn Marino   if (align_loops_max_skip > align_loops)
1251*e4b17023SJohn Marino     align_loops_max_skip = align_loops - 1;
1252*e4b17023SJohn Marino   align_loops_log = floor_log2 (align_loops * 2 - 1);
1253*e4b17023SJohn Marino   if (align_jumps <= 0)
1254*e4b17023SJohn Marino     align_jumps = 1;
1255*e4b17023SJohn Marino   if (align_jumps_max_skip > align_jumps)
1256*e4b17023SJohn Marino     align_jumps_max_skip = align_jumps - 1;
1257*e4b17023SJohn Marino   align_jumps_log = floor_log2 (align_jumps * 2 - 1);
1258*e4b17023SJohn Marino   if (align_labels <= 0)
1259*e4b17023SJohn Marino     align_labels = 1;
1260*e4b17023SJohn Marino   align_labels_log = floor_log2 (align_labels * 2 - 1);
1261*e4b17023SJohn Marino   if (align_labels_max_skip > align_labels)
1262*e4b17023SJohn Marino     align_labels_max_skip = align_labels - 1;
1263*e4b17023SJohn Marino   if (align_functions <= 0)
1264*e4b17023SJohn Marino     align_functions = 1;
1265*e4b17023SJohn Marino   align_functions_log = floor_log2 (align_functions * 2 - 1);
1266*e4b17023SJohn Marino }
1267*e4b17023SJohn Marino 
1268*e4b17023SJohn Marino /* Process the options that have been parsed.  */
1269*e4b17023SJohn Marino static void
1270*e4b17023SJohn Marino process_options (void)
1271*e4b17023SJohn Marino {
1272*e4b17023SJohn Marino   /* Just in case lang_hooks.post_options ends up calling a debug_hook.
1273*e4b17023SJohn Marino      This can happen with incorrect pre-processed input. */
1274*e4b17023SJohn Marino   debug_hooks = &do_nothing_debug_hooks;
1275*e4b17023SJohn Marino 
1276*e4b17023SJohn Marino   maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT;
1277*e4b17023SJohn Marino 
1278*e4b17023SJohn Marino   /* Allow the front end to perform consistency checks and do further
1279*e4b17023SJohn Marino      initialization based on the command line options.  This hook also
1280*e4b17023SJohn Marino      sets the original filename if appropriate (e.g. foo.i -> foo.c)
1281*e4b17023SJohn Marino      so we can correctly initialize debug output.  */
1282*e4b17023SJohn Marino   no_backend = lang_hooks.post_options (&main_input_filename);
1283*e4b17023SJohn Marino 
1284*e4b17023SJohn Marino   /* Some machines may reject certain combinations of options.  */
1285*e4b17023SJohn Marino   targetm.target_option.override ();
1286*e4b17023SJohn Marino 
1287*e4b17023SJohn Marino   /* Avoid any informative notes in the second run of -fcompare-debug.  */
1288*e4b17023SJohn Marino   if (flag_compare_debug)
1289*e4b17023SJohn Marino     diagnostic_inhibit_notes (global_dc);
1290*e4b17023SJohn Marino 
1291*e4b17023SJohn Marino   if (flag_section_anchors && !target_supports_section_anchors_p ())
1292*e4b17023SJohn Marino     {
1293*e4b17023SJohn Marino       warning (OPT_fsection_anchors,
1294*e4b17023SJohn Marino 	       "this target does not support %qs", "-fsection-anchors");
1295*e4b17023SJohn Marino       flag_section_anchors = 0;
1296*e4b17023SJohn Marino     }
1297*e4b17023SJohn Marino 
1298*e4b17023SJohn Marino   if (flag_short_enums == 2)
1299*e4b17023SJohn Marino     flag_short_enums = targetm.default_short_enums ();
1300*e4b17023SJohn Marino 
1301*e4b17023SJohn Marino   /* Set aux_base_name if not already set.  */
1302*e4b17023SJohn Marino   if (aux_base_name)
1303*e4b17023SJohn Marino     ;
1304*e4b17023SJohn Marino   else if (main_input_filename)
1305*e4b17023SJohn Marino     {
1306*e4b17023SJohn Marino       char *name = xstrdup (lbasename (main_input_filename));
1307*e4b17023SJohn Marino 
1308*e4b17023SJohn Marino       strip_off_ending (name, strlen (name));
1309*e4b17023SJohn Marino       aux_base_name = name;
1310*e4b17023SJohn Marino     }
1311*e4b17023SJohn Marino   else
1312*e4b17023SJohn Marino     aux_base_name = "gccaux";
1313*e4b17023SJohn Marino 
1314*e4b17023SJohn Marino #ifndef HAVE_cloog
1315*e4b17023SJohn Marino   if (flag_graphite
1316*e4b17023SJohn Marino       || flag_graphite_identity
1317*e4b17023SJohn Marino       || flag_loop_block
1318*e4b17023SJohn Marino       || flag_loop_flatten
1319*e4b17023SJohn Marino       || flag_loop_interchange
1320*e4b17023SJohn Marino       || flag_loop_strip_mine
1321*e4b17023SJohn Marino       || flag_loop_parallelize_all)
1322*e4b17023SJohn Marino     sorry ("Graphite loop optimizations cannot be used (-fgraphite, "
1323*e4b17023SJohn Marino 	   "-fgraphite-identity, -floop-block, -floop-flatten, "
1324*e4b17023SJohn Marino 	   "-floop-interchange, -floop-strip-mine, -floop-parallelize-all, "
1325*e4b17023SJohn Marino 	   "and -ftree-loop-linear)");
1326*e4b17023SJohn Marino #endif
1327*e4b17023SJohn Marino 
1328*e4b17023SJohn Marino   if (flag_mudflap && flag_lto)
1329*e4b17023SJohn Marino     sorry ("mudflap cannot be used together with link-time optimization");
1330*e4b17023SJohn Marino 
1331*e4b17023SJohn Marino   /* One region RA really helps to decrease the code size.  */
1332*e4b17023SJohn Marino   if (flag_ira_region == IRA_REGION_AUTODETECT)
1333*e4b17023SJohn Marino     flag_ira_region
1334*e4b17023SJohn Marino       = optimize_size || !optimize ? IRA_REGION_ONE : IRA_REGION_MIXED;
1335*e4b17023SJohn Marino 
1336*e4b17023SJohn Marino   if (flag_strict_volatile_bitfields > 0 && !abi_version_at_least (2))
1337*e4b17023SJohn Marino     {
1338*e4b17023SJohn Marino       warning (0, "-fstrict-volatile-bitfields disabled; "
1339*e4b17023SJohn Marino 	       "it is incompatible with ABI versions < 2");
1340*e4b17023SJohn Marino       flag_strict_volatile_bitfields = 0;
1341*e4b17023SJohn Marino     }
1342*e4b17023SJohn Marino 
1343*e4b17023SJohn Marino   /* Unrolling all loops implies that standard loop unrolling must also
1344*e4b17023SJohn Marino      be done.  */
1345*e4b17023SJohn Marino   if (flag_unroll_all_loops)
1346*e4b17023SJohn Marino     flag_unroll_loops = 1;
1347*e4b17023SJohn Marino 
1348*e4b17023SJohn Marino   /* web and rename-registers help when run after loop unrolling.  */
1349*e4b17023SJohn Marino   if (flag_web == AUTODETECT_VALUE)
1350*e4b17023SJohn Marino     flag_web = flag_unroll_loops || flag_peel_loops;
1351*e4b17023SJohn Marino 
1352*e4b17023SJohn Marino   if (flag_rename_registers == AUTODETECT_VALUE)
1353*e4b17023SJohn Marino     flag_rename_registers = flag_unroll_loops || flag_peel_loops;
1354*e4b17023SJohn Marino 
1355*e4b17023SJohn Marino   if (flag_non_call_exceptions)
1356*e4b17023SJohn Marino     flag_asynchronous_unwind_tables = 1;
1357*e4b17023SJohn Marino   if (flag_asynchronous_unwind_tables)
1358*e4b17023SJohn Marino     flag_unwind_tables = 1;
1359*e4b17023SJohn Marino 
1360*e4b17023SJohn Marino   if (flag_value_profile_transformations)
1361*e4b17023SJohn Marino     flag_profile_values = 1;
1362*e4b17023SJohn Marino 
1363*e4b17023SJohn Marino   /* Warn about options that are not supported on this machine.  */
1364*e4b17023SJohn Marino #ifndef INSN_SCHEDULING
1365*e4b17023SJohn Marino   if (flag_schedule_insns || flag_schedule_insns_after_reload)
1366*e4b17023SJohn Marino     warning (0, "instruction scheduling not supported on this target machine");
1367*e4b17023SJohn Marino #endif
1368*e4b17023SJohn Marino #ifndef DELAY_SLOTS
1369*e4b17023SJohn Marino   if (flag_delayed_branch)
1370*e4b17023SJohn Marino     warning (0, "this target machine does not have delayed branches");
1371*e4b17023SJohn Marino #endif
1372*e4b17023SJohn Marino 
1373*e4b17023SJohn Marino   user_label_prefix = USER_LABEL_PREFIX;
1374*e4b17023SJohn Marino   if (flag_leading_underscore != -1)
1375*e4b17023SJohn Marino     {
1376*e4b17023SJohn Marino       /* If the default prefix is more complicated than "" or "_",
1377*e4b17023SJohn Marino 	 issue a warning and ignore this option.  */
1378*e4b17023SJohn Marino       if (user_label_prefix[0] == 0 ||
1379*e4b17023SJohn Marino 	  (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
1380*e4b17023SJohn Marino 	{
1381*e4b17023SJohn Marino 	  user_label_prefix = flag_leading_underscore ? "_" : "";
1382*e4b17023SJohn Marino 	}
1383*e4b17023SJohn Marino       else
1384*e4b17023SJohn Marino 	warning (0, "-f%sleading-underscore not supported on this target machine",
1385*e4b17023SJohn Marino 		 flag_leading_underscore ? "" : "no-");
1386*e4b17023SJohn Marino     }
1387*e4b17023SJohn Marino 
1388*e4b17023SJohn Marino   /* If we are in verbose mode, write out the version and maybe all the
1389*e4b17023SJohn Marino      option flags in use.  */
1390*e4b17023SJohn Marino   if (version_flag)
1391*e4b17023SJohn Marino     {
1392*e4b17023SJohn Marino       print_version (stderr, "");
1393*e4b17023SJohn Marino       if (! quiet_flag)
1394*e4b17023SJohn Marino 	print_switch_values (print_to_stderr);
1395*e4b17023SJohn Marino     }
1396*e4b17023SJohn Marino 
1397*e4b17023SJohn Marino   if (flag_syntax_only)
1398*e4b17023SJohn Marino     {
1399*e4b17023SJohn Marino       write_symbols = NO_DEBUG;
1400*e4b17023SJohn Marino       profile_flag = 0;
1401*e4b17023SJohn Marino     }
1402*e4b17023SJohn Marino 
1403*e4b17023SJohn Marino   if (flag_gtoggle)
1404*e4b17023SJohn Marino     {
1405*e4b17023SJohn Marino       if (debug_info_level == DINFO_LEVEL_NONE)
1406*e4b17023SJohn Marino 	{
1407*e4b17023SJohn Marino 	  debug_info_level = DINFO_LEVEL_NORMAL;
1408*e4b17023SJohn Marino 
1409*e4b17023SJohn Marino 	  if (write_symbols == NO_DEBUG)
1410*e4b17023SJohn Marino 	    write_symbols = PREFERRED_DEBUGGING_TYPE;
1411*e4b17023SJohn Marino 	}
1412*e4b17023SJohn Marino       else
1413*e4b17023SJohn Marino 	debug_info_level = DINFO_LEVEL_NONE;
1414*e4b17023SJohn Marino     }
1415*e4b17023SJohn Marino 
1416*e4b17023SJohn Marino   if (flag_dump_final_insns && !flag_syntax_only && !no_backend)
1417*e4b17023SJohn Marino     {
1418*e4b17023SJohn Marino       FILE *final_output = fopen (flag_dump_final_insns, "w");
1419*e4b17023SJohn Marino       if (!final_output)
1420*e4b17023SJohn Marino 	{
1421*e4b17023SJohn Marino 	  error ("could not open final insn dump file %qs: %m",
1422*e4b17023SJohn Marino 		 flag_dump_final_insns);
1423*e4b17023SJohn Marino 	  flag_dump_final_insns = NULL;
1424*e4b17023SJohn Marino 	}
1425*e4b17023SJohn Marino       else if (fclose (final_output))
1426*e4b17023SJohn Marino 	{
1427*e4b17023SJohn Marino 	  error ("could not close zeroed insn dump file %qs: %m",
1428*e4b17023SJohn Marino 		 flag_dump_final_insns);
1429*e4b17023SJohn Marino 	  flag_dump_final_insns = NULL;
1430*e4b17023SJohn Marino 	}
1431*e4b17023SJohn Marino     }
1432*e4b17023SJohn Marino 
1433*e4b17023SJohn Marino   /* Unless over-ridden for the target, assume that all DWARF levels
1434*e4b17023SJohn Marino      may be emitted, if DWARF2_DEBUG is selected.  */
1435*e4b17023SJohn Marino   if (dwarf_strict < 0)
1436*e4b17023SJohn Marino     dwarf_strict = 0;
1437*e4b17023SJohn Marino 
1438*e4b17023SJohn Marino   /* A lot of code assumes write_symbols == NO_DEBUG if the debugging
1439*e4b17023SJohn Marino      level is 0.  */
1440*e4b17023SJohn Marino   if (debug_info_level == DINFO_LEVEL_NONE)
1441*e4b17023SJohn Marino     write_symbols = NO_DEBUG;
1442*e4b17023SJohn Marino 
1443*e4b17023SJohn Marino   if (write_symbols == NO_DEBUG)
1444*e4b17023SJohn Marino     ;
1445*e4b17023SJohn Marino #if defined(DBX_DEBUGGING_INFO)
1446*e4b17023SJohn Marino   else if (write_symbols == DBX_DEBUG)
1447*e4b17023SJohn Marino     debug_hooks = &dbx_debug_hooks;
1448*e4b17023SJohn Marino #endif
1449*e4b17023SJohn Marino #if defined(XCOFF_DEBUGGING_INFO)
1450*e4b17023SJohn Marino   else if (write_symbols == XCOFF_DEBUG)
1451*e4b17023SJohn Marino     debug_hooks = &xcoff_debug_hooks;
1452*e4b17023SJohn Marino #endif
1453*e4b17023SJohn Marino #ifdef SDB_DEBUGGING_INFO
1454*e4b17023SJohn Marino   else if (write_symbols == SDB_DEBUG)
1455*e4b17023SJohn Marino     debug_hooks = &sdb_debug_hooks;
1456*e4b17023SJohn Marino #endif
1457*e4b17023SJohn Marino #ifdef DWARF2_DEBUGGING_INFO
1458*e4b17023SJohn Marino   else if (write_symbols == DWARF2_DEBUG)
1459*e4b17023SJohn Marino     debug_hooks = &dwarf2_debug_hooks;
1460*e4b17023SJohn Marino #endif
1461*e4b17023SJohn Marino #ifdef VMS_DEBUGGING_INFO
1462*e4b17023SJohn Marino   else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1463*e4b17023SJohn Marino     debug_hooks = &vmsdbg_debug_hooks;
1464*e4b17023SJohn Marino #endif
1465*e4b17023SJohn Marino   else
1466*e4b17023SJohn Marino     error ("target system does not support the \"%s\" debug format",
1467*e4b17023SJohn Marino 	   debug_type_names[write_symbols]);
1468*e4b17023SJohn Marino 
1469*e4b17023SJohn Marino   /* We know which debug output will be used so we can set flag_var_tracking
1470*e4b17023SJohn Marino      and flag_var_tracking_uninit if the user has not specified them.  */
1471*e4b17023SJohn Marino   if (debug_info_level < DINFO_LEVEL_NORMAL
1472*e4b17023SJohn Marino       || debug_hooks->var_location == do_nothing_debug_hooks.var_location)
1473*e4b17023SJohn Marino     {
1474*e4b17023SJohn Marino       if (flag_var_tracking == 1
1475*e4b17023SJohn Marino 	  || flag_var_tracking_uninit == 1)
1476*e4b17023SJohn Marino         {
1477*e4b17023SJohn Marino 	  if (debug_info_level < DINFO_LEVEL_NORMAL)
1478*e4b17023SJohn Marino 	    warning (0, "variable tracking requested, but useless unless "
1479*e4b17023SJohn Marino 		     "producing debug info");
1480*e4b17023SJohn Marino 	  else
1481*e4b17023SJohn Marino 	    warning (0, "variable tracking requested, but not supported "
1482*e4b17023SJohn Marino 		     "by this debug format");
1483*e4b17023SJohn Marino 	}
1484*e4b17023SJohn Marino       flag_var_tracking = 0;
1485*e4b17023SJohn Marino       flag_var_tracking_uninit = 0;
1486*e4b17023SJohn Marino     }
1487*e4b17023SJohn Marino 
1488*e4b17023SJohn Marino   /* The debug hooks are used to implement -fdump-go-spec because it
1489*e4b17023SJohn Marino      gives a simple and stable API for all the information we need to
1490*e4b17023SJohn Marino      dump.  */
1491*e4b17023SJohn Marino   if (flag_dump_go_spec != NULL)
1492*e4b17023SJohn Marino     debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks);
1493*e4b17023SJohn Marino 
1494*e4b17023SJohn Marino   /* If the user specifically requested variable tracking with tagging
1495*e4b17023SJohn Marino      uninitialized variables, we need to turn on variable tracking.
1496*e4b17023SJohn Marino      (We already determined above that variable tracking is feasible.)  */
1497*e4b17023SJohn Marino   if (flag_var_tracking_uninit)
1498*e4b17023SJohn Marino     flag_var_tracking = 1;
1499*e4b17023SJohn Marino 
1500*e4b17023SJohn Marino   if (flag_var_tracking == AUTODETECT_VALUE)
1501*e4b17023SJohn Marino     flag_var_tracking = optimize >= 1;
1502*e4b17023SJohn Marino 
1503*e4b17023SJohn Marino   if (flag_var_tracking_assignments == AUTODETECT_VALUE)
1504*e4b17023SJohn Marino     flag_var_tracking_assignments = flag_var_tracking
1505*e4b17023SJohn Marino       && !(flag_selective_scheduling || flag_selective_scheduling2);
1506*e4b17023SJohn Marino 
1507*e4b17023SJohn Marino   if (flag_var_tracking_assignments_toggle)
1508*e4b17023SJohn Marino     flag_var_tracking_assignments = !flag_var_tracking_assignments;
1509*e4b17023SJohn Marino 
1510*e4b17023SJohn Marino   if (flag_var_tracking_assignments && !flag_var_tracking)
1511*e4b17023SJohn Marino     flag_var_tracking = flag_var_tracking_assignments = -1;
1512*e4b17023SJohn Marino 
1513*e4b17023SJohn Marino   if (flag_var_tracking_assignments
1514*e4b17023SJohn Marino       && (flag_selective_scheduling || flag_selective_scheduling2))
1515*e4b17023SJohn Marino     warning (0, "var-tracking-assignments changes selective scheduling");
1516*e4b17023SJohn Marino 
1517*e4b17023SJohn Marino   if (flag_tree_cselim == AUTODETECT_VALUE)
1518*e4b17023SJohn Marino #ifdef HAVE_conditional_move
1519*e4b17023SJohn Marino     flag_tree_cselim = 1;
1520*e4b17023SJohn Marino #else
1521*e4b17023SJohn Marino     flag_tree_cselim = 0;
1522*e4b17023SJohn Marino #endif
1523*e4b17023SJohn Marino 
1524*e4b17023SJohn Marino   /* If auxiliary info generation is desired, open the output file.
1525*e4b17023SJohn Marino      This goes in the same directory as the source file--unlike
1526*e4b17023SJohn Marino      all the other output files.  */
1527*e4b17023SJohn Marino   if (flag_gen_aux_info)
1528*e4b17023SJohn Marino     {
1529*e4b17023SJohn Marino       aux_info_file = fopen (aux_info_file_name, "w");
1530*e4b17023SJohn Marino       if (aux_info_file == 0)
1531*e4b17023SJohn Marino 	fatal_error ("can%'t open %s: %m", aux_info_file_name);
1532*e4b17023SJohn Marino     }
1533*e4b17023SJohn Marino 
1534*e4b17023SJohn Marino   if (!targetm_common.have_named_sections)
1535*e4b17023SJohn Marino     {
1536*e4b17023SJohn Marino       if (flag_function_sections)
1537*e4b17023SJohn Marino 	{
1538*e4b17023SJohn Marino 	  warning (0, "-ffunction-sections not supported for this target");
1539*e4b17023SJohn Marino 	  flag_function_sections = 0;
1540*e4b17023SJohn Marino 	}
1541*e4b17023SJohn Marino       if (flag_data_sections)
1542*e4b17023SJohn Marino 	{
1543*e4b17023SJohn Marino 	  warning (0, "-fdata-sections not supported for this target");
1544*e4b17023SJohn Marino 	  flag_data_sections = 0;
1545*e4b17023SJohn Marino 	}
1546*e4b17023SJohn Marino     }
1547*e4b17023SJohn Marino 
1548*e4b17023SJohn Marino   if (flag_function_sections && profile_flag)
1549*e4b17023SJohn Marino     {
1550*e4b17023SJohn Marino       warning (0, "-ffunction-sections disabled; it makes profiling impossible");
1551*e4b17023SJohn Marino       flag_function_sections = 0;
1552*e4b17023SJohn Marino     }
1553*e4b17023SJohn Marino 
1554*e4b17023SJohn Marino #ifndef HAVE_prefetch
1555*e4b17023SJohn Marino   if (flag_prefetch_loop_arrays > 0)
1556*e4b17023SJohn Marino     {
1557*e4b17023SJohn Marino       warning (0, "-fprefetch-loop-arrays not supported for this target");
1558*e4b17023SJohn Marino       flag_prefetch_loop_arrays = 0;
1559*e4b17023SJohn Marino     }
1560*e4b17023SJohn Marino #else
1561*e4b17023SJohn Marino   if (flag_prefetch_loop_arrays > 0 && !HAVE_prefetch)
1562*e4b17023SJohn Marino     {
1563*e4b17023SJohn Marino       warning (0, "-fprefetch-loop-arrays not supported for this target (try -march switches)");
1564*e4b17023SJohn Marino       flag_prefetch_loop_arrays = 0;
1565*e4b17023SJohn Marino     }
1566*e4b17023SJohn Marino #endif
1567*e4b17023SJohn Marino 
1568*e4b17023SJohn Marino   /* This combination of options isn't handled for i386 targets and doesn't
1569*e4b17023SJohn Marino      make much sense anyway, so don't allow it.  */
1570*e4b17023SJohn Marino   if (flag_prefetch_loop_arrays > 0 && optimize_size)
1571*e4b17023SJohn Marino     {
1572*e4b17023SJohn Marino       warning (0, "-fprefetch-loop-arrays is not supported with -Os");
1573*e4b17023SJohn Marino       flag_prefetch_loop_arrays = 0;
1574*e4b17023SJohn Marino     }
1575*e4b17023SJohn Marino 
1576*e4b17023SJohn Marino   /* The presence of IEEE signaling NaNs, implies all math can trap.  */
1577*e4b17023SJohn Marino   if (flag_signaling_nans)
1578*e4b17023SJohn Marino     flag_trapping_math = 1;
1579*e4b17023SJohn Marino 
1580*e4b17023SJohn Marino   /* We cannot reassociate if we want traps or signed zeros.  */
1581*e4b17023SJohn Marino   if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))
1582*e4b17023SJohn Marino     {
1583*e4b17023SJohn Marino       warning (0, "-fassociative-math disabled; other options take precedence");
1584*e4b17023SJohn Marino       flag_associative_math = 0;
1585*e4b17023SJohn Marino     }
1586*e4b17023SJohn Marino 
1587*e4b17023SJohn Marino   /* With -fcx-limited-range, we do cheap and quick complex arithmetic.  */
1588*e4b17023SJohn Marino   if (flag_cx_limited_range)
1589*e4b17023SJohn Marino     flag_complex_method = 0;
1590*e4b17023SJohn Marino 
1591*e4b17023SJohn Marino   /* With -fcx-fortran-rules, we do something in-between cheap and C99.  */
1592*e4b17023SJohn Marino   if (flag_cx_fortran_rules)
1593*e4b17023SJohn Marino     flag_complex_method = 1;
1594*e4b17023SJohn Marino 
1595*e4b17023SJohn Marino   /* Targets must be able to place spill slots at lower addresses.  If the
1596*e4b17023SJohn Marino      target already uses a soft frame pointer, the transition is trivial.  */
1597*e4b17023SJohn Marino   if (!FRAME_GROWS_DOWNWARD && flag_stack_protect)
1598*e4b17023SJohn Marino     {
1599*e4b17023SJohn Marino       warning (0, "-fstack-protector not supported for this target");
1600*e4b17023SJohn Marino       flag_stack_protect = 0;
1601*e4b17023SJohn Marino     }
1602*e4b17023SJohn Marino   if (!flag_stack_protect)
1603*e4b17023SJohn Marino     warn_stack_protect = 0;
1604*e4b17023SJohn Marino 
1605*e4b17023SJohn Marino   /* ??? Unwind info is not correct around the CFG unless either a frame
1606*e4b17023SJohn Marino      pointer is present or A_O_A is set.  Fixing this requires rewriting
1607*e4b17023SJohn Marino      unwind info generation to be aware of the CFG and propagating states
1608*e4b17023SJohn Marino      around edges.  */
1609*e4b17023SJohn Marino   if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS
1610*e4b17023SJohn Marino       && flag_omit_frame_pointer)
1611*e4b17023SJohn Marino     {
1612*e4b17023SJohn Marino       warning (0, "unwind tables currently require a frame pointer "
1613*e4b17023SJohn Marino 	       "for correctness");
1614*e4b17023SJohn Marino       flag_omit_frame_pointer = 0;
1615*e4b17023SJohn Marino     }
1616*e4b17023SJohn Marino 
1617*e4b17023SJohn Marino   /* Enable -Werror=coverage-mismatch when -Werror and -Wno-error
1618*e4b17023SJohn Marino      have not been set.  */
1619*e4b17023SJohn Marino   if (!global_options_set.x_warnings_are_errors
1620*e4b17023SJohn Marino       && warn_coverage_mismatch
1621*e4b17023SJohn Marino       && (global_dc->classify_diagnostic[OPT_Wcoverage_mismatch] ==
1622*e4b17023SJohn Marino           DK_UNSPECIFIED))
1623*e4b17023SJohn Marino     diagnostic_classify_diagnostic (global_dc, OPT_Wcoverage_mismatch,
1624*e4b17023SJohn Marino                                     DK_ERROR, UNKNOWN_LOCATION);
1625*e4b17023SJohn Marino 
1626*e4b17023SJohn Marino   /* Save the current optimization options.  */
1627*e4b17023SJohn Marino   optimization_default_node = build_optimization_node ();
1628*e4b17023SJohn Marino   optimization_current_node = optimization_default_node;
1629*e4b17023SJohn Marino }
1630*e4b17023SJohn Marino 
1631*e4b17023SJohn Marino /* This function can be called multiple times to reinitialize the compiler
1632*e4b17023SJohn Marino    back end when register classes or instruction sets have changed,
1633*e4b17023SJohn Marino    before each function.  */
1634*e4b17023SJohn Marino static void
1635*e4b17023SJohn Marino backend_init_target (void)
1636*e4b17023SJohn Marino {
1637*e4b17023SJohn Marino   /* Initialize alignment variables.  */
1638*e4b17023SJohn Marino   init_alignments ();
1639*e4b17023SJohn Marino 
1640*e4b17023SJohn Marino   /* This reinitializes hard_frame_pointer, and calls init_reg_modes_target()
1641*e4b17023SJohn Marino      to initialize reg_raw_mode[].  */
1642*e4b17023SJohn Marino   init_emit_regs ();
1643*e4b17023SJohn Marino 
1644*e4b17023SJohn Marino   /* This invokes target hooks to set fixed_reg[] etc, which is
1645*e4b17023SJohn Marino      mode-dependent.  */
1646*e4b17023SJohn Marino   init_regs ();
1647*e4b17023SJohn Marino 
1648*e4b17023SJohn Marino   /* This depends on stack_pointer_rtx.  */
1649*e4b17023SJohn Marino   init_fake_stack_mems ();
1650*e4b17023SJohn Marino 
1651*e4b17023SJohn Marino   /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is
1652*e4b17023SJohn Marino      mode-dependent.  */
1653*e4b17023SJohn Marino   init_alias_target ();
1654*e4b17023SJohn Marino 
1655*e4b17023SJohn Marino   /* Depends on HARD_FRAME_POINTER_REGNUM.  */
1656*e4b17023SJohn Marino   init_reload ();
1657*e4b17023SJohn Marino 
1658*e4b17023SJohn Marino   /* The following initialization functions need to generate rtl, so
1659*e4b17023SJohn Marino      provide a dummy function context for them.  */
1660*e4b17023SJohn Marino   init_dummy_function_start ();
1661*e4b17023SJohn Marino 
1662*e4b17023SJohn Marino   /* rtx_cost is mode-dependent, so cached values need to be recomputed
1663*e4b17023SJohn Marino      on a mode change.  */
1664*e4b17023SJohn Marino   init_expmed ();
1665*e4b17023SJohn Marino 
1666*e4b17023SJohn Marino   /* We may need to recompute regno_save_code[] and regno_restore_code[]
1667*e4b17023SJohn Marino      after a mode change as well.  */
1668*e4b17023SJohn Marino   caller_save_initialized_p = false;
1669*e4b17023SJohn Marino 
1670*e4b17023SJohn Marino   expand_dummy_function_end ();
1671*e4b17023SJohn Marino }
1672*e4b17023SJohn Marino 
1673*e4b17023SJohn Marino /* Initialize the compiler back end.  This function is called only once,
1674*e4b17023SJohn Marino    when starting the compiler.  */
1675*e4b17023SJohn Marino static void
1676*e4b17023SJohn Marino backend_init (void)
1677*e4b17023SJohn Marino {
1678*e4b17023SJohn Marino   init_emit_once ();
1679*e4b17023SJohn Marino 
1680*e4b17023SJohn Marino   init_rtlanal ();
1681*e4b17023SJohn Marino   init_inline_once ();
1682*e4b17023SJohn Marino   init_varasm_once ();
1683*e4b17023SJohn Marino   save_register_info ();
1684*e4b17023SJohn Marino 
1685*e4b17023SJohn Marino   /* Initialize the target-specific back end pieces.  */
1686*e4b17023SJohn Marino   ira_init_once ();
1687*e4b17023SJohn Marino   backend_init_target ();
1688*e4b17023SJohn Marino }
1689*e4b17023SJohn Marino 
1690*e4b17023SJohn Marino /* Initialize excess precision settings.  */
1691*e4b17023SJohn Marino static void
1692*e4b17023SJohn Marino init_excess_precision (void)
1693*e4b17023SJohn Marino {
1694*e4b17023SJohn Marino   /* Adjust excess precision handling based on the target options.  If
1695*e4b17023SJohn Marino      the front end cannot handle it, flag_excess_precision_cmdline
1696*e4b17023SJohn Marino      will already have been set accordingly in the post_options
1697*e4b17023SJohn Marino      hook.  */
1698*e4b17023SJohn Marino   gcc_assert (flag_excess_precision_cmdline != EXCESS_PRECISION_DEFAULT);
1699*e4b17023SJohn Marino   flag_excess_precision = flag_excess_precision_cmdline;
1700*e4b17023SJohn Marino   if (flag_unsafe_math_optimizations)
1701*e4b17023SJohn Marino     flag_excess_precision = EXCESS_PRECISION_FAST;
1702*e4b17023SJohn Marino   if (flag_excess_precision == EXCESS_PRECISION_STANDARD)
1703*e4b17023SJohn Marino     {
1704*e4b17023SJohn Marino       int flt_eval_method = TARGET_FLT_EVAL_METHOD;
1705*e4b17023SJohn Marino       switch (flt_eval_method)
1706*e4b17023SJohn Marino 	{
1707*e4b17023SJohn Marino 	case -1:
1708*e4b17023SJohn Marino 	case 0:
1709*e4b17023SJohn Marino 	  /* Either the target acts unpredictably (-1) or has all the
1710*e4b17023SJohn Marino 	     operations required not to have excess precision (0).  */
1711*e4b17023SJohn Marino 	  flag_excess_precision = EXCESS_PRECISION_FAST;
1712*e4b17023SJohn Marino 	  break;
1713*e4b17023SJohn Marino 	case 1:
1714*e4b17023SJohn Marino 	case 2:
1715*e4b17023SJohn Marino 	  /* In these cases, predictable excess precision makes
1716*e4b17023SJohn Marino 	     sense.  */
1717*e4b17023SJohn Marino 	  break;
1718*e4b17023SJohn Marino 	default:
1719*e4b17023SJohn Marino 	  /* Any other implementation-defined FLT_EVAL_METHOD values
1720*e4b17023SJohn Marino 	     require the compiler to handle the associated excess
1721*e4b17023SJohn Marino 	     precision rules in excess_precision_type.  */
1722*e4b17023SJohn Marino 	  gcc_unreachable ();
1723*e4b17023SJohn Marino 	}
1724*e4b17023SJohn Marino     }
1725*e4b17023SJohn Marino }
1726*e4b17023SJohn Marino 
1727*e4b17023SJohn Marino /* Initialize things that are both lang-dependent and target-dependent.
1728*e4b17023SJohn Marino    This function can be called more than once if target parameters change.  */
1729*e4b17023SJohn Marino static void
1730*e4b17023SJohn Marino lang_dependent_init_target (void)
1731*e4b17023SJohn Marino {
1732*e4b17023SJohn Marino   /* This determines excess precision settings.  */
1733*e4b17023SJohn Marino   init_excess_precision ();
1734*e4b17023SJohn Marino 
1735*e4b17023SJohn Marino   /* This creates various _DECL nodes, so needs to be called after the
1736*e4b17023SJohn Marino      front end is initialized.  It also depends on the HAVE_xxx macros
1737*e4b17023SJohn Marino      generated from the target machine description.  */
1738*e4b17023SJohn Marino   init_optabs ();
1739*e4b17023SJohn Marino 
1740*e4b17023SJohn Marino   /* The following initialization functions need to generate rtl, so
1741*e4b17023SJohn Marino      provide a dummy function context for them.  */
1742*e4b17023SJohn Marino   init_dummy_function_start ();
1743*e4b17023SJohn Marino 
1744*e4b17023SJohn Marino   /* Do the target-specific parts of expr initialization.  */
1745*e4b17023SJohn Marino   init_expr_target ();
1746*e4b17023SJohn Marino 
1747*e4b17023SJohn Marino   /* Although the actions of these functions are language-independent,
1748*e4b17023SJohn Marino      they use optabs, so we cannot call them from backend_init.  */
1749*e4b17023SJohn Marino   init_set_costs ();
1750*e4b17023SJohn Marino   ira_init ();
1751*e4b17023SJohn Marino 
1752*e4b17023SJohn Marino   expand_dummy_function_end ();
1753*e4b17023SJohn Marino }
1754*e4b17023SJohn Marino 
1755*e4b17023SJohn Marino /* Language-dependent initialization.  Returns nonzero on success.  */
1756*e4b17023SJohn Marino static int
1757*e4b17023SJohn Marino lang_dependent_init (const char *name)
1758*e4b17023SJohn Marino {
1759*e4b17023SJohn Marino   location_t save_loc = input_location;
1760*e4b17023SJohn Marino   if (dump_base_name == 0)
1761*e4b17023SJohn Marino     dump_base_name = name && name[0] ? name : "gccdump";
1762*e4b17023SJohn Marino 
1763*e4b17023SJohn Marino   /* Other front-end initialization.  */
1764*e4b17023SJohn Marino   input_location = BUILTINS_LOCATION;
1765*e4b17023SJohn Marino   if (lang_hooks.init () == 0)
1766*e4b17023SJohn Marino     return 0;
1767*e4b17023SJohn Marino   input_location = save_loc;
1768*e4b17023SJohn Marino 
1769*e4b17023SJohn Marino   if (!flag_wpa)
1770*e4b17023SJohn Marino     {
1771*e4b17023SJohn Marino       init_asm_output (name);
1772*e4b17023SJohn Marino 
1773*e4b17023SJohn Marino       /* If stack usage information is desired, open the output file.  */
1774*e4b17023SJohn Marino       if (flag_stack_usage)
1775*e4b17023SJohn Marino 	stack_usage_file = open_auxiliary_file ("su");
1776*e4b17023SJohn Marino     }
1777*e4b17023SJohn Marino 
1778*e4b17023SJohn Marino   /* This creates various _DECL nodes, so needs to be called after the
1779*e4b17023SJohn Marino      front end is initialized.  */
1780*e4b17023SJohn Marino   init_eh ();
1781*e4b17023SJohn Marino 
1782*e4b17023SJohn Marino   /* Do the target-specific parts of the initialization.  */
1783*e4b17023SJohn Marino   lang_dependent_init_target ();
1784*e4b17023SJohn Marino 
1785*e4b17023SJohn Marino   if (!flag_wpa)
1786*e4b17023SJohn Marino     {
1787*e4b17023SJohn Marino       /* If dbx symbol table desired, initialize writing it and output the
1788*e4b17023SJohn Marino 	 predefined types.  */
1789*e4b17023SJohn Marino       timevar_push (TV_SYMOUT);
1790*e4b17023SJohn Marino 
1791*e4b17023SJohn Marino       /* Now we have the correct original filename, we can initialize
1792*e4b17023SJohn Marino 	 debug output.  */
1793*e4b17023SJohn Marino       (*debug_hooks->init) (name);
1794*e4b17023SJohn Marino 
1795*e4b17023SJohn Marino       timevar_pop (TV_SYMOUT);
1796*e4b17023SJohn Marino     }
1797*e4b17023SJohn Marino 
1798*e4b17023SJohn Marino   return 1;
1799*e4b17023SJohn Marino }
1800*e4b17023SJohn Marino 
1801*e4b17023SJohn Marino 
1802*e4b17023SJohn Marino /* Reinitialize everything when target parameters, such as register usage,
1803*e4b17023SJohn Marino    have changed.  */
1804*e4b17023SJohn Marino void
1805*e4b17023SJohn Marino target_reinit (void)
1806*e4b17023SJohn Marino {
1807*e4b17023SJohn Marino   struct rtl_data saved_x_rtl;
1808*e4b17023SJohn Marino   rtx *saved_regno_reg_rtx;
1809*e4b17023SJohn Marino 
1810*e4b17023SJohn Marino   /* Save *crtl and regno_reg_rtx around the reinitialization
1811*e4b17023SJohn Marino      to allow target_reinit being called even after prepare_function_start.  */
1812*e4b17023SJohn Marino   saved_regno_reg_rtx = regno_reg_rtx;
1813*e4b17023SJohn Marino   if (saved_regno_reg_rtx)
1814*e4b17023SJohn Marino     {
1815*e4b17023SJohn Marino       saved_x_rtl = *crtl;
1816*e4b17023SJohn Marino       memset (crtl, '\0', sizeof (*crtl));
1817*e4b17023SJohn Marino       regno_reg_rtx = NULL;
1818*e4b17023SJohn Marino     }
1819*e4b17023SJohn Marino 
1820*e4b17023SJohn Marino   /* Reinitialize RTL backend.  */
1821*e4b17023SJohn Marino   backend_init_target ();
1822*e4b17023SJohn Marino 
1823*e4b17023SJohn Marino   /* Reinitialize lang-dependent parts.  */
1824*e4b17023SJohn Marino   lang_dependent_init_target ();
1825*e4b17023SJohn Marino 
1826*e4b17023SJohn Marino   /* And restore it at the end, as free_after_compilation from
1827*e4b17023SJohn Marino      expand_dummy_function_end clears it.  */
1828*e4b17023SJohn Marino   if (saved_regno_reg_rtx)
1829*e4b17023SJohn Marino     {
1830*e4b17023SJohn Marino       *crtl = saved_x_rtl;
1831*e4b17023SJohn Marino       regno_reg_rtx = saved_regno_reg_rtx;
1832*e4b17023SJohn Marino       saved_regno_reg_rtx = NULL;
1833*e4b17023SJohn Marino     }
1834*e4b17023SJohn Marino }
1835*e4b17023SJohn Marino 
1836*e4b17023SJohn Marino void
1837*e4b17023SJohn Marino dump_memory_report (bool final)
1838*e4b17023SJohn Marino {
1839*e4b17023SJohn Marino   dump_line_table_statistics ();
1840*e4b17023SJohn Marino   ggc_print_statistics ();
1841*e4b17023SJohn Marino   stringpool_statistics ();
1842*e4b17023SJohn Marino   dump_tree_statistics ();
1843*e4b17023SJohn Marino   dump_gimple_statistics ();
1844*e4b17023SJohn Marino   dump_rtx_statistics ();
1845*e4b17023SJohn Marino   dump_alloc_pool_statistics ();
1846*e4b17023SJohn Marino   dump_bitmap_statistics ();
1847*e4b17023SJohn Marino   dump_vec_loc_statistics ();
1848*e4b17023SJohn Marino   dump_ggc_loc_statistics (final);
1849*e4b17023SJohn Marino   dump_alias_stats (stderr);
1850*e4b17023SJohn Marino   dump_pta_stats (stderr);
1851*e4b17023SJohn Marino }
1852*e4b17023SJohn Marino 
1853*e4b17023SJohn Marino /* Clean up: close opened files, etc.  */
1854*e4b17023SJohn Marino 
1855*e4b17023SJohn Marino static void
1856*e4b17023SJohn Marino finalize (bool no_backend)
1857*e4b17023SJohn Marino {
1858*e4b17023SJohn Marino   /* Close the dump files.  */
1859*e4b17023SJohn Marino   if (flag_gen_aux_info)
1860*e4b17023SJohn Marino     {
1861*e4b17023SJohn Marino       fclose (aux_info_file);
1862*e4b17023SJohn Marino       if (seen_error ())
1863*e4b17023SJohn Marino 	unlink (aux_info_file_name);
1864*e4b17023SJohn Marino     }
1865*e4b17023SJohn Marino 
1866*e4b17023SJohn Marino   /* Close non-debugging input and output files.  Take special care to note
1867*e4b17023SJohn Marino      whether fclose returns an error, since the pages might still be on the
1868*e4b17023SJohn Marino      buffer chain while the file is open.  */
1869*e4b17023SJohn Marino 
1870*e4b17023SJohn Marino   if (asm_out_file)
1871*e4b17023SJohn Marino     {
1872*e4b17023SJohn Marino       if (ferror (asm_out_file) != 0)
1873*e4b17023SJohn Marino 	fatal_error ("error writing to %s: %m", asm_file_name);
1874*e4b17023SJohn Marino       if (fclose (asm_out_file) != 0)
1875*e4b17023SJohn Marino 	fatal_error ("error closing %s: %m", asm_file_name);
1876*e4b17023SJohn Marino     }
1877*e4b17023SJohn Marino 
1878*e4b17023SJohn Marino   if (stack_usage_file)
1879*e4b17023SJohn Marino     fclose (stack_usage_file);
1880*e4b17023SJohn Marino 
1881*e4b17023SJohn Marino   if (!no_backend)
1882*e4b17023SJohn Marino     {
1883*e4b17023SJohn Marino       statistics_fini ();
1884*e4b17023SJohn Marino 
1885*e4b17023SJohn Marino       finish_optimization_passes ();
1886*e4b17023SJohn Marino 
1887*e4b17023SJohn Marino       ira_finish_once ();
1888*e4b17023SJohn Marino     }
1889*e4b17023SJohn Marino 
1890*e4b17023SJohn Marino   if (mem_report)
1891*e4b17023SJohn Marino     dump_memory_report (true);
1892*e4b17023SJohn Marino 
1893*e4b17023SJohn Marino   /* Language-specific end of compilation actions.  */
1894*e4b17023SJohn Marino   lang_hooks.finish ();
1895*e4b17023SJohn Marino }
1896*e4b17023SJohn Marino 
1897*e4b17023SJohn Marino /* Initialize the compiler, and compile the input file.  */
1898*e4b17023SJohn Marino static void
1899*e4b17023SJohn Marino do_compile (void)
1900*e4b17023SJohn Marino {
1901*e4b17023SJohn Marino   /* Initialize timing first.  The C front ends read the main file in
1902*e4b17023SJohn Marino      the post_options hook, and C++ does file timings.  */
1903*e4b17023SJohn Marino   if (time_report || !quiet_flag  || flag_detailed_statistics)
1904*e4b17023SJohn Marino     timevar_init ();
1905*e4b17023SJohn Marino   timevar_start (TV_TOTAL);
1906*e4b17023SJohn Marino 
1907*e4b17023SJohn Marino   process_options ();
1908*e4b17023SJohn Marino 
1909*e4b17023SJohn Marino   /* Don't do any more if an error has already occurred.  */
1910*e4b17023SJohn Marino   if (!seen_error ())
1911*e4b17023SJohn Marino     {
1912*e4b17023SJohn Marino       timevar_start (TV_PHASE_SETUP);
1913*e4b17023SJohn Marino 
1914*e4b17023SJohn Marino       /* This must be run always, because it is needed to compute the FP
1915*e4b17023SJohn Marino 	 predefined macros, such as __LDBL_MAX__, for targets using non
1916*e4b17023SJohn Marino 	 default FP formats.  */
1917*e4b17023SJohn Marino       init_adjust_machine_modes ();
1918*e4b17023SJohn Marino 
1919*e4b17023SJohn Marino       /* Set up the back-end if requested.  */
1920*e4b17023SJohn Marino       if (!no_backend)
1921*e4b17023SJohn Marino 	backend_init ();
1922*e4b17023SJohn Marino 
1923*e4b17023SJohn Marino       /* Language-dependent initialization.  Returns true on success.  */
1924*e4b17023SJohn Marino       if (lang_dependent_init (main_input_filename))
1925*e4b17023SJohn Marino         {
1926*e4b17023SJohn Marino           /* Initialize yet another pass.  */
1927*e4b17023SJohn Marino 
1928*e4b17023SJohn Marino           ggc_protect_identifiers = true;
1929*e4b17023SJohn Marino 
1930*e4b17023SJohn Marino           init_cgraph ();
1931*e4b17023SJohn Marino           init_final (main_input_filename);
1932*e4b17023SJohn Marino           coverage_init (aux_base_name);
1933*e4b17023SJohn Marino           statistics_init ();
1934*e4b17023SJohn Marino           invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL);
1935*e4b17023SJohn Marino 
1936*e4b17023SJohn Marino           timevar_stop (TV_PHASE_SETUP);
1937*e4b17023SJohn Marino 
1938*e4b17023SJohn Marino           compile_file ();
1939*e4b17023SJohn Marino         }
1940*e4b17023SJohn Marino       else
1941*e4b17023SJohn Marino         {
1942*e4b17023SJohn Marino           timevar_stop (TV_PHASE_SETUP);
1943*e4b17023SJohn Marino         }
1944*e4b17023SJohn Marino 
1945*e4b17023SJohn Marino       timevar_start (TV_PHASE_FINALIZE);
1946*e4b17023SJohn Marino 
1947*e4b17023SJohn Marino       finalize (no_backend);
1948*e4b17023SJohn Marino 
1949*e4b17023SJohn Marino       timevar_stop (TV_PHASE_FINALIZE);
1950*e4b17023SJohn Marino     }
1951*e4b17023SJohn Marino 
1952*e4b17023SJohn Marino   /* Stop timing and print the times.  */
1953*e4b17023SJohn Marino   timevar_stop (TV_TOTAL);
1954*e4b17023SJohn Marino   timevar_print (stderr);
1955*e4b17023SJohn Marino }
1956*e4b17023SJohn Marino 
1957*e4b17023SJohn Marino /* Entry point of cc1, cc1plus, jc1, f771, etc.
1958*e4b17023SJohn Marino    Exit code is FATAL_EXIT_CODE if can't open files or if there were
1959*e4b17023SJohn Marino    any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
1960*e4b17023SJohn Marino 
1961*e4b17023SJohn Marino    It is not safe to call this function more than once.  */
1962*e4b17023SJohn Marino 
1963*e4b17023SJohn Marino int
1964*e4b17023SJohn Marino toplev_main (int argc, char **argv)
1965*e4b17023SJohn Marino {
1966*e4b17023SJohn Marino   /* Parsing and gimplification sometimes need quite large stack.
1967*e4b17023SJohn Marino      Increase stack size limits if possible.  */
1968*e4b17023SJohn Marino   stack_limit_increase (64 * 1024 * 1024);
1969*e4b17023SJohn Marino 
1970*e4b17023SJohn Marino   expandargv (&argc, &argv);
1971*e4b17023SJohn Marino 
1972*e4b17023SJohn Marino   /* Initialization of GCC's environment, and diagnostics.  */
1973*e4b17023SJohn Marino   general_init (argv[0]);
1974*e4b17023SJohn Marino 
1975*e4b17023SJohn Marino   /* One-off initialization of options that does not need to be
1976*e4b17023SJohn Marino      repeated when options are added for particular functions.  */
1977*e4b17023SJohn Marino   init_options_once ();
1978*e4b17023SJohn Marino 
1979*e4b17023SJohn Marino   /* Initialize global options structures; this must be repeated for
1980*e4b17023SJohn Marino      each structure used for parsing options.  */
1981*e4b17023SJohn Marino   init_options_struct (&global_options, &global_options_set);
1982*e4b17023SJohn Marino   lang_hooks.init_options_struct (&global_options);
1983*e4b17023SJohn Marino 
1984*e4b17023SJohn Marino   /* Convert the options to an array.  */
1985*e4b17023SJohn Marino   decode_cmdline_options_to_array_default_mask (argc,
1986*e4b17023SJohn Marino 						CONST_CAST2 (const char **,
1987*e4b17023SJohn Marino 							     char **, argv),
1988*e4b17023SJohn Marino 						&save_decoded_options,
1989*e4b17023SJohn Marino 						&save_decoded_options_count);
1990*e4b17023SJohn Marino 
1991*e4b17023SJohn Marino   /* Perform language-specific options initialization.  */
1992*e4b17023SJohn Marino   lang_hooks.init_options (save_decoded_options_count, save_decoded_options);
1993*e4b17023SJohn Marino 
1994*e4b17023SJohn Marino   /* Parse the options and do minimal processing; basically just
1995*e4b17023SJohn Marino      enough to default flags appropriately.  */
1996*e4b17023SJohn Marino   decode_options (&global_options, &global_options_set,
1997*e4b17023SJohn Marino 		  save_decoded_options, save_decoded_options_count,
1998*e4b17023SJohn Marino 		  UNKNOWN_LOCATION, global_dc);
1999*e4b17023SJohn Marino 
2000*e4b17023SJohn Marino   handle_common_deferred_options ();
2001*e4b17023SJohn Marino 
2002*e4b17023SJohn Marino   init_local_tick ();
2003*e4b17023SJohn Marino 
2004*e4b17023SJohn Marino   initialize_plugins ();
2005*e4b17023SJohn Marino 
2006*e4b17023SJohn Marino   if (version_flag)
2007*e4b17023SJohn Marino     print_version (stderr, "");
2008*e4b17023SJohn Marino 
2009*e4b17023SJohn Marino   if (help_flag)
2010*e4b17023SJohn Marino     print_plugins_help (stderr, "");
2011*e4b17023SJohn Marino 
2012*e4b17023SJohn Marino   /* Exit early if we can (e.g. -help).  */
2013*e4b17023SJohn Marino   if (!exit_after_options)
2014*e4b17023SJohn Marino     do_compile ();
2015*e4b17023SJohn Marino 
2016*e4b17023SJohn Marino   if (warningcount || errorcount)
2017*e4b17023SJohn Marino     print_ignored_options ();
2018*e4b17023SJohn Marino   diagnostic_finish (global_dc);
2019*e4b17023SJohn Marino 
2020*e4b17023SJohn Marino   /* Invoke registered plugin callbacks if any.  */
2021*e4b17023SJohn Marino   invoke_plugin_callbacks (PLUGIN_FINISH, NULL);
2022*e4b17023SJohn Marino 
2023*e4b17023SJohn Marino   finalize_plugins ();
2024*e4b17023SJohn Marino   if (seen_error ())
2025*e4b17023SJohn Marino     return (FATAL_EXIT_CODE);
2026*e4b17023SJohn Marino 
2027*e4b17023SJohn Marino   return (SUCCESS_EXIT_CODE);
2028*e4b17023SJohn Marino }
2029