OSDN Git Service

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