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