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