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