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