]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/toplev.cc
Fix profiledbootstrap
[thirdparty/gcc.git] / gcc / toplev.cc
1 /* Top level of GCC compilers (cc1, cc1plus, etc.)
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 /* This is the top level of cc1/c++.
21 It parses command args, opens files, invokes the various passes
22 in the proper order, and counts the time used by each.
23 Error messages and low-level interface to malloc also handled here. */
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "backend.h"
29 #include "target.h"
30 #include "rtl.h"
31 #include "tree.h"
32 #include "gimple.h"
33 #include "alloc-pool.h"
34 #include "timevar.h"
35 #include "memmodel.h"
36 #include "tm_p.h"
37 #include "optabs-libfuncs.h"
38 #include "insn-config.h"
39 #include "ira.h"
40 #include "recog.h"
41 #include "cgraph.h"
42 #include "coverage.h"
43 #include "diagnostic.h"
44 #include "varasm.h"
45 #include "tree-inline.h"
46 #include "realmpfr.h" /* For GMP/MPFR/MPC versions, in print_version. */
47 #include "version.h"
48 #include "flags.h"
49 #include "insn-attr.h"
50 #include "output.h"
51 #include "toplev.h"
52 #include "expr.h"
53 #include "intl.h"
54 #include "tree-diagnostic.h"
55 #include "reload.h"
56 #include "lra.h"
57 #include "dwarf2asm.h"
58 #include "debug.h"
59 #include "common/common-target.h"
60 #include "langhooks.h"
61 #include "cfgloop.h" /* for init_set_costs */
62 #include "hosthooks.h"
63 #include "opts.h"
64 #include "opts-diagnostic.h"
65 #include "stringpool.h"
66 #include "attribs.h"
67 #include "asan.h"
68 #include "tsan.h"
69 #include "plugin.h"
70 #include "context.h"
71 #include "pass_manager.h"
72 #include "auto-profile.h"
73 #include "dwarf2out.h"
74 #include "ipa-reference.h"
75 #include "symbol-summary.h"
76 #include "tree-vrp.h"
77 #include "ipa-prop.h"
78 #include "gcse.h"
79 #include "omp-offload.h"
80 #include "edit-context.h"
81 #include "tree-pass.h"
82 #include "dumpfile.h"
83 #include "ipa-fnsummary.h"
84 #include "dump-context.h"
85 #include "print-tree.h"
86 #include "optinfo-emit-json.h"
87 #include "ipa-modref-tree.h"
88 #include "ipa-modref.h"
89 #include "ipa-param-manipulation.h"
90 #include "dbgcnt.h"
91
92 #include "selftest.h"
93
94 #ifdef HAVE_isl
95 #include <isl/version.h>
96 #endif
97
98 static void general_init (const char *, bool);
99 static void backend_init (void);
100 static int lang_dependent_init (const char *);
101 static void init_asm_output (const char *);
102 static void finalize (bool);
103
104 static void crash_signal (int) ATTRIBUTE_NORETURN;
105 static void compile_file (void);
106
107 /* Decoded options, and number of such options. */
108 struct cl_decoded_option *save_decoded_options;
109 unsigned int save_decoded_options_count;
110
111 /* Vector of saved Optimization decoded command line options. */
112 vec<cl_decoded_option> *save_opt_decoded_options;
113
114 /* Debug hooks - dependent upon command line options. */
115
116 const struct gcc_debug_hooks *debug_hooks;
117
118 /* The FUNCTION_DECL for the function currently being compiled,
119 or 0 if between functions. */
120 tree current_function_decl;
121
122 /* Set to the FUNC_BEGIN label of the current function, or NULL
123 if none. */
124 const char * current_function_func_begin_label;
125
126 /* A random sequence of characters, unless overridden by user. */
127 static const char *flag_random_seed;
128
129 /* A local time stamp derived from the time of compilation. It will be
130 zero if the system cannot provide a time. It will be -1u, if the
131 user has specified a particular random seed. */
132 unsigned local_tick;
133
134 /* Random number for this compilation */
135 HOST_WIDE_INT random_seed;
136
137 /* -f flags. */
138
139 /* When non-NULL, indicates that whenever space is allocated on the
140 stack, the resulting stack pointer must not pass this
141 address---that is, for stacks that grow downward, the stack pointer
142 must always be greater than or equal to this address; for stacks
143 that grow upward, the stack pointer must be less than this address.
144 At present, the rtx may be either a REG or a SYMBOL_REF, although
145 the support provided depends on the backend. */
146 rtx stack_limit_rtx;
147
148 class target_flag_state default_target_flag_state;
149 #if SWITCHABLE_TARGET
150 class target_flag_state *this_target_flag_state = &default_target_flag_state;
151 #else
152 #define this_target_flag_state (&default_target_flag_state)
153 #endif
154
155 /* The user symbol prefix after having resolved same. */
156 const char *user_label_prefix;
157
158 /* Output files for assembler code (real compiler output)
159 and debugging dumps. */
160
161 FILE *asm_out_file;
162 FILE *aux_info_file;
163 FILE *callgraph_info_file = NULL;
164 static bitmap callgraph_info_external_printed;
165 FILE *stack_usage_file = NULL;
166
167 /* The current working directory of a translation. It's generally the
168 directory from which compilation was initiated, but a preprocessed
169 file may specify the original directory in which it was
170 created. */
171
172 static const char *src_pwd;
173
174 /* Initialize src_pwd with the given string, and return true. If it
175 was already initialized, return false. As a special case, it may
176 be called with a NULL argument to test whether src_pwd has NOT been
177 initialized yet. */
178
179 bool
180 set_src_pwd (const char *pwd)
181 {
182 if (src_pwd)
183 {
184 if (strcmp (src_pwd, pwd) == 0)
185 return true;
186 else
187 return false;
188 }
189
190 src_pwd = xstrdup (pwd);
191 return true;
192 }
193
194 /* Return the directory from which the translation unit was initiated,
195 in case set_src_pwd() was not called before to assign it a
196 different value. */
197
198 const char *
199 get_src_pwd (void)
200 {
201 if (! src_pwd)
202 {
203 src_pwd = getpwd ();
204 if (!src_pwd)
205 src_pwd = ".";
206 }
207
208 return src_pwd;
209 }
210
211 /* Called when the start of a function definition is parsed,
212 this function prints on stderr the name of the function. */
213 void
214 announce_function (tree decl)
215 {
216 if (!quiet_flag)
217 {
218 if (rtl_dump_and_exit)
219 fprintf (stderr, "%s ",
220 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl))));
221 else
222 fprintf (stderr, " %s",
223 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2)));
224 fflush (stderr);
225 pp_needs_newline (global_dc->printer) = true;
226 diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL);
227 }
228 }
229
230 /* Initialize local_tick with the time of day, or -1 if
231 flag_random_seed is set. */
232
233 static void
234 init_local_tick (void)
235 {
236 if (!flag_random_seed)
237 {
238 #ifdef HAVE_GETTIMEOFDAY
239 {
240 struct timeval tv;
241
242 gettimeofday (&tv, NULL);
243 local_tick = (unsigned) tv.tv_sec * 1000 + tv.tv_usec / 1000;
244 }
245 #else
246 {
247 time_t now = time (NULL);
248
249 if (now != (time_t)-1)
250 local_tick = (unsigned) now;
251 }
252 #endif
253 }
254 else
255 local_tick = -1;
256 }
257
258 /* Obtain the random_seed. Unless NOINIT, initialize it if
259 it's not provided in the command line. */
260
261 HOST_WIDE_INT
262 get_random_seed (bool noinit)
263 {
264 if (!random_seed && !noinit)
265 {
266 int fd = open ("/dev/urandom", O_RDONLY);
267 if (fd >= 0)
268 {
269 if (read (fd, &random_seed, sizeof (random_seed))
270 != sizeof (random_seed))
271 random_seed = 0;
272 close (fd);
273 }
274 if (!random_seed)
275 random_seed = local_tick ^ getpid ();
276 }
277 return random_seed;
278 }
279
280 /* Set flag_random_seed to VAL, and if non-null, reinitialize random_seed. */
281
282 void
283 set_random_seed (const char *val)
284 {
285 flag_random_seed = val;
286 if (flag_random_seed)
287 {
288 char *endp;
289
290 /* When the driver passed in a hex number don't crc it again */
291 random_seed = strtoul (flag_random_seed, &endp, 0);
292 if (!(endp > flag_random_seed && *endp == 0))
293 random_seed = crc32_string (0, flag_random_seed);
294 }
295 }
296
297 /* Handler for fatal signals, such as SIGSEGV. These are transformed
298 into ICE messages, which is much more user friendly. In case the
299 error printer crashes, reset the signal to prevent infinite recursion. */
300
301 static void
302 crash_signal (int signo)
303 {
304 signal (signo, SIG_DFL);
305
306 /* If we crashed while processing an ASM statement, then be a little more
307 graceful. It's most likely the user's fault. */
308 if (this_is_asm_operands)
309 {
310 output_operand_lossage ("unrecoverable error");
311 exit (FATAL_EXIT_CODE);
312 }
313
314 internal_error ("%s", strsignal (signo));
315 }
316
317 /* A subroutine of wrapup_global_declarations. We've come to the end of
318 the compilation unit. All deferred variables should be undeferred,
319 and all incomplete decls should be finalized. */
320
321 void
322 wrapup_global_declaration_1 (tree decl)
323 {
324 /* We're not deferring this any longer. Assignment is conditional to
325 avoid needlessly dirtying PCH pages. */
326 if (HAS_DECL_ASSEMBLER_NAME_P (decl)
327 && DECL_DEFER_OUTPUT (decl) != 0)
328 DECL_DEFER_OUTPUT (decl) = 0;
329
330 if (VAR_P (decl) && DECL_SIZE (decl) == 0)
331 lang_hooks.finish_incomplete_decl (decl);
332 }
333
334 /* A subroutine of wrapup_global_declarations. Decide whether or not DECL
335 needs to be output. Return true if it is output. */
336
337 bool
338 wrapup_global_declaration_2 (tree decl)
339 {
340 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl)
341 || (VAR_P (decl) && DECL_HAS_VALUE_EXPR_P (decl)))
342 return false;
343
344 /* Don't write out static consts, unless we still need them.
345
346 We also keep static consts if not optimizing (for debugging),
347 unless the user specified -fno-keep-static-consts.
348 ??? They might be better written into the debug information.
349 This is possible when using DWARF.
350
351 A language processor that wants static constants to be always
352 written out (even if it is not used) is responsible for
353 calling rest_of_decl_compilation itself. E.g. the C front-end
354 calls rest_of_decl_compilation from finish_decl.
355 One motivation for this is that is conventional in some
356 environments to write things like:
357 static const char rcsid[] = "... version string ...";
358 intending to force the string to be in the executable.
359
360 A language processor that would prefer to have unneeded
361 static constants "optimized away" would just defer writing
362 them out until here. E.g. C++ does this, because static
363 constants are often defined in header files.
364
365 ??? A tempting alternative (for both C and C++) would be
366 to force a constant to be written if and only if it is
367 defined in a main file, as opposed to an include file. */
368
369 if (VAR_P (decl) && TREE_STATIC (decl))
370 {
371 varpool_node *node;
372 bool needed = true;
373 node = varpool_node::get (decl);
374
375 if (!node && flag_ltrans)
376 needed = false;
377 else if (node && node->definition)
378 needed = false;
379 else if (node && node->alias)
380 needed = false;
381 else if (!symtab->global_info_ready
382 && (TREE_USED (decl)
383 || TREE_USED (DECL_ASSEMBLER_NAME (decl))))
384 /* needed */;
385 else if (node && node->analyzed)
386 /* needed */;
387 else if (DECL_COMDAT (decl))
388 needed = false;
389 else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
390 && (optimize || !flag_keep_static_consts
391 || DECL_ARTIFICIAL (decl)))
392 needed = false;
393
394 if (needed)
395 {
396 rest_of_decl_compilation (decl, 1, 1);
397 return true;
398 }
399 }
400
401 return false;
402 }
403
404 /* Do any final processing required for the declarations in VEC, of
405 which there are LEN. We write out inline functions and variables
406 that have been deferred until this point, but which are required.
407 Returns nonzero if anything was put out. */
408
409 bool
410 wrapup_global_declarations (tree *vec, int len)
411 {
412 bool reconsider, output_something = false;
413 int i;
414
415 for (i = 0; i < len; i++)
416 wrapup_global_declaration_1 (vec[i]);
417
418 /* Now emit any global variables or functions that we have been
419 putting off. We need to loop in case one of the things emitted
420 here references another one which comes earlier in the list. */
421 do
422 {
423 reconsider = false;
424 for (i = 0; i < len; i++)
425 reconsider |= wrapup_global_declaration_2 (vec[i]);
426 if (reconsider)
427 output_something = true;
428 }
429 while (reconsider);
430
431 return output_something;
432 }
433
434 /* Compile an entire translation unit. Write a file of assembly
435 output and various debugging dumps. */
436
437 static void
438 compile_file (void)
439 {
440 timevar_start (TV_PHASE_PARSING);
441 timevar_push (TV_PARSE_GLOBAL);
442
443 /* Parse entire file and generate initial debug information. */
444 lang_hooks.parse_file ();
445
446 timevar_pop (TV_PARSE_GLOBAL);
447 timevar_stop (TV_PHASE_PARSING);
448
449 if (flag_dump_locations)
450 dump_location_info (stderr);
451
452 free_attr_data ();
453
454 /* Compilation is now finished except for writing
455 what's left of the symbol table output. */
456
457 if (flag_syntax_only || flag_wpa)
458 return;
459
460 /* Reset maximum_field_alignment, it can be adjusted by #pragma pack
461 and this shouldn't influence any types built by the middle-end
462 from now on (like gcov_info_type). */
463 maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT;
464
465 ggc_protect_identifiers = false;
466
467 /* Run the actual compilation process. */
468 if (!in_lto_p)
469 {
470 timevar_start (TV_PHASE_OPT_GEN);
471 symtab->finalize_compilation_unit ();
472 timevar_stop (TV_PHASE_OPT_GEN);
473 }
474
475 /* Perform any post compilation-proper parser cleanups and
476 processing. This is currently only needed for the C++ parser,
477 which can be hopefully cleaned up so this hook is no longer
478 necessary. */
479 if (lang_hooks.decls.post_compilation_parsing_cleanups)
480 lang_hooks.decls.post_compilation_parsing_cleanups ();
481
482 dump_context::get ().finish_any_json_writer ();
483
484 if (seen_error ())
485 return;
486
487 timevar_start (TV_PHASE_LATE_ASM);
488
489 /* Compilation unit is finalized. When producing non-fat LTO object, we are
490 basically finished. */
491 if ((in_lto_p && flag_incremental_link != INCREMENTAL_LINK_LTO)
492 || !flag_lto || flag_fat_lto_objects)
493 {
494 /* File-scope initialization for AddressSanitizer. */
495 if (flag_sanitize & SANITIZE_ADDRESS)
496 asan_finish_file ();
497
498 if (flag_sanitize & SANITIZE_THREAD)
499 tsan_finish_file ();
500
501 if (gate_hwasan ())
502 hwasan_finish_file ();
503
504 omp_finish_file ();
505
506 output_shared_constant_pool ();
507 output_object_blocks ();
508 finish_tm_clone_pairs ();
509
510 /* Write out any pending weak symbol declarations. */
511 weak_finish ();
512
513 /* This must be at the end before unwind and debug info.
514 Some target ports emit PIC setup thunks here. */
515 insn_locations_init ();
516 targetm.asm_out.code_end ();
517
518 /* Do dbx symbols. */
519 timevar_push (TV_SYMOUT);
520
521 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
522 dwarf2out_frame_finish ();
523 #endif
524
525 debuginfo_start ();
526 (*debug_hooks->finish) (main_input_filename);
527 debuginfo_stop ();
528 timevar_pop (TV_SYMOUT);
529
530 /* Output some stuff at end of file if nec. */
531
532 dw2_output_indirect_constants ();
533
534 /* Flush any pending external directives. */
535 process_pending_assemble_externals ();
536 }
537
538 /* Let linker plugin know that this is a slim object and must be LTOed
539 even when user did not ask for it. */
540 if (flag_generate_lto && !flag_fat_lto_objects)
541 {
542 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
543 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE, "__gnu_lto_slim",
544 HOST_WIDE_INT_1U, 8);
545 #elif defined ASM_OUTPUT_ALIGNED_COMMON
546 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
547 HOST_WIDE_INT_1U, 8);
548 #else
549 ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
550 HOST_WIDE_INT_1U,
551 HOST_WIDE_INT_1U);
552 #endif
553 }
554
555 /* Attach a special .ident directive to the end of the file to identify
556 the version of GCC which compiled this code. The format of the .ident
557 string is patterned after the ones produced by native SVR4 compilers. */
558 if (!flag_no_ident)
559 {
560 const char *pkg_version = "(GNU) ";
561 char *ident_str;
562
563 if (strcmp ("(GCC) ", pkgversion_string))
564 pkg_version = pkgversion_string;
565
566 ident_str = ACONCAT (("GCC: ", pkg_version, version_string, NULL));
567 targetm.asm_out.output_ident (ident_str);
568 }
569
570 /* Auto profile finalization. */
571 if (flag_auto_profile)
572 end_auto_profile ();
573
574 /* Invoke registered plugin callbacks. */
575 invoke_plugin_callbacks (PLUGIN_FINISH_UNIT, NULL);
576
577 /* This must be at the end. Some target ports emit end of file directives
578 into the assembly file here, and hence we cannot output anything to the
579 assembly file after this point. */
580 targetm.asm_out.file_end ();
581
582 timevar_stop (TV_PHASE_LATE_ASM);
583 }
584
585 /* Print version information to FILE.
586 Each line begins with INDENT (for the case where FILE is the
587 assembler output file).
588
589 If SHOW_GLOBAL_STATE is true (for cc1 etc), we are within the compiler
590 proper and can print pertinent state (e.g. params and plugins).
591
592 If SHOW_GLOBAL_STATE is false (for use by libgccjit), we are outside the
593 compiler, and we don't hold the mutex on the compiler's global state:
594 we can't print params and plugins, since they might not be initialized,
595 or might be being manipulated by a compile running in another
596 thread. */
597
598 void
599 print_version (FILE *file, const char *indent, bool show_global_state)
600 {
601 static const char fmt1[] =
602 #ifdef __GNUC__
603 N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
604 #else
605 N_("%s%s%s %sversion %s (%s) compiled by CC, ")
606 #endif
607 ;
608 static const char fmt2[] =
609 N_("GMP version %s, MPFR version %s, MPC version %s, isl version %s\n");
610 static const char fmt3[] =
611 N_("%s%swarning: %s header version %s differs from library version %s.\n");
612 static const char fmt4[] =
613 N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n");
614 #ifndef __VERSION__
615 #define __VERSION__ "[?]"
616 #endif
617 fprintf (file,
618 file == stderr ? _(fmt1) : fmt1,
619 indent, *indent != 0 ? " " : "",
620 lang_hooks.name, pkgversion_string, version_string, TARGET_NAME,
621 indent, __VERSION__);
622
623 /* We need to stringify the GMP macro values. Ugh, gmp_version has
624 two string formats, "i.j.k" and "i.j" when k is zero. As of
625 gmp-4.3.0, GMP always uses the 3 number format. */
626 #define GCC_GMP_STRINGIFY_VERSION3(X) #X
627 #define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3 (X)
628 #define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z))
629 #define GCC_GMP_VERSION \
630 GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
631 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0
632 #define GCC_GMP_STRINGIFY_VERSION \
633 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \
634 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR)
635 #else
636 #define GCC_GMP_STRINGIFY_VERSION \
637 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \
638 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR) "." \
639 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_PATCHLEVEL)
640 #endif
641 fprintf (file,
642 file == stderr ? _(fmt2) : fmt2,
643 GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING,
644 #ifndef HAVE_isl
645 "none"
646 #else
647 isl_version ()
648 #endif
649 );
650 if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
651 fprintf (file,
652 file == stderr ? _(fmt3) : fmt3,
653 indent, *indent != 0 ? " " : "",
654 "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version);
655 if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ()))
656 fprintf (file,
657 file == stderr ? _(fmt3) : fmt3,
658 indent, *indent != 0 ? " " : "",
659 "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
660 if (strcmp (MPC_VERSION_STRING, mpc_get_version ()))
661 fprintf (file,
662 file == stderr ? _(fmt3) : fmt3,
663 indent, *indent != 0 ? " " : "",
664 "MPC", MPC_VERSION_STRING, mpc_get_version ());
665
666 if (show_global_state)
667 {
668 fprintf (file,
669 file == stderr ? _(fmt4) : fmt4,
670 indent, *indent != 0 ? " " : "",
671 param_ggc_min_expand, param_ggc_min_heapsize);
672
673 print_plugins_versions (file, indent);
674 }
675 }
676
677
678
679 /* Open assembly code output file. Do this even if -fsyntax-only is
680 on, because then the driver will have provided the name of a
681 temporary file or bit bucket for us. NAME is the file specified on
682 the command line, possibly NULL. */
683 static void
684 init_asm_output (const char *name)
685 {
686 if (name == NULL && asm_file_name == 0)
687 asm_out_file = stdout;
688 else
689 {
690 if (asm_file_name == 0)
691 {
692 int len = strlen (dump_base_name);
693 char *dumpname = XNEWVEC (char, len + 6);
694
695 memcpy (dumpname, dump_base_name, len + 1);
696 strip_off_ending (dumpname, len);
697 strcat (dumpname, ".s");
698 asm_file_name = dumpname;
699 }
700 if (!strcmp (asm_file_name, "-"))
701 asm_out_file = stdout;
702 else if (!canonical_filename_eq (asm_file_name, name)
703 || !strcmp (asm_file_name, HOST_BIT_BUCKET))
704 asm_out_file = fopen (asm_file_name, "w");
705 else
706 /* Use UNKOWN_LOCATION to prevent gcc from printing the first
707 line in the current file. */
708 fatal_error (UNKNOWN_LOCATION,
709 "input file %qs is the same as output file",
710 asm_file_name);
711 if (asm_out_file == 0)
712 fatal_error (UNKNOWN_LOCATION,
713 "cannot open %qs for writing: %m", asm_file_name);
714 }
715
716 if (!flag_syntax_only && !(global_dc->lang_mask & CL_LTODump))
717 {
718 targetm.asm_out.file_start ();
719
720 if (flag_record_gcc_switches)
721 {
722 if (targetm.asm_out.record_gcc_switches)
723 {
724 const char *str
725 = gen_producer_string (lang_hooks.name,
726 save_decoded_options,
727 save_decoded_options_count);
728 targetm.asm_out.record_gcc_switches (str);
729 }
730 else
731 inform (UNKNOWN_LOCATION,
732 "%<-frecord-gcc-switches%> is not supported by "
733 "the current target");
734 }
735
736 if (flag_verbose_asm)
737 {
738 print_version (asm_out_file, ASM_COMMENT_START, true);
739 fputs (ASM_COMMENT_START, asm_out_file);
740 fputs (" options passed: ", asm_out_file);
741 char *cmdline = gen_command_line_string (save_decoded_options,
742 save_decoded_options_count);
743 fputs (cmdline, asm_out_file);
744 free (cmdline);
745 fputc ('\n', asm_out_file);
746 }
747 }
748 }
749
750 /* A helper function; used as the reallocator function for cpp's line
751 table. */
752 static void *
753 realloc_for_line_map (void *ptr, size_t len)
754 {
755 return ggc_realloc (ptr, len);
756 }
757
758 /* A helper function: used as the allocator function for
759 identifier_to_locale. */
760 static void *
761 alloc_for_identifier_to_locale (size_t len)
762 {
763 return ggc_alloc_atomic (len);
764 }
765
766 /* Output stack usage information. */
767 static void
768 output_stack_usage_1 (FILE *cf)
769 {
770 static bool warning_issued = false;
771 enum stack_usage_kind_type { STATIC = 0, DYNAMIC, DYNAMIC_BOUNDED };
772 const char *stack_usage_kind_str[] = {
773 "static",
774 "dynamic",
775 "dynamic,bounded"
776 };
777 HOST_WIDE_INT stack_usage = current_function_static_stack_size;
778 enum stack_usage_kind_type stack_usage_kind;
779
780 if (stack_usage < 0)
781 {
782 if (!warning_issued)
783 {
784 warning (0, "stack usage computation not supported for this target");
785 warning_issued = true;
786 }
787 return;
788 }
789
790 stack_usage_kind = STATIC;
791
792 /* Add the maximum amount of space pushed onto the stack. */
793 if (maybe_ne (current_function_pushed_stack_size, 0))
794 {
795 HOST_WIDE_INT extra;
796 if (current_function_pushed_stack_size.is_constant (&extra))
797 {
798 stack_usage += extra;
799 stack_usage_kind = DYNAMIC_BOUNDED;
800 }
801 else
802 {
803 extra = constant_lower_bound (current_function_pushed_stack_size);
804 stack_usage += extra;
805 stack_usage_kind = DYNAMIC;
806 }
807 }
808
809 /* Now on to the tricky part: dynamic stack allocation. */
810 if (current_function_allocates_dynamic_stack_space)
811 {
812 if (stack_usage_kind != DYNAMIC)
813 {
814 if (current_function_has_unbounded_dynamic_stack_size)
815 stack_usage_kind = DYNAMIC;
816 else
817 stack_usage_kind = DYNAMIC_BOUNDED;
818 }
819
820 /* Add the size even in the unbounded case, this can't hurt. */
821 stack_usage += current_function_dynamic_stack_size;
822 }
823
824 if (cf && flag_callgraph_info & CALLGRAPH_INFO_STACK_USAGE)
825 fprintf (cf, "\\n" HOST_WIDE_INT_PRINT_DEC " bytes (%s)",
826 stack_usage,
827 stack_usage_kind_str[stack_usage_kind]);
828
829 if (stack_usage_file)
830 {
831 print_decl_identifier (stack_usage_file, current_function_decl,
832 PRINT_DECL_ORIGIN | PRINT_DECL_NAME
833 | 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]);
836 }
837
838 if (warn_stack_usage >= 0 && warn_stack_usage < HOST_WIDE_INT_MAX)
839 {
840 const location_t loc = DECL_SOURCE_LOCATION (current_function_decl);
841
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)
845 {
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);
853 }
854 }
855 }
856
857 /* Dump placeholder node for indirect calls in VCG format. */
858
859 #define INDIRECT_CALL_NAME "__indirect_call"
860
861 static void
862 dump_final_node_vcg_start (FILE *f, tree decl)
863 {
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)
871 {
872 print_decl_identifier (f, decl, PRINT_DECL_NAME);
873 fputs ("\\n", f);
874 print_decl_identifier (f, decl, PRINT_DECL_ORIGIN);
875 }
876 else
877 fputs ("Indirect Call Placeholder", f);
878 }
879
880 /* Dump final cgraph edge in VCG format. */
881
882 static void
883 dump_final_callee_vcg (FILE *f, location_t location, tree callee)
884 {
885 if ((!callee || DECL_EXTERNAL (callee))
886 && bitmap_set_bit (callgraph_info_external_printed,
887 callee ? DECL_UID (callee) + 1 : 0))
888 {
889 dump_final_node_vcg_start (f, callee);
890 fputs ("\" shape : ellipse }\n", f);
891 }
892
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)
901 {
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);
906 }
907 fputs ("\" }\n", f);
908 }
909
910 /* Dump final cgraph node in VCG format. */
911
912 static void
913 dump_final_node_vcg (FILE *f)
914 {
915 dump_final_node_vcg_start (f, current_function_decl);
916
917 if (flag_stack_usage_info
918 || (flag_callgraph_info & CALLGRAPH_INFO_STACK_USAGE))
919 output_stack_usage_1 (f);
920
921 if (flag_callgraph_info & CALLGRAPH_INFO_DYNAMIC_ALLOC)
922 {
923 fprintf (f, "\\n%u dynamic objects", vec_safe_length (cfun->su->dallocs));
924
925 unsigned i;
926 callinfo_dalloc *cda;
927 FOR_EACH_VEC_SAFE_ELT (cfun->su->dallocs, i, cda)
928 {
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);
932 }
933
934 vec_free (cfun->su->dallocs);
935 cfun->su->dallocs = NULL;
936 }
937
938 fputs ("\" }\n", f);
939
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;
946 }
947
948 /* Output stack usage and callgraph info, as requested. */
949 void
950 output_stack_usage (void)
951 {
952 if (flag_callgraph_info)
953 dump_final_node_vcg (callgraph_info_file);
954 else
955 output_stack_usage_1 (NULL);
956 }
957
958 /* Open an auxiliary output file. */
959 static FILE *
960 open_auxiliary_file (const char *ext)
961 {
962 char *filename;
963 FILE *file;
964
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;
971 }
972
973 /* Alternative diagnostics callback for reentered ICE reporting. */
974
975 static void
976 internal_error_reentered (diagnostic_context *, const char *, va_list *)
977 {
978 /* Flush the dump file if emergency_dump_function itself caused an ICE. */
979 if (dump_file)
980 fflush (dump_file);
981 }
982
983 /* Auxiliary callback for the diagnostics code. */
984
985 static void
986 internal_error_function (diagnostic_context *, const char *, va_list *)
987 {
988 global_dc->internal_error = internal_error_reentered;
989 warn_if_plugins ();
990 emergency_dump_function ();
991 }
992
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)
998 {
999 const char *p;
1000
1001 p = argv0 + strlen (argv0);
1002 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
1003 --p;
1004 progname = p;
1005
1006 xmalloc_set_program_name (progname);
1007
1008 hex_init ();
1009
1010 /* Unlock the stdio streams. */
1011 unlock_std_streams ();
1012
1013 gcc_init_libintl ();
1014
1015 identifier_to_locale_alloc = alloc_for_identifier_to_locale;
1016 identifier_to_locale_free = ggc_free;
1017
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);
1025
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;
1051
1052 if (init_signals)
1053 {
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
1073
1074 /* Other host-specific signal setup. */
1075 (*host_hooks.extra_signals)();
1076 }
1077
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 ();
1089
1090 /* Initialize register usage now so switches may override. */
1091 init_reg_sets ();
1092
1093 /* Create the singleton holder for global state. This creates the
1094 dump manager. */
1095 g = new gcc::context ();
1096
1097 /* Allow languages and middle-end to register their dumps before the
1098 optimization passes. */
1099 g->get_dumps ()->register_dumps ();
1100
1101 /* Create the passes. */
1102 g->set_passes (new gcc::pass_manager (g));
1103
1104 symtab = new (ggc_alloc <symbol_table> ()) symbol_table ();
1105
1106 statistics_early_init ();
1107 debuginfo_early_init ();
1108 }
1109
1110 /* Return true if the current target supports -fsection-anchors. */
1111
1112 static bool
1113 target_supports_section_anchors_p (void)
1114 {
1115 if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0)
1116 return false;
1117
1118 if (targetm.asm_out.output_anchor == NULL)
1119 return false;
1120
1121 return true;
1122 }
1123
1124 /* Parse "N[:M][:...]" into struct align_flags A.
1125 VALUES contains parsed values (in reverse order), all processed
1126 values are popped. */
1127
1128 static void
1129 read_log_maxskip (auto_vec<unsigned> &values, align_flags_tuple *a)
1130 {
1131 unsigned n = values.pop ();
1132 if (n != 0)
1133 a->log = floor_log2 (n * 2 - 1);
1134
1135 if (values.is_empty ())
1136 a->maxskip = n ? n - 1 : 0;
1137 else
1138 {
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;
1144 }
1145
1146 /* Normalize the tuple. */
1147 a->normalize ();
1148 }
1149
1150 /* Parse "N[:M[:N2[:M2]]]" string FLAG into a pair of struct align_flags. */
1151
1152 static void
1153 parse_N_M (const char *flag, align_flags &a)
1154 {
1155 if (flag)
1156 {
1157 static hash_map <nofree_string_hash, align_flags> cache;
1158 align_flags *entry = cache.get (flag);
1159 if (entry)
1160 {
1161 a = *entry;
1162 return;
1163 }
1164
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;
1170
1171 /* Reverse values for easier manipulation. */
1172 result_values.reverse ();
1173
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
1179 {
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: */
1189
1190 int align = 1 << a.levels[0].log;
1191 int subalign = 1 << SUBALIGN_LOG;
1192
1193 if (a.levels[0].log > SUBALIGN_LOG
1194 && a.levels[0].maxskip >= subalign - 1)
1195 {
1196 /* Set N2 unless subalign can never have any effect. */
1197 if (align > a.levels[0].maxskip + 1)
1198 {
1199 a.levels[1].log = SUBALIGN_LOG;
1200 a.levels[1].normalize ();
1201 }
1202 }
1203 }
1204 #endif
1205
1206 /* Cache seen value. */
1207 cache.put (flag, a);
1208 }
1209 }
1210
1211 /* Process -falign-foo=N[:M[:N2[:M2]]] options. */
1212
1213 void
1214 parse_alignment_opts (void)
1215 {
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);
1220 }
1221
1222 /* Process the options that have been parsed. */
1223 static void
1224 process_options (bool no_backend)
1225 {
1226 const char *language_string = lang_hooks.name;
1227
1228 maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT;
1229
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;
1235
1236 if (flag_diagnostics_generate_patch)
1237 global_dc->edit_context_ptr = new edit_context ();
1238
1239 /* Avoid any informative notes in the second run of -fcompare-debug. */
1240 if (flag_compare_debug)
1241 diagnostic_inhibit_notes (global_dc);
1242
1243 if (flag_section_anchors && !target_supports_section_anchors_p ())
1244 {
1245 warning_at (UNKNOWN_LOCATION, OPT_fsection_anchors,
1246 "this target does not support %qs",
1247 "-fsection-anchors");
1248 flag_section_anchors = 0;
1249 }
1250
1251 if (flag_short_enums == 2)
1252 flag_short_enums = targetm.default_short_enums ();
1253
1254 /* Set aux_base_name if not already set. */
1255 if (aux_base_name)
1256 ;
1257 else if (dump_base_name)
1258 {
1259 const char *name = dump_base_name;
1260 int nlen, len;
1261
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)
1265 {
1266 char *p = xstrndup (name, nlen - len);
1267 name = p;
1268 }
1269
1270 aux_base_name = name;
1271 }
1272 else
1273 aux_base_name = "gccaux";
1274
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
1284
1285 if (flag_cf_protection != CF_NONE
1286 && !(flag_cf_protection & CF_SET))
1287 {
1288 if (flag_cf_protection == CF_FULL)
1289 {
1290 error_at (UNKNOWN_LOCATION,
1291 "%<-fcf-protection=full%> is not supported for this "
1292 "target");
1293 flag_cf_protection = CF_NONE;
1294 }
1295 if (flag_cf_protection == CF_BRANCH)
1296 {
1297 error_at (UNKNOWN_LOCATION,
1298 "%<-fcf-protection=branch%> is not supported for this "
1299 "target");
1300 flag_cf_protection = CF_NONE;
1301 }
1302 if (flag_cf_protection == CF_RETURN)
1303 {
1304 error_at (UNKNOWN_LOCATION,
1305 "%<-fcf-protection=return%> is not supported for this "
1306 "target");
1307 flag_cf_protection = CF_NONE;
1308 }
1309 }
1310
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;
1315
1316 if (!abi_version_at_least (2))
1317 {
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;
1322 }
1323
1324 if (flag_non_call_exceptions)
1325 flag_asynchronous_unwind_tables = 1;
1326 if (flag_asynchronous_unwind_tables)
1327 flag_unwind_tables = 1;
1328
1329 if (flag_value_profile_transformations)
1330 flag_profile_values = 1;
1331
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");
1341
1342 user_label_prefix = USER_LABEL_PREFIX;
1343 if (flag_leading_underscore != -1)
1344 {
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))
1349 {
1350 user_label_prefix = flag_leading_underscore ? "_" : "";
1351 }
1352 else
1353 warning_at (UNKNOWN_LOCATION, 0,
1354 "%<-f%sleading-underscore%> not supported on this "
1355 "target machine", flag_leading_underscore ? "" : "no-");
1356 }
1357
1358 /* If we are in verbose mode, write out the version and maybe all the
1359 option flags in use. */
1360 if (version_flag)
1361 {
1362 /* We already printed the version header in main (). */
1363 if (!quiet_flag)
1364 {
1365 fputs ("options passed: ", stderr);
1366 char *cmdline = gen_command_line_string (save_decoded_options,
1367 save_decoded_options_count);
1368
1369 fputs (cmdline, stderr);
1370 free (cmdline);
1371 fputc ('\n', stderr);
1372 }
1373 }
1374
1375 /* CTF is supported for only C at this time. */
1376 if (!lang_GNU_C ()
1377 && ctf_debug_info_level > CTFINFO_LEVEL_NONE)
1378 {
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;
1386 }
1387
1388 if (flag_dump_final_insns && !flag_syntax_only && !no_backend)
1389 {
1390 FILE *final_output = fopen (flag_dump_final_insns, "w");
1391 if (!final_output)
1392 {
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;
1397 }
1398 else if (fclose (final_output))
1399 {
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;
1404 }
1405 }
1406
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;
1412
1413 if (write_symbols == NO_DEBUG)
1414 ;
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
1436 {
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)]);
1441 }
1442
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);
1448
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 ();
1453
1454 if (!OPTION_SET_P (debug_variable_location_views))
1455 {
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);
1463 }
1464 else if (debug_variable_location_views == -1 && dwarf_version != 5)
1465 {
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;
1471 }
1472
1473 if (debug_internal_reset_location_views == 2)
1474 {
1475 debug_internal_reset_location_views
1476 = (debug_variable_location_views
1477 && targetm.reset_location_view);
1478 }
1479 else if (debug_internal_reset_location_views
1480 && !debug_variable_location_views)
1481 {
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;
1486 }
1487
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)
1491 {
1492 warning_at (UNKNOWN_LOCATION, 0,
1493 "%<-ginline-points%> is forced disabled without "
1494 "%<-gstatement-frontiers%>");
1495 debug_inline_points = 0;
1496 }
1497
1498 if (!OPTION_SET_P (flag_tree_cselim))
1499 {
1500 if (HAVE_conditional_move)
1501 flag_tree_cselim = 1;
1502 else
1503 flag_tree_cselim = 0;
1504 }
1505
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)
1510 {
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);
1515 }
1516
1517 if (!targetm_common.have_named_sections)
1518 {
1519 if (flag_function_sections)
1520 {
1521 warning_at (UNKNOWN_LOCATION, 0,
1522 "%<-ffunction-sections%> not supported for this target");
1523 flag_function_sections = 0;
1524 }
1525 if (flag_data_sections)
1526 {
1527 warning_at (UNKNOWN_LOCATION, 0,
1528 "%<-fdata-sections%> not supported for this target");
1529 flag_data_sections = 0;
1530 }
1531 }
1532
1533 if (flag_prefetch_loop_arrays > 0 && !targetm.code_for_prefetch)
1534 {
1535 warning_at (UNKNOWN_LOCATION, 0,
1536 "%<-fprefetch-loop-arrays%> not supported for this target");
1537 flag_prefetch_loop_arrays = 0;
1538 }
1539 else if (flag_prefetch_loop_arrays > 0 && !targetm.have_prefetch ())
1540 {
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;
1545 }
1546
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)
1550 {
1551 warning_at (UNKNOWN_LOCATION, 0,
1552 "%<-fprefetch-loop-arrays%> is not supported with %<-Os%>");
1553 flag_prefetch_loop_arrays = 0;
1554 }
1555
1556 /* The presence of IEEE signaling NaNs, implies all math can trap. */
1557 if (flag_signaling_nans)
1558 flag_trapping_math = 1;
1559
1560 /* We cannot reassociate if we want traps or signed zeros. */
1561 if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))
1562 {
1563 warning_at (UNKNOWN_LOCATION, 0,
1564 "%<-fassociative-math%> disabled; other options take "
1565 "precedence");
1566 flag_associative_math = 0;
1567 }
1568
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)
1572 {
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;
1577 }
1578
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)
1582 {
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;
1587 }
1588
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)
1592 {
1593 warning_at (UNKNOWN_LOCATION, 0,
1594 "%<-fstack-protector%> not supported for this target");
1595 flag_stack_protect = 0;
1596 }
1597 if (!flag_stack_protect)
1598 warn_stack_protect = 0;
1599
1600 /* Address Sanitizer needs porting to each target architecture. */
1601
1602 if ((flag_sanitize & SANITIZE_ADDRESS)
1603 && !FRAME_GROWS_DOWNWARD)
1604 {
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;
1609 }
1610
1611 if ((flag_sanitize & SANITIZE_USER_ADDRESS)
1612 && ((targetm.asan_shadow_offset == NULL)
1613 || (targetm.asan_shadow_offset () == 0)))
1614 {
1615 warning_at (UNKNOWN_LOCATION, 0,
1616 "%<-fsanitize=address%> not supported for this target");
1617 flag_sanitize &= ~SANITIZE_ADDRESS;
1618 }
1619
1620 if ((flag_sanitize & SANITIZE_KERNEL_ADDRESS)
1621 && (targetm.asan_shadow_offset == NULL
1622 && !asan_shadow_offset_set_p ()))
1623 {
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;
1629 }
1630
1631 /* HWAsan requires top byte ignore feature in the backend. */
1632 if (flag_sanitize & SANITIZE_HWADDRESS
1633 && ! targetm.memtag.can_tag_addresses ())
1634 {
1635 warning_at (UNKNOWN_LOCATION, 0, "%qs is not supported for this target",
1636 "-fsanitize=hwaddress");
1637 flag_sanitize &= ~SANITIZE_HWADDRESS;
1638 }
1639
1640 if (flag_sanitize & SANITIZE_SHADOW_CALL_STACK)
1641 {
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%>");
1648 }
1649
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);
1653
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;
1660
1661 /* Enable -Werror=coverage-mismatch when -Werror and -Wno-error
1662 have not been set. */
1663 if (!OPTION_SET_P (warnings_are_errors))
1664 {
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);
1675 }
1676
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;
1681
1682 if (flag_checking >= 2)
1683 hash_table_sanitize_eq_limit
1684 = param_hash_table_verification_limit;
1685
1686 if (flag_large_source_files)
1687 line_table->default_range_bits = 0;
1688
1689 diagnose_options (&global_options, &global_options_set, UNKNOWN_LOCATION);
1690
1691 /* Please don't change global_options after this point, those changes won't
1692 be reflected in optimization_{default,current}_node. */
1693 }
1694
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)
1700 {
1701 /* This depends on stack_pointer_rtx. */
1702 init_fake_stack_mems ();
1703
1704 /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is
1705 mode-dependent. */
1706 init_alias_target ();
1707
1708 /* Depends on HARD_FRAME_POINTER_REGNUM. */
1709 if (!ira_use_lra_p)
1710 init_reload ();
1711
1712 /* Depends on the enabled attribute. */
1713 recog_init ();
1714
1715 /* The following initialization functions need to generate rtl, so
1716 provide a dummy function context for them. */
1717 init_dummy_function_start ();
1718
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 ();
1724
1725 init_expr_target ();
1726 ira_init ();
1727
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;
1731
1732 expand_dummy_function_end ();
1733 }
1734
1735 /* Initialize the compiler back end. This function is called only once,
1736 when starting the compiler. */
1737 static void
1738 backend_init (void)
1739 {
1740 init_emit_once ();
1741
1742 init_rtlanal ();
1743 init_inline_once ();
1744 init_varasm_once ();
1745 save_register_info ();
1746
1747 /* Middle end needs this initialization for default mem attributes
1748 used by early calls to make_decl_rtl. */
1749 init_emit_regs ();
1750
1751 /* Middle end needs this initialization for mode tables used to assign
1752 modes to vector variables. */
1753 init_regs ();
1754 }
1755
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)
1760 {
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 ();
1765
1766 gcc_assert (!this_target_rtl->target_specific_initialized);
1767 }
1768
1769 /* Perform initializations that are lang-dependent or target-dependent.
1770 but matters only for late optimizations and RTL generation. */
1771
1772 static int rtl_initialized;
1773
1774 void
1775 initialize_rtl (void)
1776 {
1777 auto_timevar tv (g_timer, TV_INITIALIZE_RTL);
1778
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;
1784
1785 /* Target specific RTL backend initialization. */
1786 if (!this_target_rtl->target_specific_initialized)
1787 {
1788 backend_init_target ();
1789 this_target_rtl->target_specific_initialized = true;
1790 }
1791 }
1792
1793 /* Language-dependent initialization. Returns nonzero on success. */
1794 static int
1795 lang_dependent_init (const char *name)
1796 {
1797 location_t save_loc = input_location;
1798 if (!dump_base_name)
1799 {
1800 dump_base_name = name && name[0] ? name : "gccdump";
1801
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)
1806 {
1807 const char *base = lbasename (dump_base_name);
1808 const char *ext = strrchr (base, '.');
1809 if (ext)
1810 dump_base_ext = ext;
1811 }
1812 }
1813
1814 /* Other front-end initialization. */
1815 input_location = BUILTINS_LOCATION;
1816 if (lang_hooks.init () == 0)
1817 return 0;
1818 input_location = save_loc;
1819
1820 if (!flag_wpa)
1821 {
1822 init_asm_output (name);
1823
1824 if (!flag_generate_lto && !flag_compare_debug)
1825 {
1826 /* If stack usage information is desired, open the output file. */
1827 if (flag_stack_usage)
1828 stack_usage_file = open_auxiliary_file ("su");
1829
1830 /* If call graph information is desired, open the output file. */
1831 if (flag_callgraph_info)
1832 {
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);
1839 }
1840 }
1841 else
1842 flag_stack_usage = flag_callgraph_info = false;
1843 }
1844
1845 /* This creates various _DECL nodes, so needs to be called after the
1846 front end is initialized. */
1847 init_eh ();
1848
1849 /* Do the target-specific parts of the initialization. */
1850 lang_dependent_init_target ();
1851
1852 if (!flag_wpa)
1853 {
1854 /* If dbx symbol table desired, initialize writing it and output the
1855 predefined types. */
1856 timevar_push (TV_SYMOUT);
1857
1858 /* Now we have the correct original filename, we can initialize
1859 debug output. */
1860 (*debug_hooks->init) (name);
1861
1862 timevar_pop (TV_SYMOUT);
1863 }
1864
1865 return 1;
1866 }
1867
1868
1869 /* Reinitialize everything when target parameters, such as register usage,
1870 have changed. */
1871 void
1872 target_reinit (void)
1873 {
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;
1878
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)
1886 {
1887 optimization_current_node = optimization_default_node;
1888 cl_optimization_restore
1889 (&global_options, &global_options_set,
1890 TREE_OPTIMIZATION (optimization_default_node));
1891 }
1892 this_fn_optabs = this_target_optabs;
1893
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)
1898 {
1899 saved_x_rtl = *crtl;
1900 memset (crtl, '\0', sizeof (*crtl));
1901 regno_reg_rtx = NULL;
1902 }
1903
1904 this_target_rtl->target_specific_initialized = false;
1905
1906 /* This initializes hard_frame_pointer, and calls init_reg_modes_target()
1907 to initialize reg_raw_mode[]. */
1908 init_emit_regs ();
1909
1910 /* This invokes target hooks to set fixed_reg[] etc, which is
1911 mode-dependent. */
1912 init_regs ();
1913
1914 /* Reinitialize lang-dependent parts. */
1915 lang_dependent_init_target ();
1916
1917 /* Restore the original optimization node. */
1918 if (saved_optimization_current_node != optimization_default_node)
1919 {
1920 optimization_current_node = saved_optimization_current_node;
1921 cl_optimization_restore (&global_options, &global_options_set,
1922 TREE_OPTIMIZATION (optimization_current_node));
1923 }
1924 this_fn_optabs = saved_this_fn_optabs;
1925
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)
1929 {
1930 *crtl = saved_x_rtl;
1931 regno_reg_rtx = saved_regno_reg_rtx;
1932 saved_regno_reg_rtx = NULL;
1933 }
1934 }
1935
1936 void
1937 dump_memory_report (const char *header)
1938 {
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);
1947
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);
1961 }
1962
1963 /* Clean up: close opened files, etc. */
1964
1965 static void
1966 finalize (bool no_backend)
1967 {
1968 /* Close the dump files. */
1969 if (flag_gen_aux_info)
1970 {
1971 fclose (aux_info_file);
1972 aux_info_file = NULL;
1973 if (seen_error ())
1974 unlink (aux_info_file_name);
1975 }
1976
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. */
1980
1981 if (asm_out_file)
1982 {
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;
1988 }
1989
1990 if (stack_usage_file)
1991 {
1992 fclose (stack_usage_file);
1993 stack_usage_file = NULL;
1994 }
1995
1996 if (callgraph_info_file)
1997 {
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);
2003 }
2004
2005 if (seen_error ())
2006 coverage_remove_note_file ();
2007
2008 if (!no_backend)
2009 {
2010 statistics_fini ();
2011 debuginfo_fini ();
2012
2013 g->get_passes ()->finish_optimization_passes ();
2014
2015 lra_finish_once ();
2016 }
2017
2018 if (mem_report)
2019 dump_memory_report ("Final");
2020
2021 if (profile_report)
2022 dump_profile_report ();
2023
2024 if (flag_dbg_cnt_list)
2025 dbg_cnt_list_all_counters ();
2026
2027 /* Language-specific end of compilation actions. */
2028 lang_hooks.finish ();
2029 }
2030
2031 static bool
2032 standard_type_bitsize (int bitsize)
2033 {
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;
2044 }
2045
2046 /* Initialize the compiler, and compile the input file. */
2047 static void
2048 do_compile (bool no_backend)
2049 {
2050 /* Don't do any more if an error has already occurred. */
2051 if (!seen_error ())
2052 {
2053 int i;
2054
2055 timevar_start (TV_PHASE_SETUP);
2056
2057 if (flag_save_optimization_record)
2058 {
2059 dump_context::get ().set_json_writer (new optrecord_json_writer ());
2060 }
2061
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 ();
2067
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;
2077
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))
2085 {
2086 const real_format *fmt = REAL_MODE_FORMAT (mode);
2087 if (fmt)
2088 {
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;
2096 }
2097 }
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");
2105
2106 /* Set up the back-end if requested. */
2107 if (!no_backend)
2108 backend_init ();
2109
2110 /* Language-dependent initialization. Returns true on success. */
2111 if (lang_dependent_init (main_input_filename))
2112 {
2113 /* Initialize yet another pass. */
2114
2115 ggc_protect_identifiers = true;
2116
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);
2123
2124 timevar_stop (TV_PHASE_SETUP);
2125
2126 compile_file ();
2127 }
2128 else
2129 {
2130 timevar_stop (TV_PHASE_SETUP);
2131 }
2132
2133 timevar_start (TV_PHASE_FINALIZE);
2134
2135 finalize (no_backend);
2136
2137 timevar_stop (TV_PHASE_FINALIZE);
2138 }
2139 }
2140
2141 toplev::toplev (timer *external_timer,
2142 bool init_signals)
2143 : m_use_TV_TOTAL (external_timer == NULL),
2144 m_init_signals (init_signals)
2145 {
2146 if (external_timer)
2147 g_timer = external_timer;
2148 }
2149
2150 toplev::~toplev ()
2151 {
2152 if (g_timer && m_use_TV_TOTAL)
2153 {
2154 g_timer->stop (TV_TOTAL);
2155 g_timer->print (stderr);
2156 delete g_timer;
2157 g_timer = NULL;
2158 }
2159 }
2160
2161 /* Potentially call timevar_init (which will create g_timevars if it
2162 doesn't already exist). */
2163
2164 void
2165 toplev::start_timevars ()
2166 {
2167 if (time_report || !quiet_flag || flag_detailed_statistics)
2168 timevar_init ();
2169
2170 timevar_start (TV_TOTAL);
2171 }
2172
2173 /* Handle -fself-test. */
2174
2175 void
2176 toplev::run_self_tests ()
2177 {
2178 #if CHECKING_P
2179 /* Reset some state. */
2180 input_location = UNKNOWN_LOCATION;
2181 bitmap_obstack_initialize (NULL);
2182
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 ();
2186
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 */
2192 }
2193
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.
2197
2198 It is not safe to call this function more than once. */
2199
2200 int
2201 toplev::main (int argc, char **argv)
2202 {
2203 /* Parsing and gimplification sometimes need quite large stack.
2204 Increase stack size limits if possible. */
2205 stack_limit_increase (64 * 1024 * 1024);
2206
2207 expandargv (&argc, &argv);
2208
2209 /* Initialization of GCC's environment, and diagnostics. */
2210 general_init (argv[0], m_init_signals);
2211
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 ();
2216
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);
2221
2222 /* Init GGC heuristics must be caller after we initialize
2223 options. */
2224 init_ggc_heuristics ();
2225
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);
2232
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]);
2239
2240 /* Perform language-specific options initialization. */
2241 lang_hooks.init_options (save_decoded_options_count, save_decoded_options);
2242
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);
2249
2250 handle_common_deferred_options ();
2251
2252 init_local_tick ();
2253
2254 initialize_plugins ();
2255
2256 /* Handle the dump options now that plugins have had a chance to install new
2257 passes. */
2258 handle_deferred_dump_options ();
2259
2260 if (version_flag)
2261 print_version (stderr, "", true);
2262
2263 if (help_flag)
2264 print_plugins_help (stderr, "");
2265
2266 /* Exit early if we can (e.g. -help). */
2267 if (!exit_after_options)
2268 {
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);
2277
2278 process_options (no_backend);
2279
2280 if (m_use_TV_TOTAL)
2281 start_timevars ();
2282 do_compile (no_backend);
2283
2284 if (flag_self_test && !seen_error ())
2285 {
2286 if (no_backend)
2287 error_at (UNKNOWN_LOCATION, "self-tests incompatible with %<-E%>");
2288 else
2289 run_self_tests ();
2290 }
2291 }
2292
2293 if (warningcount || errorcount || werrorcount)
2294 print_ignored_options ();
2295
2296 /* Invoke registered plugin callbacks if any. Some plugins could
2297 emit some diagnostics here. */
2298 invoke_plugin_callbacks (PLUGIN_FINISH, NULL);
2299
2300 if (flag_diagnostics_generate_patch)
2301 {
2302 gcc_assert (global_dc->edit_context_ptr);
2303
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);
2308 }
2309
2310 diagnostic_finish (global_dc);
2311
2312 finalize_plugins ();
2313
2314 after_memory_report = true;
2315
2316 if (seen_error () || werrorcount)
2317 return (FATAL_EXIT_CODE);
2318
2319 return (SUCCESS_EXIT_CODE);
2320 }
2321
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)
2326 {
2327 rtl_initialized = false;
2328 this_target_rtl->target_specific_initialized = false;
2329
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 ();
2335
2336 cgraph_cc_finalize ();
2337 cgraphunit_cc_finalize ();
2338 symtab_thunks_cc_finalize ();
2339 dwarf2out_cc_finalize ();
2340 gcse_cc_finalize ();
2341 ipa_cp_cc_finalize ();
2342 ira_costs_cc_finalize ();
2343 tree_cc_finalize ();
2344 reginfo_cc_finalize ();
2345
2346 /* save_decoded_options uses opts_obstack, so these must
2347 be cleaned up together. */
2348 obstack_free (&opts_obstack, NULL);
2349 XDELETEVEC (save_decoded_options);
2350 save_decoded_options = NULL;
2351 save_decoded_options_count = 0;
2352
2353 /* Clean up the context (and pass_manager etc). */
2354 delete g;
2355 g = NULL;
2356
2357 }