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