OSDN Git Service

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