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