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