struct / union in initializer, RFE #901.
[sdcc.git] / sdcc / support / cpp / gcc / toplev.cc
blobe07f065b0112da7761ecb3115da8f490f74bd074
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
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This is the top level of cc1/c++.
21 It parses command args, opens files, invokes the various passes
22 in the proper order, and counts the time used by each.
23 Error messages and low-level interface to malloc also handled here. */
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "backend.h"
29 #include "target.h"
30 #include "rtl.h"
31 #include "tree.h"
32 // sdcpp #include "gimple.h"
33 #include "alloc-pool.h"
34 #include "timevar.h"
35 #include "memmodel.h"
36 #include "insn-config.h"
37 #include "ira.h"
38 #include "recog.h"
39 #include "cgraph.h"
40 #include "diagnostic.h"
41 #include "varasm.h"
42 #include "tree-inline.h"
43 #include "version.h"
44 #include "flags.h"
45 #include "insn-attr.h"
46 #include "output.h"
47 #include "toplev.h"
48 #include "expr.h"
49 #include "intl.h"
50 #include "tree-diagnostic.h"
51 #include "reload.h"
52 #include "debug.h"
53 #include "common/common-target.h"
54 #include "langhooks.h"
55 #include "cfgloop.h" /* for init_set_costs */
56 #include "hosthooks.h"
57 #include "opts.h"
58 #include "opts-diagnostic.h"
59 #include "stringpool.h"
60 #include "attribs.h"
61 #include "asan.h"
62 #include "plugin.h"
63 #include "context.h"
64 #include "dwarf2out.h"
65 #include "tree-vrp.h"
66 // sdcpp #include "ipa-prop.h"
67 #include "omp-offload.h"
68 #include "edit-context.h"
69 #include "tree-pass.h"
70 #include "dumpfile.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"
76 #include "dbgcnt.h"
78 #define untested() { fprintf (stderr, "@@#\n@@@:%s:%d:%s\n", __FILE__, __LINE__, __func__); }
80 //sdcpp
81 bool flag_wpa = false;
82 #if 0 // sdcpp
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)
90 #include "dbxout.h"
91 #endif
93 #ifdef XCOFF_DEBUGGING_INFO
94 #include "xcoffout.h" /* Needed for external data declarations. */
95 #endif
96 #endif // sdcpp
98 #include "selftest.h"
100 #ifdef HAVE_isl
101 #include <isl/version.h>
102 #endif
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
129 if none. */
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. */
138 unsigned local_tick;
140 /* Random number for this compilation */
141 HOST_WIDE_INT random_seed;
143 /* -f flags. */
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. */
152 rtx stack_limit_rtx;
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;
157 #else
158 #define this_target_flag_state (&default_target_flag_state)
159 #endif
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. */
167 FILE *asm_out_file;
168 FILE *aux_info_file;
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
176 created. */
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
183 initialized yet. */
185 bool
186 set_src_pwd (const char *pwd)
188 if (src_pwd)
190 if (strcmp (src_pwd, pwd) == 0)
191 return true;
192 else
193 return false;
196 src_pwd = xstrdup (pwd);
197 return true;
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
202 different value. */
204 const char *
205 get_src_pwd (void)
207 if (! src_pwd)
209 src_pwd = getpwd ();
210 if (!src_pwd)
211 src_pwd = ".";
214 return src_pwd;
217 /* Called when the start of a function definition is parsed,
218 this function prints on stderr the name of the function. */
219 #if 0 // sdcpp
220 void
221 announce_function (tree decl)
223 if (!quiet_flag)
225 if (rtl_dump_and_exit)
226 fprintf (stderr, "%s ",
227 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl))));
228 else
229 fprintf (stderr, " %s",
230 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2)));
231 fflush (stderr);
232 pp_needs_newline (global_dc->printer) = true;
233 diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL);
236 #endif
238 /* Initialize local_tick with the time of day, or -1 if
239 flag_random_seed is set. */
241 static void
242 init_local_tick (void)
244 if (!flag_random_seed)
246 #ifdef HAVE_GETTIMEOFDAY
248 struct timeval tv;
250 gettimeofday (&tv, NULL);
251 local_tick = (unsigned) tv.tv_sec * 1000 + tv.tv_usec / 1000;
253 #else
255 time_t now = time (NULL);
257 if (now != (time_t)-1)
258 local_tick = (unsigned) now;
260 #endif
262 else
263 local_tick = -1;
266 /* Obtain the random_seed. Unless NOINIT, initialize it if
267 it's not provided in the command line. */
269 HOST_WIDE_INT
270 get_random_seed (bool noinit)
272 if (!random_seed && !noinit)
274 int fd = open ("/dev/urandom", O_RDONLY);
275 if (fd >= 0)
277 if (read (fd, &random_seed, sizeof (random_seed))
278 != sizeof (random_seed))
279 random_seed = 0;
280 close (fd);
282 if (!random_seed)
283 random_seed = local_tick ^ getpid ();
285 return random_seed;
288 /* Set flag_random_seed to VAL, and if non-null, reinitialize random_seed. */
290 #if 0 // sdcpp
291 void
292 set_random_seed (const char *val)
294 flag_random_seed = val;
295 if (flag_random_seed)
297 char *endp;
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);
305 #endif
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. */
311 static void
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. */
332 #if 0 // sdcpp
333 void
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. */
349 bool
350 wrapup_global_declaration_2 (tree decl)
352 gcc_assert(false);
353 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl)
354 || (VAR_P (decl) && DECL_HAS_VALUE_EXPR_P (decl)))
355 return false;
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))
384 varpool_node *node;
385 bool needed = true;
386 node = varpool_node::get (decl);
388 if (!node && flag_ltrans)
389 needed = false;
390 else if (node && node->definition)
391 needed = false;
392 else if (node && node->alias)
393 needed = false;
394 else if (!symtab->global_info_ready
395 && (TREE_USED (decl)
396 || TREE_USED (DECL_ASSEMBLER_NAME (decl))))
397 /* needed */;
398 else if (node && node->analyzed)
399 /* needed */;
400 else if (DECL_COMDAT (decl))
401 needed = false;
402 else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
403 && (optimize || !flag_keep_static_consts
404 || DECL_ARTIFICIAL (decl)))
405 needed = false;
407 if (needed)
409 rest_of_decl_compilation (decl, 1, 1);
410 return true;
414 return false;
416 #endif
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. */
423 bool
424 wrapup_global_declarations (tree *vec, int len)
426 (void) vec;
427 (void) len;
428 #if 0 // sdcpp
429 bool reconsider, output_something = false;
430 int i;
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. */
440 reconsider = false;
441 for (i = 0; i < len; i++)
442 reconsider |= wrapup_global_declaration_2 (vec[i]);
443 if (reconsider)
444 output_something = true;
446 while (reconsider);
448 return output_something;
449 #endif // sdcpp
450 return false;
453 /* Compile an entire translation unit. Write a file of assembly
454 output and various debugging dumps. */
456 #if 0 // sdcpp
457 static void
458 compile_file (void)
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);
472 free_attr_data ();
474 /* Compilation is now finished except for writing
475 what's left of the symbol table output. */
477 if (flag_syntax_only || flag_wpa)
478 return;
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. */
488 if (!in_lto_p)
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
498 necessary. */
499 if (lang_hooks.decls.post_compilation_parsing_cleanups)
500 lang_hooks.decls.post_compilation_parsing_cleanups ();
502 // sdcpp
503 // dump_context::get ().finish_any_json_writer ();
505 if (seen_error ())
506 return;
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)
517 asan_finish_file ();
519 if (flag_sanitize & SANITIZE_THREAD){
520 gcc_assert(0 && "tsan");
521 //tsan_finish_file ();
524 if (gate_hwasan ())
525 hwasan_finish_file ();
527 omp_finish_file ();
529 output_shared_constant_pool ();
530 output_object_blocks ();
531 finish_tm_clone_pairs ();
533 /* Write out any pending weak symbol declarations. */
534 weak_finish ();
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 ();
546 #endif
548 debuginfo_start ();
549 (*debug_hooks->finish) (main_input_filename);
550 debuginfo_stop ();
551 timevar_pop (TV_SYMOUT);
553 /* Output some stuff at end of file if nec. */
555 // sdcpp
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);
572 #else
573 ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
574 HOST_WIDE_INT_1U,
575 HOST_WIDE_INT_1U);
576 #endif
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. */
582 if (!flag_no_ident)
584 const char *pkg_version = "(GNU) ";
585 char *ident_str;
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);
609 #endif // sdcpp
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
622 thread. */
624 void
625 print_version (FILE *file, const char *indent, bool show_global_state)
627 static const char fmt1[] =
628 #ifdef __GNUC__
629 N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
630 #else
631 N_("%s%s%s %sversion %s (%s) compiled by CC, ")
632 #endif
634 (void) show_global_state;
635 #if 0 // sdcpp
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");
642 #endif
643 #ifndef __VERSION__
644 #define __VERSION__ "[?]"
645 #endif
646 fprintf (file,
647 file == stderr ? _(fmt1) : fmt1,
648 indent, *indent != 0 ? " " : "",
649 lang_hooks.name, pkgversion_string, version_string, TARGET_NAME,
650 indent, __VERSION__);
652 /* We need to stringify the GMP macro values. Ugh, gmp_version has
653 two string formats, "i.j.k" and "i.j" when k is zero. As of
654 gmp-4.3.0, GMP always uses the 3 number format. */
655 #define GCC_GMP_STRINGIFY_VERSION3(X) #X
656 #define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3 (X)
657 #define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z))
658 #define GCC_GMP_VERSION \
659 GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
660 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0
661 #define GCC_GMP_STRINGIFY_VERSION \
662 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \
663 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR)
664 #else
665 #define GCC_GMP_STRINGIFY_VERSION \
666 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \
667 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR) "." \
668 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_PATCHLEVEL)
669 #endif
670 #if 0 // sdcpp
671 fprintf (file,
672 file == stderr ? _(fmt2) : fmt2,
673 GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING,
674 #ifndef HAVE_isl
675 "none"
676 #else
677 isl_version ()
678 #endif
680 if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
681 fprintf (file,
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 ()))
686 fprintf (file,
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 ()))
691 fprintf (file,
692 file == stderr ? _(fmt3) : fmt3,
693 indent, *indent != 0 ? " " : "",
694 "MPC", MPC_VERSION_STRING, mpc_get_version ());
696 if (show_global_state)
698 fprintf (file,
699 file == stderr ? _(fmt4) : fmt4,
700 indent, *indent != 0 ? " " : "",
701 param_ggc_min_expand, param_ggc_min_heapsize);
703 print_plugins_versions (file, indent);
705 #endif
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. */
714 static void
715 init_asm_output (const char *name)
717 if (name == NULL && asm_file_name == 0)
718 asm_out_file = stdout;
719 else
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");
736 else
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",
741 asm_file_name);
742 if (asm_out_file == 0)
743 fatal_error (UNKNOWN_LOCATION,
744 "cannot open %qs for writing: %m", asm_file_name);
747 #if 0 // sdcpp
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)
756 const char *str
757 = gen_producer_string (lang_hooks.name,
758 save_decoded_options,
759 save_decoded_options_count);
760 targetm.asm_out.record_gcc_switches (str);
762 else
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);
776 free (cmdline);
777 fputc ('\n', asm_out_file);
780 #endif // sdcpp
783 /* A helper function; used as the reallocator function for cpp's line
784 table. */
785 static void *
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. */
793 static void *
794 alloc_for_identifier_to_locale (size_t len)
796 return ggc_alloc_atomic (len);
799 #if 0 // sdcpp
800 /* Output stack usage information. */
801 static void
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[] = {
807 "static",
808 "dynamic",
809 "dynamic,bounded"
811 HOST_WIDE_INT stack_usage = current_function_static_stack_size;
812 enum stack_usage_kind_type stack_usage_kind;
814 if (stack_usage < 0)
816 if (!warning_issued)
818 warning (0, "stack usage computation not supported for this target");
819 warning_issued = true;
821 return;
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))
829 HOST_WIDE_INT extra;
830 if (current_function_pushed_stack_size.is_constant (&extra))
832 stack_usage += extra;
833 stack_usage_kind = DYNAMIC_BOUNDED;
835 else
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;
850 else
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)",
860 stack_usage,
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)
880 warning_at (loc,
881 OPT_Wstack_usage_, "stack usage might be %wu bytes",
882 stack_usage);
883 else
884 warning_at (loc, OPT_Wstack_usage_, "stack usage is %wu bytes",
885 stack_usage);
890 /* Dump placeholder node for indirect calls in VCG format. */
892 #define INDIRECT_CALL_NAME "__indirect_call"
894 static void
895 dump_final_node_vcg_start (FILE *f, tree decl)
897 fputs ("node: { title: \"", f);
898 if (decl)
899 print_decl_identifier (f, decl, PRINT_DECL_UNIQUE_NAME);
900 else
901 fputs (INDIRECT_CALL_NAME, f);
902 fputs ("\" label: \"", f);
903 if (decl)
905 print_decl_identifier (f, decl, PRINT_DECL_NAME);
906 fputs ("\\n", f);
907 print_decl_identifier (f, decl, PRINT_DECL_ORIGIN);
909 else
910 fputs ("Indirect Call Placeholder", f);
912 #endif // sdcpp
914 /* Dump final cgraph edge in VCG format. */
916 #if 0 //sdcpp
917 static void
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);
931 if (callee)
932 print_decl_identifier (f, callee, PRINT_DECL_UNIQUE_NAME);
933 else
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);
942 fputs ("\" }\n", f);
944 #endif // sdcpp
946 /* Dump final cgraph node in VCG format. */
948 #if 0 // sdcpp
949 static void
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));
962 unsigned i;
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;
975 fputs ("\" }\n", f);
977 unsigned i;
978 callinfo_callee *c;
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. */
986 void
987 output_stack_usage (void)
989 if (flag_callgraph_info)
990 dump_final_node_vcg (callgraph_info_file);
991 else
992 output_stack_usage_1 (NULL);
994 #endif // sdcpp
996 /* Open an auxiliary output file. */
997 static FILE *
998 open_auxiliary_file (const char *ext)
1000 char *filename;
1001 FILE *file;
1003 filename = concat (aux_base_name, ".", ext, NULL);
1004 file = fopen (filename, "w");
1005 if (!file)
1006 fatal_error (input_location, "cannot open %s for writing: %m", filename);
1007 free (filename);
1008 return file;
1011 /* Alternative diagnostics callback for reentered ICE reporting. */
1013 static void
1014 internal_error_reentered (diagnostic_context *, const char *, va_list *)
1016 /* Flush the dump file if emergency_dump_function itself caused an ICE. */
1017 if (dump_file)
1018 fflush (dump_file);
1021 /* Auxiliary callback for the diagnostics code. */
1023 static void
1024 internal_error_function (diagnostic_context *, const char *, va_list *)
1026 global_dc->internal_error = internal_error_reentered;
1027 warn_if_plugins ();
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]. */
1034 static void
1035 general_init (const char *argv0, bool init_signals)
1037 const char *p;
1039 p = argv0 + strlen (argv0);
1040 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
1041 --p;
1042 progname = p;
1044 xmalloc_set_program_name (progname);
1046 hex_init ();
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;
1070 global_dc->show_cwe
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. */
1091 #ifdef SIGSEGV
1092 signal (SIGSEGV, crash_signal);
1093 #endif
1094 #ifdef SIGILL
1095 signal (SIGILL, crash_signal);
1096 #endif
1097 #ifdef SIGBUS
1098 signal (SIGBUS, crash_signal);
1099 #endif
1100 #ifdef SIGABRT
1101 signal (SIGABRT, crash_signal);
1102 #endif
1103 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
1104 signal (SIGIOT, crash_signal);
1105 #endif
1106 #ifdef SIGFPE
1107 signal (SIGFPE, crash_signal);
1108 #endif
1110 /* Other host-specific signal setup. */
1111 // sdcpp (*host_hooks.extra_signals)();
1114 /* Initialize the garbage-collector, string pools and tree type hash
1115 table. */
1116 init_ggc ();
1117 init_stringpool ();
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
1131 dump manager. */
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. */
1139 //sdcpp
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. */
1150 static bool
1151 target_supports_section_anchors_p (void)
1153 #if 0 // sdcpp
1154 if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0)
1155 return false;
1157 if (targetm.asm_out.output_anchor == NULL)
1158 return false;
1160 return true;
1161 #else // sdcpp
1162 return false;
1163 #endif // sdcpp
1166 /* Parse "N[:M][:...]" into struct align_flags A.
1167 VALUES contains parsed values (in reverse order), all processed
1168 values are popped. */
1170 static void
1171 read_log_maxskip (auto_vec<unsigned> &values, align_flags_tuple *a)
1173 unsigned n = values.pop ();
1174 if (n != 0)
1175 a->log = floor_log2 (n * 2 - 1);
1177 if (values.is_empty ())
1178 a->maxskip = n ? n - 1 : 0;
1179 else
1181 unsigned m = values.pop ();
1182 /* -falign-foo=N:M means M-1 max bytes of padding, not M. */
1183 if (m > 0)
1184 m--;
1185 a->maxskip = m;
1188 /* Normalize the tuple. */
1189 a->normalize ();
1192 /* Parse "N[:M[:N2[:M2]]]" string FLAG into a pair of struct align_flags. */
1194 static void
1195 parse_N_M (const char *flag, align_flags &a)
1197 if (flag)
1199 static hash_map <nofree_string_hash, align_flags> cache;
1200 align_flags *entry = cache.get (flag);
1201 if (entry)
1203 a = *entry;
1204 return;
1207 auto_vec<unsigned> result_values;
1208 bool r = parse_and_check_align_values (flag, NULL, result_values, false,
1209 UNKNOWN_LOCATION);
1210 if (!r)
1211 return;
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]);
1219 #ifdef SUBALIGN_LOG
1220 else
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:
1226 .p2align 4,,9
1227 .p2align 3
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 ();
1246 #endif
1248 /* Cache seen value. */
1249 cache.put (flag, a);
1253 /* Process -falign-foo=N[:M[:N2[:M2]]] options. */
1255 void
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. */
1265 static void
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;
1293 #if 0 // sdcc
1294 if (flag_short_enums == 2)
1295 flag_short_enums = targetm.default_short_enums ();
1296 #endif
1298 /* Set aux_base_name if not already set. */
1299 if (aux_base_name)
1301 else if (dump_base_name)
1303 const char *name = dump_base_name;
1304 int nlen, len;
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);
1311 name = p;
1314 aux_base_name = name;
1316 else
1317 aux_base_name = "gccaux";
1319 #ifndef HAVE_isl
1320 if (flag_graphite
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%>)");
1327 #endif
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 "
1336 "target");
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 "
1343 "target");
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 "
1350 "target");
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))
1357 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");
1381 #endif
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 ? "_" : "";
1396 else
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. */
1404 if (version_flag)
1406 print_version (stderr, "", true);
1407 if (!quiet_flag)
1409 fputs ("options passed: ", stderr);
1410 char *cmdline = gen_command_line_string (save_decoded_options,
1411 save_decoded_options_count);
1413 fputs (cmdline, stderr);
1414 free (cmdline);
1415 fputc ('\n', stderr);
1419 /* CTF is supported for only C at this time. */
1420 if (!lang_GNU_C ()
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",
1428 language_string);
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");
1435 if (!final_output)
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
1452 level is 0. */
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)
1464 #if 0 // sdcpp
1465 #if defined(DBX_DEBUGGING_INFO)
1466 else if (write_symbols == DBX_DEBUG)
1467 debug_hooks = &dbx_debug_hooks;
1468 #endif
1469 #if defined(XCOFF_DEBUGGING_INFO)
1470 else if (write_symbols == XCOFF_DEBUG)
1471 debug_hooks = &xcoff_debug_hooks;
1472 #endif
1473 #ifdef DWARF2_DEBUGGING_INFO
1474 else if (dwarf_debuginfo_p ())
1475 debug_hooks = &dwarf2_debug_hooks;
1476 #endif
1477 #ifdef CTF_DEBUGGING_INFO
1478 else if (ctf_debuginfo_p ())
1479 debug_hooks = &dwarf2_debug_hooks;
1480 #endif
1481 #ifdef BTF_DEBUGGING_INFO
1482 else if (btf_debuginfo_p ())
1483 debug_hooks = &dwarf2_debug_hooks;
1484 #endif
1485 #ifdef VMS_DEBUGGING_INFO
1486 else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1487 debug_hooks = &vmsdbg_debug_hooks;
1488 #endif
1489 #ifdef DWARF2_LINENO_DEBUGGING_INFO
1490 else if (write_symbols == DWARF2_DEBUG)
1491 debug_hooks = &dwarf2_lineno_debug_hooks;
1492 #endif
1493 #endif // sdcpp
1494 else
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");
1516 else
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
1528 dump. */
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 ()
1543 && !dwarf_strict
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;
1556 #if 0 // sdcpp
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;
1571 #endif // sdcpp
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;
1587 else
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);
1602 #if 0 // sdcpp
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;
1632 #endif // sdcpp
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 "
1652 "precedence");
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
1667 the same time. */
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;
1698 #if 0 // sdcpp
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=%> "
1715 "for this target");
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%>");
1737 #endif // sdcpp
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);
1743 #if 0 // sdcpp
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 ())
1749 flag_ipa_ra = 0;
1750 #endif
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] ==
1758 DK_UNSPECIFIED))
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] ==
1763 DK_UNSPECIFIED))
1764 diagnostic_classify_diagnostic (global_dc, OPT_Wcoverage_invalid_line_number,
1765 DK_ERROR, UNKNOWN_LOCATION);
1768 #if 0 // sdcpp
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;
1773 #endif
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. */
1788 #if 0 // sdcpp
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. */
1792 static void
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
1799 mode-dependent. */
1800 init_alias_target ();
1802 /* Depends on HARD_FRAME_POINTER_REGNUM. */
1803 if (!ira_use_lra_p)
1804 init_reload ();
1806 /* Depends on the enabled attribute. */
1807 recog_init ();
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. */
1815 init_expmed ();
1816 init_lower_subreg ();
1817 init_set_costs ();
1819 init_expr_target ();
1820 ira_init ();
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 ();
1828 #endif // sdcpp
1830 /* Initialize the compiler back end. This function is called only once,
1831 when starting the compiler. */
1832 #if 0 // sdcpp
1833 static void
1834 backend_init (void)
1836 init_emit_once ();
1838 init_rtlanal ();
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. */
1845 init_emit_regs ();
1847 /* Middle end needs this initialization for mode tables used to assign
1848 modes to vector variables. */
1849 init_regs ();
1852 #endif // sdcpp
1853 /* Initialize things that are both lang-dependent and target-dependent.
1854 This function can be called more than once if target parameters change. */
1855 static void
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");
1862 // init_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. */
1870 #if 0 // sdcpp
1871 static int rtl_initialized;
1873 void
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)
1881 ira_init_once ();
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;
1891 #endif
1893 /* Language-dependent initialization. Returns nonzero on success. */
1894 static int
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
1904 dumpbase. */
1905 if (!dump_base_ext)
1907 const char *base = lbasename (dump_base_name);
1908 const char *ext = strrchr (base, '.');
1909 if (ext)
1910 dump_base_ext = ext;
1914 /* Other front-end initialization. */
1915 input_location = BUILTINS_LOCATION;
1916 if (lang_hooks.init () == 0)
1917 return 0;
1918 gcc_assert(false);
1919 input_location = save_loc;
1921 if (!flag_wpa)
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);
1942 else
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. */
1948 init_eh ();
1950 /* Do the target-specific parts of the initialization. */
1951 lang_dependent_init_target ();
1953 if (!flag_wpa)
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
1960 debug output. */
1961 (*debug_hooks->init) (name);
1963 timevar_pop (TV_SYMOUT);
1966 return 1;
1970 /* Reinitialize everything when target parameters, such as register usage,
1971 have changed. */
1972 void
1973 target_reinit (void)
1975 //sdcpp
1976 gcc_assert(0 && "reinit");
1977 #if 0
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
1986 attribute. */
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[]. */
2012 init_emit_regs ();
2014 /* This invokes target hooks to set fixed_reg[] etc, which is
2015 mode-dependent. */
2016 init_regs ();
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;
2038 #endif
2041 #if 1 // sdcpp
2042 void
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__);
2057 #if 0 // sdcpp
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);
2069 #endif // sdcpp
2071 #endif // sdcpp
2073 /* Clean up: close opened files, etc. */
2075 static void
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;
2083 if (seen_error ())
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. */
2091 if (asm_out_file)
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);
2115 // sdcpp ??
2116 // if (seen_error ())
2117 // coverage_remove_note_file ();
2119 if (!no_backend)
2121 gcc_assert(0 && "passes");
2122 #if 0 // sdcpp
2123 statistics_fini ();
2124 debuginfo_fini ();
2125 g->get_passes ()->finish_optimization_passes ();
2126 lra_finish_once ();
2127 #endif
2130 if (mem_report)
2131 dump_memory_report ("Final");
2133 if (profile_report)
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 ();
2143 #if 0 // sdcpp
2144 static bool
2145 standard_type_bitsize (int bitsize)
2147 /* As a special exception, we always want __int128 enabled if possible. */
2148 if (bitsize == 128)
2149 return false;
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)
2155 return true;
2156 return false;
2158 #endif // sdcpp
2160 /* Initialize the compiler, and compile the input file. */
2161 static void
2162 do_compile (bool no_backend)
2164 /* Don't do any more if an error has already occurred. */
2165 if (!seen_error ())
2167 #if 0 // sdcpp
2168 int i;
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 ();
2183 #endif // sdcpp
2185 /* This must happen after the backend has a chance to process
2186 command line options, but before the parsers are
2187 initialized. */
2188 #if 0 // sdcpp
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;
2193 else
2194 int_n_enabled_p[i] = false;
2196 /* Initialize mpfrs exponent range. This is important to get
2197 underflow/overflow in a reasonable timeframe. */
2198 machine_mode mode;
2199 int min_exp = -1;
2200 int max_exp = 1;
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);
2205 if (fmt)
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");
2223 #endif
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");
2233 #if 0 // scdpp
2235 /* Initialize yet another pass. */
2237 ggc_protect_identifiers = true;
2239 symtab->initialize ();
2240 init_final (main_input_filename);
2241 // sdcpp
2242 // coverage_init (aux_base_name);
2243 statistics_init ();
2244 debuginfo_init ();
2245 invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL);
2247 timevar_stop (TV_PHASE_SETUP);
2249 compile_file ();
2251 #endif // sdcpp
2252 else
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,
2266 bool init_signals)
2267 : m_use_TV_TOTAL (external_timer == NULL),
2268 m_init_signals (init_signals)
2270 if (external_timer)
2271 g_timer = external_timer;
2274 toplev::~toplev ()
2276 if (g_timer && m_use_TV_TOTAL)
2278 g_timer->stop (TV_TOTAL);
2279 g_timer->print (stderr);
2280 delete g_timer;
2281 g_timer = NULL;
2285 /* Potentially call timevar_init (which will create g_timevars if it
2286 doesn't already exist). */
2288 void
2289 toplev::start_timevars ()
2291 if (time_report || !quiet_flag || flag_detailed_statistics)
2292 timevar_init ();
2294 timevar_start (TV_TOTAL);
2297 /* Handle -fself-test. */
2299 void
2300 toplev::run_self_tests ()
2302 #if CHECKING_P
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 ();
2311 /* Cleanup. */
2312 bitmap_obstack_release (NULL);
2313 #else
2314 inform (UNKNOWN_LOCATION, "self-tests are not enabled in this build");
2315 #endif /* #if CHECKING_P */
2318 // sdcpp hack
2319 static void docb()
2320 { untested();
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
2352 options. */
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 **,
2358 char **, argv),
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 ();
2381 init_local_tick ();
2383 initialize_plugins ();
2385 if (version_flag)
2386 print_version (stderr, "", true);
2388 if (help_flag)
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);
2406 if (m_use_TV_TOTAL)
2407 start_timevars ();
2408 do_compile (no_backend);
2410 if (flag_self_test)
2411 { untested();
2412 if (no_backend)
2413 error_at (UNKNOWN_LOCATION, "self-tests incompatible with %<-E%>");
2414 else
2415 run_self_tests ();
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);
2430 pretty_printer pp;
2431 pp_show_color (&pp) = pp_show_color (global_dc->printer);
2432 global_dc->edit_context_ptr->print_diff (&pp, true);
2433 pp_flush (&pp);
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. */
2450 void
2451 toplev::finalize (void)
2453 #if 0 // sdcpp
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 ();
2472 #endif // sdcpp
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). */
2482 delete g;
2483 g = NULL;