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