1 /* Top level of GCC compilers (cc1, cc1plus, etc.)
2 Copyright (C) 1987-2022 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
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
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This is the top level of cc1/c++.
21 It parses command args, opens files, invokes the various passes
22 in the proper order, and counts the time used by each.
23 Error messages and low-level interface to malloc also handled here. */
27 #include "coretypes.h"
32 // sdcpp #include "gimple.h"
33 #include "alloc-pool.h"
36 #include "insn-config.h"
40 #include "diagnostic.h"
42 #include "tree-inline.h"
45 #include "insn-attr.h"
50 #include "tree-diagnostic.h"
53 #include "common/common-target.h"
54 #include "langhooks.h"
55 #include "cfgloop.h" /* for init_set_costs */
56 #include "hosthooks.h"
58 #include "opts-diagnostic.h"
59 #include "stringpool.h"
64 #include "dwarf2out.h"
66 // sdcpp #include "ipa-prop.h"
67 #include "omp-offload.h"
68 #include "edit-context.h"
69 #include "tree-pass.h"
71 // sdcpp #include "ipa-fnsummary.h"
72 #include "print-tree.h"
73 // sdcpp #include "ipa-modref-tree.h"
74 //sdcpp #include "ipa-modref.h"
75 //sdcpp #include "ipa-param-manipulation.h"
78 #define untested() { fprintf (stderr, "@@#\n@@@:%s:%d:%s\n", __FILE__, __LINE__, __func__); }
81 bool flag_wpa
= false;
83 #undef DBX_DEBUGGING_INFO
84 #undef XCOFF_DEBUGGING_INFO
85 #undef DWARF2_DEBUGGING_INFO
86 #undef CTF_DEBUGGING_INFO
87 #undef BTF_DEBUGGING_INFO
89 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
93 #ifdef XCOFF_DEBUGGING_INFO
94 #include "xcoffout.h" /* Needed for external data declarations. */
101 #include <isl/version.h>
104 static void general_init (const char *, bool);
105 // sdcpp static void backend_init (void);
106 static int lang_dependent_init (const char *);
107 static void init_asm_output (const char *);
108 static void finalize (bool);
110 static void crash_signal (int) ATTRIBUTE_NORETURN
;
111 // sdcpp static void compile_file (void);
113 /* Decoded options, and number of such options. */
114 struct cl_decoded_option
*save_decoded_options
;
115 unsigned int save_decoded_options_count
;
117 /* Vector of saved Optimization decoded command line options. */
118 vec
<cl_decoded_option
> *save_opt_decoded_options
;
120 /* Debug hooks - dependent upon command line options. */
122 const struct gcc_debug_hooks
*debug_hooks
;
124 /* The FUNCTION_DECL for the function currently being compiled,
125 or 0 if between functions. */
126 tree current_function_decl
;
128 /* Set to the FUNC_BEGIN label of the current function, or NULL
130 const char * current_function_func_begin_label
;
132 /* A random sequence of characters, unless overridden by user. */
133 static const char *flag_random_seed
;
135 /* A local time stamp derived from the time of compilation. It will be
136 zero if the system cannot provide a time. It will be -1u, if the
137 user has specified a particular random seed. */
140 /* Random number for this compilation */
141 HOST_WIDE_INT random_seed
;
145 /* When non-NULL, indicates that whenever space is allocated on the
146 stack, the resulting stack pointer must not pass this
147 address---that is, for stacks that grow downward, the stack pointer
148 must always be greater than or equal to this address; for stacks
149 that grow upward, the stack pointer must be less than this address.
150 At present, the rtx may be either a REG or a SYMBOL_REF, although
151 the support provided depends on the backend. */
154 class target_flag_state default_target_flag_state
;
155 #if SWITCHABLE_TARGET
156 class target_flag_state
*this_target_flag_state
= &default_target_flag_state
;
158 #define this_target_flag_state (&default_target_flag_state)
161 /* The user symbol prefix after having resolved same. */
162 const char *user_label_prefix
;
164 /* Output files for assembler code (real compiler output)
165 and debugging dumps. */
169 FILE *callgraph_info_file
= NULL
;
170 static bitmap callgraph_info_external_printed
;
171 FILE *stack_usage_file
= NULL
;
173 /* The current working directory of a translation. It's generally the
174 directory from which compilation was initiated, but a preprocessed
175 file may specify the original directory in which it was
178 static const char *src_pwd
;
180 /* Initialize src_pwd with the given string, and return true. If it
181 was already initialized, return false. As a special case, it may
182 be called with a NULL argument to test whether src_pwd has NOT been
186 set_src_pwd (const char *pwd
)
190 if (strcmp (src_pwd
, pwd
) == 0)
196 src_pwd
= xstrdup (pwd
);
200 /* Return the directory from which the translation unit was initiated,
201 in case set_src_pwd() was not called before to assign it a
217 /* Called when the start of a function definition is parsed,
218 this function prints on stderr the name of the function. */
221 announce_function (tree decl
)
225 if (rtl_dump_and_exit
)
226 fprintf (stderr
, "%s ",
227 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl
))));
229 fprintf (stderr
, " %s",
230 identifier_to_locale (lang_hooks
.decl_printable_name (decl
, 2)));
232 pp_needs_newline (global_dc
->printer
) = true;
233 diagnostic_set_last_function (global_dc
, (diagnostic_info
*) NULL
);
238 /* Initialize local_tick with the time of day, or -1 if
239 flag_random_seed is set. */
242 init_local_tick (void)
244 if (!flag_random_seed
)
246 #ifdef HAVE_GETTIMEOFDAY
250 gettimeofday (&tv
, NULL
);
251 local_tick
= (unsigned) tv
.tv_sec
* 1000 + tv
.tv_usec
/ 1000;
255 time_t now
= time (NULL
);
257 if (now
!= (time_t)-1)
258 local_tick
= (unsigned) now
;
266 /* Obtain the random_seed. Unless NOINIT, initialize it if
267 it's not provided in the command line. */
270 get_random_seed (bool noinit
)
272 if (!random_seed
&& !noinit
)
274 int fd
= open ("/dev/urandom", O_RDONLY
);
277 if (read (fd
, &random_seed
, sizeof (random_seed
))
278 != sizeof (random_seed
))
283 random_seed
= local_tick
^ getpid ();
288 /* Set flag_random_seed to VAL, and if non-null, reinitialize random_seed. */
292 set_random_seed (const char *val
)
294 flag_random_seed
= val
;
295 if (flag_random_seed
)
299 /* When the driver passed in a hex number don't crc it again */
300 random_seed
= strtoul (flag_random_seed
, &endp
, 0);
301 if (!(endp
> flag_random_seed
&& *endp
== 0))
302 random_seed
= crc32_string (0, flag_random_seed
);
307 /* Handler for fatal signals, such as SIGSEGV. These are transformed
308 into ICE messages, which is much more user friendly. In case the
309 error printer crashes, reset the signal to prevent infinite recursion. */
312 crash_signal (int signo
)
314 signal (signo
, SIG_DFL
);
316 /* If we crashed while processing an ASM statement, then be a little more
317 graceful. It's most likely the user's fault. */
318 if (this_is_asm_operands
)
320 output_operand_lossage ("unrecoverable error");
321 exit (FATAL_EXIT_CODE
);
324 gcc_assert(false); // sdcpp
325 internal_error ("%s", strsignal (signo
));
328 /* A subroutine of wrapup_global_declarations. We've come to the end of
329 the compilation unit. All deferred variables should be undeferred,
330 and all incomplete decls should be finalized. */
334 wrapup_global_declaration_1 (tree decl
)
336 /* We're not deferring this any longer. Assignment is conditional to
337 avoid needlessly dirtying PCH pages. */
338 if (CODE_CONTAINS_STRUCT (TREE_CODE (decl
), TS_DECL_WITH_VIS
)
339 && DECL_DEFER_OUTPUT (decl
) != 0)
340 DECL_DEFER_OUTPUT (decl
) = 0;
342 if (VAR_P (decl
) && DECL_SIZE (decl
) == 0)
343 lang_hooks
.finish_incomplete_decl (decl
);
346 /* A subroutine of wrapup_global_declarations. Decide whether or not DECL
347 needs to be output. Return true if it is output. */
350 wrapup_global_declaration_2 (tree decl
)
353 if (TREE_ASM_WRITTEN (decl
) || DECL_EXTERNAL (decl
)
354 || (VAR_P (decl
) && DECL_HAS_VALUE_EXPR_P (decl
)))
357 /* Don't write out static consts, unless we still need them.
359 We also keep static consts if not optimizing (for debugging),
360 unless the user specified -fno-keep-static-consts.
361 ??? They might be better written into the debug information.
362 This is possible when using DWARF.
364 A language processor that wants static constants to be always
365 written out (even if it is not used) is responsible for
366 calling rest_of_decl_compilation itself. E.g. the C front-end
367 calls rest_of_decl_compilation from finish_decl.
368 One motivation for this is that is conventional in some
369 environments to write things like:
370 static const char rcsid[] = "... version string ...";
371 intending to force the string to be in the executable.
373 A language processor that would prefer to have unneeded
374 static constants "optimized away" would just defer writing
375 them out until here. E.g. C++ does this, because static
376 constants are often defined in header files.
378 ??? A tempting alternative (for both C and C++) would be
379 to force a constant to be written if and only if it is
380 defined in a main file, as opposed to an include file. */
382 if (VAR_P (decl
) && TREE_STATIC (decl
))
386 node
= varpool_node::get (decl
);
388 if (!node
&& flag_ltrans
)
390 else if (node
&& node
->definition
)
392 else if (node
&& node
->alias
)
394 else if (!symtab
->global_info_ready
396 || TREE_USED (DECL_ASSEMBLER_NAME (decl
))))
398 else if (node
&& node
->analyzed
)
400 else if (DECL_COMDAT (decl
))
402 else if (TREE_READONLY (decl
) && !TREE_PUBLIC (decl
)
403 && (optimize
|| !flag_keep_static_consts
404 || DECL_ARTIFICIAL (decl
)))
409 rest_of_decl_compilation (decl
, 1, 1);
418 /* Do any final processing required for the declarations in VEC, of
419 which there are LEN. We write out inline functions and variables
420 that have been deferred until this point, but which are required.
421 Returns nonzero if anything was put out. */
424 wrapup_global_declarations (tree
*vec
, int len
)
429 bool reconsider
, output_something
= false;
432 for (i
= 0; i
< len
; i
++)
433 wrapup_global_declaration_1 (vec
[i
]);
435 /* Now emit any global variables or functions that we have been
436 putting off. We need to loop in case one of the things emitted
437 here references another one which comes earlier in the list. */
441 for (i
= 0; i
< len
; i
++)
442 reconsider
|= wrapup_global_declaration_2 (vec
[i
]);
444 output_something
= true;
448 return output_something
;
453 /* Compile an entire translation unit. Write a file of assembly
454 output and various debugging dumps. */
460 timevar_start (TV_PHASE_PARSING
);
461 timevar_push (TV_PARSE_GLOBAL
);
463 /* Parse entire file and generate initial debug information. */
464 lang_hooks
.parse_file ();
466 timevar_pop (TV_PARSE_GLOBAL
);
467 timevar_stop (TV_PHASE_PARSING
);
469 if (flag_dump_locations
)
470 dump_location_info (stderr
);
474 /* Compilation is now finished except for writing
475 what's left of the symbol table output. */
477 if (flag_syntax_only
|| flag_wpa
)
480 /* Reset maximum_field_alignment, it can be adjusted by #pragma pack
481 and this shouldn't influence any types built by the middle-end
482 from now on (like gcov_info_type). */
483 maximum_field_alignment
= initial_max_fld_align
* BITS_PER_UNIT
;
485 ggc_protect_identifiers
= false;
487 /* Run the actual compilation process. */
490 timevar_start (TV_PHASE_OPT_GEN
);
491 symtab
->finalize_compilation_unit ();
492 timevar_stop (TV_PHASE_OPT_GEN
);
495 /* Perform any post compilation-proper parser cleanups and
496 processing. This is currently only needed for the C++ parser,
497 which can be hopefully cleaned up so this hook is no longer
499 if (lang_hooks
.decls
.post_compilation_parsing_cleanups
)
500 lang_hooks
.decls
.post_compilation_parsing_cleanups ();
503 // dump_context::get ().finish_any_json_writer ();
508 timevar_start (TV_PHASE_LATE_ASM
);
510 /* Compilation unit is finalized. When producing non-fat LTO object, we are
511 basically finished. */
512 if ((in_lto_p
&& flag_incremental_link
!= INCREMENTAL_LINK_LTO
)
513 || !flag_lto
|| flag_fat_lto_objects
)
515 /* File-scope initialization for AddressSanitizer. */
516 if (flag_sanitize
& SANITIZE_ADDRESS
)
519 if (flag_sanitize
& SANITIZE_THREAD
){
520 gcc_assert(0 && "tsan");
521 //tsan_finish_file ();
525 hwasan_finish_file ();
529 output_shared_constant_pool ();
530 output_object_blocks ();
531 finish_tm_clone_pairs ();
533 /* Write out any pending weak symbol declarations. */
536 /* This must be at the end before unwind and debug info.
537 Some target ports emit PIC setup thunks here. */
538 insn_locations_init ();
539 targetm
.asm_out
.code_end ();
541 /* Do dbx symbols. */
542 timevar_push (TV_SYMOUT
);
544 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
545 dwarf2out_frame_finish ();
549 (*debug_hooks
->finish
) (main_input_filename
);
551 timevar_pop (TV_SYMOUT
);
553 /* Output some stuff at end of file if nec. */
556 // dw2_output_indirect_constants ();
558 /* Flush any pending external directives. */
559 process_pending_assemble_externals ();
562 /* Let linker plugin know that this is a slim object and must be LTOed
563 even when user did not ask for it. */
564 if (flag_generate_lto
&& !flag_fat_lto_objects
)
566 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
567 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file
, NULL_TREE
, "__gnu_lto_slim",
568 HOST_WIDE_INT_1U
, 8);
569 #elif defined ASM_OUTPUT_ALIGNED_COMMON
570 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file
, "__gnu_lto_slim",
571 HOST_WIDE_INT_1U
, 8);
573 ASM_OUTPUT_COMMON (asm_out_file
, "__gnu_lto_slim",
579 /* Attach a special .ident directive to the end of the file to identify
580 the version of GCC which compiled this code. The format of the .ident
581 string is patterned after the ones produced by native SVR4 compilers. */
584 const char *pkg_version
= "(GNU) ";
587 if (strcmp ("(GCC) ", pkgversion_string
))
588 pkg_version
= pkgversion_string
;
590 ident_str
= ACONCAT (("GCC: ", pkg_version
, version_string
, NULL
));
591 targetm
.asm_out
.output_ident (ident_str
);
594 /* Auto profile finalization. */
595 if (flag_auto_profile
)
596 gcc_assert(0 && "profile");
597 // end_auto_profile ();
599 /* Invoke registered plugin callbacks. */
600 invoke_plugin_callbacks (PLUGIN_FINISH_UNIT
, NULL
);
602 /* This must be at the end. Some target ports emit end of file directives
603 into the assembly file here, and hence we cannot output anything to the
604 assembly file after this point. */
605 targetm
.asm_out
.file_end ();
607 timevar_stop (TV_PHASE_LATE_ASM
);
611 /* Print version information to FILE.
612 Each line begins with INDENT (for the case where FILE is the
613 assembler output file).
615 If SHOW_GLOBAL_STATE is true (for cc1 etc), we are within the compiler
616 proper and can print pertinent state (e.g. params and plugins).
618 If SHOW_GLOBAL_STATE is false (for use by libgccjit), we are outside the
619 compiler, and we don't hold the mutex on the compiler's global state:
620 we can't print params and plugins, since they might not be initialized,
621 or might be being manipulated by a compile running in another
625 print_version (FILE *file
, const char *indent
, bool show_global_state
)
627 static const char fmt1
[] =
629 N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
631 N_("%s%s%s %sversion %s (%s) compiled by CC, ")
634 (void) show_global_state
;
636 static const char fmt2
[] =
637 N_("GMP version %s, MPFR version %s, MPC version %s, isl version %s\n");
638 static const char fmt3
[] =
639 N_("%s%swarning: %s header version %s differs from library version %s.\n");
640 static const char fmt4
[] =
641 N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n");
644 #define __VERSION__ "[?]"
647 file
== stderr
? _(fmt1
) : fmt1
,
648 indent
, *indent
!= 0 ? " " : "",
649 lang_hooks
.name
, pkgversion_string
, version_string
, TARGET_NAME
,
650 indent
, __VERSION__
);
652 /* We need to stringify the GMP macro values. Ugh, gmp_version has
653 two string formats, "i.j.k" and "i.j" when k is zero. As of
654 gmp-4.3.0, GMP always uses the 3 number format. */
655 #define GCC_GMP_STRINGIFY_VERSION3(X) #X
656 #define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3 (X)
657 #define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z))
658 #define GCC_GMP_VERSION \
659 GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
660 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0
661 #define GCC_GMP_STRINGIFY_VERSION \
662 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \
663 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR)
665 #define GCC_GMP_STRINGIFY_VERSION \
666 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \
667 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR) "." \
668 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_PATCHLEVEL)
672 file
== stderr
? _(fmt2
) : fmt2
,
673 GCC_GMP_STRINGIFY_VERSION
, MPFR_VERSION_STRING
, MPC_VERSION_STRING
,
680 if (strcmp (GCC_GMP_STRINGIFY_VERSION
, gmp_version
))
682 file
== stderr
? _(fmt3
) : fmt3
,
683 indent
, *indent
!= 0 ? " " : "",
684 "GMP", GCC_GMP_STRINGIFY_VERSION
, gmp_version
);
685 if (strcmp (MPFR_VERSION_STRING
, mpfr_get_version ()))
687 file
== stderr
? _(fmt3
) : fmt3
,
688 indent
, *indent
!= 0 ? " " : "",
689 "MPFR", MPFR_VERSION_STRING
, mpfr_get_version ());
690 if (strcmp (MPC_VERSION_STRING
, mpc_get_version ()))
692 file
== stderr
? _(fmt3
) : fmt3
,
693 indent
, *indent
!= 0 ? " " : "",
694 "MPC", MPC_VERSION_STRING
, mpc_get_version ());
696 if (show_global_state
)
699 file
== stderr
? _(fmt4
) : fmt4
,
700 indent
, *indent
!= 0 ? " " : "",
701 param_ggc_min_expand
, param_ggc_min_heapsize
);
703 print_plugins_versions (file
, indent
);
710 /* Open assembly code output file. Do this even if -fsyntax-only is
711 on, because then the driver will have provided the name of a
712 temporary file or bit bucket for us. NAME is the file specified on
713 the command line, possibly NULL. */
715 init_asm_output (const char *name
)
717 if (name
== NULL
&& asm_file_name
== 0)
718 asm_out_file
= stdout
;
721 if (asm_file_name
== 0)
723 int len
= strlen (dump_base_name
);
724 char *dumpname
= XNEWVEC (char, len
+ 6);
726 memcpy (dumpname
, dump_base_name
, len
+ 1);
727 strip_off_ending (dumpname
, len
);
728 strcat (dumpname
, ".s");
729 asm_file_name
= dumpname
;
731 if (!strcmp (asm_file_name
, "-"))
732 asm_out_file
= stdout
;
733 else if (!canonical_filename_eq (asm_file_name
, name
)
734 || !strcmp (asm_file_name
, HOST_BIT_BUCKET
))
735 asm_out_file
= fopen (asm_file_name
, "w");
737 /* Use UNKOWN_LOCATION to prevent gcc from printing the first
738 line in the current file. */
739 fatal_error (UNKNOWN_LOCATION
,
740 "input file %qs is the same as output file",
742 if (asm_out_file
== 0)
743 fatal_error (UNKNOWN_LOCATION
,
744 "cannot open %qs for writing: %m", asm_file_name
);
748 if (!flag_syntax_only
)
750 targetm
.asm_out
.file_start ();
752 if (flag_record_gcc_switches
)
754 if (targetm
.asm_out
.record_gcc_switches
)
757 = gen_producer_string (lang_hooks
.name
,
758 save_decoded_options
,
759 save_decoded_options_count
);
760 targetm
.asm_out
.record_gcc_switches (str
);
763 inform (UNKNOWN_LOCATION
,
764 "%<-frecord-gcc-switches%> is not supported by "
765 "the current target");
768 if (flag_verbose_asm
)
770 print_version (asm_out_file
, ASM_COMMENT_START
, true);
771 fputs (ASM_COMMENT_START
, asm_out_file
);
772 fputs (" options passed: ", asm_out_file
);
773 char *cmdline
= gen_command_line_string (save_decoded_options
,
774 save_decoded_options_count
);
775 fputs (cmdline
, asm_out_file
);
777 fputc ('\n', asm_out_file
);
783 /* A helper function; used as the reallocator function for cpp's line
786 realloc_for_line_map (void *ptr
, size_t len
)
788 return ggc_realloc (ptr
, len
);
791 /* A helper function: used as the allocator function for
792 identifier_to_locale. */
794 alloc_for_identifier_to_locale (size_t len
)
796 return ggc_alloc_atomic (len
);
800 /* Output stack usage information. */
802 output_stack_usage_1 (FILE *cf
)
804 static bool warning_issued
= false;
805 enum stack_usage_kind_type
{ STATIC
= 0, DYNAMIC
, DYNAMIC_BOUNDED
};
806 const char *stack_usage_kind_str
[] = {
811 HOST_WIDE_INT stack_usage
= current_function_static_stack_size
;
812 enum stack_usage_kind_type stack_usage_kind
;
818 warning (0, "stack usage computation not supported for this target");
819 warning_issued
= true;
824 stack_usage_kind
= STATIC
;
826 /* Add the maximum amount of space pushed onto the stack. */
827 if (maybe_ne (current_function_pushed_stack_size
, 0))
830 if (current_function_pushed_stack_size
.is_constant (&extra
))
832 stack_usage
+= extra
;
833 stack_usage_kind
= DYNAMIC_BOUNDED
;
837 extra
= constant_lower_bound (current_function_pushed_stack_size
);
838 stack_usage
+= extra
;
839 stack_usage_kind
= DYNAMIC
;
843 /* Now on to the tricky part: dynamic stack allocation. */
844 if (current_function_allocates_dynamic_stack_space
)
846 if (stack_usage_kind
!= DYNAMIC
)
848 if (current_function_has_unbounded_dynamic_stack_size
)
849 stack_usage_kind
= DYNAMIC
;
851 stack_usage_kind
= DYNAMIC_BOUNDED
;
854 /* Add the size even in the unbounded case, this can't hurt. */
855 stack_usage
+= current_function_dynamic_stack_size
;
858 if (cf
&& flag_callgraph_info
& CALLGRAPH_INFO_STACK_USAGE
)
859 fprintf (cf
, "\\n" HOST_WIDE_INT_PRINT_DEC
" bytes (%s)",
861 stack_usage_kind_str
[stack_usage_kind
]);
863 if (stack_usage_file
)
865 print_decl_identifier (stack_usage_file
, current_function_decl
,
866 PRINT_DECL_ORIGIN
| PRINT_DECL_NAME
);
867 fprintf (stack_usage_file
, "\t" HOST_WIDE_INT_PRINT_DEC
"\t%s\n",
868 stack_usage
, stack_usage_kind_str
[stack_usage_kind
]);
871 if (warn_stack_usage
>= 0 && warn_stack_usage
< HOST_WIDE_INT_MAX
)
873 const location_t loc
= DECL_SOURCE_LOCATION (current_function_decl
);
875 if (stack_usage_kind
== DYNAMIC
)
876 warning_at (loc
, OPT_Wstack_usage_
, "stack usage might be unbounded");
877 else if (stack_usage
> warn_stack_usage
)
879 if (stack_usage_kind
== DYNAMIC_BOUNDED
)
881 OPT_Wstack_usage_
, "stack usage might be %wu bytes",
884 warning_at (loc
, OPT_Wstack_usage_
, "stack usage is %wu bytes",
890 /* Dump placeholder node for indirect calls in VCG format. */
892 #define INDIRECT_CALL_NAME "__indirect_call"
895 dump_final_node_vcg_start (FILE *f
, tree decl
)
897 fputs ("node: { title: \"", f
);
899 print_decl_identifier (f
, decl
, PRINT_DECL_UNIQUE_NAME
);
901 fputs (INDIRECT_CALL_NAME
, f
);
902 fputs ("\" label: \"", f
);
905 print_decl_identifier (f
, decl
, PRINT_DECL_NAME
);
907 print_decl_identifier (f
, decl
, PRINT_DECL_ORIGIN
);
910 fputs ("Indirect Call Placeholder", f
);
914 /* Dump final cgraph edge in VCG format. */
918 dump_final_callee_vcg (FILE *f
, location_t location
, tree callee
)
920 if ((!callee
|| DECL_EXTERNAL (callee
))
921 && bitmap_set_bit (callgraph_info_external_printed
,
922 callee
? DECL_UID (callee
) + 1 : 0))
924 dump_final_node_vcg_start (f
, callee
);
925 fputs ("\" shape : ellipse }\n", f
);
928 fputs ("edge: { sourcename: \"", f
);
929 print_decl_identifier (f
, current_function_decl
, PRINT_DECL_UNIQUE_NAME
);
930 fputs ("\" targetname: \"", f
);
932 print_decl_identifier (f
, callee
, PRINT_DECL_UNIQUE_NAME
);
934 fputs (INDIRECT_CALL_NAME
, f
);
935 if (LOCATION_LOCUS (location
) != UNKNOWN_LOCATION
)
937 expanded_location loc
;
938 fputs ("\" label: \"", f
);
939 loc
= expand_location (location
);
940 fprintf (f
, "%s:%d:%d", loc
.file
, loc
.line
, loc
.column
);
946 /* Dump final cgraph node in VCG format. */
950 dump_final_node_vcg (FILE *f
)
952 dump_final_node_vcg_start (f
, current_function_decl
);
954 if (flag_stack_usage_info
955 || (flag_callgraph_info
& CALLGRAPH_INFO_STACK_USAGE
))
956 output_stack_usage_1 (f
);
958 if (flag_callgraph_info
& CALLGRAPH_INFO_DYNAMIC_ALLOC
)
960 fprintf (f
, "\\n%u dynamic objects", vec_safe_length (cfun
->su
->dallocs
));
963 callinfo_dalloc
*cda
;
964 FOR_EACH_VEC_SAFE_ELT (cfun
->su
->dallocs
, i
, cda
)
966 expanded_location loc
= expand_location (cda
->location
);
967 fprintf (f
, "\\n %s", cda
->name
);
968 fprintf (f
, " %s:%d:%d", loc
.file
, loc
.line
, loc
.column
);
971 vec_free (cfun
->su
->dallocs
);
972 cfun
->su
->dallocs
= NULL
;
979 FOR_EACH_VEC_SAFE_ELT (cfun
->su
->callees
, i
, c
)
980 dump_final_callee_vcg (f
, c
->location
, c
->decl
);
981 vec_free (cfun
->su
->callees
);
982 cfun
->su
->callees
= NULL
;
985 /* Output stack usage and callgraph info, as requested. */
987 output_stack_usage (void)
989 if (flag_callgraph_info
)
990 dump_final_node_vcg (callgraph_info_file
);
992 output_stack_usage_1 (NULL
);
996 /* Open an auxiliary output file. */
998 open_auxiliary_file (const char *ext
)
1003 filename
= concat (aux_base_name
, ".", ext
, NULL
);
1004 file
= fopen (filename
, "w");
1006 fatal_error (input_location
, "cannot open %s for writing: %m", filename
);
1011 /* Alternative diagnostics callback for reentered ICE reporting. */
1014 internal_error_reentered (diagnostic_context
*, const char *, va_list *)
1016 /* Flush the dump file if emergency_dump_function itself caused an ICE. */
1021 /* Auxiliary callback for the diagnostics code. */
1024 internal_error_function (diagnostic_context
*, const char *, va_list *)
1026 global_dc
->internal_error
= internal_error_reentered
;
1028 emergency_dump_function ();
1031 /* Initialization of the front end environment, before command line
1032 options are parsed. Signal handlers, internationalization etc.
1033 ARGV0 is main's argv[0]. */
1035 general_init (const char *argv0
, bool init_signals
)
1039 p
= argv0
+ strlen (argv0
);
1040 while (p
!= argv0
&& !IS_DIR_SEPARATOR (p
[-1]))
1044 xmalloc_set_program_name (progname
);
1048 /* Unlock the stdio streams. */
1049 unlock_std_streams ();
1051 gcc_init_libintl ();
1053 identifier_to_locale_alloc
= alloc_for_identifier_to_locale
;
1054 identifier_to_locale_free
= ggc_free
;
1056 /* Initialize the diagnostics reporting machinery, so option parsing
1057 can give warnings and errors. */
1058 diagnostic_initialize (global_dc
, N_OPTS
);
1059 global_dc
->lang_mask
= lang_hooks
.option_lang_mask ();
1060 /* Set a default printer. Language specific initializations will
1061 override it later. */
1062 tree_diagnostics_defaults (global_dc
);
1064 global_dc
->show_caret
1065 = global_options_init
.x_flag_diagnostics_show_caret
;
1066 global_dc
->show_labels_p
1067 = global_options_init
.x_flag_diagnostics_show_labels
;
1068 global_dc
->show_line_numbers_p
1069 = global_options_init
.x_flag_diagnostics_show_line_numbers
;
1071 = global_options_init
.x_flag_diagnostics_show_cwe
;
1072 global_dc
->path_format
1073 = (enum diagnostic_path_format
)global_options_init
.x_flag_diagnostics_path_format
;
1074 global_dc
->show_path_depths
1075 = global_options_init
.x_flag_diagnostics_show_path_depths
;
1076 global_dc
->show_option_requested
1077 = global_options_init
.x_flag_diagnostics_show_option
;
1078 global_dc
->min_margin_width
1079 = global_options_init
.x_diagnostics_minimum_margin_width
;
1080 global_dc
->show_column
1081 = global_options_init
.x_flag_show_column
;
1082 global_dc
->internal_error
= internal_error_function
;
1083 global_dc
->option_enabled
= option_enabled
;
1084 global_dc
->option_state
= &global_options
;
1085 global_dc
->option_name
= option_name
;
1086 global_dc
->get_option_url
= get_option_url
;
1088 if (init_signals
&& 0)
1090 /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */
1092 signal (SIGSEGV
, crash_signal
);
1095 signal (SIGILL
, crash_signal
);
1098 signal (SIGBUS
, crash_signal
);
1101 signal (SIGABRT
, crash_signal
);
1103 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
1104 signal (SIGIOT
, crash_signal
);
1107 signal (SIGFPE
, crash_signal
);
1110 /* Other host-specific signal setup. */
1111 // sdcpp (*host_hooks.extra_signals)();
1114 /* Initialize the garbage-collector, string pools and tree type hash
1118 input_location
= UNKNOWN_LOCATION
;
1120 line_table
= ggc_alloc
<line_maps
> ();
1121 linemap_init (line_table
, BUILTINS_LOCATION
);
1122 line_table
->reallocator
= realloc_for_line_map
;
1123 line_table
->round_alloc_size
= ggc_round_alloc_size
;
1124 line_table
->default_range_bits
= 5;
1125 // sdcpp init_ttree ();
1127 /* Initialize register usage now so switches may override. */
1128 // sdcpp init_reg_sets ();
1130 /* Create the singleton holder for global state. This creates the
1132 g
= new gcc::context ();
1134 /* Allow languages and middle-end to register their dumps before the
1135 optimization passes. */
1136 g
->get_dumps ()->register_dumps ();
1138 /* Create the passes. */
1140 // g->set_passes (new gcc::pass_manager (g));
1142 // sdcpp symtab = new (ggc_alloc <symbol_table> ()) symbol_table ();
1144 statistics_early_init ();
1145 // sdcpp debuginfo_early_init ();
1148 /* Return true if the current target supports -fsection-anchors. */
1151 target_supports_section_anchors_p (void)
1154 if (targetm
.min_anchor_offset
== 0 && targetm
.max_anchor_offset
== 0)
1157 if (targetm
.asm_out
.output_anchor
== NULL
)
1166 /* Parse "N[:M][:...]" into struct align_flags A.
1167 VALUES contains parsed values (in reverse order), all processed
1168 values are popped. */
1171 read_log_maxskip (auto_vec
<unsigned> &values
, align_flags_tuple
*a
)
1173 unsigned n
= values
.pop ();
1175 a
->log
= floor_log2 (n
* 2 - 1);
1177 if (values
.is_empty ())
1178 a
->maxskip
= n
? n
- 1 : 0;
1181 unsigned m
= values
.pop ();
1182 /* -falign-foo=N:M means M-1 max bytes of padding, not M. */
1188 /* Normalize the tuple. */
1192 /* Parse "N[:M[:N2[:M2]]]" string FLAG into a pair of struct align_flags. */
1195 parse_N_M (const char *flag
, align_flags
&a
)
1199 static hash_map
<nofree_string_hash
, align_flags
> cache
;
1200 align_flags
*entry
= cache
.get (flag
);
1207 auto_vec
<unsigned> result_values
;
1208 bool r
= parse_and_check_align_values (flag
, NULL
, result_values
, false,
1213 /* Reverse values for easier manipulation. */
1214 result_values
.reverse ();
1216 read_log_maxskip (result_values
, &a
.levels
[0]);
1217 if (!result_values
.is_empty ())
1218 read_log_maxskip (result_values
, &a
.levels
[1]);
1222 /* N2[:M2] is not specified. This arch has a default for N2.
1223 Before -falign-foo=N:M:N2:M2 was introduced, x86 had a tweak.
1224 -falign-functions=N with N > 8 was adding secondary alignment.
1225 -falign-functions=10 was emitting this before every function:
1228 Now this behavior (and more) can be explicitly requested:
1229 -falign-functions=16:10:8
1230 Retain old behavior if N2 is missing: */
1232 int align
= 1 << a
.levels
[0].log
;
1233 int subalign
= 1 << SUBALIGN_LOG
;
1235 if (a
.levels
[0].log
> SUBALIGN_LOG
1236 && a
.levels
[0].maxskip
>= subalign
- 1)
1238 /* Set N2 unless subalign can never have any effect. */
1239 if (align
> a
.levels
[0].maxskip
+ 1)
1241 a
.levels
[1].log
= SUBALIGN_LOG
;
1242 a
.levels
[1].normalize ();
1248 /* Cache seen value. */
1249 cache
.put (flag
, a
);
1253 /* Process -falign-foo=N[:M[:N2[:M2]]] options. */
1256 parse_alignment_opts (void)
1258 parse_N_M (str_align_loops
, align_loops
);
1259 parse_N_M (str_align_jumps
, align_jumps
);
1260 parse_N_M (str_align_labels
, align_labels
);
1261 parse_N_M (str_align_functions
, align_functions
);
1264 /* Process the options that have been parsed. */
1266 process_options (bool no_backend
)
1268 const char *language_string
= lang_hooks
.name
;
1270 // sdcpp maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT;
1272 /* Some machines may reject certain combinations of options. */
1273 location_t saved_location
= input_location
;
1274 input_location
= UNKNOWN_LOCATION
;
1275 // sdcc targetm.target_option.override ();
1276 input_location
= saved_location
;
1278 if (flag_diagnostics_generate_patch
)
1279 global_dc
->edit_context_ptr
= new edit_context ();
1281 /* Avoid any informative notes in the second run of -fcompare-debug. */
1282 if (flag_compare_debug
)
1283 diagnostic_inhibit_notes (global_dc
);
1285 if (flag_section_anchors
&& !target_supports_section_anchors_p ())
1287 warning_at (UNKNOWN_LOCATION
, OPT_fsection_anchors
,
1288 "this target does not support %qs",
1289 "-fsection-anchors");
1290 flag_section_anchors
= 0;
1294 if (flag_short_enums
== 2)
1295 flag_short_enums
= targetm
.default_short_enums ();
1298 /* Set aux_base_name if not already set. */
1301 else if (dump_base_name
)
1303 const char *name
= dump_base_name
;
1306 if (dump_base_ext
&& (len
= strlen (dump_base_ext
))
1307 && (nlen
= strlen (name
)) && nlen
> len
1308 && strcmp (name
+ nlen
- len
, dump_base_ext
) == 0)
1310 char *p
= xstrndup (name
, nlen
- len
);
1314 aux_base_name
= name
;
1317 aux_base_name
= "gccaux";
1321 || flag_loop_nest_optimize
1322 || flag_graphite_identity
1323 || flag_loop_parallelize_all
)
1324 sorry ("Graphite loop optimizations cannot be used (isl is not available) "
1325 "(%<-fgraphite%>, %<-fgraphite-identity%>, "
1326 "%<-floop-nest-optimize%>, %<-floop-parallelize-all%>)");
1329 if (flag_cf_protection
!= CF_NONE
1330 && !(flag_cf_protection
& CF_SET
))
1332 if (flag_cf_protection
== CF_FULL
)
1334 error_at (UNKNOWN_LOCATION
,
1335 "%<-fcf-protection=full%> is not supported for this "
1337 flag_cf_protection
= CF_NONE
;
1339 if (flag_cf_protection
== CF_BRANCH
)
1341 error_at (UNKNOWN_LOCATION
,
1342 "%<-fcf-protection=branch%> is not supported for this "
1344 flag_cf_protection
= CF_NONE
;
1346 if (flag_cf_protection
== CF_RETURN
)
1348 error_at (UNKNOWN_LOCATION
,
1349 "%<-fcf-protection=return%> is not supported for this "
1351 flag_cf_protection
= CF_NONE
;
1355 /* One region RA really helps to decrease the code size. */
1356 if (!OPTION_SET_P (flag_ira_region
))
1358 = optimize_size
|| !optimize
? IRA_REGION_ONE
: IRA_REGION_MIXED
;
1360 if (!abi_version_at_least (2))
1362 /* -fabi-version=1 support was removed after GCC 4.9. */
1363 error_at (UNKNOWN_LOCATION
,
1364 "%<-fabi-version=1%> is no longer supported");
1365 flag_abi_version
= 2;
1368 if (flag_non_call_exceptions
)
1369 flag_asynchronous_unwind_tables
= 1;
1370 if (flag_asynchronous_unwind_tables
)
1371 flag_unwind_tables
= 1;
1373 if (flag_value_profile_transformations
)
1374 flag_profile_values
= 1;
1376 /* Warn about options that are not supported on this machine. */
1377 #ifndef INSN_SCHEDULING
1378 if (flag_schedule_insns
|| flag_schedule_insns_after_reload
)
1379 warning_at (UNKNOWN_LOCATION
, 0,
1380 "instruction scheduling not supported on this target machine");
1382 if (!DELAY_SLOTS
&& flag_delayed_branch
)
1383 warning_at (UNKNOWN_LOCATION
, 0,
1384 "this target machine does not have delayed branches");
1386 user_label_prefix
= USER_LABEL_PREFIX
;
1387 if (flag_leading_underscore
!= -1)
1389 /* If the default prefix is more complicated than "" or "_",
1390 issue a warning and ignore this option. */
1391 if (user_label_prefix
[0] == 0 ||
1392 (user_label_prefix
[0] == '_' && user_label_prefix
[1] == 0))
1394 user_label_prefix
= flag_leading_underscore
? "_" : "";
1397 warning_at (UNKNOWN_LOCATION
, 0,
1398 "%<-f%sleading-underscore%> not supported on this "
1399 "target machine", flag_leading_underscore
? "" : "no-");
1402 /* If we are in verbose mode, write out the version and maybe all the
1403 option flags in use. */
1406 print_version (stderr
, "", true);
1409 fputs ("options passed: ", stderr
);
1410 char *cmdline
= gen_command_line_string (save_decoded_options
,
1411 save_decoded_options_count
);
1413 fputs (cmdline
, stderr
);
1415 fputc ('\n', stderr
);
1419 /* CTF is supported for only C at this time. */
1421 && ctf_debug_info_level
> CTFINFO_LEVEL_NONE
)
1423 /* Compiling with -flto results in frontend language of GNU GIMPLE. It
1424 is not useful to warn in that case. */
1425 if (!startswith (lang_hooks
.name
, "GNU GIMPLE"))
1426 inform (UNKNOWN_LOCATION
,
1427 "CTF debug info requested, but not supported for %qs frontend",
1429 ctf_debug_info_level
= CTFINFO_LEVEL_NONE
;
1432 if (flag_dump_final_insns
&& !flag_syntax_only
&& !no_backend
)
1434 FILE *final_output
= fopen (flag_dump_final_insns
, "w");
1437 error_at (UNKNOWN_LOCATION
,
1438 "could not open final insn dump file %qs: %m",
1439 flag_dump_final_insns
);
1440 flag_dump_final_insns
= NULL
;
1442 else if (fclose (final_output
))
1444 error_at (UNKNOWN_LOCATION
,
1445 "could not close zeroed insn dump file %qs: %m",
1446 flag_dump_final_insns
);
1447 flag_dump_final_insns
= NULL
;
1451 /* A lot of code assumes write_symbols == NO_DEBUG if the debugging
1453 if (debug_info_level
== DINFO_LEVEL_NONE
1454 && ctf_debug_info_level
== CTFINFO_LEVEL_NONE
)
1455 write_symbols
= NO_DEBUG
;
1457 /* Warn if STABS debug gets enabled and is not the default. */
1458 if (PREFERRED_DEBUGGING_TYPE
!= DBX_DEBUG
&& (write_symbols
& DBX_DEBUG
))
1459 warning (0, "STABS debugging information is obsolete and not "
1460 "supported anymore");
1462 if (write_symbols
== NO_DEBUG
)
1465 #if defined(DBX_DEBUGGING_INFO)
1466 else if (write_symbols
== DBX_DEBUG
)
1467 debug_hooks
= &dbx_debug_hooks
;
1469 #if defined(XCOFF_DEBUGGING_INFO)
1470 else if (write_symbols
== XCOFF_DEBUG
)
1471 debug_hooks
= &xcoff_debug_hooks
;
1473 #ifdef DWARF2_DEBUGGING_INFO
1474 else if (dwarf_debuginfo_p ())
1475 debug_hooks
= &dwarf2_debug_hooks
;
1477 #ifdef CTF_DEBUGGING_INFO
1478 else if (ctf_debuginfo_p ())
1479 debug_hooks
= &dwarf2_debug_hooks
;
1481 #ifdef BTF_DEBUGGING_INFO
1482 else if (btf_debuginfo_p ())
1483 debug_hooks
= &dwarf2_debug_hooks
;
1485 #ifdef VMS_DEBUGGING_INFO
1486 else if (write_symbols
== VMS_DEBUG
|| write_symbols
== VMS_AND_DWARF2_DEBUG
)
1487 debug_hooks
= &vmsdbg_debug_hooks
;
1489 #ifdef DWARF2_LINENO_DEBUGGING_INFO
1490 else if (write_symbols
== DWARF2_DEBUG
)
1491 debug_hooks
= &dwarf2_lineno_debug_hooks
;
1496 gcc_assert (debug_set_count (write_symbols
) <= 1);
1497 error_at (UNKNOWN_LOCATION
,
1498 "target system does not support the %qs debug format",
1499 debug_type_names
[debug_set_to_format (write_symbols
)]);
1502 /* We know which debug output will be used so we can set flag_var_tracking
1503 and flag_var_tracking_uninit if the user has not specified them. */
1504 if (debug_info_level
< DINFO_LEVEL_NORMAL
1505 || !dwarf_debuginfo_p ()
1506 || debug_hooks
->var_location
== do_nothing_debug_hooks
.var_location
)
1508 if ((OPTION_SET_P (flag_var_tracking
) && flag_var_tracking
== 1)
1509 || (OPTION_SET_P (flag_var_tracking_uninit
)
1510 && flag_var_tracking_uninit
== 1))
1512 if (debug_info_level
< DINFO_LEVEL_NORMAL
)
1513 warning_at (UNKNOWN_LOCATION
, 0,
1514 "variable tracking requested, but useless unless "
1515 "producing debug info");
1517 warning_at (UNKNOWN_LOCATION
, 0,
1518 "variable tracking requested, but not supported "
1519 "by this debug format");
1521 flag_var_tracking
= 0;
1522 flag_var_tracking_uninit
= 0;
1523 flag_var_tracking_assignments
= 0;
1526 /* The debug hooks are used to implement -fdump-go-spec because it
1527 gives a simple and stable API for all the information we need to
1529 if (flag_dump_go_spec
!= NULL
)
1530 debug_hooks
= dump_go_spec_init (flag_dump_go_spec
, debug_hooks
);
1532 if (!OPTION_SET_P (dwarf2out_as_loc_support
))
1533 dwarf2out_as_loc_support
= dwarf2out_default_as_loc_support ();
1534 if (!OPTION_SET_P (dwarf2out_as_locview_support
))
1535 dwarf2out_as_locview_support
= dwarf2out_default_as_locview_support ();
1537 if (!OPTION_SET_P (debug_variable_location_views
))
1539 debug_variable_location_views
1540 = (flag_var_tracking
1541 && debug_info_level
>= DINFO_LEVEL_NORMAL
1542 && dwarf_debuginfo_p ()
1544 && dwarf2out_as_loc_support
1545 && dwarf2out_as_locview_support
);
1547 else if (debug_variable_location_views
== -1 && dwarf_version
!= 5)
1549 warning_at (UNKNOWN_LOCATION
, 0,
1550 "without %<-gdwarf-5%>, "
1551 "%<-gvariable-location-views=incompat5%> "
1552 "is equivalent to %<-gvariable-location-views%>");
1553 debug_variable_location_views
= 1;
1557 if (debug_internal_reset_location_views
== 2)
1559 debug_internal_reset_location_views
1560 = (debug_variable_location_views
1561 && targetm
.reset_location_view
);
1563 else if (debug_internal_reset_location_views
1564 && !debug_variable_location_views
)
1566 warning_at (UNKNOWN_LOCATION
, 0,
1567 "%<-ginternal-reset-location-views%> is forced disabled "
1568 "without %<-gvariable-location-views%>");
1569 debug_internal_reset_location_views
= 0;
1573 if (!OPTION_SET_P (debug_inline_points
))
1574 debug_inline_points
= debug_variable_location_views
;
1575 else if (debug_inline_points
&& !debug_nonbind_markers_p
)
1577 warning_at (UNKNOWN_LOCATION
, 0,
1578 "%<-ginline-points%> is forced disabled without "
1579 "%<-gstatement-frontiers%>");
1580 debug_inline_points
= 0;
1583 if (!OPTION_SET_P (flag_tree_cselim
))
1585 if (HAVE_conditional_move
)
1586 flag_tree_cselim
= 1;
1588 flag_tree_cselim
= 0;
1591 /* If auxiliary info generation is desired, open the output file.
1592 This goes in the same directory as the source file--unlike
1593 all the other output files. */
1594 if (flag_gen_aux_info
)
1596 aux_info_file
= fopen (aux_info_file_name
, "w");
1597 if (aux_info_file
== 0)
1598 fatal_error (UNKNOWN_LOCATION
,
1599 "cannot open %s: %m", aux_info_file_name
);
1603 if (!targetm_common
.have_named_sections
)
1605 if (flag_function_sections
)
1607 warning_at (UNKNOWN_LOCATION
, 0,
1608 "%<-ffunction-sections%> not supported for this target");
1609 flag_function_sections
= 0;
1611 if (flag_data_sections
)
1613 warning_at (UNKNOWN_LOCATION
, 0,
1614 "%<-fdata-sections%> not supported for this target");
1615 flag_data_sections
= 0;
1619 if (flag_prefetch_loop_arrays
> 0 && !targetm
.code_for_prefetch
)
1621 warning_at (UNKNOWN_LOCATION
, 0,
1622 "%<-fprefetch-loop-arrays%> not supported for this target");
1623 flag_prefetch_loop_arrays
= 0;
1625 else if (flag_prefetch_loop_arrays
> 0 && !targetm
.have_prefetch ())
1627 warning_at (UNKNOWN_LOCATION
, 0,
1628 "%<-fprefetch-loop-arrays%> not supported for this target "
1629 "(try %<-march%> switches)");
1630 flag_prefetch_loop_arrays
= 0;
1634 /* This combination of options isn't handled for i386 targets and doesn't
1635 make much sense anyway, so don't allow it. */
1636 if (flag_prefetch_loop_arrays
> 0 && optimize_size
)
1638 warning_at (UNKNOWN_LOCATION
, 0,
1639 "%<-fprefetch-loop-arrays%> is not supported with %<-Os%>");
1640 flag_prefetch_loop_arrays
= 0;
1643 /* The presence of IEEE signaling NaNs, implies all math can trap. */
1644 if (flag_signaling_nans
)
1645 flag_trapping_math
= 1;
1647 /* We cannot reassociate if we want traps or signed zeros. */
1648 if (flag_associative_math
&& (flag_trapping_math
|| flag_signed_zeros
))
1650 warning_at (UNKNOWN_LOCATION
, 0,
1651 "%<-fassociative-math%> disabled; other options take "
1653 flag_associative_math
= 0;
1656 /* -fstack-clash-protection is not currently supported on targets
1657 where the stack grows up. */
1658 if (flag_stack_clash_protection
&& !STACK_GROWS_DOWNWARD
)
1660 warning_at (UNKNOWN_LOCATION
, 0,
1661 "%<-fstack-clash-protection%> is not supported on targets "
1662 "where the stack grows from lower to higher addresses");
1663 flag_stack_clash_protection
= 0;
1666 /* We cannot support -fstack-check= and -fstack-clash-protection at
1668 if (flag_stack_check
!= NO_STACK_CHECK
&& flag_stack_clash_protection
)
1670 warning_at (UNKNOWN_LOCATION
, 0,
1671 "%<-fstack-check=%> and %<-fstack-clash_protection%> are "
1672 "mutually exclusive; disabling %<-fstack-check=%>");
1673 flag_stack_check
= NO_STACK_CHECK
;
1676 /* Targets must be able to place spill slots at lower addresses. If the
1677 target already uses a soft frame pointer, the transition is trivial. */
1678 if (!FRAME_GROWS_DOWNWARD
&& flag_stack_protect
)
1680 warning_at (UNKNOWN_LOCATION
, 0,
1681 "%<-fstack-protector%> not supported for this target");
1682 flag_stack_protect
= 0;
1684 if (!flag_stack_protect
)
1685 warn_stack_protect
= 0;
1687 /* Address Sanitizer needs porting to each target architecture. */
1689 if ((flag_sanitize
& SANITIZE_ADDRESS
)
1690 && !FRAME_GROWS_DOWNWARD
)
1692 warning_at (UNKNOWN_LOCATION
, 0,
1693 "%<-fsanitize=address%> and %<-fsanitize=kernel-address%> "
1694 "are not supported for this target");
1695 flag_sanitize
&= ~SANITIZE_ADDRESS
;
1699 if ((flag_sanitize
& SANITIZE_USER_ADDRESS
)
1700 && ((targetm
.asan_shadow_offset
== NULL
)
1701 || (targetm
.asan_shadow_offset () == 0)))
1703 warning_at (UNKNOWN_LOCATION
, 0,
1704 "%<-fsanitize=address%> not supported for this target");
1705 flag_sanitize
&= ~SANITIZE_ADDRESS
;
1708 if ((flag_sanitize
& SANITIZE_KERNEL_ADDRESS
)
1709 && (targetm
.asan_shadow_offset
== NULL
1710 && !asan_shadow_offset_set_p ()))
1712 warning_at (UNKNOWN_LOCATION
, 0,
1713 "%<-fsanitize=kernel-address%> with stack protection "
1714 "is not supported without %<-fasan-shadow-offset=%> "
1716 flag_sanitize
&= ~SANITIZE_ADDRESS
;
1719 /* HWAsan requires top byte ignore feature in the backend. */
1720 if (flag_sanitize
& SANITIZE_HWADDRESS
1721 && ! targetm
.memtag
.can_tag_addresses ())
1723 warning_at (UNKNOWN_LOCATION
, 0, "%qs is not supported for this target",
1724 "-fsanitize=hwaddress");
1725 flag_sanitize
&= ~SANITIZE_HWADDRESS
;
1728 if (flag_sanitize
& SANITIZE_SHADOW_CALL_STACK
)
1730 if (!targetm
.have_shadow_call_stack
)
1731 sorry ("%<-fsanitize=shadow-call-stack%> not supported "
1732 "in current platform");
1733 else if (flag_exceptions
)
1734 error_at (UNKNOWN_LOCATION
, "%<-fsanitize=shadow-call-stack%> "
1735 "requires %<-fno-exceptions%>");
1739 HOST_WIDE_INT patch_area_size
, patch_area_start
;
1740 parse_and_check_patch_area (flag_patchable_function_entry
, false,
1741 &patch_area_size
, &patch_area_start
);
1744 /* Do not use IPA optimizations for register allocation if profiler is active
1745 or patchable function entries are inserted for run-time instrumentation
1746 or port does not emit prologue and epilogue as RTL. */
1747 if (profile_flag
|| patch_area_size
1748 || !targetm
.have_prologue () || !targetm
.have_epilogue ())
1752 /* Enable -Werror=coverage-mismatch when -Werror and -Wno-error
1753 have not been set. */
1754 if (!OPTION_SET_P (warnings_are_errors
))
1756 if (warn_coverage_mismatch
1757 && (global_dc
->classify_diagnostic
[OPT_Wcoverage_mismatch
] ==
1759 diagnostic_classify_diagnostic (global_dc
, OPT_Wcoverage_mismatch
,
1760 DK_ERROR
, UNKNOWN_LOCATION
);
1761 if (warn_coverage_invalid_linenum
1762 && (global_dc
->classify_diagnostic
[OPT_Wcoverage_invalid_line_number
] ==
1764 diagnostic_classify_diagnostic (global_dc
, OPT_Wcoverage_invalid_line_number
,
1765 DK_ERROR
, UNKNOWN_LOCATION
);
1769 /* Save the current optimization options. */
1770 optimization_default_node
1771 = build_optimization_node (&global_options
, &global_options_set
);
1772 optimization_current_node
= optimization_default_node
;
1775 if (flag_checking
>= 2)
1776 hash_table_sanitize_eq_limit
1777 = param_hash_table_verification_limit
;
1779 if (flag_large_source_files
)
1780 line_table
->default_range_bits
= 0;
1782 diagnose_options (&global_options
, &global_options_set
, UNKNOWN_LOCATION
);
1784 /* Please don't change global_options after this point, those changes won't
1785 be reflected in optimization_{default,current}_node. */
1789 /* This function can be called multiple times to reinitialize the compiler
1790 back end when register classes or instruction sets have changed,
1791 before each function. */
1793 backend_init_target (void)
1795 /* This depends on stack_pointer_rtx. */
1796 init_fake_stack_mems ();
1798 /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is
1800 init_alias_target ();
1802 /* Depends on HARD_FRAME_POINTER_REGNUM. */
1806 /* Depends on the enabled attribute. */
1809 /* The following initialization functions need to generate rtl, so
1810 provide a dummy function context for them. */
1811 init_dummy_function_start ();
1813 /* rtx_cost is mode-dependent, so cached values need to be recomputed
1814 on a mode change. */
1816 init_lower_subreg ();
1819 init_expr_target ();
1822 /* We may need to recompute regno_save_code[] and regno_restore_code[]
1823 after a mode change as well. */
1824 caller_save_initialized_p
= false;
1826 expand_dummy_function_end ();
1830 /* Initialize the compiler back end. This function is called only once,
1831 when starting the compiler. */
1839 init_inline_once ();
1840 init_varasm_once ();
1841 save_register_info ();
1843 /* Middle end needs this initialization for default mem attributes
1844 used by early calls to make_decl_rtl. */
1847 /* Middle end needs this initialization for mode tables used to assign
1848 modes to vector variables. */
1853 /* Initialize things that are both lang-dependent and target-dependent.
1854 This function can be called more than once if target parameters change. */
1856 lang_dependent_init_target (void)
1858 /* This creates various _DECL nodes, so needs to be called after the
1859 front end is initialized. It also depends on the HAVE_xxx macros
1860 generated from the target machine description. */
1861 gcc_assert(0 && "optabs");
1864 // sdcpp gcc_assert (!this_target_rtl->target_specific_initialized);
1867 /* Perform initializations that are lang-dependent or target-dependent.
1868 but matters only for late optimizations and RTL generation. */
1871 static int rtl_initialized
;
1874 initialize_rtl (void)
1876 auto_timevar
tv (g_timer
, TV_INITIALIZE_RTL
);
1878 /* Initialization done just once per compilation, but delayed
1879 till code generation. */
1880 if (!rtl_initialized
)
1882 rtl_initialized
= true;
1884 /* Target specific RTL backend initialization. */
1885 if (!this_target_rtl
->target_specific_initialized
)
1887 backend_init_target ();
1888 this_target_rtl
->target_specific_initialized
= true;
1893 /* Language-dependent initialization. Returns nonzero on success. */
1895 lang_dependent_init (const char *name
)
1897 location_t save_loc
= input_location
;
1898 if (!dump_base_name
)
1900 dump_base_name
= name
&& name
[0] ? name
: "gccdump";
1902 /* We do not want to derive a non-empty dumpbase-ext from an
1903 explicit -dumpbase argument, only from a defaulted
1907 const char *base
= lbasename (dump_base_name
);
1908 const char *ext
= strrchr (base
, '.');
1910 dump_base_ext
= ext
;
1914 /* Other front-end initialization. */
1915 input_location
= BUILTINS_LOCATION
;
1916 if (lang_hooks
.init () == 0)
1919 input_location
= save_loc
;
1923 init_asm_output (name
);
1925 if (!flag_generate_lto
&& !flag_compare_debug
)
1927 /* If stack usage information is desired, open the output file. */
1928 if (flag_stack_usage
)
1929 stack_usage_file
= open_auxiliary_file ("su");
1931 /* If call graph information is desired, open the output file. */
1932 if (flag_callgraph_info
)
1934 callgraph_info_file
= open_auxiliary_file ("ci");
1935 /* Write the file header. */
1936 fprintf (callgraph_info_file
,
1937 "graph: { title: \"%s\"\n", main_input_filename
);
1938 bitmap_obstack_initialize (NULL
);
1939 callgraph_info_external_printed
= BITMAP_ALLOC (NULL
);
1943 flag_stack_usage
= flag_callgraph_info
= false;
1946 /* This creates various _DECL nodes, so needs to be called after the
1947 front end is initialized. */
1950 /* Do the target-specific parts of the initialization. */
1951 lang_dependent_init_target ();
1955 /* If dbx symbol table desired, initialize writing it and output the
1956 predefined types. */
1957 timevar_push (TV_SYMOUT
);
1959 /* Now we have the correct original filename, we can initialize
1961 (*debug_hooks
->init
) (name
);
1963 timevar_pop (TV_SYMOUT
);
1970 /* Reinitialize everything when target parameters, such as register usage,
1973 target_reinit (void)
1976 gcc_assert(0 && "reinit");
1978 struct rtl_data saved_x_rtl
;
1979 rtx
*saved_regno_reg_rtx
;
1980 tree saved_optimization_current_node
;
1981 struct target_optabs
*saved_this_fn_optabs
;
1983 /* Temporarily switch to the default optimization node, so that
1984 *this_target_optabs is set to the default, not reflecting
1985 whatever a previous function used for the optimize
1987 saved_optimization_current_node
= optimization_current_node
;
1988 saved_this_fn_optabs
= this_fn_optabs
;
1989 if (saved_optimization_current_node
!= optimization_default_node
)
1991 optimization_current_node
= optimization_default_node
;
1992 cl_optimization_restore
1993 (&global_options
, &global_options_set
,
1994 TREE_OPTIMIZATION (optimization_default_node
));
1996 this_fn_optabs
= this_target_optabs
;
1998 /* Save *crtl and regno_reg_rtx around the reinitialization
1999 to allow target_reinit being called even after prepare_function_start. */
2000 saved_regno_reg_rtx
= regno_reg_rtx
;
2001 if (saved_regno_reg_rtx
)
2003 saved_x_rtl
= *crtl
;
2004 memset (crtl
, '\0', sizeof (*crtl
));
2005 regno_reg_rtx
= NULL
;
2008 this_target_rtl
->target_specific_initialized
= false;
2010 /* This initializes hard_frame_pointer, and calls init_reg_modes_target()
2011 to initialize reg_raw_mode[]. */
2014 /* This invokes target hooks to set fixed_reg[] etc, which is
2018 /* Reinitialize lang-dependent parts. */
2019 lang_dependent_init_target ();
2021 /* Restore the original optimization node. */
2022 if (saved_optimization_current_node
!= optimization_default_node
)
2024 optimization_current_node
= saved_optimization_current_node
;
2025 cl_optimization_restore (&global_options
, &global_options_set
,
2026 TREE_OPTIMIZATION (optimization_current_node
));
2028 this_fn_optabs
= saved_this_fn_optabs
;
2030 /* Restore regno_reg_rtx at the end, as free_after_compilation from
2031 expand_dummy_function_end clears it. */
2032 if (saved_regno_reg_rtx
)
2034 *crtl
= saved_x_rtl
;
2035 regno_reg_rtx
= saved_regno_reg_rtx
;
2036 saved_regno_reg_rtx
= NULL
;
2043 dump_memory_report (const char *header
)
2045 /* Print significant header. */
2046 fputc ('\n', stderr
);
2047 for (unsigned i
= 0; i
< 80; i
++)
2048 fputc ('#', stderr
);
2049 fprintf (stderr
, "\n# %-77s#\n", header
);
2050 for (unsigned i
= 0; i
< 80; i
++)
2051 fputc ('#', stderr
);
2052 fputs ("\n\n", stderr
);
2054 dump_line_table_statistics ();
2055 ggc_print_statistics ();
2056 fprintf(stderr
, "incomplete %s %d\n", __func__
, __LINE__
);
2058 stringpool_statistics ();
2059 dump_tree_statistics ();
2060 dump_gimple_statistics ();
2061 sdcpp
dump_rtx_statistics ();
2062 sdcpp
dump_alloc_pool_statistics ();
2063 sdcpp
dump_bitmap_statistics ();
2064 sdcpp
dump_hash_table_loc_statistics ();
2065 sdcpp
dump_vec_loc_statistics ();
2066 sdcpp
dump_ggc_loc_statistics ();
2067 sdcpp
dump_alias_stats (stderr
);
2068 sdcpp
dump_pta_stats (stderr
);
2073 /* Clean up: close opened files, etc. */
2076 finalize (bool no_backend
)
2078 /* Close the dump files. */
2079 if (flag_gen_aux_info
)
2081 fclose (aux_info_file
);
2082 aux_info_file
= NULL
;
2084 unlink (aux_info_file_name
);
2087 /* Close non-debugging input and output files. Take special care to note
2088 whether fclose returns an error, since the pages might still be on the
2089 buffer chain while the file is open. */
2093 if (ferror (asm_out_file
) != 0)
2094 fatal_error (input_location
, "error writing to %s: %m", asm_file_name
);
2095 if (fclose (asm_out_file
) != 0)
2096 fatal_error (input_location
, "error closing %s: %m", asm_file_name
);
2097 asm_out_file
= NULL
;
2100 if (stack_usage_file
)
2102 fclose (stack_usage_file
);
2103 stack_usage_file
= NULL
;
2106 if (callgraph_info_file
)
2108 fputs ("}\n", callgraph_info_file
);
2109 fclose (callgraph_info_file
);
2110 callgraph_info_file
= NULL
;
2111 BITMAP_FREE (callgraph_info_external_printed
);
2112 bitmap_obstack_release (NULL
);
2116 // if (seen_error ())
2117 // coverage_remove_note_file ();
2121 gcc_assert(0 && "passes");
2125 g
->get_passes ()->finish_optimization_passes ();
2131 dump_memory_report ("Final");
2134 dump_profile_report ();
2136 if (flag_dbg_cnt_list
)
2137 dbg_cnt_list_all_counters ();
2139 /* Language-specific end of compilation actions. */
2140 lang_hooks
.finish ();
2145 standard_type_bitsize (int bitsize
)
2147 /* As a special exception, we always want __int128 enabled if possible. */
2150 if (bitsize
== CHAR_TYPE_SIZE
2151 || bitsize
== SHORT_TYPE_SIZE
2152 || bitsize
== INT_TYPE_SIZE
2153 || bitsize
== LONG_TYPE_SIZE
2154 || bitsize
== LONG_LONG_TYPE_SIZE
)
2160 /* Initialize the compiler, and compile the input file. */
2162 do_compile (bool no_backend
)
2164 /* Don't do any more if an error has already occurred. */
2170 timevar_start (TV_PHASE_SETUP
);
2172 if (flag_save_optimization_record
)
2174 gcc_assert(0 && "dump"); // sdcpp
2175 // dump_context::get ().set_json_writer (new optrecord_json_writer ());
2178 /* This must be run always, because it is needed to compute the FP
2179 predefined macros, such as __LDBL_MAX__, for targets using non
2180 default FP formats. */
2181 init_adjust_machine_modes ();
2182 init_derived_machine_modes ();
2185 /* This must happen after the backend has a chance to process
2186 command line options, but before the parsers are
2189 for (i
= 0; i
< NUM_INT_N_ENTS
; i
++)
2190 if (targetm
.scalar_mode_supported_p (int_n_data
[i
].m
)
2191 && ! standard_type_bitsize (int_n_data
[i
].bitsize
))
2192 int_n_enabled_p
[i
] = true;
2194 int_n_enabled_p
[i
] = false;
2196 /* Initialize mpfrs exponent range. This is important to get
2197 underflow/overflow in a reasonable timeframe. */
2201 FOR_EACH_MODE_IN_CLASS (mode
, MODE_FLOAT
)
2202 if (SCALAR_FLOAT_MODE_P (mode
))
2204 const real_format
*fmt
= REAL_MODE_FORMAT (mode
);
2207 /* fmt->emin - fmt->p + 1 should be enough but the
2208 back-and-forth dance in real_to_decimal_for_mode we
2209 do for checking fails due to rounding effects then. */
2210 if ((fmt
->emin
- fmt
->p
) < min_exp
)
2211 min_exp
= fmt
->emin
- fmt
->p
;
2212 if (fmt
->emax
> max_exp
)
2213 max_exp
= fmt
->emax
;
2216 /* E.g. mpc_norm assumes it can square a number without bothering with
2217 with range scaling, so until that is fixed, double the minimum
2218 and maximum exponents, plus add some buffer for arithmetics
2219 on the squared numbers. */
2220 if (mpfr_set_emin (2 * (min_exp
- 1))
2221 || mpfr_set_emax (2 * (max_exp
+ 1)))
2222 sorry ("mpfr not configured to handle all floating modes");
2225 /* Set up the back-end if requested. */
2226 if (!no_backend
) { gcc_assert(false);
2227 // sdcpp backend_init ();
2230 /* Language-dependent initialization. Returns true on success. */
2231 if (lang_dependent_init (main_input_filename
))
2232 gcc_assert(0 && "lang dep");
2235 /* Initialize yet another pass. */
2237 ggc_protect_identifiers
= true;
2239 symtab
->initialize ();
2240 init_final (main_input_filename
);
2242 // coverage_init (aux_base_name);
2245 invoke_plugin_callbacks (PLUGIN_START_UNIT
, NULL
);
2247 timevar_stop (TV_PHASE_SETUP
);
2254 timevar_stop (TV_PHASE_SETUP
);
2257 timevar_start (TV_PHASE_FINALIZE
);
2259 finalize (no_backend
);
2261 timevar_stop (TV_PHASE_FINALIZE
);
2265 toplev::toplev (timer
*external_timer
,
2267 : m_use_TV_TOTAL (external_timer
== NULL
),
2268 m_init_signals (init_signals
)
2271 g_timer
= external_timer
;
2276 if (g_timer
&& m_use_TV_TOTAL
)
2278 g_timer
->stop (TV_TOTAL
);
2279 g_timer
->print (stderr
);
2285 /* Potentially call timevar_init (which will create g_timevars if it
2286 doesn't already exist). */
2289 toplev::start_timevars ()
2291 if (time_report
|| !quiet_flag
|| flag_detailed_statistics
)
2294 timevar_start (TV_TOTAL
);
2297 /* Handle -fself-test. */
2300 toplev::run_self_tests ()
2303 /* Reset some state. */
2304 input_location
= UNKNOWN_LOCATION
;
2305 bitmap_obstack_initialize (NULL
);
2307 /* Run the tests; any failures will lead to an abort of the process.
2308 Use "make selftests-gdb" to run under the debugger. */
2309 ::selftest::run_tests ();
2312 bitmap_obstack_release (NULL
);
2314 inform (UNKNOWN_LOCATION
, "self-tests are not enabled in this build");
2315 #endif /* #if CHECKING_P */
2323 /* Entry point of cc1, cc1plus, jc1, f771, etc.
2324 Exit code is FATAL_EXIT_CODE if can't open files or if there were
2325 any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
2327 It is not safe to call this function more than once. */
2330 toplev::main (int argc
, char **argv
)
2332 /* Parsing and gimplification sometimes need quite large stack.
2333 Increase stack size limits if possible. */
2334 stack_limit_increase (64 * 1024 * 1024);
2336 expandargv (&argc
, &argv
);
2338 /* Initialization of GCC's environment, and diagnostics. */
2339 general_init (argv
[0], m_init_signals
);
2341 /* One-off initialization of options that does not need to be
2342 repeated when options are added for particular functions. */
2343 init_options_once ();
2344 init_opts_obstack ();
2346 /* Initialize global options structures; this must be repeated for
2347 each structure used for parsing options. */
2348 init_options_struct (&global_options
, &global_options_set
);
2349 lang_hooks
.init_options_struct (&global_options
);
2351 /* Init GGC heuristics must be caller after we initialize
2353 init_ggc_heuristics ();
2355 /* Convert the options to an array. */
2356 decode_cmdline_options_to_array_default_mask (argc
,
2357 CONST_CAST2 (const char **,
2359 &save_decoded_options
,
2360 &save_decoded_options_count
);
2362 /* Save Optimization decoded options. */
2363 save_opt_decoded_options
= new vec
<cl_decoded_option
> ();
2364 for (unsigned i
= 1; i
< save_decoded_options_count
; ++i
)
2365 if (save_decoded_options
[i
].opt_index
< cl_options_count
2366 && cl_options
[save_decoded_options
[i
].opt_index
].flags
& CL_OPTIMIZATION
)
2367 save_opt_decoded_options
->safe_push (save_decoded_options
[i
]);
2369 /* Perform language-specific options initialization. */
2370 lang_hooks
.init_options (save_decoded_options_count
, save_decoded_options
);
2372 /* Parse the options and do minimal processing; basically just
2373 enough to default flags appropriately. */
2374 decode_options (&global_options
, &global_options_set
,
2375 save_decoded_options
, save_decoded_options_count
,
2376 UNKNOWN_LOCATION
, global_dc
,
2377 &docb
); // (targetm.target_option.override);
2379 handle_common_deferred_options ();
2383 initialize_plugins ();
2386 print_version (stderr
, "", true);
2389 print_plugins_help (stderr
, "");
2391 /* Exit early if we can (e.g. -help). */
2392 if (!exit_after_options
)
2394 /* Just in case lang_hooks.post_options ends up calling a debug_hook.
2395 This can happen with incorrect pre-processed input. */
2396 debug_hooks
= &do_nothing_debug_hooks
;
2397 /* Allow the front end to perform consistency checks and do further
2398 initialization based on the command line options. This hook also
2399 sets the original filename if appropriate (e.g. foo.i -> foo.c)
2400 so we can correctly initialize debug output. */
2401 bool no_backend
= lang_hooks
.post_options (&main_input_filename
);
2402 gcc_assert(no_backend
);
2404 process_options (no_backend
);
2408 do_compile (no_backend
);
2413 error_at (UNKNOWN_LOCATION
, "self-tests incompatible with %<-E%>");
2419 if (warningcount
|| errorcount
|| werrorcount
)
2420 print_ignored_options ();
2422 /* Invoke registered plugin callbacks if any. Some plugins could
2423 emit some diagnostics here. */
2424 invoke_plugin_callbacks (PLUGIN_FINISH
, NULL
);
2426 if (flag_diagnostics_generate_patch
)
2428 gcc_assert (global_dc
->edit_context_ptr
);
2431 pp_show_color (&pp
) = pp_show_color (global_dc
->printer
);
2432 global_dc
->edit_context_ptr
->print_diff (&pp
, true);
2436 diagnostic_finish (global_dc
);
2438 finalize_plugins ();
2440 after_memory_report
= true;
2442 if (seen_error () || werrorcount
)
2443 return (FATAL_EXIT_CODE
);
2445 return (SUCCESS_EXIT_CODE
);
2448 /* For those that want to, this function aims to clean up enough state that
2449 you can call toplev::main again. */
2451 toplev::finalize (void)
2454 rtl_initialized
= false;
2455 this_target_rtl
->target_specific_initialized
= false;
2457 /* Needs to be called before cgraph_cc_finalize since it uses symtab. */
2458 // sdcpp ipa_reference_cc_finalize ();
2459 ipa_fnsummary_cc_finalize ();
2460 ipa_modref_cc_finalize ();
2461 ipa_edge_modifications_finalize ();
2463 cgraph_cc_finalize ();
2464 cgraphunit_cc_finalize ();
2465 symtab_thunks_cc_finalize ();
2466 dwarf2out_cc_finalize ();
2467 // sdcpp gcse_cc_finalize ();
2468 ipa_cp_cc_finalize ();
2469 ira_costs_cc_finalize ();
2470 tree_cc_finalize ();
2471 reginfo_cc_finalize ();
2474 /* save_decoded_options uses opts_obstack, so these must
2475 be cleaned up together. */
2476 obstack_free (&opts_obstack
, NULL
);
2477 XDELETEVEC (save_decoded_options
);
2478 save_decoded_options
= NULL
;
2479 save_decoded_options_count
= 0;
2481 /* Clean up the context (and pass_manager etc). */