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