OSDN Git Service

* common.opt (exit_after_options, write_symbols, debug_info_level,
[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 /* True if we don't need a backend (e.g. preprocessing only).  */
121 static bool no_backend;
122
123 /* Length of line when printing switch values.  */
124 #define MAX_LINE 75
125
126 /* Decoded options, and number of such options.  */
127 struct cl_decoded_option *save_decoded_options;
128 unsigned int save_decoded_options_count;
129
130 /* Name of top-level original source file (what was input to cpp).
131    This comes from the #-command at the beginning of the actual input.
132    If there isn't any there, then this is the cc1 input file name.  */
133
134 const char *main_input_filename;
135
136 /* Pointer to base name in main_input_filename, with directories and a
137    single final extension removed, and the length of this base
138    name.  */
139 const char *main_input_basename;
140 int main_input_baselength;
141
142 /* Used to enable -fvar-tracking, -fweb and -frename-registers according
143    to optimize in process_options ().  */
144 #define AUTODETECT_VALUE 2
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 ();
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 'D': /* These are handled by the preprocessor.  */
997       case 'I':
998       case 'M':
999       case 'N':
1000       case 'U':
1001         break;
1002       case 'H':
1003         setup_core_dumping();
1004         break;
1005       case 'a':
1006         enable_rtl_dump_file ();
1007         break;
1008
1009       default:
1010           warning (0, "unrecognized gcc debugging option: %c", c);
1011         break;
1012       }
1013 }
1014
1015 /* Indexed by enum debug_info_type.  */
1016 const char *const debug_type_names[] =
1017 {
1018   "none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
1019 };
1020
1021 /* Print version information to FILE.
1022    Each line begins with INDENT (for the case where FILE is the
1023    assembler output file).  */
1024
1025 void
1026 print_version (FILE *file, const char *indent)
1027 {
1028   static const char fmt1[] =
1029 #ifdef __GNUC__
1030     N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
1031 #else
1032     N_("%s%s%s %sversion %s (%s) compiled by CC, ")
1033 #endif
1034     ;
1035   static const char fmt2[] =
1036     N_("GMP version %s, MPFR version %s, MPC version %s\n");
1037   static const char fmt3[] =
1038     N_("%s%swarning: %s header version %s differs from library version %s.\n");
1039   static const char fmt4[] =
1040     N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n");
1041 #ifndef __VERSION__
1042 #define __VERSION__ "[?]"
1043 #endif
1044   fprintf (file,
1045            file == stderr ? _(fmt1) : fmt1,
1046            indent, *indent != 0 ? " " : "",
1047            lang_hooks.name, pkgversion_string, version_string, TARGET_NAME,
1048            indent, __VERSION__);
1049
1050   /* We need to stringify the GMP macro values.  Ugh, gmp_version has
1051      two string formats, "i.j.k" and "i.j" when k is zero.  As of
1052      gmp-4.3.0, GMP always uses the 3 number format.  */
1053 #define GCC_GMP_STRINGIFY_VERSION3(X) #X
1054 #define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3(X)
1055 #define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z))
1056 #define GCC_GMP_VERSION \
1057   GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
1058 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0
1059 #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
1060   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR)
1061 #else
1062 #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
1063   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR) "." \
1064   GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_PATCHLEVEL)
1065 #endif
1066   fprintf (file,
1067            file == stderr ? _(fmt2) : fmt2,
1068            GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING);
1069   if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
1070     fprintf (file,
1071              file == stderr ? _(fmt3) : fmt3,
1072              indent, *indent != 0 ? " " : "",
1073              "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version);
1074   if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ()))
1075     fprintf (file,
1076              file == stderr ? _(fmt3) : fmt3,
1077              indent, *indent != 0 ? " " : "",
1078              "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
1079   if (strcmp (MPC_VERSION_STRING, mpc_get_version ()))
1080     fprintf (file,
1081              file == stderr ? _(fmt3) : fmt3,
1082              indent, *indent != 0 ? " " : "",
1083              "MPC", MPC_VERSION_STRING, mpc_get_version ());
1084   fprintf (file,
1085            file == stderr ? _(fmt4) : fmt4,
1086            indent, *indent != 0 ? " " : "",
1087            PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
1088
1089   print_plugins_versions (file, indent);
1090 }
1091
1092 #ifdef ASM_COMMENT_START
1093 static int
1094 print_to_asm_out_file (print_switch_type type, const char * text)
1095 {
1096   bool prepend_sep = true;
1097
1098   switch (type)
1099     {
1100     case SWITCH_TYPE_LINE_END:
1101       putc ('\n', asm_out_file);
1102       return 1;
1103
1104     case SWITCH_TYPE_LINE_START:
1105       fputs (ASM_COMMENT_START, asm_out_file);
1106       return strlen (ASM_COMMENT_START);
1107
1108     case SWITCH_TYPE_DESCRIPTIVE:
1109       if (ASM_COMMENT_START[0] == 0)
1110         prepend_sep = false;
1111       /* Drop through.  */
1112     case SWITCH_TYPE_PASSED:
1113     case SWITCH_TYPE_ENABLED:
1114       if (prepend_sep)
1115         fputc (' ', asm_out_file);
1116       fputs (text, asm_out_file);
1117       /* No need to return the length here as
1118          print_single_switch has already done it.  */
1119       return 0;
1120
1121     default:
1122       return -1;
1123     }
1124 }
1125 #endif
1126
1127 static int
1128 print_to_stderr (print_switch_type type, const char * text)
1129 {
1130   switch (type)
1131     {
1132     case SWITCH_TYPE_LINE_END:
1133       putc ('\n', stderr);
1134       return 1;
1135
1136     case SWITCH_TYPE_LINE_START:
1137       return 0;
1138
1139     case SWITCH_TYPE_PASSED:
1140     case SWITCH_TYPE_ENABLED:
1141       fputc (' ', stderr);
1142       /* Drop through.  */
1143
1144     case SWITCH_TYPE_DESCRIPTIVE:
1145       fputs (text, stderr);
1146       /* No need to return the length here as
1147          print_single_switch has already done it.  */
1148       return 0;
1149
1150     default:
1151       return -1;
1152     }
1153 }
1154
1155 /* Print an option value and return the adjusted position in the line.
1156    ??? print_fn doesn't handle errors, eg disk full; presumably other
1157    code will catch a disk full though.  */
1158
1159 static int
1160 print_single_switch (print_switch_fn_type print_fn,
1161                      int pos,
1162                      print_switch_type type,
1163                      const char * text)
1164 {
1165   /* The ultrix fprintf returns 0 on success, so compute the result
1166      we want here since we need it for the following test.  The +1
1167      is for the separator character that will probably be emitted.  */
1168   int len = strlen (text) + 1;
1169
1170   if (pos != 0
1171       && pos + len > MAX_LINE)
1172     {
1173       print_fn (SWITCH_TYPE_LINE_END, NULL);
1174       pos = 0;
1175     }
1176
1177   if (pos == 0)
1178     pos += print_fn (SWITCH_TYPE_LINE_START, NULL);
1179
1180   print_fn (type, text);
1181   return pos + len;
1182 }
1183
1184 /* Print active target switches using PRINT_FN.
1185    POS is the current cursor position and MAX is the size of a "line".
1186    Each line begins with INDENT and ends with TERM.
1187    Each switch is separated from the next by SEP.  */
1188
1189 static void
1190 print_switch_values (print_switch_fn_type print_fn)
1191 {
1192   int pos = 0;
1193   size_t j;
1194
1195   /* Fill in the -frandom-seed option, if the user didn't pass it, so
1196      that it can be printed below.  This helps reproducibility.  */
1197   if (!flag_random_seed)
1198     init_random_seed ();
1199
1200   /* Print the options as passed.  */
1201   pos = print_single_switch (print_fn, pos,
1202                              SWITCH_TYPE_DESCRIPTIVE, _("options passed: "));
1203
1204   for (j = 1; j < save_decoded_options_count; j++)
1205     {
1206       switch (save_decoded_options[j].opt_index)
1207         {
1208         case OPT_o:
1209         case OPT_d:
1210         case OPT_dumpbase:
1211         case OPT_dumpdir:
1212         case OPT_auxbase:
1213         case OPT_quiet:
1214         case OPT_version:
1215           /* Ignore these.  */
1216           continue;
1217         }
1218
1219       pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED,
1220                                  save_decoded_options[j].orig_option_with_args_text);
1221     }
1222
1223   if (pos > 0)
1224     print_fn (SWITCH_TYPE_LINE_END, NULL);
1225
1226   /* Print the -f and -m options that have been enabled.
1227      We don't handle language specific options but printing argv
1228      should suffice.  */
1229   pos = print_single_switch (print_fn, 0,
1230                              SWITCH_TYPE_DESCRIPTIVE, _("options enabled: "));
1231
1232   for (j = 0; j < cl_options_count; j++)
1233     if ((cl_options[j].flags & CL_REPORT)
1234         && option_enabled (j, &global_options) > 0)
1235       pos = print_single_switch (print_fn, pos,
1236                                  SWITCH_TYPE_ENABLED, cl_options[j].opt_text);
1237
1238   print_fn (SWITCH_TYPE_LINE_END, NULL);
1239 }
1240
1241 /* Open assembly code output file.  Do this even if -fsyntax-only is
1242    on, because then the driver will have provided the name of a
1243    temporary file or bit bucket for us.  NAME is the file specified on
1244    the command line, possibly NULL.  */
1245 static void
1246 init_asm_output (const char *name)
1247 {
1248   if (name == NULL && asm_file_name == 0)
1249     asm_out_file = stdout;
1250   else
1251     {
1252       if (asm_file_name == 0)
1253         {
1254           int len = strlen (dump_base_name);
1255           char *dumpname = XNEWVEC (char, len + 6);
1256
1257           memcpy (dumpname, dump_base_name, len + 1);
1258           strip_off_ending (dumpname, len);
1259           strcat (dumpname, ".s");
1260           asm_file_name = dumpname;
1261         }
1262       if (!strcmp (asm_file_name, "-"))
1263         asm_out_file = stdout;
1264       else
1265         asm_out_file = fopen (asm_file_name, "w+b");
1266       if (asm_out_file == 0)
1267         fatal_error ("can%'t open %s for writing: %m", asm_file_name);
1268     }
1269
1270   if (!flag_syntax_only)
1271     {
1272       targetm.asm_out.file_start ();
1273
1274       if (flag_record_gcc_switches)
1275         {
1276           if (targetm.asm_out.record_gcc_switches)
1277             {
1278               /* Let the target know that we are about to start recording.  */
1279               targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
1280                                                    NULL);
1281               /* Now record the switches.  */
1282               print_switch_values (targetm.asm_out.record_gcc_switches);
1283               /* Let the target know that the recording is over.  */
1284               targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
1285                                                    NULL);
1286             }
1287           else
1288             inform (input_location, "-frecord-gcc-switches is not supported by the current target");
1289         }
1290
1291 #ifdef ASM_COMMENT_START
1292       if (flag_verbose_asm)
1293         {
1294           /* Print the list of switches in effect
1295              into the assembler file as comments.  */
1296           print_version (asm_out_file, ASM_COMMENT_START);
1297           print_switch_values (print_to_asm_out_file);
1298           putc ('\n', asm_out_file);
1299         }
1300 #endif
1301     }
1302 }
1303
1304 /* Return true if the state of option OPTION should be stored in PCH files
1305    and checked by default_pch_valid_p.  Store the option's current state
1306    in STATE if so.  */
1307
1308 static inline bool
1309 option_affects_pch_p (int option, struct cl_option_state *state)
1310 {
1311   if ((cl_options[option].flags & CL_TARGET) == 0)
1312     return false;
1313   if (option_flag_var (option, &global_options) == &target_flags)
1314     if (targetm.check_pch_target_flags)
1315       return false;
1316   return get_option_state (&global_options, option, state);
1317 }
1318
1319 /* Default version of get_pch_validity.
1320    By default, every flag difference is fatal; that will be mostly right for
1321    most targets, but completely right for very few.  */
1322
1323 void *
1324 default_get_pch_validity (size_t *sz)
1325 {
1326   struct cl_option_state state;
1327   size_t i;
1328   char *result, *r;
1329
1330   *sz = 2;
1331   if (targetm.check_pch_target_flags)
1332     *sz += sizeof (target_flags);
1333   for (i = 0; i < cl_options_count; i++)
1334     if (option_affects_pch_p (i, &state))
1335       *sz += state.size;
1336
1337   result = r = XNEWVEC (char, *sz);
1338   r[0] = flag_pic;
1339   r[1] = flag_pie;
1340   r += 2;
1341   if (targetm.check_pch_target_flags)
1342     {
1343       memcpy (r, &target_flags, sizeof (target_flags));
1344       r += sizeof (target_flags);
1345     }
1346
1347   for (i = 0; i < cl_options_count; i++)
1348     if (option_affects_pch_p (i, &state))
1349       {
1350         memcpy (r, state.data, state.size);
1351         r += state.size;
1352       }
1353
1354   return result;
1355 }
1356
1357 /* Return a message which says that a PCH file was created with a different
1358    setting of OPTION.  */
1359
1360 static const char *
1361 pch_option_mismatch (const char *option)
1362 {
1363   char *r;
1364
1365   asprintf (&r, _("created and used with differing settings of '%s'"), option);
1366   if (r == NULL)
1367     return _("out of memory");
1368   return r;
1369 }
1370
1371 /* Default version of pch_valid_p.  */
1372
1373 const char *
1374 default_pch_valid_p (const void *data_p, size_t len)
1375 {
1376   struct cl_option_state state;
1377   const char *data = (const char *)data_p;
1378   size_t i;
1379
1380   /* -fpic and -fpie also usually make a PCH invalid.  */
1381   if (data[0] != flag_pic)
1382     return _("created and used with different settings of -fpic");
1383   if (data[1] != flag_pie)
1384     return _("created and used with different settings of -fpie");
1385   data += 2;
1386
1387   /* Check target_flags.  */
1388   if (targetm.check_pch_target_flags)
1389     {
1390       int tf;
1391       const char *r;
1392
1393       memcpy (&tf, data, sizeof (target_flags));
1394       data += sizeof (target_flags);
1395       len -= sizeof (target_flags);
1396       r = targetm.check_pch_target_flags (tf);
1397       if (r != NULL)
1398         return r;
1399     }
1400
1401   for (i = 0; i < cl_options_count; i++)
1402     if (option_affects_pch_p (i, &state))
1403       {
1404         if (memcmp (data, state.data, state.size) != 0)
1405           return pch_option_mismatch (cl_options[i].opt_text);
1406         data += state.size;
1407         len -= state.size;
1408       }
1409
1410   return NULL;
1411 }
1412
1413 /* Default tree printer.   Handles declarations only.  */
1414 bool
1415 default_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
1416                       int precision, bool wide, bool set_locus, bool hash)
1417 {
1418   tree t;
1419
1420   /* FUTURE: %+x should set the locus.  */
1421   if (precision != 0 || wide || hash)
1422     return false;
1423
1424   switch (*spec)
1425     {
1426     case 'E':
1427       t = va_arg (*text->args_ptr, tree);
1428       if (TREE_CODE (t) == IDENTIFIER_NODE)
1429         {
1430           pp_identifier (pp, IDENTIFIER_POINTER (t));
1431           return true;
1432         }
1433       break;
1434
1435     case 'D':
1436       t = va_arg (*text->args_ptr, tree);
1437       if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
1438         t = DECL_DEBUG_EXPR (t);
1439       break;
1440
1441     case 'F':
1442     case 'T':
1443       t = va_arg (*text->args_ptr, tree);
1444       break;
1445
1446     case 'K':
1447       percent_K_format (text);
1448       return true;
1449
1450     default:
1451       return false;
1452     }
1453
1454   if (set_locus && text->locus)
1455     *text->locus = DECL_SOURCE_LOCATION (t);
1456
1457   if (DECL_P (t))
1458     {
1459       const char *n = DECL_NAME (t)
1460         ? identifier_to_locale (lang_hooks.decl_printable_name (t, 2))
1461         : _("<anonymous>");
1462       pp_string (pp, n);
1463     }
1464   else
1465     dump_generic_node (pp, t, 0, TDF_DIAGNOSTIC, 0);
1466
1467   return true;
1468 }
1469
1470 /* A helper function; used as the reallocator function for cpp's line
1471    table.  */
1472 static void *
1473 realloc_for_line_map (void *ptr, size_t len)
1474 {
1475   return GGC_RESIZEVAR (void, ptr, len);
1476 }
1477
1478 /* A helper function: used as the allocator function for
1479    identifier_to_locale.  */
1480 static void *
1481 alloc_for_identifier_to_locale (size_t len)
1482 {
1483   return ggc_alloc_atomic (len);
1484 }
1485
1486 /* Output stack usage information.  */
1487 void
1488 output_stack_usage (void)
1489 {
1490   static bool warning_issued = false;
1491   enum stack_usage_kind_type { STATIC = 0, DYNAMIC, DYNAMIC_BOUNDED };
1492   const char *stack_usage_kind_str[] = {
1493     "static",
1494     "dynamic",
1495     "dynamic,bounded"
1496   };
1497   HOST_WIDE_INT stack_usage = current_function_static_stack_size;
1498   enum stack_usage_kind_type stack_usage_kind;
1499   expanded_location loc;
1500   const char *raw_id, *id;
1501
1502   if (stack_usage < 0)
1503     {
1504       if (!warning_issued)
1505         {
1506           warning (0, "-fstack-usage not supported for this target");
1507           warning_issued = true;
1508         }
1509       return;
1510     }
1511
1512   stack_usage_kind = STATIC;
1513
1514   /* Add the maximum amount of space pushed onto the stack.  */
1515   if (current_function_pushed_stack_size > 0)
1516     {
1517       stack_usage += current_function_pushed_stack_size;
1518       stack_usage_kind = DYNAMIC_BOUNDED;
1519     }
1520
1521   /* Now on to the tricky part: dynamic stack allocation.  */
1522   if (current_function_allocates_dynamic_stack_space)
1523     {
1524       if (current_function_has_unbounded_dynamic_stack_size)
1525         stack_usage_kind = DYNAMIC;
1526       else
1527         stack_usage_kind = DYNAMIC_BOUNDED;
1528
1529       /* Add the size even in the unbounded case, this can't hurt.  */
1530       stack_usage += current_function_dynamic_stack_size;
1531     }
1532
1533   loc = expand_location (DECL_SOURCE_LOCATION (current_function_decl));
1534
1535   /* Strip the scope prefix if any.  */
1536   raw_id = lang_hooks.decl_printable_name (current_function_decl, 2);
1537   id = strrchr (raw_id, '.');
1538   if (id)
1539     id++;
1540   else
1541     id = raw_id;
1542
1543   fprintf (stack_usage_file,
1544            "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n",
1545            lbasename (loc.file),
1546            loc.line,
1547            loc.column,
1548            id,
1549            stack_usage,
1550            stack_usage_kind_str[stack_usage_kind]);
1551 }
1552
1553 /* Open an auxiliary output file.  */
1554 static FILE *
1555 open_auxiliary_file (const char *ext)
1556 {
1557   char *filename;
1558   FILE *file;
1559
1560   filename = concat (aux_base_name, ".", ext, NULL);
1561   file = fopen (filename, "w");
1562   if (!file)
1563     fatal_error ("can%'t open %s for writing: %m", filename);
1564   free (filename);
1565   return file;
1566 }
1567
1568 /* Initialization of the front end environment, before command line
1569    options are parsed.  Signal handlers, internationalization etc.
1570    ARGV0 is main's argv[0].  */
1571 static void
1572 general_init (const char *argv0)
1573 {
1574   const char *p;
1575
1576   p = argv0 + strlen (argv0);
1577   while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
1578     --p;
1579   progname = p;
1580
1581   xmalloc_set_program_name (progname);
1582
1583   hex_init ();
1584
1585   /* Unlock the stdio streams.  */
1586   unlock_std_streams ();
1587
1588   gcc_init_libintl ();
1589
1590   identifier_to_locale_alloc = alloc_for_identifier_to_locale;
1591   identifier_to_locale_free = ggc_free;
1592
1593   /* Initialize the diagnostics reporting machinery, so option parsing
1594      can give warnings and errors.  */
1595   diagnostic_initialize (global_dc, N_OPTS);
1596   diagnostic_starter (global_dc) = default_tree_diagnostic_starter;
1597   /* Set a default printer.  Language specific initializations will
1598      override it later.  */
1599   pp_format_decoder (global_dc->printer) = &default_tree_printer;
1600   global_dc->show_option_requested
1601     = global_options_init.x_flag_diagnostics_show_option;
1602   global_dc->show_column
1603     = global_options_init.x_flag_show_column;
1604   global_dc->internal_error = plugins_internal_error_function;
1605   global_dc->option_enabled = option_enabled;
1606   global_dc->option_state = &global_options;
1607   global_dc->option_name = option_name;
1608
1609   /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
1610 #ifdef SIGSEGV
1611   signal (SIGSEGV, crash_signal);
1612 #endif
1613 #ifdef SIGILL
1614   signal (SIGILL, crash_signal);
1615 #endif
1616 #ifdef SIGBUS
1617   signal (SIGBUS, crash_signal);
1618 #endif
1619 #ifdef SIGABRT
1620   signal (SIGABRT, crash_signal);
1621 #endif
1622 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
1623   signal (SIGIOT, crash_signal);
1624 #endif
1625 #ifdef SIGFPE
1626   signal (SIGFPE, crash_signal);
1627 #endif
1628
1629   /* Other host-specific signal setup.  */
1630   (*host_hooks.extra_signals)();
1631
1632   /* Initialize the garbage-collector, string pools and tree type hash
1633      table.  */
1634   init_ggc ();
1635   init_stringpool ();
1636   line_table = ggc_alloc_line_maps ();
1637   linemap_init (line_table);
1638   line_table->reallocator = realloc_for_line_map;
1639   init_ttree ();
1640
1641   /* Initialize register usage now so switches may override.  */
1642   init_reg_sets ();
1643
1644   /* Register the language-independent parameters.  */
1645   add_params (lang_independent_params, LAST_PARAM);
1646   targetm.target_option.default_params ();
1647
1648   /* This must be done after add_params but before argument processing.  */
1649   init_ggc_heuristics();
1650   init_optimization_passes ();
1651   statistics_early_init ();
1652   finish_params ();
1653 }
1654
1655 /* Return true if the current target supports -fsection-anchors.  */
1656
1657 static bool
1658 target_supports_section_anchors_p (void)
1659 {
1660   if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0)
1661     return false;
1662
1663   if (targetm.asm_out.output_anchor == NULL)
1664     return false;
1665
1666   return true;
1667 }
1668
1669 /* Default the align_* variables to 1 if they're still unset, and
1670    set up the align_*_log variables.  */
1671 static void
1672 init_alignments (void)
1673 {
1674   if (align_loops <= 0)
1675     align_loops = 1;
1676   if (align_loops_max_skip > align_loops)
1677     align_loops_max_skip = align_loops - 1;
1678   align_loops_log = floor_log2 (align_loops * 2 - 1);
1679   if (align_jumps <= 0)
1680     align_jumps = 1;
1681   if (align_jumps_max_skip > align_jumps)
1682     align_jumps_max_skip = align_jumps - 1;
1683   align_jumps_log = floor_log2 (align_jumps * 2 - 1);
1684   if (align_labels <= 0)
1685     align_labels = 1;
1686   align_labels_log = floor_log2 (align_labels * 2 - 1);
1687   if (align_labels_max_skip > align_labels)
1688     align_labels_max_skip = align_labels - 1;
1689   if (align_functions <= 0)
1690     align_functions = 1;
1691   align_functions_log = floor_log2 (align_functions * 2 - 1);
1692 }
1693
1694 /* Process the options that have been parsed.  */
1695 static void
1696 process_options (void)
1697 {
1698   /* Just in case lang_hooks.post_options ends up calling a debug_hook.
1699      This can happen with incorrect pre-processed input. */
1700   debug_hooks = &do_nothing_debug_hooks;
1701
1702   /* This replaces set_Wunused.  */
1703   if (warn_unused_function == -1)
1704     warn_unused_function = warn_unused;
1705   if (warn_unused_label == -1)
1706     warn_unused_label = warn_unused;
1707   /* Wunused-parameter is enabled if both -Wunused -Wextra are enabled.  */
1708   if (warn_unused_parameter == -1)
1709     warn_unused_parameter = (warn_unused && extra_warnings);
1710   if (warn_unused_variable == -1)
1711     warn_unused_variable = warn_unused;
1712   /* Wunused-but-set-parameter is enabled if both -Wunused -Wextra are
1713      enabled.  */
1714   if (warn_unused_but_set_parameter == -1)
1715     warn_unused_but_set_parameter = (warn_unused && extra_warnings);
1716   if (warn_unused_but_set_variable == -1)
1717     warn_unused_but_set_variable = warn_unused;
1718   if (warn_unused_value == -1)
1719     warn_unused_value = warn_unused;
1720
1721   /* This replaces set_Wextra.  */
1722   if (warn_uninitialized == -1)
1723     warn_uninitialized = extra_warnings;
1724
1725   /* Allow the front end to perform consistency checks and do further
1726      initialization based on the command line options.  This hook also
1727      sets the original filename if appropriate (e.g. foo.i -> foo.c)
1728      so we can correctly initialize debug output.  */
1729   no_backend = lang_hooks.post_options (&main_input_filename);
1730
1731   /* Some machines may reject certain combinations of options.  */
1732   targetm.target_option.override ();
1733
1734   /* Avoid any informative notes in the second run of -fcompare-debug.  */
1735   if (flag_compare_debug) 
1736     diagnostic_inhibit_notes (global_dc);
1737
1738   if (flag_section_anchors && !target_supports_section_anchors_p ())
1739     {
1740       warning (OPT_fsection_anchors,
1741                "this target does not support %qs", "-fsection-anchors");
1742       flag_section_anchors = 0;
1743     }
1744
1745   if (flag_short_enums == 2)
1746     flag_short_enums = targetm.default_short_enums ();
1747
1748   /* Set aux_base_name if not already set.  */
1749   if (aux_base_name)
1750     ;
1751   else if (main_input_filename)
1752     {
1753       char *name = xstrdup (lbasename (main_input_filename));
1754
1755       strip_off_ending (name, strlen (name));
1756       aux_base_name = name;
1757     }
1758   else
1759     aux_base_name = "gccaux";
1760
1761 #ifndef HAVE_cloog
1762   if (flag_graphite
1763       || flag_loop_block
1764       || flag_loop_interchange
1765       || flag_loop_strip_mine
1766       || flag_graphite_identity
1767       || flag_loop_parallelize_all)
1768     sorry ("Graphite loop optimizations cannot be used");
1769 #endif
1770
1771   /* Unrolling all loops implies that standard loop unrolling must also
1772      be done.  */
1773   if (flag_unroll_all_loops)
1774     flag_unroll_loops = 1;
1775
1776   /* web and rename-registers help when run after loop unrolling.  */
1777   if (flag_web == AUTODETECT_VALUE)
1778     flag_web = flag_unroll_loops || flag_peel_loops;
1779
1780   if (flag_rename_registers == AUTODETECT_VALUE)
1781     flag_rename_registers = flag_unroll_loops || flag_peel_loops;
1782
1783   if (flag_non_call_exceptions)
1784     flag_asynchronous_unwind_tables = 1;
1785   if (flag_asynchronous_unwind_tables)
1786     flag_unwind_tables = 1;
1787
1788   if (flag_value_profile_transformations)
1789     flag_profile_values = 1;
1790
1791   /* Warn about options that are not supported on this machine.  */
1792 #ifndef INSN_SCHEDULING
1793   if (flag_schedule_insns || flag_schedule_insns_after_reload)
1794     warning (0, "instruction scheduling not supported on this target machine");
1795 #endif
1796 #ifndef DELAY_SLOTS
1797   if (flag_delayed_branch)
1798     warning (0, "this target machine does not have delayed branches");
1799 #endif
1800
1801   user_label_prefix = USER_LABEL_PREFIX;
1802   if (flag_leading_underscore != -1)
1803     {
1804       /* If the default prefix is more complicated than "" or "_",
1805          issue a warning and ignore this option.  */
1806       if (user_label_prefix[0] == 0 ||
1807           (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
1808         {
1809           user_label_prefix = flag_leading_underscore ? "_" : "";
1810         }
1811       else
1812         warning (0, "-f%sleading-underscore not supported on this target machine",
1813                  flag_leading_underscore ? "" : "no-");
1814     }
1815
1816   /* If we are in verbose mode, write out the version and maybe all the
1817      option flags in use.  */
1818   if (version_flag)
1819     {
1820       print_version (stderr, "");
1821       if (! quiet_flag)
1822         print_switch_values (print_to_stderr);
1823     }
1824
1825   if (flag_syntax_only)
1826     {
1827       write_symbols = NO_DEBUG;
1828       profile_flag = 0;
1829     }
1830
1831   if (flag_gtoggle)
1832     {
1833       if (debug_info_level == DINFO_LEVEL_NONE)
1834         {
1835           debug_info_level = DINFO_LEVEL_NORMAL;
1836
1837           if (write_symbols == NO_DEBUG)
1838             write_symbols = PREFERRED_DEBUGGING_TYPE;
1839         }
1840       else
1841         debug_info_level = DINFO_LEVEL_NONE;
1842     }
1843
1844   if (flag_dump_final_insns && !flag_syntax_only && !no_backend)
1845     {
1846       FILE *final_output = fopen (flag_dump_final_insns, "w");
1847       if (!final_output)
1848         {
1849           error ("could not open final insn dump file %qs: %m",
1850                  flag_dump_final_insns);
1851           flag_dump_final_insns = NULL;
1852         }
1853       else if (fclose (final_output))
1854         {
1855           error ("could not close zeroed insn dump file %qs: %m",
1856                  flag_dump_final_insns);
1857           flag_dump_final_insns = NULL;
1858         }
1859     }
1860
1861   /* Unless over-ridden for the target, assume that all DWARF levels
1862      may be emitted, if DWARF2_DEBUG is selected.  */
1863   if (dwarf_strict < 0)
1864     dwarf_strict = 0;
1865
1866   /* A lot of code assumes write_symbols == NO_DEBUG if the debugging
1867      level is 0.  */
1868   if (debug_info_level == DINFO_LEVEL_NONE)
1869     write_symbols = NO_DEBUG;
1870
1871   if (write_symbols == NO_DEBUG)
1872     ;
1873 #if defined(DBX_DEBUGGING_INFO)
1874   else if (write_symbols == DBX_DEBUG)
1875     debug_hooks = &dbx_debug_hooks;
1876 #endif
1877 #if defined(XCOFF_DEBUGGING_INFO)
1878   else if (write_symbols == XCOFF_DEBUG)
1879     debug_hooks = &xcoff_debug_hooks;
1880 #endif
1881 #ifdef SDB_DEBUGGING_INFO
1882   else if (write_symbols == SDB_DEBUG)
1883     debug_hooks = &sdb_debug_hooks;
1884 #endif
1885 #ifdef DWARF2_DEBUGGING_INFO
1886   else if (write_symbols == DWARF2_DEBUG)
1887     debug_hooks = &dwarf2_debug_hooks;
1888 #endif
1889 #ifdef VMS_DEBUGGING_INFO
1890   else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1891     debug_hooks = &vmsdbg_debug_hooks;
1892 #endif
1893   else
1894     error ("target system does not support the \"%s\" debug format",
1895            debug_type_names[write_symbols]);
1896
1897   /* We know which debug output will be used so we can set flag_var_tracking
1898      and flag_var_tracking_uninit if the user has not specified them.  */
1899   if (debug_info_level < DINFO_LEVEL_NORMAL
1900       || debug_hooks->var_location == do_nothing_debug_hooks.var_location)
1901     {
1902       if (flag_var_tracking == 1
1903           || flag_var_tracking_uninit == 1)
1904         {
1905           if (debug_info_level < DINFO_LEVEL_NORMAL)
1906             warning (0, "variable tracking requested, but useless unless "
1907                      "producing debug info");
1908           else
1909             warning (0, "variable tracking requested, but not supported "
1910                      "by this debug format");
1911         }
1912       flag_var_tracking = 0;
1913       flag_var_tracking_uninit = 0;
1914     }
1915
1916   /* The debug hooks are used to implement -fdump-go-spec because it
1917      gives a simple and stable API for all the information we need to
1918      dump.  */
1919   if (flag_dump_go_spec != NULL)
1920     debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks);
1921
1922   /* If the user specifically requested variable tracking with tagging
1923      uninitialized variables, we need to turn on variable tracking.
1924      (We already determined above that variable tracking is feasible.)  */
1925   if (flag_var_tracking_uninit)
1926     flag_var_tracking = 1;
1927
1928   if (flag_var_tracking == AUTODETECT_VALUE)
1929     flag_var_tracking = optimize >= 1;
1930
1931   if (flag_var_tracking_assignments == AUTODETECT_VALUE)
1932     flag_var_tracking_assignments = flag_var_tracking
1933       && !(flag_selective_scheduling || flag_selective_scheduling2);
1934
1935   if (flag_var_tracking_assignments_toggle)
1936     flag_var_tracking_assignments = !flag_var_tracking_assignments;
1937
1938   if (flag_var_tracking_assignments && !flag_var_tracking)
1939     flag_var_tracking = flag_var_tracking_assignments = -1;
1940
1941   if (flag_var_tracking_assignments
1942       && (flag_selective_scheduling || flag_selective_scheduling2))
1943     warning (0, "var-tracking-assignments changes selective scheduling");
1944
1945   if (flag_tree_cselim == AUTODETECT_VALUE)
1946 #ifdef HAVE_conditional_move
1947     flag_tree_cselim = 1;
1948 #else
1949     flag_tree_cselim = 0;
1950 #endif
1951
1952   /* If auxiliary info generation is desired, open the output file.
1953      This goes in the same directory as the source file--unlike
1954      all the other output files.  */
1955   if (flag_gen_aux_info)
1956     {
1957       aux_info_file = fopen (aux_info_file_name, "w");
1958       if (aux_info_file == 0)
1959         fatal_error ("can%'t open %s: %m", aux_info_file_name);
1960     }
1961
1962   if (! targetm.have_named_sections)
1963     {
1964       if (flag_function_sections)
1965         {
1966           warning (0, "-ffunction-sections not supported for this target");
1967           flag_function_sections = 0;
1968         }
1969       if (flag_data_sections)
1970         {
1971           warning (0, "-fdata-sections not supported for this target");
1972           flag_data_sections = 0;
1973         }
1974     }
1975
1976   if (flag_function_sections && profile_flag)
1977     {
1978       warning (0, "-ffunction-sections disabled; it makes profiling impossible");
1979       flag_function_sections = 0;
1980     }
1981
1982 #ifndef HAVE_prefetch
1983   if (flag_prefetch_loop_arrays > 0)
1984     {
1985       warning (0, "-fprefetch-loop-arrays not supported for this target");
1986       flag_prefetch_loop_arrays = 0;
1987     }
1988 #else
1989   if (flag_prefetch_loop_arrays > 0 && !HAVE_prefetch)
1990     {
1991       warning (0, "-fprefetch-loop-arrays not supported for this target (try -march switches)");
1992       flag_prefetch_loop_arrays = 0;
1993     }
1994 #endif
1995
1996   /* This combination of options isn't handled for i386 targets and doesn't
1997      make much sense anyway, so don't allow it.  */
1998   if (flag_prefetch_loop_arrays > 0 && optimize_size)
1999     {
2000       warning (0, "-fprefetch-loop-arrays is not supported with -Os");
2001       flag_prefetch_loop_arrays = 0;
2002     }
2003
2004   /* The presence of IEEE signaling NaNs, implies all math can trap.  */
2005   if (flag_signaling_nans)
2006     flag_trapping_math = 1;
2007
2008   /* We cannot reassociate if we want traps or signed zeros.  */
2009   if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))
2010     {
2011       warning (0, "-fassociative-math disabled; other options take precedence");
2012       flag_associative_math = 0;
2013     }
2014
2015   /* With -fcx-limited-range, we do cheap and quick complex arithmetic.  */
2016   if (flag_cx_limited_range)
2017     flag_complex_method = 0;
2018
2019   /* With -fcx-fortran-rules, we do something in-between cheap and C99.  */
2020   if (flag_cx_fortran_rules)
2021     flag_complex_method = 1;
2022
2023   /* Targets must be able to place spill slots at lower addresses.  If the
2024      target already uses a soft frame pointer, the transition is trivial.  */
2025   if (!FRAME_GROWS_DOWNWARD && flag_stack_protect)
2026     {
2027       warning (0, "-fstack-protector not supported for this target");
2028       flag_stack_protect = 0;
2029     }
2030   if (!flag_stack_protect)
2031     warn_stack_protect = 0;
2032
2033   /* ??? Unwind info is not correct around the CFG unless either a frame
2034      pointer is present or A_O_A is set.  Fixing this requires rewriting
2035      unwind info generation to be aware of the CFG and propagating states
2036      around edges.  */
2037   if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS
2038       && flag_omit_frame_pointer)
2039     {
2040       warning (0, "unwind tables currently require a frame pointer "
2041                "for correctness");
2042       flag_omit_frame_pointer = 0;
2043     }
2044
2045   /* Save the current optimization options.  */
2046   optimization_default_node = build_optimization_node ();
2047   optimization_current_node = optimization_default_node;
2048 }
2049
2050 /* This function can be called multiple times to reinitialize the compiler
2051    back end when register classes or instruction sets have changed,
2052    before each function.  */
2053 static void
2054 backend_init_target (void)
2055 {
2056   /* Initialize alignment variables.  */
2057   init_alignments ();
2058
2059   /* This reinitializes hard_frame_pointer, and calls init_reg_modes_target()
2060      to initialize reg_raw_mode[].  */
2061   init_emit_regs ();
2062
2063   /* This invokes target hooks to set fixed_reg[] etc, which is
2064      mode-dependent.  */
2065   init_regs ();
2066
2067   /* This depends on stack_pointer_rtx.  */
2068   init_fake_stack_mems ();
2069
2070   /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is
2071      mode-dependent.  */
2072   init_alias_target ();
2073
2074   /* Depends on HARD_FRAME_POINTER_REGNUM.  */
2075   init_reload ();
2076
2077   /* The following initialization functions need to generate rtl, so
2078      provide a dummy function context for them.  */
2079   init_dummy_function_start ();
2080
2081   /* rtx_cost is mode-dependent, so cached values need to be recomputed
2082      on a mode change.  */
2083   init_expmed ();
2084
2085   /* We may need to recompute regno_save_code[] and regno_restore_code[]
2086      after a mode change as well.  */
2087   caller_save_initialized_p = false;
2088
2089   expand_dummy_function_end ();
2090 }
2091
2092 /* Initialize the compiler back end.  This function is called only once,
2093    when starting the compiler.  */
2094 static void
2095 backend_init (void)
2096 {
2097   init_emit_once ();
2098
2099   init_rtlanal ();
2100   init_inline_once ();
2101   init_varasm_once ();
2102   save_register_info ();
2103
2104   /* Initialize the target-specific back end pieces.  */
2105   ira_init_once ();
2106   backend_init_target ();
2107 }
2108
2109 /* Initialize excess precision settings.  */
2110 static void
2111 init_excess_precision (void)
2112 {
2113   /* Adjust excess precision handling based on the target options.  If
2114      the front end cannot handle it, flag_excess_precision_cmdline
2115      will already have been set accordingly in the post_options
2116      hook.  */
2117   gcc_assert (flag_excess_precision_cmdline != EXCESS_PRECISION_DEFAULT);
2118   flag_excess_precision = flag_excess_precision_cmdline;
2119   if (flag_unsafe_math_optimizations)
2120     flag_excess_precision = EXCESS_PRECISION_FAST;
2121   if (flag_excess_precision == EXCESS_PRECISION_STANDARD)
2122     {
2123       int flt_eval_method = TARGET_FLT_EVAL_METHOD;
2124       switch (flt_eval_method)
2125         {
2126         case -1:
2127         case 0:
2128           /* Either the target acts unpredictably (-1) or has all the
2129              operations required not to have excess precision (0).  */
2130           flag_excess_precision = EXCESS_PRECISION_FAST;
2131           break;
2132         case 1:
2133         case 2:
2134           /* In these cases, predictable excess precision makes
2135              sense.  */
2136           break;
2137         default:
2138           /* Any other implementation-defined FLT_EVAL_METHOD values
2139              require the compiler to handle the associated excess
2140              precision rules in excess_precision_type.  */
2141           gcc_unreachable ();
2142         }
2143     }
2144 }
2145
2146 /* Initialize things that are both lang-dependent and target-dependent.
2147    This function can be called more than once if target parameters change.  */
2148 static void
2149 lang_dependent_init_target (void)
2150 {
2151   /* This determines excess precision settings.  */
2152   init_excess_precision ();
2153
2154   /* This creates various _DECL nodes, so needs to be called after the
2155      front end is initialized.  It also depends on the HAVE_xxx macros
2156      generated from the target machine description.  */
2157   init_optabs ();
2158
2159   /* The following initialization functions need to generate rtl, so
2160      provide a dummy function context for them.  */
2161   init_dummy_function_start ();
2162
2163   /* Do the target-specific parts of expr initialization.  */
2164   init_expr_target ();
2165
2166   /* Although the actions of these functions are language-independent,
2167      they use optabs, so we cannot call them from backend_init.  */
2168   init_set_costs ();
2169   ira_init ();
2170
2171   expand_dummy_function_end ();
2172 }
2173
2174 /* Language-dependent initialization.  Returns nonzero on success.  */
2175 static int
2176 lang_dependent_init (const char *name)
2177 {
2178   location_t save_loc = input_location;
2179   if (dump_base_name == 0)
2180     dump_base_name = name && name[0] ? name : "gccdump";
2181
2182   /* Other front-end initialization.  */
2183   input_location = BUILTINS_LOCATION;
2184   if (lang_hooks.init () == 0)
2185     return 0;
2186   input_location = save_loc;
2187
2188   init_asm_output (name);
2189
2190   /* If stack usage information is desired, open the output file.  */
2191   if (flag_stack_usage)
2192     stack_usage_file = open_auxiliary_file ("su");
2193
2194   /* This creates various _DECL nodes, so needs to be called after the
2195      front end is initialized.  */
2196   init_eh ();
2197
2198   /* Do the target-specific parts of the initialization.  */
2199   lang_dependent_init_target ();
2200
2201   /* If dbx symbol table desired, initialize writing it and output the
2202      predefined types.  */
2203   timevar_push (TV_SYMOUT);
2204
2205 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
2206   if (dwarf2out_do_frame ())
2207     dwarf2out_frame_init ();
2208 #endif
2209
2210   /* Now we have the correct original filename, we can initialize
2211      debug output.  */
2212   (*debug_hooks->init) (name);
2213
2214   timevar_pop (TV_SYMOUT);
2215
2216   return 1;
2217 }
2218
2219
2220 /* Reinitialize everything when target parameters, such as register usage,
2221    have changed.  */
2222 void
2223 target_reinit (void)
2224 {
2225   /* Reinitialize RTL backend.  */
2226   backend_init_target ();
2227
2228   /* Reinitialize lang-dependent parts.  */
2229   lang_dependent_init_target ();
2230 }
2231
2232 void
2233 dump_memory_report (bool final)
2234 {
2235   ggc_print_statistics ();
2236   stringpool_statistics ();
2237   dump_tree_statistics ();
2238   dump_gimple_statistics ();
2239   dump_rtx_statistics ();
2240   dump_alloc_pool_statistics ();
2241   dump_bitmap_statistics ();
2242   dump_vec_loc_statistics ();
2243   dump_ggc_loc_statistics (final);
2244   dump_alias_stats (stderr);
2245   dump_pta_stats (stderr);
2246 }
2247
2248 /* Clean up: close opened files, etc.  */
2249
2250 static void
2251 finalize (void)
2252 {
2253   /* Close the dump files.  */
2254   if (flag_gen_aux_info)
2255     {
2256       fclose (aux_info_file);
2257       if (seen_error ())
2258         unlink (aux_info_file_name);
2259     }
2260
2261   /* Close non-debugging input and output files.  Take special care to note
2262      whether fclose returns an error, since the pages might still be on the
2263      buffer chain while the file is open.  */
2264
2265   if (asm_out_file)
2266     {
2267       if (ferror (asm_out_file) != 0)
2268         fatal_error ("error writing to %s: %m", asm_file_name);
2269       if (fclose (asm_out_file) != 0)
2270         fatal_error ("error closing %s: %m", asm_file_name);
2271       if (flag_wpa)
2272         unlink_if_ordinary (asm_file_name);
2273     }
2274
2275   if (stack_usage_file)
2276     fclose (stack_usage_file);
2277
2278   statistics_fini ();
2279   finish_optimization_passes ();
2280
2281   ira_finish_once ();
2282
2283   if (mem_report)
2284     dump_memory_report (true);
2285
2286   /* Language-specific end of compilation actions.  */
2287   lang_hooks.finish ();
2288 }
2289
2290 /* Initialize the compiler, and compile the input file.  */
2291 static void
2292 do_compile (void)
2293 {
2294   /* Initialize timing first.  The C front ends read the main file in
2295      the post_options hook, and C++ does file timings.  */
2296   if (time_report || !quiet_flag  || flag_detailed_statistics)
2297     timevar_init ();
2298   timevar_start (TV_TOTAL);
2299
2300   process_options ();
2301
2302   /* Don't do any more if an error has already occurred.  */
2303   if (!seen_error ())
2304     {
2305       /* This must be run always, because it is needed to compute the FP
2306          predefined macros, such as __LDBL_MAX__, for targets using non
2307          default FP formats.  */
2308       init_adjust_machine_modes ();
2309
2310       /* Set up the back-end if requested.  */
2311       if (!no_backend)
2312         backend_init ();
2313
2314       /* Language-dependent initialization.  Returns true on success.  */
2315       if (lang_dependent_init (main_input_filename))
2316         compile_file ();
2317
2318       finalize ();
2319     }
2320
2321   /* Stop timing and print the times.  */
2322   timevar_stop (TV_TOTAL);
2323   timevar_print (stderr);
2324 }
2325
2326 /* Entry point of cc1, cc1plus, jc1, f771, etc.
2327    Exit code is FATAL_EXIT_CODE if can't open files or if there were
2328    any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
2329
2330    It is not safe to call this function more than once.  */
2331
2332 int
2333 toplev_main (int argc, char **argv)
2334 {
2335   expandargv (&argc, &argv);
2336
2337   /* Initialization of GCC's environment, and diagnostics.  */
2338   general_init (argv[0]);
2339
2340   /* One-off initialization of options that does not need to be
2341      repeated when options are added for particular functions.  */
2342   init_options_once ();
2343
2344   /* Initialize global options structures; this must be repeated for
2345      each structure used for parsing options.  */
2346   init_options_struct (&global_options, &global_options_set);
2347   lang_hooks.init_options_struct (&global_options);
2348
2349   /* Convert the options to an array.  */
2350   decode_cmdline_options_to_array_default_mask (argc,
2351                                                 CONST_CAST2 (const char **,
2352                                                              char **, argv),
2353                                                 &save_decoded_options,
2354                                                 &save_decoded_options_count);
2355
2356   /* Perform language-specific options initialization.  */
2357   lang_hooks.init_options (save_decoded_options_count, save_decoded_options);
2358
2359   /* Parse the options and do minimal processing; basically just
2360      enough to default flags appropriately.  */
2361   decode_options (&global_options, &global_options_set,
2362                   save_decoded_options, save_decoded_options_count,
2363                   UNKNOWN_LOCATION, global_dc);
2364
2365   handle_common_deferred_options ();
2366
2367   init_local_tick ();
2368
2369   initialize_plugins ();
2370
2371   if (version_flag)
2372     print_version (stderr, "");
2373
2374   if (help_flag)
2375     print_plugins_help (stderr, "");
2376
2377   /* Exit early if we can (e.g. -help).  */
2378   if (!exit_after_options)
2379     do_compile ();
2380
2381   if (warningcount || errorcount)
2382     print_ignored_options ();
2383   diagnostic_finish (global_dc);
2384
2385   /* Invoke registered plugin callbacks if any.  */
2386   invoke_plugin_callbacks (PLUGIN_FINISH, NULL);
2387
2388   finalize_plugins ();
2389   if (seen_error ())
2390     return (FATAL_EXIT_CODE);
2391
2392   return (SUCCESS_EXIT_CODE);
2393 }