OSDN Git Service

* ipa-inline.c (update_edge_key): Break out from ...
[pf3gnuchains/gcc-fork.git] / gcc / toplev.c
1 /* Top level of GCC compilers (cc1, cc1plus, etc.)
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This is the top level of cc1/c++.
23    It parses command args, opens files, invokes the various passes
24    in the proper order, and counts the time used by each.
25    Error messages and low-level interface to malloc also handled here.  */
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include <signal.h>
32
33 #ifdef HAVE_SYS_RESOURCE_H
34 # include <sys/resource.h>
35 #endif
36
37 #ifdef HAVE_SYS_TIMES_H
38 # include <sys/times.h>
39 #endif
40
41 #include "line-map.h"
42 #include "input.h"
43 #include "tree.h"
44 #include "realmpfr.h"   /* For GMP/MPFR/MPC versions, in print_version.  */
45 #include "version.h"
46 #include "rtl.h"
47 #include "tm_p.h"
48 #include "flags.h"
49 #include "insn-attr.h"
50 #include "insn-config.h"
51 #include "insn-flags.h"
52 #include "hard-reg-set.h"
53 #include "recog.h"
54 #include "output.h"
55 #include "except.h"
56 #include "function.h"
57 #include "toplev.h"
58 #include "expr.h"
59 #include "basic-block.h"
60 #include "intl.h"
61 #include "ggc.h"
62 #include "graph.h"
63 #include "regs.h"
64 #include "timevar.h"
65 #include "diagnostic.h"
66 #include "tree-diagnostic.h"
67 #include "tree-pretty-print.h"
68 #include "params.h"
69 #include "reload.h"
70 #include "ira.h"
71 #include "dwarf2asm.h"
72 #include "integrate.h"
73 #include "debug.h"
74 #include "target.h"
75 #include "langhooks.h"
76 #include "cfglayout.h"
77 #include "cfgloop.h"
78 #include "hosthooks.h"
79 #include "cgraph.h"
80 #include "opts.h"
81 #include "opts-diagnostic.h"
82 #include "coverage.h"
83 #include "value-prof.h"
84 #include "alloc-pool.h"
85 #include "tree-mudflap.h"
86 #include "tree-pass.h"
87 #include "gimple.h"
88 #include "tree-ssa-alias.h"
89 #include "plugin.h"
90
91 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
92 #include "dwarf2out.h"
93 #endif
94
95 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
96 #include "dbxout.h"
97 #endif
98
99 #ifdef SDB_DEBUGGING_INFO
100 #include "sdbout.h"
101 #endif
102
103 #ifdef XCOFF_DEBUGGING_INFO
104 #include "xcoffout.h"           /* Needed for external data
105                                    declarations for e.g. AIX 4.x.  */
106 #endif
107
108 static void general_init (const char *);
109 static void do_compile (void);
110 static void process_options (void);
111 static void backend_init (void);
112 static int lang_dependent_init (const char *);
113 static void init_asm_output (const char *);
114 static void finalize (void);
115
116 static void crash_signal (int) ATTRIBUTE_NORETURN;
117 static void setup_core_dumping (void);
118 static void compile_file (void);
119
120 /* Nonzero to dump debug info whilst parsing (-dy option).  */
121 static int set_yydebug;
122
123 /* True if we don't need a backend (e.g. preprocessing only).  */
124 static bool no_backend;
125
126 /* Length of line when printing switch values.  */
127 #define MAX_LINE 75
128
129 /* Decoded options, and number of such options.  */
130 static struct cl_decoded_option *save_decoded_options;
131 static unsigned int save_decoded_options_count;
132
133 /* Name of top-level original source file (what was input to cpp).
134    This comes from the #-command at the beginning of the actual input.
135    If there isn't any there, then this is the cc1 input file name.  */
136
137 const char *main_input_filename;
138
139 /* Used to enable -fvar-tracking, -fweb and -frename-registers according
140    to optimize in process_options ().  */
141 #define AUTODETECT_VALUE 2
142
143 /* Name to use as base of names for dump output files.  */
144
145 const char *dump_base_name;
146
147 /* Directory used for dump output files.  */
148
149 const char *dump_dir_name;
150
151 /* Name to use as a base for auxiliary output files.  */
152
153 const char *aux_base_name;
154
155 /* Prefix for profile data files */
156 const char *profile_data_prefix;
157
158 /* A mask of target_flags that includes bit X if X was set or cleared
159    on the command line.  */
160
161 int target_flags_explicit;
162
163 /* Debug hooks - dependent upon command line options.  */
164
165 const struct gcc_debug_hooks *debug_hooks;
166
167 /* Other flags saying which kinds of debugging dump have been requested.  */
168
169 int rtl_dump_and_exit;
170 int flag_print_asm_name;
171 enum graph_dump_types graph_dump_format;
172
173 /* Name for output file of assembly code, specified with -o.  */
174
175 const char *asm_file_name;
176
177 /* Nonzero means do optimizations.  -O.
178    Particular numeric values stand for particular amounts of optimization;
179    thus, -O2 stores 2 here.  However, the optimizations beyond the basic
180    ones are not controlled directly by this variable.  Instead, they are
181    controlled by individual `flag_...' variables that are defaulted
182    based on this variable.  */
183
184 int optimize = 0;
185
186 /* Nonzero means optimize for size.  -Os.
187    The only valid values are zero and nonzero. When optimize_size is
188    nonzero, optimize defaults to 2, but certain individual code
189    bloating optimizations are disabled.  */
190
191 int optimize_size = 0;
192
193 /* True if this is the lto front end.  This is used to disable
194    gimple generation and lowering passes that are normally run on the
195    output of a front end.  These passes must be bypassed for lto since
196    they have already been done before the gimple was written.  */
197
198 bool in_lto_p = false;
199
200 /* Nonzero if we should write GIMPLE bytecode for link-time optimization.  */
201
202 int flag_generate_lto;
203
204 /* The FUNCTION_DECL for the function currently being compiled,
205    or 0 if between functions.  */
206 tree current_function_decl;
207
208 /* Set to the FUNC_BEGIN label of the current function, or NULL
209    if none.  */
210 const char * current_function_func_begin_label;
211
212 /* A random sequence of characters, unless overridden by user.  */
213 static const char *flag_random_seed;
214
215 /* A local time stamp derived from the time of compilation. It will be
216    zero if the system cannot provide a time.  It will be -1u, if the
217    user has specified a particular random seed.  */
218 unsigned local_tick;
219
220 /* -f flags.  */
221
222 /* 0 means straightforward implementation of complex divide acceptable.
223    1 means wide ranges of inputs must work for complex divide.
224    2 means C99-like requirements for complex multiply and divide.  */
225
226 int flag_complex_method = 1;
227
228 /* Nonzero means we should be saving declaration info into a .X file.  */
229
230 int flag_gen_aux_info = 0;
231
232 /* Specified name of aux-info file.  */
233
234 const char *aux_info_file_name;
235
236 /* Nonzero if we are compiling code for a shared library, zero for
237    executable.  */
238
239 int flag_shlib;
240
241 /* Generate code for GNU or NeXT Objective-C runtime environment.  */
242
243 #ifdef NEXT_OBJC_RUNTIME
244 int flag_next_runtime = 1;
245 #else
246 int flag_next_runtime = 0;
247 #endif
248
249 /* Set to the default thread-local storage (tls) model to use.  */
250
251 enum tls_model flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
252
253 /* Set the default region and algorithm for the integrated register
254    allocator.  */
255
256 enum ira_algorithm flag_ira_algorithm = IRA_ALGORITHM_CB;
257 enum ira_region flag_ira_region = IRA_REGION_MIXED;
258
259 /* Set the default for excess precision.  */
260
261 enum excess_precision flag_excess_precision_cmdline = EXCESS_PRECISION_DEFAULT;
262 enum excess_precision flag_excess_precision = EXCESS_PRECISION_DEFAULT;
263
264 /* Nonzero means change certain warnings into errors.
265    Usually these are warnings about failure to conform to some standard.  */
266
267 int flag_pedantic_errors = 0;
268
269 /* Nonzero means make permerror produce warnings instead of errors.  */
270
271 int flag_permissive = 0;
272
273 /* -dA causes debug commentary information to be produced in
274    the generated assembly code (to make it more readable).  This option
275    is generally only of use to those who actually need to read the
276    generated assembly code (perhaps while debugging the compiler itself).
277    Currently, this switch is only used by dwarfout.c; however, it is intended
278    to be a catchall for printing debug information in the assembler file.  */
279
280 int flag_debug_asm = 0;
281
282 /* -dP causes the rtl to be emitted as a comment in assembly.  */
283
284 int flag_dump_rtl_in_asm = 0;
285
286 /* When non-NULL, indicates that whenever space is allocated on the
287    stack, the resulting stack pointer must not pass this
288    address---that is, for stacks that grow downward, the stack pointer
289    must always be greater than or equal to this address; for stacks
290    that grow upward, the stack pointer must be less than this address.
291    At present, the rtx may be either a REG or a SYMBOL_REF, although
292    the support provided depends on the backend.  */
293 rtx stack_limit_rtx;
294
295 /* Positive if we should track variables, negative if we should run
296    the var-tracking pass only to discard debug annotations, zero if
297    we're not to run it.  When flag_var_tracking == AUTODETECT_VALUE it
298    will be set according to optimize, debug_info_level and debug_hooks
299    in process_options ().  */
300 int flag_var_tracking = AUTODETECT_VALUE;
301
302 /* Positive if we should track variables at assignments, negative if
303    we should run the var-tracking pass only to discard debug
304    annotations.  When flag_var_tracking_assignments ==
305    AUTODETECT_VALUE it will be set according to flag_var_tracking.  */
306 int flag_var_tracking_assignments = AUTODETECT_VALUE;
307
308 /* Nonzero if we should toggle flag_var_tracking_assignments after
309    processing options and computing its default.  */
310 int flag_var_tracking_assignments_toggle = 0;
311
312 /* Type of stack check.  */
313 enum stack_check_type flag_stack_check = NO_STACK_CHECK;
314
315 /* True if the user has tagged the function with the 'section'
316    attribute.  */
317
318 bool user_defined_section_attribute = false;
319
320 /* Values of the -falign-* flags: how much to align labels in code.
321    0 means `use default', 1 means `don't align'.
322    For each variable, there is an _log variant which is the power
323    of two not less than the variable, for .align output.  */
324
325 int align_loops_log;
326 int align_loops_max_skip;
327 int align_jumps_log;
328 int align_jumps_max_skip;
329 int align_labels_log;
330 int align_labels_max_skip;
331 int align_functions_log;
332
333 typedef struct
334 {
335   const char *const string;
336   int *const variable;
337   const int on_value;
338 }
339 lang_independent_options;
340
341 /* Nonzero if subexpressions must be evaluated from left-to-right.  */
342 int flag_evaluation_order = 0;
343
344 /* The user symbol prefix after having resolved same.  */
345 const char *user_label_prefix;
346
347 static const param_info lang_independent_params[] = {
348 #define DEFPARAM(ENUM, OPTION, HELP, DEFAULT, MIN, MAX) \
349   { OPTION, DEFAULT, false, MIN, MAX, HELP },
350 #include "params.def"
351 #undef DEFPARAM
352   { NULL, 0, false, 0, 0, NULL }
353 };
354
355 /* Output files for assembler code (real compiler output)
356    and debugging dumps.  */
357
358 FILE *asm_out_file;
359 FILE *aux_info_file;
360 FILE *dump_file = NULL;
361 const char *dump_file_name;
362
363 /* The current working directory of a translation.  It's generally the
364    directory from which compilation was initiated, but a preprocessed
365    file may specify the original directory in which it was
366    created.  */
367
368 static const char *src_pwd;
369
370 /* Initialize src_pwd with the given string, and return true.  If it
371    was already initialized, return false.  As a special case, it may
372    be called with a NULL argument to test whether src_pwd has NOT been
373    initialized yet.  */
374
375 bool
376 set_src_pwd (const char *pwd)
377 {
378   if (src_pwd)
379     {
380       if (strcmp (src_pwd, pwd) == 0)
381         return true;
382       else
383         return false;
384     }
385
386   src_pwd = xstrdup (pwd);
387   return true;
388 }
389
390 /* Return the directory from which the translation unit was initiated,
391    in case set_src_pwd() was not called before to assign it a
392    different value.  */
393
394 const char *
395 get_src_pwd (void)
396 {
397   if (! src_pwd)
398     {
399       src_pwd = getpwd ();
400       if (!src_pwd)
401         src_pwd = ".";
402     }
403
404    return src_pwd;
405 }
406
407 /* Called when the start of a function definition is parsed,
408    this function prints on stderr the name of the function.  */
409 void
410 announce_function (tree decl)
411 {
412   if (!quiet_flag)
413     {
414       if (rtl_dump_and_exit)
415         fprintf (stderr, "%s ",
416                  identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl))));
417       else
418         fprintf (stderr, " %s",
419                  identifier_to_locale (lang_hooks.decl_printable_name (decl, 2)));
420       fflush (stderr);
421       pp_needs_newline (global_dc->printer) = true;
422       diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL);
423     }
424 }
425
426 /* Initialize local_tick with the time of day, or -1 if
427    flag_random_seed is set.  */
428
429 static void
430 init_local_tick (void)
431 {
432   if (!flag_random_seed)
433     {
434       /* Get some more or less random data.  */
435 #ifdef HAVE_GETTIMEOFDAY
436       {
437         struct timeval tv;
438
439         gettimeofday (&tv, NULL);
440         local_tick = tv.tv_sec * 1000 + tv.tv_usec / 1000;
441       }
442 #else
443       {
444         time_t now = time (NULL);
445
446         if (now != (time_t)-1)
447           local_tick = (unsigned) now;
448       }
449 #endif
450     }
451   else
452     local_tick = -1;
453 }
454
455 /* Set up a default flag_random_seed and local_tick, unless the user
456    already specified one.  Must be called after init_local_tick.  */
457
458 static void
459 init_random_seed (void)
460 {
461   unsigned HOST_WIDE_INT value;
462   static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
463
464   value = local_tick ^ getpid ();
465
466   sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
467   flag_random_seed = random_seed;
468 }
469
470 /* Obtain the random_seed string.  Unless NOINIT, initialize it if
471    it's not provided in the command line.  */
472
473 const char *
474 get_random_seed (bool noinit)
475 {
476   if (!flag_random_seed && !noinit)
477     init_random_seed ();
478   return flag_random_seed;
479 }
480
481 /* Modify the random_seed string to VAL.  Return its previous
482    value.  */
483
484 const char *
485 set_random_seed (const char *val)
486 {
487   const char *old = flag_random_seed;
488   flag_random_seed = val;
489   return old;
490 }
491
492 #if GCC_VERSION < 3004
493
494 /* The functions floor_log2 and exact_log2 are defined as inline
495    functions in toplev.h if GCC_VERSION >= 3004.  The definitions here
496    are used for older versions of gcc.  */
497
498 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
499    If X is 0, return -1.  */
500
501 int
502 floor_log2 (unsigned HOST_WIDE_INT x)
503 {
504   int t = 0;
505
506   if (x == 0)
507     return -1;
508
509   if (HOST_BITS_PER_WIDE_INT > 64)
510     if (x >= (unsigned HOST_WIDE_INT) 1 << (t + 64))
511       t += 64;
512   if (HOST_BITS_PER_WIDE_INT > 32)
513     if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 32))
514       t += 32;
515   if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 16))
516     t += 16;
517   if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 8))
518     t += 8;
519   if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 4))
520     t += 4;
521   if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 2))
522     t += 2;
523   if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 1))
524     t += 1;
525
526   return t;
527 }
528
529 /* Return the logarithm of X, base 2, considering X unsigned,
530    if X is a power of 2.  Otherwise, returns -1.  */
531
532 int
533 exact_log2 (unsigned HOST_WIDE_INT x)
534 {
535   if (x != (x & -x))
536     return -1;
537   return floor_log2 (x);
538 }
539
540 #endif /* GCC_VERSION < 3004 */
541
542 /* Handler for fatal signals, such as SIGSEGV.  These are transformed
543    into ICE messages, which is much more user friendly.  In case the
544    error printer crashes, reset the signal to prevent infinite recursion.  */
545
546 static void
547 crash_signal (int signo)
548 {
549   signal (signo, SIG_DFL);
550
551   /* If we crashed while processing an ASM statement, then be a little more
552      graceful.  It's most likely the user's fault.  */
553   if (this_is_asm_operands)
554     {
555       output_operand_lossage ("unrecoverable error");
556       exit (FATAL_EXIT_CODE);
557     }
558
559   internal_error ("%s", strsignal (signo));
560 }
561
562 /* Arrange to dump core on error.  (The regular error message is still
563    printed first, except in the case of abort().)  */
564
565 static void
566 setup_core_dumping (void)
567 {
568 #ifdef SIGABRT
569   signal (SIGABRT, SIG_DFL);
570 #endif
571 #if defined(HAVE_SETRLIMIT)
572   {
573     struct rlimit rlim;
574     if (getrlimit (RLIMIT_CORE, &rlim) != 0)
575       fatal_error ("getting core file size maximum limit: %m");
576     rlim.rlim_cur = rlim.rlim_max;
577     if (setrlimit (RLIMIT_CORE, &rlim) != 0)
578       fatal_error ("setting core file size limit to maximum: %m");
579   }
580 #endif
581   diagnostic_abort_on_error (global_dc);
582 }
583
584
585 /* Strip off a legitimate source ending from the input string NAME of
586    length LEN.  Rather than having to know the names used by all of
587    our front ends, we strip off an ending of a period followed by
588    up to five characters.  (Java uses ".class".)  */
589
590 void
591 strip_off_ending (char *name, int len)
592 {
593   int i;
594   for (i = 2; i < 6 && len > i; i++)
595     {
596       if (name[len - i] == '.')
597         {
598           name[len - i] = '\0';
599           break;
600         }
601     }
602 }
603
604 /* Output a quoted string.  */
605
606 void
607 output_quoted_string (FILE *asm_file, const char *string)
608 {
609 #ifdef OUTPUT_QUOTED_STRING
610   OUTPUT_QUOTED_STRING (asm_file, string);
611 #else
612   char c;
613
614   putc ('\"', asm_file);
615   while ((c = *string++) != 0)
616     {
617       if (ISPRINT (c))
618         {
619           if (c == '\"' || c == '\\')
620             putc ('\\', asm_file);
621           putc (c, asm_file);
622         }
623       else
624         fprintf (asm_file, "\\%03o", (unsigned char) c);
625     }
626   putc ('\"', asm_file);
627 #endif
628 }
629
630 /* Output a file name in the form wanted by System V.  */
631
632 void
633 output_file_directive (FILE *asm_file, const char *input_name)
634 {
635   int len;
636   const char *na;
637
638   if (input_name == NULL)
639     input_name = "<stdin>";
640   else
641     input_name = remap_debug_filename (input_name);
642
643   len = strlen (input_name);
644   na = input_name + len;
645
646   /* NA gets INPUT_NAME sans directory names.  */
647   while (na > input_name)
648     {
649       if (IS_DIR_SEPARATOR (na[-1]))
650         break;
651       na--;
652     }
653
654 #ifdef ASM_OUTPUT_SOURCE_FILENAME
655   ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
656 #else
657   fprintf (asm_file, "\t.file\t");
658   output_quoted_string (asm_file, na);
659   putc ('\n', asm_file);
660 #endif
661 }
662
663 /* A subroutine of wrapup_global_declarations.  We've come to the end of
664    the compilation unit.  All deferred variables should be undeferred,
665    and all incomplete decls should be finalized.  */
666
667 void
668 wrapup_global_declaration_1 (tree decl)
669 {
670   /* We're not deferring this any longer.  Assignment is conditional to
671      avoid needlessly dirtying PCH pages.  */
672   if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS)
673       && DECL_DEFER_OUTPUT (decl) != 0)
674     DECL_DEFER_OUTPUT (decl) = 0;
675
676   if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0)
677     lang_hooks.finish_incomplete_decl (decl);
678 }
679
680 /* A subroutine of wrapup_global_declarations.  Decide whether or not DECL
681    needs to be output.  Return true if it is output.  */
682
683 bool
684 wrapup_global_declaration_2 (tree decl)
685 {
686   if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
687     return false;
688
689   /* Don't write out static consts, unless we still need them.
690
691      We also keep static consts if not optimizing (for debugging),
692      unless the user specified -fno-keep-static-consts.
693      ??? They might be better written into the debug information.
694      This is possible when using DWARF.
695
696      A language processor that wants static constants to be always
697      written out (even if it is not used) is responsible for
698      calling rest_of_decl_compilation itself.  E.g. the C front-end
699      calls rest_of_decl_compilation from finish_decl.
700      One motivation for this is that is conventional in some
701      environments to write things like:
702      static const char rcsid[] = "... version string ...";
703      intending to force the string to be in the executable.
704
705      A language processor that would prefer to have unneeded
706      static constants "optimized away" would just defer writing
707      them out until here.  E.g. C++ does this, because static
708      constants are often defined in header files.
709
710      ??? A tempting alternative (for both C and C++) would be
711      to force a constant to be written if and only if it is
712      defined in a main file, as opposed to an include file.  */
713
714   if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
715     {
716       struct varpool_node *node;
717       bool needed = true;
718       node = varpool_get_node (decl);
719
720       if (!node && flag_ltrans)
721         needed = false;
722       else if (node && node->finalized)
723         needed = false;
724       else if (node && node->alias)
725         needed = false;
726       else if (!cgraph_global_info_ready
727                && (TREE_USED (decl)
728                    || TREE_USED (DECL_ASSEMBLER_NAME (decl))))
729         /* needed */;
730       else if (node && node->needed)
731         /* needed */;
732       else if (DECL_COMDAT (decl))
733         needed = false;
734       else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
735                && (optimize || !flag_keep_static_consts
736                    || DECL_ARTIFICIAL (decl)))
737         needed = false;
738
739       if (needed)
740         {
741           rest_of_decl_compilation (decl, 1, 1);
742           return true;
743         }
744     }
745
746   return false;
747 }
748
749 /* Do any final processing required for the declarations in VEC, of
750    which there are LEN.  We write out inline functions and variables
751    that have been deferred until this point, but which are required.
752    Returns nonzero if anything was put out.  */
753
754 bool
755 wrapup_global_declarations (tree *vec, int len)
756 {
757   bool reconsider, output_something = false;
758   int i;
759
760   for (i = 0; i < len; i++)
761     wrapup_global_declaration_1 (vec[i]);
762
763   /* Now emit any global variables or functions that we have been
764      putting off.  We need to loop in case one of the things emitted
765      here references another one which comes earlier in the list.  */
766   do
767     {
768       reconsider = false;
769       for (i = 0; i < len; i++)
770         reconsider |= wrapup_global_declaration_2 (vec[i]);
771       if (reconsider)
772         output_something = true;
773     }
774   while (reconsider);
775
776   return output_something;
777 }
778
779 /* A subroutine of check_global_declarations.  Issue appropriate warnings
780    for the global declaration DECL.  */
781
782 void
783 check_global_declaration_1 (tree decl)
784 {
785   /* Warn about any function declared static but not defined.  We don't
786      warn about variables, because many programs have static variables
787      that exist only to get some text into the object file.  */
788   if (TREE_CODE (decl) == FUNCTION_DECL
789       && DECL_INITIAL (decl) == 0
790       && DECL_EXTERNAL (decl)
791       && ! DECL_ARTIFICIAL (decl)
792       && ! TREE_NO_WARNING (decl)
793       && ! TREE_PUBLIC (decl)
794       && (warn_unused_function
795           || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
796     {
797       if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
798         pedwarn (input_location, 0, "%q+F used but never defined", decl);
799       else
800         warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl);
801       /* This symbol is effectively an "extern" declaration now.  */
802       TREE_PUBLIC (decl) = 1;
803       assemble_external (decl);
804     }
805
806   /* Warn about static fns or vars defined but not used.  */
807   if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
808        /* We don't warn about "static const" variables because the
809           "rcs_id" idiom uses that construction.  */
810        || (warn_unused_variable
811            && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
812       && ! DECL_IN_SYSTEM_HEADER (decl)
813       && ! TREE_USED (decl)
814       /* The TREE_USED bit for file-scope decls is kept in the identifier,
815          to handle multiple external decls in different scopes.  */
816       && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl)))
817       && ! DECL_EXTERNAL (decl)
818       && ! TREE_PUBLIC (decl)
819       /* A volatile variable might be used in some non-obvious way.  */
820       && ! TREE_THIS_VOLATILE (decl)
821       /* Global register variables must be declared to reserve them.  */
822       && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
823       /* Otherwise, ask the language.  */
824       && lang_hooks.decls.warn_unused_global (decl))
825     warning ((TREE_CODE (decl) == FUNCTION_DECL)
826              ? OPT_Wunused_function
827              : OPT_Wunused_variable,
828              "%q+D defined but not used", decl);
829 }
830
831 /* Issue appropriate warnings for the global declarations in VEC (of
832    which there are LEN).  */
833
834 void
835 check_global_declarations (tree *vec, int len)
836 {
837   int i;
838
839   for (i = 0; i < len; i++)
840     check_global_declaration_1 (vec[i]);
841 }
842
843 /* Emit debugging information for all global declarations in VEC.  */
844
845 void
846 emit_debug_global_declarations (tree *vec, int len)
847 {
848   int i;
849
850   /* Avoid confusing the debug information machinery when there are errors.  */
851   if (seen_error ())
852     return;
853
854   timevar_push (TV_SYMOUT);
855   for (i = 0; i < len; i++)
856     debug_hooks->global_decl (vec[i]);
857   timevar_pop (TV_SYMOUT);
858 }
859
860 /* Warn about a use of an identifier which was marked deprecated.  */
861 void
862 warn_deprecated_use (tree node, tree attr)
863 {
864   const char *msg;
865
866   if (node == 0 || !warn_deprecated_decl)
867     return;
868
869   if (!attr)
870     {
871       if (DECL_P (node))
872         attr = DECL_ATTRIBUTES (node);
873       else if (TYPE_P (node))
874         {
875           tree decl = TYPE_STUB_DECL (node);
876           if (decl)
877             attr = lookup_attribute ("deprecated",
878                                      TYPE_ATTRIBUTES (TREE_TYPE (decl)));
879         }
880     }
881
882   if (attr)
883     attr = lookup_attribute ("deprecated", attr);
884
885   if (attr)
886     msg = TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)));
887   else
888     msg = NULL;
889
890   if (DECL_P (node))
891     {
892       expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (node));
893       if (msg)
894         warning (OPT_Wdeprecated_declarations,
895                  "%qD is deprecated (declared at %s:%d): %s",
896                  node, xloc.file, xloc.line, msg);
897       else
898         warning (OPT_Wdeprecated_declarations,
899                  "%qD is deprecated (declared at %s:%d)",
900                  node, xloc.file, xloc.line);
901     }
902   else if (TYPE_P (node))
903     {
904       tree what = NULL_TREE;
905       tree decl = TYPE_STUB_DECL (node);
906
907       if (TYPE_NAME (node))
908         {
909           if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
910             what = TYPE_NAME (node);
911           else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
912                    && DECL_NAME (TYPE_NAME (node)))
913             what = DECL_NAME (TYPE_NAME (node));
914         }
915
916       if (decl)
917         {
918           expanded_location xloc
919             = expand_location (DECL_SOURCE_LOCATION (decl));
920           if (what)
921             {
922               if (msg)
923                 warning (OPT_Wdeprecated_declarations,
924                          "%qE is deprecated (declared at %s:%d): %s",
925                          what, xloc.file, xloc.line, msg);
926               else
927                 warning (OPT_Wdeprecated_declarations,
928                          "%qE is deprecated (declared at %s:%d)", what,
929                          xloc.file, xloc.line);
930             }
931           else
932             {
933               if (msg)
934                 warning (OPT_Wdeprecated_declarations,
935                          "type is deprecated (declared at %s:%d): %s",
936                          xloc.file, xloc.line, msg);
937               else
938                 warning (OPT_Wdeprecated_declarations,
939                          "type is deprecated (declared at %s:%d)",
940                          xloc.file, xloc.line);
941             }
942         }
943       else
944         {
945           if (what)
946             {
947               if (msg)
948                 warning (OPT_Wdeprecated_declarations, "%qE is deprecated: %s",
949                          what, msg);
950               else
951                 warning (OPT_Wdeprecated_declarations, "%qE is deprecated", what);
952             }
953           else
954             {
955               if (msg)
956                 warning (OPT_Wdeprecated_declarations, "type is deprecated: %s",
957                          msg);
958               else
959                 warning (OPT_Wdeprecated_declarations, "type is deprecated");
960             }
961         }
962     }
963 }
964
965 /* Compile an entire translation unit.  Write a file of assembly
966    output and various debugging dumps.  */
967
968 static void
969 compile_file (void)
970 {
971   /* Initialize yet another pass.  */
972
973   ggc_protect_identifiers = true;
974
975   init_cgraph ();
976   init_final (main_input_filename);
977   coverage_init (aux_base_name);
978   statistics_init ();
979   invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL);
980
981   timevar_push (TV_PARSE);
982
983   /* Call the parser, which parses the entire file (calling
984      rest_of_compilation for each function).  */
985   lang_hooks.parse_file (set_yydebug);
986
987   /* Compilation is now finished except for writing
988      what's left of the symbol table output.  */
989   timevar_pop (TV_PARSE);
990
991   if (flag_syntax_only || flag_wpa)
992     return;
993
994   ggc_protect_identifiers = false;
995
996   /* This must also call cgraph_finalize_compilation_unit.  */
997   lang_hooks.decls.final_write_globals ();
998
999   if (seen_error ())
1000     return;
1001
1002   /* Ensure that emulated TLS control vars are finalized and build 
1003      a static constructor for them, when it is required.  */
1004   if (!targetm.have_tls)
1005     emutls_finish ();
1006
1007   varpool_assemble_pending_decls ();
1008   finish_aliases_2 ();
1009
1010   /* Likewise for mudflap static object registrations.  */
1011   if (flag_mudflap)
1012     mudflap_finish_file ();
1013
1014   output_shared_constant_pool ();
1015   output_object_blocks ();
1016
1017   /* Write out any pending weak symbol declarations.  */
1018   weak_finish ();
1019
1020   /* This must be at the end before unwind and debug info.
1021      Some target ports emit PIC setup thunks here.  */
1022   targetm.asm_out.code_end ();
1023
1024   /* Do dbx symbols.  */
1025   timevar_push (TV_SYMOUT);
1026
1027 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
1028   if (dwarf2out_do_frame ())
1029     dwarf2out_frame_finish ();
1030 #endif
1031
1032   (*debug_hooks->finish) (main_input_filename);
1033   timevar_pop (TV_SYMOUT);
1034
1035   /* Output some stuff at end of file if nec.  */
1036
1037   dw2_output_indirect_constants ();
1038
1039   /* Flush any pending external directives.  */
1040   process_pending_assemble_externals ();
1041
1042   /* Emit LTO marker if LTO info has been previously emitted.  This is
1043      used by collect2 to determine whether an object file contains IL.
1044      We used to emit an undefined reference here, but this produces
1045      link errors if an object file with IL is stored into a shared
1046      library without invoking lto1.  */
1047   if (flag_generate_lto)
1048     {
1049 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1050       ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
1051                                       "__gnu_lto_v1",
1052                                       (unsigned HOST_WIDE_INT) 1, 8);
1053 #elif defined ASM_OUTPUT_ALIGNED_COMMON
1054       ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_v1",
1055                                  (unsigned HOST_WIDE_INT) 1, 8);
1056 #else
1057       ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_v1",
1058                          (unsigned HOST_WIDE_INT) 1,
1059                          (unsigned HOST_WIDE_INT) 1);
1060 #endif
1061     }
1062
1063   /* Attach a special .ident directive to the end of the file to identify
1064      the version of GCC which compiled this code.  The format of the .ident
1065      string is patterned after the ones produced by native SVR4 compilers.  */
1066 #ifdef IDENT_ASM_OP
1067   if (!flag_no_ident)
1068     {
1069       const char *pkg_version = "(GNU) ";
1070
1071       if (strcmp ("(GCC) ", pkgversion_string))
1072         pkg_version = pkgversion_string;
1073       fprintf (asm_out_file, "%s\"GCC: %s%s\"\n",
1074                IDENT_ASM_OP, pkg_version, version_string);
1075     }
1076 #endif
1077
1078   /* Invoke registered plugin callbacks.  */
1079   invoke_plugin_callbacks (PLUGIN_FINISH_UNIT, NULL);
1080
1081   /* This must be at the end.  Some target ports emit end of file directives
1082      into the assembly file here, and hence we can not output anything to the
1083      assembly file after this point.  */
1084   targetm.asm_out.file_end ();
1085 }
1086
1087 /* Parse a -d... command line switch.  */
1088
1089 void
1090 decode_d_option (const char *arg)
1091 {
1092   int c;
1093
1094   while (*arg)
1095     switch (c = *arg++)
1096       {
1097       case 'A':
1098         flag_debug_asm = 1;
1099         break;
1100       case 'p':
1101         flag_print_asm_name = 1;
1102         break;
1103       case 'P':
1104         flag_dump_rtl_in_asm = 1;
1105         flag_print_asm_name = 1;
1106         break;
1107       case 'v':
1108         graph_dump_format = vcg;
1109         break;
1110       case 'x':
1111         rtl_dump_and_exit = 1;
1112         break;
1113       case 'y':
1114         set_yydebug = 1;
1115         break;
1116       case 'D': /* These are handled by the preprocessor.  */
1117       case 'I':
1118       case 'M':
1119       case 'N':
1120       case 'U':
1121         break;
1122       case 'H':
1123         setup_core_dumping();
1124         break;
1125       case 'a':
1126         enable_rtl_dump_file ();
1127         break;
1128
1129       default:
1130           warning (0, "unrecognized gcc debugging option: %c", c);
1131         break;
1132       }
1133 }
1134
1135 /* Indexed by enum debug_info_type.  */
1136 const char *const debug_type_names[] =
1137 {
1138   "none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
1139 };
1140
1141 /* Print version information to FILE.
1142    Each line begins with INDENT (for the case where FILE is the
1143    assembler output file).  */
1144
1145 void
1146 print_version (FILE *file, const char *indent)
1147 {
1148   static const char fmt1[] =
1149 #ifdef __GNUC__
1150     N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
1151 #else
1152     N_("%s%s%s %sversion %s (%s) compiled by CC, ")
1153 #endif
1154     ;
1155   static const char fmt2[] =
1156     N_("GMP version %s, MPFR version %s, MPC version %s\n");
1157   static const char fmt3[] =
1158     N_("%s%swarning: %s header version %s differs from library version %s.\n");
1159   static const char fmt4[] =
1160     N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n");
1161 #ifndef __VERSION__
1162 #define __VERSION__ "[?]"
1163 #endif
1164   fprintf (file,
1165            file == stderr ? _(fmt1) : fmt1,
1166            indent, *indent != 0 ? " " : "",
1167            lang_hooks.name, pkgversion_string, version_string, TARGET_NAME,
1168            indent, __VERSION__);
1169
1170   /* We need to stringify the GMP macro values.  Ugh, gmp_version has
1171      two string formats, "i.j.k" and "i.j" when k is zero.  As of
1172      gmp-4.3.0, GMP always uses the 3 number format.  */
1173 #define GCC_GMP_STRINGIFY_VERSION3(X) #X
1174 #define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3(X)
1175 #define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z))
1176 #define GCC_GMP_VERSION \
1177   GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
1178 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0
1179 #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
1180   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR)
1181 #else
1182 #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
1183   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR) "." \
1184   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_PATCHLEVEL)
1185 #endif
1186   fprintf (file,
1187            file == stderr ? _(fmt2) : fmt2,
1188            GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING);
1189   if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
1190     fprintf (file,
1191              file == stderr ? _(fmt3) : fmt3,
1192              indent, *indent != 0 ? " " : "",
1193              "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version);
1194   if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ()))
1195     fprintf (file,
1196              file == stderr ? _(fmt3) : fmt3,
1197              indent, *indent != 0 ? " " : "",
1198              "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
1199   if (strcmp (MPC_VERSION_STRING, mpc_get_version ()))
1200     fprintf (file,
1201              file == stderr ? _(fmt3) : fmt3,
1202              indent, *indent != 0 ? " " : "",
1203              "MPC", MPC_VERSION_STRING, mpc_get_version ());
1204   fprintf (file,
1205            file == stderr ? _(fmt4) : fmt4,
1206            indent, *indent != 0 ? " " : "",
1207            PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
1208
1209   print_plugins_versions (file, indent);
1210 }
1211
1212 #ifdef ASM_COMMENT_START
1213 static int
1214 print_to_asm_out_file (print_switch_type type, const char * text)
1215 {
1216   bool prepend_sep = true;
1217
1218   switch (type)
1219     {
1220     case SWITCH_TYPE_LINE_END:
1221       putc ('\n', asm_out_file);
1222       return 1;
1223
1224     case SWITCH_TYPE_LINE_START:
1225       fputs (ASM_COMMENT_START, asm_out_file);
1226       return strlen (ASM_COMMENT_START);
1227
1228     case SWITCH_TYPE_DESCRIPTIVE:
1229       if (ASM_COMMENT_START[0] == 0)
1230         prepend_sep = false;
1231       /* Drop through.  */
1232     case SWITCH_TYPE_PASSED:
1233     case SWITCH_TYPE_ENABLED:
1234       if (prepend_sep)
1235         fputc (' ', asm_out_file);
1236       fputs (text, asm_out_file);
1237       /* No need to return the length here as
1238          print_single_switch has already done it.  */
1239       return 0;
1240
1241     default:
1242       return -1;
1243     }
1244 }
1245 #endif
1246
1247 static int
1248 print_to_stderr (print_switch_type type, const char * text)
1249 {
1250   switch (type)
1251     {
1252     case SWITCH_TYPE_LINE_END:
1253       putc ('\n', stderr);
1254       return 1;
1255
1256     case SWITCH_TYPE_LINE_START:
1257       return 0;
1258
1259     case SWITCH_TYPE_PASSED:
1260     case SWITCH_TYPE_ENABLED:
1261       fputc (' ', stderr);
1262       /* Drop through.  */
1263
1264     case SWITCH_TYPE_DESCRIPTIVE:
1265       fputs (text, stderr);
1266       /* No need to return the length here as
1267          print_single_switch has already done it.  */
1268       return 0;
1269
1270     default:
1271       return -1;
1272     }
1273 }
1274
1275 /* Print an option value and return the adjusted position in the line.
1276    ??? print_fn doesn't handle errors, eg disk full; presumably other
1277    code will catch a disk full though.  */
1278
1279 static int
1280 print_single_switch (print_switch_fn_type print_fn,
1281                      int pos,
1282                      print_switch_type type,
1283                      const char * text)
1284 {
1285   /* The ultrix fprintf returns 0 on success, so compute the result
1286      we want here since we need it for the following test.  The +1
1287      is for the separator character that will probably be emitted.  */
1288   int len = strlen (text) + 1;
1289
1290   if (pos != 0
1291       && pos + len > MAX_LINE)
1292     {
1293       print_fn (SWITCH_TYPE_LINE_END, NULL);
1294       pos = 0;
1295     }
1296
1297   if (pos == 0)
1298     pos += print_fn (SWITCH_TYPE_LINE_START, NULL);
1299
1300   print_fn (type, text);
1301   return pos + len;
1302 }
1303
1304 /* Print active target switches using PRINT_FN.
1305    POS is the current cursor position and MAX is the size of a "line".
1306    Each line begins with INDENT and ends with TERM.
1307    Each switch is separated from the next by SEP.  */
1308
1309 static void
1310 print_switch_values (print_switch_fn_type print_fn)
1311 {
1312   int pos = 0;
1313   size_t j;
1314
1315   /* Fill in the -frandom-seed option, if the user didn't pass it, so
1316      that it can be printed below.  This helps reproducibility.  */
1317   if (!flag_random_seed)
1318     init_random_seed ();
1319
1320   /* Print the options as passed.  */
1321   pos = print_single_switch (print_fn, pos,
1322                              SWITCH_TYPE_DESCRIPTIVE, _("options passed: "));
1323
1324   for (j = 1; j < save_decoded_options_count; j++)
1325     {
1326       switch (save_decoded_options[j].opt_index)
1327         {
1328         case OPT_o:
1329         case OPT_d:
1330         case OPT_dumpbase:
1331         case OPT_dumpdir:
1332         case OPT_auxbase:
1333         case OPT_quiet:
1334         case OPT_version:
1335           /* Ignore these.  */
1336           continue;
1337         }
1338
1339       pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED,
1340                                  save_decoded_options[j].orig_option_with_args_text);
1341     }
1342
1343   if (pos > 0)
1344     print_fn (SWITCH_TYPE_LINE_END, NULL);
1345
1346   /* Print the -f and -m options that have been enabled.
1347      We don't handle language specific options but printing argv
1348      should suffice.  */
1349   pos = print_single_switch (print_fn, 0,
1350                              SWITCH_TYPE_DESCRIPTIVE, _("options enabled: "));
1351
1352   for (j = 0; j < cl_options_count; j++)
1353     if ((cl_options[j].flags & CL_REPORT)
1354         && option_enabled (j) > 0)
1355       pos = print_single_switch (print_fn, pos,
1356                                  SWITCH_TYPE_ENABLED, cl_options[j].opt_text);
1357
1358   print_fn (SWITCH_TYPE_LINE_END, NULL);
1359 }
1360
1361 /* Open assembly code output file.  Do this even if -fsyntax-only is
1362    on, because then the driver will have provided the name of a
1363    temporary file or bit bucket for us.  NAME is the file specified on
1364    the command line, possibly NULL.  */
1365 static void
1366 init_asm_output (const char *name)
1367 {
1368   if (name == NULL && asm_file_name == 0)
1369     asm_out_file = stdout;
1370   else
1371     {
1372       if (asm_file_name == 0)
1373         {
1374           int len = strlen (dump_base_name);
1375           char *dumpname = XNEWVEC (char, len + 6);
1376
1377           memcpy (dumpname, dump_base_name, len + 1);
1378           strip_off_ending (dumpname, len);
1379           strcat (dumpname, ".s");
1380           asm_file_name = dumpname;
1381         }
1382       if (!strcmp (asm_file_name, "-"))
1383         asm_out_file = stdout;
1384       else
1385         asm_out_file = fopen (asm_file_name, "w+b");
1386       if (asm_out_file == 0)
1387         fatal_error ("can%'t open %s for writing: %m", asm_file_name);
1388     }
1389
1390   if (!flag_syntax_only)
1391     {
1392       targetm.asm_out.file_start ();
1393
1394       if (flag_record_gcc_switches)
1395         {
1396           if (targetm.asm_out.record_gcc_switches)
1397             {
1398               /* Let the target know that we are about to start recording.  */
1399               targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
1400                                                    NULL);
1401               /* Now record the switches.  */
1402               print_switch_values (targetm.asm_out.record_gcc_switches);
1403               /* Let the target know that the recording is over.  */
1404               targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
1405                                                    NULL);
1406             }
1407           else
1408             inform (input_location, "-frecord-gcc-switches is not supported by the current target");
1409         }
1410
1411 #ifdef ASM_COMMENT_START
1412       if (flag_verbose_asm)
1413         {
1414           /* Print the list of switches in effect
1415              into the assembler file as comments.  */
1416           print_version (asm_out_file, ASM_COMMENT_START);
1417           print_switch_values (print_to_asm_out_file);
1418           putc ('\n', asm_out_file);
1419         }
1420 #endif
1421     }
1422 }
1423
1424 /* Return true if the state of option OPTION should be stored in PCH files
1425    and checked by default_pch_valid_p.  Store the option's current state
1426    in STATE if so.  */
1427
1428 static inline bool
1429 option_affects_pch_p (int option, struct cl_option_state *state)
1430 {
1431   if ((cl_options[option].flags & CL_TARGET) == 0)
1432     return false;
1433   if (cl_options[option].flag_var == &target_flags)
1434     if (targetm.check_pch_target_flags)
1435       return false;
1436   return get_option_state (option, state);
1437 }
1438
1439 /* Default version of get_pch_validity.
1440    By default, every flag difference is fatal; that will be mostly right for
1441    most targets, but completely right for very few.  */
1442
1443 void *
1444 default_get_pch_validity (size_t *sz)
1445 {
1446   struct cl_option_state state;
1447   size_t i;
1448   char *result, *r;
1449
1450   *sz = 2;
1451   if (targetm.check_pch_target_flags)
1452     *sz += sizeof (target_flags);
1453   for (i = 0; i < cl_options_count; i++)
1454     if (option_affects_pch_p (i, &state))
1455       *sz += state.size;
1456
1457   result = r = XNEWVEC (char, *sz);
1458   r[0] = flag_pic;
1459   r[1] = flag_pie;
1460   r += 2;
1461   if (targetm.check_pch_target_flags)
1462     {
1463       memcpy (r, &target_flags, sizeof (target_flags));
1464       r += sizeof (target_flags);
1465     }
1466
1467   for (i = 0; i < cl_options_count; i++)
1468     if (option_affects_pch_p (i, &state))
1469       {
1470         memcpy (r, state.data, state.size);
1471         r += state.size;
1472       }
1473
1474   return result;
1475 }
1476
1477 /* Return a message which says that a PCH file was created with a different
1478    setting of OPTION.  */
1479
1480 static const char *
1481 pch_option_mismatch (const char *option)
1482 {
1483   char *r;
1484
1485   asprintf (&r, _("created and used with differing settings of '%s'"), option);
1486   if (r == NULL)
1487     return _("out of memory");
1488   return r;
1489 }
1490
1491 /* Default version of pch_valid_p.  */
1492
1493 const char *
1494 default_pch_valid_p (const void *data_p, size_t len)
1495 {
1496   struct cl_option_state state;
1497   const char *data = (const char *)data_p;
1498   size_t i;
1499
1500   /* -fpic and -fpie also usually make a PCH invalid.  */
1501   if (data[0] != flag_pic)
1502     return _("created and used with different settings of -fpic");
1503   if (data[1] != flag_pie)
1504     return _("created and used with different settings of -fpie");
1505   data += 2;
1506
1507   /* Check target_flags.  */
1508   if (targetm.check_pch_target_flags)
1509     {
1510       int tf;
1511       const char *r;
1512
1513       memcpy (&tf, data, sizeof (target_flags));
1514       data += sizeof (target_flags);
1515       len -= sizeof (target_flags);
1516       r = targetm.check_pch_target_flags (tf);
1517       if (r != NULL)
1518         return r;
1519     }
1520
1521   for (i = 0; i < cl_options_count; i++)
1522     if (option_affects_pch_p (i, &state))
1523       {
1524         if (memcmp (data, state.data, state.size) != 0)
1525           return pch_option_mismatch (cl_options[i].opt_text);
1526         data += state.size;
1527         len -= state.size;
1528       }
1529
1530   return NULL;
1531 }
1532
1533 /* Default tree printer.   Handles declarations only.  */
1534 bool
1535 default_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
1536                       int precision, bool wide, bool set_locus, bool hash)
1537 {
1538   tree t;
1539
1540   /* FUTURE: %+x should set the locus.  */
1541   if (precision != 0 || wide || hash)
1542     return false;
1543
1544   switch (*spec)
1545     {
1546     case 'E':
1547       t = va_arg (*text->args_ptr, tree);
1548       if (TREE_CODE (t) == IDENTIFIER_NODE)
1549         {
1550           pp_identifier (pp, IDENTIFIER_POINTER (t));
1551           return true;
1552         }
1553       break;
1554
1555     case 'D':
1556       t = va_arg (*text->args_ptr, tree);
1557       if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
1558         t = DECL_DEBUG_EXPR (t);
1559       break;
1560
1561     case 'F':
1562     case 'T':
1563       t = va_arg (*text->args_ptr, tree);
1564       break;
1565
1566     case 'K':
1567       percent_K_format (text);
1568       return true;
1569
1570     default:
1571       return false;
1572     }
1573
1574   if (set_locus && text->locus)
1575     *text->locus = DECL_SOURCE_LOCATION (t);
1576
1577   if (DECL_P (t))
1578     {
1579       const char *n = DECL_NAME (t)
1580         ? identifier_to_locale (lang_hooks.decl_printable_name (t, 2))
1581         : _("<anonymous>");
1582       pp_string (pp, n);
1583     }
1584   else
1585     dump_generic_node (pp, t, 0, TDF_DIAGNOSTIC, 0);
1586
1587   return true;
1588 }
1589
1590 /* A helper function; used as the reallocator function for cpp's line
1591    table.  */
1592 static void *
1593 realloc_for_line_map (void *ptr, size_t len)
1594 {
1595   return GGC_RESIZEVAR (void, ptr, len);
1596 }
1597
1598 /* A helper function: used as the allocator function for
1599    identifier_to_locale.  */
1600 static void *
1601 alloc_for_identifier_to_locale (size_t len)
1602 {
1603   return ggc_alloc_atomic (len);
1604 }
1605
1606 /* Initialization of the front end environment, before command line
1607    options are parsed.  Signal handlers, internationalization etc.
1608    ARGV0 is main's argv[0].  */
1609 static void
1610 general_init (const char *argv0)
1611 {
1612   const char *p;
1613
1614   p = argv0 + strlen (argv0);
1615   while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
1616     --p;
1617   progname = p;
1618
1619   xmalloc_set_program_name (progname);
1620
1621   hex_init ();
1622
1623   /* Unlock the stdio streams.  */
1624   unlock_std_streams ();
1625
1626   gcc_init_libintl ();
1627
1628   identifier_to_locale_alloc = alloc_for_identifier_to_locale;
1629   identifier_to_locale_free = ggc_free;
1630
1631   /* Initialize the diagnostics reporting machinery, so option parsing
1632      can give warnings and errors.  */
1633   diagnostic_initialize (global_dc, N_OPTS);
1634   diagnostic_starter (global_dc) = default_tree_diagnostic_starter;
1635   /* Set a default printer.  Language specific initializations will
1636      override it later.  */
1637   pp_format_decoder (global_dc->printer) = &default_tree_printer;
1638   global_dc->show_option_requested = flag_diagnostics_show_option;
1639   global_dc->show_column = flag_show_column;
1640   global_dc->internal_error = plugins_internal_error_function;
1641   global_dc->option_enabled = option_enabled;
1642   global_dc->option_name = option_name;
1643
1644   /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
1645 #ifdef SIGSEGV
1646   signal (SIGSEGV, crash_signal);
1647 #endif
1648 #ifdef SIGILL
1649   signal (SIGILL, crash_signal);
1650 #endif
1651 #ifdef SIGBUS
1652   signal (SIGBUS, crash_signal);
1653 #endif
1654 #ifdef SIGABRT
1655   signal (SIGABRT, crash_signal);
1656 #endif
1657 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
1658   signal (SIGIOT, crash_signal);
1659 #endif
1660 #ifdef SIGFPE
1661   signal (SIGFPE, crash_signal);
1662 #endif
1663
1664   /* Other host-specific signal setup.  */
1665   (*host_hooks.extra_signals)();
1666
1667   /* Initialize the garbage-collector, string pools and tree type hash
1668      table.  */
1669   init_ggc ();
1670   init_stringpool ();
1671   line_table = ggc_alloc_line_maps ();
1672   linemap_init (line_table);
1673   line_table->reallocator = realloc_for_line_map;
1674   init_ttree ();
1675
1676   /* Initialize register usage now so switches may override.  */
1677   init_reg_sets ();
1678
1679   /* Register the language-independent parameters.  */
1680   add_params (lang_independent_params, LAST_PARAM);
1681
1682   /* This must be done after add_params but before argument processing.  */
1683   init_ggc_heuristics();
1684   init_optimization_passes ();
1685   statistics_early_init ();
1686 }
1687
1688 /* Return true if the current target supports -fsection-anchors.  */
1689
1690 static bool
1691 target_supports_section_anchors_p (void)
1692 {
1693   if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0)
1694     return false;
1695
1696   if (targetm.asm_out.output_anchor == NULL)
1697     return false;
1698
1699   return true;
1700 }
1701
1702 /* Default the align_* variables to 1 if they're still unset, and
1703    set up the align_*_log variables.  */
1704 static void
1705 init_alignments (void)
1706 {
1707   if (align_loops <= 0)
1708     align_loops = 1;
1709   if (align_loops_max_skip > align_loops)
1710     align_loops_max_skip = align_loops - 1;
1711   align_loops_log = floor_log2 (align_loops * 2 - 1);
1712   if (align_jumps <= 0)
1713     align_jumps = 1;
1714   if (align_jumps_max_skip > align_jumps)
1715     align_jumps_max_skip = align_jumps - 1;
1716   align_jumps_log = floor_log2 (align_jumps * 2 - 1);
1717   if (align_labels <= 0)
1718     align_labels = 1;
1719   align_labels_log = floor_log2 (align_labels * 2 - 1);
1720   if (align_labels_max_skip > align_labels)
1721     align_labels_max_skip = align_labels - 1;
1722   if (align_functions <= 0)
1723     align_functions = 1;
1724   align_functions_log = floor_log2 (align_functions * 2 - 1);
1725 }
1726
1727 /* Process the options that have been parsed.  */
1728 static void
1729 process_options (void)
1730 {
1731   /* Just in case lang_hooks.post_options ends up calling a debug_hook.
1732      This can happen with incorrect pre-processed input. */
1733   debug_hooks = &do_nothing_debug_hooks;
1734
1735   /* This replaces set_Wunused.  */
1736   if (warn_unused_function == -1)
1737     warn_unused_function = warn_unused;
1738   if (warn_unused_label == -1)
1739     warn_unused_label = warn_unused;
1740   /* Wunused-parameter is enabled if both -Wunused -Wextra are enabled.  */
1741   if (warn_unused_parameter == -1)
1742     warn_unused_parameter = (warn_unused && extra_warnings);
1743   if (warn_unused_variable == -1)
1744     warn_unused_variable = warn_unused;
1745   /* Wunused-but-set-parameter is enabled if both -Wunused -Wextra are
1746      enabled.  */
1747   if (warn_unused_but_set_parameter == -1)
1748     warn_unused_but_set_parameter = (warn_unused && extra_warnings);
1749   if (warn_unused_but_set_variable == -1)
1750     warn_unused_but_set_variable = warn_unused;
1751   if (warn_unused_value == -1)
1752     warn_unused_value = warn_unused;
1753
1754   /* This replaces set_Wextra.  */
1755   if (warn_uninitialized == -1)
1756     warn_uninitialized = extra_warnings;
1757
1758   /* Allow the front end to perform consistency checks and do further
1759      initialization based on the command line options.  This hook also
1760      sets the original filename if appropriate (e.g. foo.i -> foo.c)
1761      so we can correctly initialize debug output.  */
1762   no_backend = lang_hooks.post_options (&main_input_filename);
1763
1764   /* Some machines may reject certain combinations of options.  */
1765   targetm.target_option.override ();
1766
1767   /* Avoid any informative notes in the second run of -fcompare-debug.  */
1768   if (flag_compare_debug) 
1769     diagnostic_inhibit_notes (global_dc);
1770
1771   if (flag_section_anchors && !target_supports_section_anchors_p ())
1772     {
1773       warning (OPT_fsection_anchors,
1774                "this target does not support %qs", "-fsection-anchors");
1775       flag_section_anchors = 0;
1776     }
1777
1778   if (flag_short_enums == 2)
1779     flag_short_enums = targetm.default_short_enums ();
1780
1781   /* Set aux_base_name if not already set.  */
1782   if (aux_base_name)
1783     ;
1784   else if (main_input_filename)
1785     {
1786       char *name = xstrdup (lbasename (main_input_filename));
1787
1788       strip_off_ending (name, strlen (name));
1789       aux_base_name = name;
1790     }
1791   else
1792     aux_base_name = "gccaux";
1793
1794 #ifndef HAVE_cloog
1795   if (flag_graphite
1796       || flag_loop_block
1797       || flag_loop_interchange
1798       || flag_loop_strip_mine
1799       || flag_graphite_identity
1800       || flag_loop_parallelize_all)
1801     sorry ("Graphite loop optimizations cannot be used");
1802 #endif
1803
1804   /* Unrolling all loops implies that standard loop unrolling must also
1805      be done.  */
1806   if (flag_unroll_all_loops)
1807     flag_unroll_loops = 1;
1808
1809   /* The loop unrolling code assumes that cse will be run after loop.
1810      web and rename-registers also help when run after loop unrolling.  */
1811   if (flag_rerun_cse_after_loop == AUTODETECT_VALUE)
1812     flag_rerun_cse_after_loop = flag_unroll_loops || flag_peel_loops;
1813
1814   if (flag_web == AUTODETECT_VALUE)
1815     flag_web = flag_unroll_loops || flag_peel_loops;
1816
1817   if (flag_rename_registers == AUTODETECT_VALUE)
1818     flag_rename_registers = flag_unroll_loops || flag_peel_loops;
1819
1820   if (flag_non_call_exceptions)
1821     flag_asynchronous_unwind_tables = 1;
1822   if (flag_asynchronous_unwind_tables)
1823     flag_unwind_tables = 1;
1824
1825   if (flag_value_profile_transformations)
1826     flag_profile_values = 1;
1827
1828   /* Warn about options that are not supported on this machine.  */
1829 #ifndef INSN_SCHEDULING
1830   if (flag_schedule_insns || flag_schedule_insns_after_reload)
1831     warning (0, "instruction scheduling not supported on this target machine");
1832 #endif
1833 #ifndef DELAY_SLOTS
1834   if (flag_delayed_branch)
1835     warning (0, "this target machine does not have delayed branches");
1836 #endif
1837
1838   user_label_prefix = USER_LABEL_PREFIX;
1839   if (flag_leading_underscore != -1)
1840     {
1841       /* If the default prefix is more complicated than "" or "_",
1842          issue a warning and ignore this option.  */
1843       if (user_label_prefix[0] == 0 ||
1844           (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
1845         {
1846           user_label_prefix = flag_leading_underscore ? "_" : "";
1847         }
1848       else
1849         warning (0, "-f%sleading-underscore not supported on this target machine",
1850                  flag_leading_underscore ? "" : "no-");
1851     }
1852
1853   /* If we are in verbose mode, write out the version and maybe all the
1854      option flags in use.  */
1855   if (version_flag)
1856     {
1857       print_version (stderr, "");
1858       if (! quiet_flag)
1859         print_switch_values (print_to_stderr);
1860     }
1861
1862   if (flag_syntax_only)
1863     {
1864       write_symbols = NO_DEBUG;
1865       profile_flag = 0;
1866     }
1867
1868   if (flag_gtoggle)
1869     {
1870       if (debug_info_level == DINFO_LEVEL_NONE)
1871         {
1872           debug_info_level = DINFO_LEVEL_NORMAL;
1873
1874           if (write_symbols == NO_DEBUG)
1875             write_symbols = PREFERRED_DEBUGGING_TYPE;
1876         }
1877       else
1878         debug_info_level = DINFO_LEVEL_NONE;
1879     }
1880
1881   if (flag_dump_final_insns && !flag_syntax_only && !no_backend)
1882     {
1883       FILE *final_output = fopen (flag_dump_final_insns, "w");
1884       if (!final_output)
1885         {
1886           error ("could not open final insn dump file %qs: %m",
1887                  flag_dump_final_insns);
1888           flag_dump_final_insns = NULL;
1889         }
1890       else if (fclose (final_output))
1891         {
1892           error ("could not close zeroed insn dump file %qs: %m",
1893                  flag_dump_final_insns);
1894           flag_dump_final_insns = NULL;
1895         }
1896     }
1897
1898   /* Unless over-ridden for the target, assume that all DWARF levels
1899      may be emitted, if DWARF2_DEBUG is selected.  */
1900   if (dwarf_strict < 0)
1901     dwarf_strict = 0;
1902
1903   /* A lot of code assumes write_symbols == NO_DEBUG if the debugging
1904      level is 0.  */
1905   if (debug_info_level == DINFO_LEVEL_NONE)
1906     write_symbols = NO_DEBUG;
1907
1908   if (write_symbols == NO_DEBUG)
1909     ;
1910 #if defined(DBX_DEBUGGING_INFO)
1911   else if (write_symbols == DBX_DEBUG)
1912     debug_hooks = &dbx_debug_hooks;
1913 #endif
1914 #if defined(XCOFF_DEBUGGING_INFO)
1915   else if (write_symbols == XCOFF_DEBUG)
1916     debug_hooks = &xcoff_debug_hooks;
1917 #endif
1918 #ifdef SDB_DEBUGGING_INFO
1919   else if (write_symbols == SDB_DEBUG)
1920     debug_hooks = &sdb_debug_hooks;
1921 #endif
1922 #ifdef DWARF2_DEBUGGING_INFO
1923   else if (write_symbols == DWARF2_DEBUG)
1924     debug_hooks = &dwarf2_debug_hooks;
1925 #endif
1926 #ifdef VMS_DEBUGGING_INFO
1927   else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1928     debug_hooks = &vmsdbg_debug_hooks;
1929 #endif
1930   else
1931     error ("target system does not support the \"%s\" debug format",
1932            debug_type_names[write_symbols]);
1933
1934   /* We know which debug output will be used so we can set flag_var_tracking
1935      and flag_var_tracking_uninit if the user has not specified them.  */
1936   if (debug_info_level < DINFO_LEVEL_NORMAL
1937       || debug_hooks->var_location == do_nothing_debug_hooks.var_location)
1938     {
1939       if (flag_var_tracking == 1
1940           || flag_var_tracking_uninit == 1)
1941         {
1942           if (debug_info_level < DINFO_LEVEL_NORMAL)
1943             warning (0, "variable tracking requested, but useless unless "
1944                      "producing debug info");
1945           else
1946             warning (0, "variable tracking requested, but not supported "
1947                      "by this debug format");
1948         }
1949       flag_var_tracking = 0;
1950       flag_var_tracking_uninit = 0;
1951     }
1952
1953   /* If the user specifically requested variable tracking with tagging
1954      uninitialized variables, we need to turn on variable tracking.
1955      (We already determined above that variable tracking is feasible.)  */
1956   if (flag_var_tracking_uninit)
1957     flag_var_tracking = 1;
1958
1959   if (flag_var_tracking == AUTODETECT_VALUE)
1960     flag_var_tracking = optimize >= 1;
1961
1962   if (flag_var_tracking_assignments == AUTODETECT_VALUE)
1963     flag_var_tracking_assignments = flag_var_tracking
1964       && !(flag_selective_scheduling || flag_selective_scheduling2);
1965
1966   if (flag_var_tracking_assignments_toggle)
1967     flag_var_tracking_assignments = !flag_var_tracking_assignments;
1968
1969   if (flag_var_tracking_assignments && !flag_var_tracking)
1970     flag_var_tracking = flag_var_tracking_assignments = -1;
1971
1972   if (flag_var_tracking_assignments
1973       && (flag_selective_scheduling || flag_selective_scheduling2))
1974     warning (0, "var-tracking-assignments changes selective scheduling");
1975
1976   if (flag_tree_cselim == AUTODETECT_VALUE)
1977 #ifdef HAVE_conditional_move
1978     flag_tree_cselim = 1;
1979 #else
1980     flag_tree_cselim = 0;
1981 #endif
1982
1983   /* If auxiliary info generation is desired, open the output file.
1984      This goes in the same directory as the source file--unlike
1985      all the other output files.  */
1986   if (flag_gen_aux_info)
1987     {
1988       aux_info_file = fopen (aux_info_file_name, "w");
1989       if (aux_info_file == 0)
1990         fatal_error ("can%'t open %s: %m", aux_info_file_name);
1991     }
1992
1993   if (! targetm.have_named_sections)
1994     {
1995       if (flag_function_sections)
1996         {
1997           warning (0, "-ffunction-sections not supported for this target");
1998           flag_function_sections = 0;
1999         }
2000       if (flag_data_sections)
2001         {
2002           warning (0, "-fdata-sections not supported for this target");
2003           flag_data_sections = 0;
2004         }
2005     }
2006
2007   if (flag_function_sections && profile_flag)
2008     {
2009       warning (0, "-ffunction-sections disabled; it makes profiling impossible");
2010       flag_function_sections = 0;
2011     }
2012
2013 #ifndef HAVE_prefetch
2014   if (flag_prefetch_loop_arrays > 0)
2015     {
2016       warning (0, "-fprefetch-loop-arrays not supported for this target");
2017       flag_prefetch_loop_arrays = 0;
2018     }
2019 #else
2020   if (flag_prefetch_loop_arrays > 0 && !HAVE_prefetch)
2021     {
2022       warning (0, "-fprefetch-loop-arrays not supported for this target (try -march switches)");
2023       flag_prefetch_loop_arrays = 0;
2024     }
2025 #endif
2026
2027   /* This combination of options isn't handled for i386 targets and doesn't
2028      make much sense anyway, so don't allow it.  */
2029   if (flag_prefetch_loop_arrays > 0 && optimize_size)
2030     {
2031       warning (0, "-fprefetch-loop-arrays is not supported with -Os");
2032       flag_prefetch_loop_arrays = 0;
2033     }
2034
2035   /* The presence of IEEE signaling NaNs, implies all math can trap.  */
2036   if (flag_signaling_nans)
2037     flag_trapping_math = 1;
2038
2039   /* We cannot reassociate if we want traps or signed zeros.  */
2040   if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))
2041     {
2042       warning (0, "-fassociative-math disabled; other options take precedence");
2043       flag_associative_math = 0;
2044     }
2045
2046   /* With -fcx-limited-range, we do cheap and quick complex arithmetic.  */
2047   if (flag_cx_limited_range)
2048     flag_complex_method = 0;
2049
2050   /* With -fcx-fortran-rules, we do something in-between cheap and C99.  */
2051   if (flag_cx_fortran_rules)
2052     flag_complex_method = 1;
2053
2054   /* Targets must be able to place spill slots at lower addresses.  If the
2055      target already uses a soft frame pointer, the transition is trivial.  */
2056   if (!FRAME_GROWS_DOWNWARD && flag_stack_protect)
2057     {
2058       warning (0, "-fstack-protector not supported for this target");
2059       flag_stack_protect = 0;
2060     }
2061   if (!flag_stack_protect)
2062     warn_stack_protect = 0;
2063
2064   /* ??? Unwind info is not correct around the CFG unless either a frame
2065      pointer is present or A_O_A is set.  Fixing this requires rewriting
2066      unwind info generation to be aware of the CFG and propagating states
2067      around edges.  */
2068   if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS
2069       && flag_omit_frame_pointer)
2070     {
2071       warning (0, "unwind tables currently require a frame pointer "
2072                "for correctness");
2073       flag_omit_frame_pointer = 0;
2074     }
2075
2076   /* Save the current optimization options.  */
2077   optimization_default_node = build_optimization_node ();
2078   optimization_current_node = optimization_default_node;
2079 }
2080
2081 /* This function can be called multiple times to reinitialize the compiler
2082    back end when register classes or instruction sets have changed,
2083    before each function.  */
2084 static void
2085 backend_init_target (void)
2086 {
2087   /* Initialize alignment variables.  */
2088   init_alignments ();
2089
2090   /* This reinitializes hard_frame_pointer, and calls init_reg_modes_target()
2091      to initialize reg_raw_mode[].  */
2092   init_emit_regs ();
2093
2094   /* This invokes target hooks to set fixed_reg[] etc, which is
2095      mode-dependent.  */
2096   init_regs ();
2097
2098   /* This depends on stack_pointer_rtx.  */
2099   init_fake_stack_mems ();
2100
2101   /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is
2102      mode-dependent.  */
2103   init_alias_target ();
2104
2105   /* Depends on HARD_FRAME_POINTER_REGNUM.  */
2106   init_reload ();
2107
2108   /* The following initialization functions need to generate rtl, so
2109      provide a dummy function context for them.  */
2110   init_dummy_function_start ();
2111
2112   /* rtx_cost is mode-dependent, so cached values need to be recomputed
2113      on a mode change.  */
2114   init_expmed ();
2115
2116   /* We may need to recompute regno_save_code[] and regno_restore_code[]
2117      after a mode change as well.  */
2118   caller_save_initialized_p = false;
2119
2120   expand_dummy_function_end ();
2121 }
2122
2123 /* Initialize the compiler back end.  This function is called only once,
2124    when starting the compiler.  */
2125 static void
2126 backend_init (void)
2127 {
2128   init_emit_once ();
2129
2130   init_rtlanal ();
2131   init_inline_once ();
2132   init_varasm_once ();
2133   save_register_info ();
2134
2135   /* Initialize the target-specific back end pieces.  */
2136   ira_init_once ();
2137   backend_init_target ();
2138 }
2139
2140 /* Initialize excess precision settings.  */
2141 static void
2142 init_excess_precision (void)
2143 {
2144   /* Adjust excess precision handling based on the target options.  If
2145      the front end cannot handle it, flag_excess_precision_cmdline
2146      will already have been set accordingly in the post_options
2147      hook.  */
2148   gcc_assert (flag_excess_precision_cmdline != EXCESS_PRECISION_DEFAULT);
2149   flag_excess_precision = flag_excess_precision_cmdline;
2150   if (flag_unsafe_math_optimizations)
2151     flag_excess_precision = EXCESS_PRECISION_FAST;
2152   if (flag_excess_precision == EXCESS_PRECISION_STANDARD)
2153     {
2154       int flt_eval_method = TARGET_FLT_EVAL_METHOD;
2155       switch (flt_eval_method)
2156         {
2157         case -1:
2158         case 0:
2159           /* Either the target acts unpredictably (-1) or has all the
2160              operations required not to have excess precision (0).  */
2161           flag_excess_precision = EXCESS_PRECISION_FAST;
2162           break;
2163         case 1:
2164         case 2:
2165           /* In these cases, predictable excess precision makes
2166              sense.  */
2167           break;
2168         default:
2169           /* Any other implementation-defined FLT_EVAL_METHOD values
2170              require the compiler to handle the associated excess
2171              precision rules in excess_precision_type.  */
2172           gcc_unreachable ();
2173         }
2174     }
2175 }
2176
2177 /* Initialize things that are both lang-dependent and target-dependent.
2178    This function can be called more than once if target parameters change.  */
2179 static void
2180 lang_dependent_init_target (void)
2181 {
2182   /* This determines excess precision settings.  */
2183   init_excess_precision ();
2184
2185   /* This creates various _DECL nodes, so needs to be called after the
2186      front end is initialized.  It also depends on the HAVE_xxx macros
2187      generated from the target machine description.  */
2188   init_optabs ();
2189
2190   /* The following initialization functions need to generate rtl, so
2191      provide a dummy function context for them.  */
2192   init_dummy_function_start ();
2193
2194   /* Do the target-specific parts of expr initialization.  */
2195   init_expr_target ();
2196
2197   /* Although the actions of these functions are language-independent,
2198      they use optabs, so we cannot call them from backend_init.  */
2199   init_set_costs ();
2200   ira_init ();
2201
2202   expand_dummy_function_end ();
2203 }
2204
2205 /* Language-dependent initialization.  Returns nonzero on success.  */
2206 static int
2207 lang_dependent_init (const char *name)
2208 {
2209   location_t save_loc = input_location;
2210   if (dump_base_name == 0)
2211     dump_base_name = name && name[0] ? name : "gccdump";
2212
2213   /* Other front-end initialization.  */
2214   input_location = BUILTINS_LOCATION;
2215   if (lang_hooks.init () == 0)
2216     return 0;
2217   input_location = save_loc;
2218
2219   init_asm_output (name);
2220
2221   /* This creates various _DECL nodes, so needs to be called after the
2222      front end is initialized.  */
2223   init_eh ();
2224
2225   /* Do the target-specific parts of the initialization.  */
2226   lang_dependent_init_target ();
2227
2228   /* If dbx symbol table desired, initialize writing it and output the
2229      predefined types.  */
2230   timevar_push (TV_SYMOUT);
2231
2232 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
2233   if (dwarf2out_do_frame ())
2234     dwarf2out_frame_init ();
2235 #endif
2236
2237   /* Now we have the correct original filename, we can initialize
2238      debug output.  */
2239   (*debug_hooks->init) (name);
2240
2241   timevar_pop (TV_SYMOUT);
2242
2243   return 1;
2244 }
2245
2246
2247 /* Reinitialize everything when target parameters, such as register usage,
2248    have changed.  */
2249 void
2250 target_reinit (void)
2251 {
2252   /* Reinitialize RTL backend.  */
2253   backend_init_target ();
2254
2255   /* Reinitialize lang-dependent parts.  */
2256   lang_dependent_init_target ();
2257 }
2258
2259 void
2260 dump_memory_report (bool final)
2261 {
2262   ggc_print_statistics ();
2263   stringpool_statistics ();
2264   dump_tree_statistics ();
2265   dump_gimple_statistics ();
2266   dump_rtx_statistics ();
2267   dump_alloc_pool_statistics ();
2268   dump_bitmap_statistics ();
2269   dump_vec_loc_statistics ();
2270   dump_ggc_loc_statistics (final);
2271   dump_alias_stats (stderr);
2272   dump_pta_stats (stderr);
2273 }
2274
2275 /* Clean up: close opened files, etc.  */
2276
2277 static void
2278 finalize (void)
2279 {
2280   /* Close the dump files.  */
2281   if (flag_gen_aux_info)
2282     {
2283       fclose (aux_info_file);
2284       if (seen_error ())
2285         unlink (aux_info_file_name);
2286     }
2287
2288   /* Close non-debugging input and output files.  Take special care to note
2289      whether fclose returns an error, since the pages might still be on the
2290      buffer chain while the file is open.  */
2291
2292   if (asm_out_file)
2293     {
2294       if (ferror (asm_out_file) != 0)
2295         fatal_error ("error writing to %s: %m", asm_file_name);
2296       if (fclose (asm_out_file) != 0)
2297         fatal_error ("error closing %s: %m", asm_file_name);
2298       if (flag_wpa)
2299         unlink_if_ordinary (asm_file_name);
2300     }
2301
2302   statistics_fini ();
2303   finish_optimization_passes ();
2304
2305   ira_finish_once ();
2306
2307   if (mem_report)
2308     dump_memory_report (true);
2309
2310   /* Language-specific end of compilation actions.  */
2311   lang_hooks.finish ();
2312 }
2313
2314 /* Initialize the compiler, and compile the input file.  */
2315 static void
2316 do_compile (void)
2317 {
2318   /* Initialize timing first.  The C front ends read the main file in
2319      the post_options hook, and C++ does file timings.  */
2320   if (time_report || !quiet_flag  || flag_detailed_statistics)
2321     timevar_init ();
2322   timevar_start (TV_TOTAL);
2323
2324   process_options ();
2325
2326   /* Don't do any more if an error has already occurred.  */
2327   if (!seen_error ())
2328     {
2329       /* This must be run always, because it is needed to compute the FP
2330          predefined macros, such as __LDBL_MAX__, for targets using non
2331          default FP formats.  */
2332       init_adjust_machine_modes ();
2333
2334       /* Set up the back-end if requested.  */
2335       if (!no_backend)
2336         backend_init ();
2337
2338       /* Language-dependent initialization.  Returns true on success.  */
2339       if (lang_dependent_init (main_input_filename))
2340         compile_file ();
2341
2342       finalize ();
2343     }
2344
2345   /* Stop timing and print the times.  */
2346   timevar_stop (TV_TOTAL);
2347   timevar_print (stderr);
2348 }
2349
2350 /* Entry point of cc1, cc1plus, jc1, f771, etc.
2351    Exit code is FATAL_EXIT_CODE if can't open files or if there were
2352    any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
2353
2354    It is not safe to call this function more than once.  */
2355
2356 int
2357 toplev_main (int argc, char **argv)
2358 {
2359   expandargv (&argc, &argv);
2360
2361   /* Initialization of GCC's environment, and diagnostics.  */
2362   general_init (argv[0]);
2363
2364   /* Parse the options and do minimal processing; basically just
2365      enough to default flags appropriately.  */
2366   decode_options (argc, CONST_CAST2 (const char **, char **, argv),
2367                   &save_decoded_options, &save_decoded_options_count);
2368
2369   init_local_tick ();
2370
2371   initialize_plugins ();
2372
2373   if (version_flag)
2374     print_version (stderr, "");
2375
2376   if (help_flag)
2377     print_plugins_help (stderr, "");
2378
2379   /* Exit early if we can (e.g. -help).  */
2380   if (!exit_after_options)
2381     do_compile ();
2382
2383   if (warningcount || errorcount)
2384     print_ignored_options ();
2385   diagnostic_finish (global_dc);
2386
2387   /* Invoke registered plugin callbacks if any.  */
2388   invoke_plugin_callbacks (PLUGIN_FINISH, NULL);
2389
2390   finalize_plugins ();
2391   if (seen_error ())
2392     return (FATAL_EXIT_CODE);
2393
2394   return (SUCCESS_EXIT_CODE);
2395 }