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