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