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