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