toplev.c 58.1 KB
Newer Older
1
/* Top level of GCC compilers (cc1, cc1plus, etc.)
2
   Copyright (C) 1987-2014 Free Software Foundation, Inc.
Richard Stallman committed
3

4
This file is part of GCC.
Richard Stallman committed
5

6 7
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
8
Software Foundation; either version 3, or (at your option) any later
9
version.
Richard Stallman committed
10

11 12 13 14
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
Richard Stallman committed
15 16

You should have received a copy of the GNU General Public License
17 18
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
Richard Stallman committed
19 20 21 22 23 24 25

/* This is the top level of cc1/c++.
   It parses command args, opens files, invokes the various passes
   in the proper order, and counts the time used by each.
   Error messages and low-level interface to malloc also handled here.  */

#include "config.h"
26
#include "system.h"
27 28
#include "coretypes.h"
#include "tm.h"
29
#include "line-map.h"
Richard Stallman committed
30 31
#include "input.h"
#include "tree.h"
32 33
#include "varasm.h"
#include "tree-inline.h"
34
#include "realmpfr.h"	/* For GMP/MPFR/MPC versions, in print_version.  */
35
#include "version.h"
Richard Stallman committed
36
#include "rtl.h"
37
#include "tm_p.h"
Richard Stallman committed
38 39
#include "flags.h"
#include "insn-attr.h"
40
#include "insn-config.h"
41
#include "insn-flags.h"
42
#include "hard-reg-set.h"
43
#include "recog.h"
Richard Kenner committed
44
#include "output.h"
Mike Stump committed
45
#include "except.h"
46
#include "function.h"
Jim Wilson committed
47
#include "toplev.h"
48
#include "expr.h"
49
#include "intl.h"
50
#include "regs.h"
51
#include "timevar.h"
52
#include "diagnostic.h"
53 54
#include "tree-diagnostic.h"
#include "tree-pretty-print.h"
55
#include "params.h"
56
#include "reload.h"
Vladimir Makarov committed
57
#include "ira.h"
58
#include "dwarf2asm.h"
59
#include "debug.h"
60
#include "target.h"
61
#include "common/common-target.h"
Neil Booth committed
62
#include "langhooks.h"
63
#include "cfgloop.h" /* for init_set_costs */
64
#include "hosthooks.h"
65
#include "cgraph.h"
66
#include "opts.h"
67
#include "opts-diagnostic.h"
68
#include "coverage.h"
69
#include "value-prof.h"
70
#include "alloc-pool.h"
71
#include "asan.h"
72
#include "tsan.h"
73
#include "tree-ssa-alias.h"
74 75 76
#include "internal-fn.h"
#include "gimple-expr.h"
#include "gimple.h"
Diego Novillo committed
77
#include "plugin.h"
78
#include "diagnostic-color.h"
David Malcolm committed
79
#include "context.h"
80
#include "pass_manager.h"
81
#include "optabs.h"
82

Kaveh R. Ghazi committed
83
#if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
84 85 86 87 88 89
#include "dbxout.h"
#endif

#ifdef SDB_DEBUGGING_INFO
#include "sdbout.h"
#endif
90 91 92 93 94

#ifdef XCOFF_DEBUGGING_INFO
#include "xcoffout.h"		/* Needed for external data
				   declarations for e.g. AIX 4.x.  */
#endif
95

96
static void general_init (const char *);
97 98 99 100 101
static void do_compile (void);
static void process_options (void);
static void backend_init (void);
static int lang_dependent_init (const char *);
static void init_asm_output (const char *);
102
static void finalize (bool);
103 104 105 106

static void crash_signal (int) ATTRIBUTE_NORETURN;
static void compile_file (void);

107 108 109
/* True if we don't need a backend (e.g. preprocessing only).  */
static bool no_backend;

110 111 112
/* Length of line when printing switch values.  */
#define MAX_LINE 75

113
/* Decoded options, and number of such options.  */
114 115
struct cl_decoded_option *save_decoded_options;
unsigned int save_decoded_options_count;
116

117
/* Used to enable -fvar-tracking, -fweb and -frename-registers according
118
   to optimize in process_options ().  */
119
#define AUTODETECT_VALUE 2
120

121 122
/* Debug hooks - dependent upon command line options.  */

123
const struct gcc_debug_hooks *debug_hooks;
124

125 126 127 128
/* The FUNCTION_DECL for the function currently being compiled,
   or 0 if between functions.  */
tree current_function_decl;

129
/* Set to the FUNC_BEGIN label of the current function, or NULL
130
   if none.  */
131
const char * current_function_func_begin_label;
132

133
/* A random sequence of characters, unless overridden by user.  */
134
static const char *flag_random_seed;
135 136 137 138 139 140

/* A local time stamp derived from the time of compilation. It will be
   zero if the system cannot provide a time.  It will be -1u, if the
   user has specified a particular random seed.  */
unsigned local_tick;

141 142 143
/* Random number for this compilation */
HOST_WIDE_INT random_seed;

Richard Stallman committed
144 145
/* -f flags.  */

146 147 148 149 150 151 152 153 154
/* When non-NULL, indicates that whenever space is allocated on the
   stack, the resulting stack pointer must not pass this
   address---that is, for stacks that grow downward, the stack pointer
   must always be greater than or equal to this address; for stacks
   that grow upward, the stack pointer must be less than this address.
   At present, the rtx may be either a REG or a SYMBOL_REF, although
   the support provided depends on the backend.  */
rtx stack_limit_rtx;

155 156 157 158 159
/* True if the user has tagged the function with the 'section'
   attribute.  */

bool user_defined_section_attribute = false;

160 161 162 163 164 165
struct target_flag_state default_target_flag_state;
#if SWITCHABLE_TARGET
struct target_flag_state *this_target_flag_state = &default_target_flag_state;
#else
#define this_target_flag_state (&default_target_flag_state)
#endif
166

167
/* The user symbol prefix after having resolved same.  */
168
const char *user_label_prefix;
169

Richard Stallman committed
170 171 172 173 174
/* Output files for assembler code (real compiler output)
   and debugging dumps.  */

FILE *asm_out_file;
FILE *aux_info_file;
Eric Botcazou committed
175
FILE *stack_usage_file = NULL;
Richard Stallman committed
176

177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
/* The current working directory of a translation.  It's generally the
   directory from which compilation was initiated, but a preprocessed
   file may specify the original directory in which it was
   created.  */

static const char *src_pwd;

/* Initialize src_pwd with the given string, and return true.  If it
   was already initialized, return false.  As a special case, it may
   be called with a NULL argument to test whether src_pwd has NOT been
   initialized yet.  */

bool
set_src_pwd (const char *pwd)
{
  if (src_pwd)
193 194 195 196 197 198
    {
      if (strcmp (src_pwd, pwd) == 0)
	return true;
      else
	return false;
    }
199 200 201 202 203 204 205 206 207 208 209 210 211

  src_pwd = xstrdup (pwd);
  return true;
}

/* Return the directory from which the translation unit was initiated,
   in case set_src_pwd() was not called before to assign it a
   different value.  */

const char *
get_src_pwd (void)
{
  if (! src_pwd)
212 213 214 215 216
    {
      src_pwd = getpwd ();
      if (!src_pwd)
	src_pwd = ".";
    }
217 218 219 220

   return src_pwd;
}

221 222 223 224 225 226 227 228
/* Called when the start of a function definition is parsed,
   this function prints on stderr the name of the function.  */
void
announce_function (tree decl)
{
  if (!quiet_flag)
    {
      if (rtl_dump_and_exit)
229 230
	fprintf (stderr, "%s ",
		 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl))));
231
      else
232 233
	fprintf (stderr, " %s",
		 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2)));
234 235
      fflush (stderr);
      pp_needs_newline (global_dc->printer) = true;
236
      diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL);
237 238 239
    }
}

240
/* Initialize local_tick with a random number or -1 if
241
   flag_random_seed is set.  */
242 243

static void
244
init_local_tick (void)
245 246 247
{
  if (!flag_random_seed)
    {
248 249 250 251 252 253 254 255 256 257 258
      /* Try urandom first. Time of day is too likely to collide. 
	 In case of any error we just use the local tick. */

      int fd = open ("/dev/urandom", O_RDONLY);
      if (fd >= 0)
        {
          read (fd, &random_seed, sizeof (random_seed));
          close (fd);
        }

      /* Now get the tick anyways  */
259 260
#ifdef HAVE_GETTIMEOFDAY
      {
261
	struct timeval tv;
262

263
	gettimeofday (&tv, NULL);
264 265 266 267
	local_tick = tv.tv_sec * 1000 + tv.tv_usec / 1000;
      }
#else
      {
268
	time_t now = time (NULL);
269 270 271 272 273 274

	if (now != (time_t)-1)
	  local_tick = (unsigned) now;
      }
#endif
    }
275
  else
276 277 278
    local_tick = -1;
}

279 280 281 282 283 284
/* Set up a default flag_random_seed and local_tick, unless the user
   already specified one.  Must be called after init_local_tick.  */

static void
init_random_seed (void)
{
285 286 287
  if (flag_random_seed)
    {
      char *endp;
288

289 290 291 292 293 294 295
      /* When the driver passed in a hex number don't crc it again */
      random_seed = strtoul (flag_random_seed, &endp, 0);
      if (!(endp > flag_random_seed && *endp == 0))
        random_seed = crc32_string (0, flag_random_seed);
    }
  else if (!random_seed)
    random_seed = local_tick ^ getpid ();  /* Old racey fallback method */
296 297
}

298
/* Obtain the random_seed.  Unless NOINIT, initialize it if
299 300
   it's not provided in the command line.  */

301
HOST_WIDE_INT
302 303 304 305
get_random_seed (bool noinit)
{
  if (!flag_random_seed && !noinit)
    init_random_seed ();
306
  return random_seed;
307 308 309 310 311 312 313 314 315 316 317 318
}

/* Modify the random_seed string to VAL.  Return its previous
   value.  */

const char *
set_random_seed (const char *val)
{
  const char *old = flag_random_seed;
  flag_random_seed = val;
  return old;
}
319

320
/* Handler for fatal signals, such as SIGSEGV.  These are transformed
321 322
   into ICE messages, which is much more user friendly.  In case the
   error printer crashes, reset the signal to prevent infinite recursion.  */
Richard Stallman committed
323 324

static void
325
crash_signal (int signo)
Richard Stallman committed
326
{
327
  signal (signo, SIG_DFL);
328 329 330 331 332 333 334 335 336

  /* If we crashed while processing an ASM statement, then be a little more
     graceful.  It's most likely the user's fault.  */
  if (this_is_asm_operands)
    {
      output_operand_lossage ("unrecoverable error");
      exit (FATAL_EXIT_CODE);
    }

337
  internal_error ("%s", strsignal (signo));
Richard Stallman committed
338 339
}

340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
/* A subroutine of wrapup_global_declarations.  We've come to the end of
   the compilation unit.  All deferred variables should be undeferred,
   and all incomplete decls should be finalized.  */

void
wrapup_global_declaration_1 (tree decl)
{
  /* We're not deferring this any longer.  Assignment is conditional to
     avoid needlessly dirtying PCH pages.  */
  if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS)
      && DECL_DEFER_OUTPUT (decl) != 0)
    DECL_DEFER_OUTPUT (decl) = 0;

  if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0)
    lang_hooks.finish_incomplete_decl (decl);
}

/* A subroutine of wrapup_global_declarations.  Decide whether or not DECL
   needs to be output.  Return true if it is output.  */

bool
wrapup_global_declaration_2 (tree decl)
{
363 364
  if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl)
      || (TREE_CODE (decl) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (decl)))
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
    return false;

  /* Don't write out static consts, unless we still need them.

     We also keep static consts if not optimizing (for debugging),
     unless the user specified -fno-keep-static-consts.
     ??? They might be better written into the debug information.
     This is possible when using DWARF.

     A language processor that wants static constants to be always
     written out (even if it is not used) is responsible for
     calling rest_of_decl_compilation itself.  E.g. the C front-end
     calls rest_of_decl_compilation from finish_decl.
     One motivation for this is that is conventional in some
     environments to write things like:
     static const char rcsid[] = "... version string ...";
     intending to force the string to be in the executable.

     A language processor that would prefer to have unneeded
     static constants "optimized away" would just defer writing
     them out until here.  E.g. C++ does this, because static
     constants are often defined in header files.

     ??? A tempting alternative (for both C and C++) would be
     to force a constant to be written if and only if it is
     defined in a main file, as opposed to an include file.  */

  if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
    {
394
      varpool_node *node;
395
      bool needed = true;
396
      node = varpool_get_node (decl);
397

398
      if (!node && flag_ltrans)
399
	needed = false;
400
      else if (node && node->definition)
401
	needed = false;
402
      else if (node && node->alias)
403 404 405 406 407
	needed = false;
      else if (!cgraph_global_info_ready
	       && (TREE_USED (decl)
		   || TREE_USED (DECL_ASSEMBLER_NAME (decl))))
	/* needed */;
408
      else if (node && node->analyzed)
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
	/* needed */;
      else if (DECL_COMDAT (decl))
	needed = false;
      else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl)
	       && (optimize || !flag_keep_static_consts
		   || DECL_ARTIFICIAL (decl)))
	needed = false;

      if (needed)
	{
	  rest_of_decl_compilation (decl, 1, 1);
	  return true;
	}
    }

  return false;
}

427 428 429
/* Do any final processing required for the declarations in VEC, of
   which there are LEN.  We write out inline functions and variables
   that have been deferred until this point, but which are required.
430
   Returns nonzero if anything was put out.  */
431

432
bool
433
wrapup_global_declarations (tree *vec, int len)
434
{
435
  bool reconsider, output_something = false;
436 437 438
  int i;

  for (i = 0; i < len; i++)
439
    wrapup_global_declaration_1 (vec[i]);
440 441 442 443 444 445

  /* Now emit any global variables or functions that we have been
     putting off.  We need to loop in case one of the things emitted
     here references another one which comes earlier in the list.  */
  do
    {
446
      reconsider = false;
447
      for (i = 0; i < len; i++)
448
	reconsider |= wrapup_global_declaration_2 (vec[i]);
449
      if (reconsider)
450
	output_something = true;
451 452 453 454 455 456
    }
  while (reconsider);

  return output_something;
}

457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
/* A subroutine of check_global_declarations.  Issue appropriate warnings
   for the global declaration DECL.  */

void
check_global_declaration_1 (tree decl)
{
  /* Warn about any function declared static but not defined.  We don't
     warn about variables, because many programs have static variables
     that exist only to get some text into the object file.  */
  if (TREE_CODE (decl) == FUNCTION_DECL
      && DECL_INITIAL (decl) == 0
      && DECL_EXTERNAL (decl)
      && ! DECL_ARTIFICIAL (decl)
      && ! TREE_NO_WARNING (decl)
      && ! TREE_PUBLIC (decl)
      && (warn_unused_function
	  || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
    {
      if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
476
	pedwarn (input_location, 0, "%q+F used but never defined", decl);
477
      else
478
	warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl);
479 480 481 482 483 484 485 486 487 488 489 490 491 492
      /* This symbol is effectively an "extern" declaration now.  */
      TREE_PUBLIC (decl) = 1;
    }

  /* Warn about static fns or vars defined but not used.  */
  if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
       /* We don't warn about "static const" variables because the
	  "rcs_id" idiom uses that construction.  */
       || (warn_unused_variable
	   && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
      && ! DECL_IN_SYSTEM_HEADER (decl)
      && ! TREE_USED (decl)
      /* The TREE_USED bit for file-scope decls is kept in the identifier,
	 to handle multiple external decls in different scopes.  */
493
      && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl)))
494 495 496 497 498 499 500 501
      && ! DECL_EXTERNAL (decl)
      && ! TREE_PUBLIC (decl)
      /* A volatile variable might be used in some non-obvious way.  */
      && ! TREE_THIS_VOLATILE (decl)
      /* Global register variables must be declared to reserve them.  */
      && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
      /* Otherwise, ask the language.  */
      && lang_hooks.decls.warn_unused_global (decl))
H.J. Lu committed
502 503 504
    warning ((TREE_CODE (decl) == FUNCTION_DECL)
	     ? OPT_Wunused_function
             : OPT_Wunused_variable,
505
	     "%q+D defined but not used", decl);
506 507
}

508
/* Issue appropriate warnings for the global declarations in V (of
509
   which there are LEN).  */
510

511
void
512
check_global_declarations (tree *v, int len)
513 514 515 516
{
  int i;

  for (i = 0; i < len; i++)
517
    check_global_declaration_1 (v[i]);
518
}
519

520 521 522 523 524 525 526 527
/* Emit debugging information for all global declarations in VEC.  */

void
emit_debug_global_declarations (tree *vec, int len)
{
  int i;

  /* Avoid confusing the debug information machinery when there are errors.  */
Joseph Myers committed
528
  if (seen_error ())
529 530 531 532 533 534
    return;

  timevar_push (TV_SYMOUT);
  for (i = 0; i < len; i++)
    debug_hooks->global_decl (vec[i]);
  timevar_pop (TV_SYMOUT);
535
}
536

537 538
/* Compile an entire translation unit.  Write a file of assembly
   output and various debugging dumps.  */
Richard Stallman committed
539 540

static void
541
compile_file (void)
Richard Stallman committed
542
{
543 544
  timevar_start (TV_PHASE_PARSING);
  timevar_push (TV_PARSE_GLOBAL);
Richard Stallman committed
545

546 547
  /* Call the parser, which parses the entire file (calling
     rest_of_compilation for each function).  */
548
  lang_hooks.parse_file ();
Richard Stallman committed
549

550 551 552
  timevar_pop (TV_PARSE_GLOBAL);
  timevar_stop (TV_PHASE_PARSING);

Richard Stallman committed
553 554 555
  /* Compilation is now finished except for writing
     what's left of the symbol table output.  */

556
  if (flag_syntax_only || flag_wpa)
557
    return;
558

559 560
  ggc_protect_identifiers = false;

561
  /* This must also call finalize_compilation_unit.  */
562
  lang_hooks.decls.final_write_globals ();
Geoffrey Keating committed
563

Joseph Myers committed
564
  if (seen_error ())
565 566 567
    return;

  timevar_start (TV_PHASE_LATE_ASM);
Geoffrey Keating committed
568

569 570 571 572
  /* Compilation unit is finalized.  When producing non-fat LTO object, we are
     basically finished.  */
  if (in_lto_p || !flag_lto || flag_fat_lto_objects)
    {
573
      /* File-scope initialization for AddressSanitizer.  */
Marek Polacek committed
574
      if (flag_sanitize & SANITIZE_ADDRESS)
575 576
        asan_finish_file ();

Marek Polacek committed
577
      if (flag_sanitize & SANITIZE_THREAD)
578 579
	tsan_finish_file ();

580 581
      output_shared_constant_pool ();
      output_object_blocks ();
582
      finish_tm_clone_pairs ();
583

584 585
      /* Write out any pending weak symbol declarations.  */
      weak_finish ();
586

587 588 589
      /* This must be at the end before unwind and debug info.
	 Some target ports emit PIC setup thunks here.  */
      targetm.asm_out.code_end ();
590

591 592
      /* Do dbx symbols.  */
      timevar_push (TV_SYMOUT);
593

594 595 596 597
    #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
      if (dwarf2out_do_frame ())
	dwarf2out_frame_finish ();
    #endif
Jason Merrill committed
598

599 600
      (*debug_hooks->finish) (main_input_filename);
      timevar_pop (TV_SYMOUT);
x  
Jason Merrill committed
601

602
      /* Output some stuff at end of file if nec.  */
Richard Stallman committed
603

604
      dw2_output_indirect_constants ();
605

606 607 608
      /* Flush any pending external directives.  */
      process_pending_assemble_externals ();
   }
609

610 611 612 613 614 615
  /* Emit LTO marker if LTO info has been previously emitted.  This is
     used by collect2 to determine whether an object file contains IL.
     We used to emit an undefined reference here, but this produces
     link errors if an object file with IL is stored into a shared
     library without invoking lto1.  */
  if (flag_generate_lto)
616 617 618 619 620 621 622 623 624 625 626 627 628
    {
#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
      ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
				      "__gnu_lto_v1",
				      (unsigned HOST_WIDE_INT) 1, 8);
#elif defined ASM_OUTPUT_ALIGNED_COMMON
      ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_v1",
				 (unsigned HOST_WIDE_INT) 1, 8);
#else
      ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_v1",
			 (unsigned HOST_WIDE_INT) 1,
			 (unsigned HOST_WIDE_INT) 1);
#endif
629 630 631 632 633 634
      /* Let linker plugin know that this is a slim object and must be LTOed
         even when user did not ask for it.  */
      if (!flag_fat_lto_objects)
        {
#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
	  ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
635
					  "__gnu_lto_slim",
636 637
					  (unsigned HOST_WIDE_INT) 1, 8);
#elif defined ASM_OUTPUT_ALIGNED_COMMON
638
	  ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
639 640
				     (unsigned HOST_WIDE_INT) 1, 8);
#else
641
	  ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
642 643 644 645
			     (unsigned HOST_WIDE_INT) 1,
			     (unsigned HOST_WIDE_INT) 1);
#endif
        }
646
    }
647

648 649 650 651
  /* Attach a special .ident directive to the end of the file to identify
     the version of GCC which compiled this code.  The format of the .ident
     string is patterned after the ones produced by native SVR4 compilers.  */
  if (!flag_no_ident)
652 653
    {
      const char *pkg_version = "(GNU) ";
654
      char *ident_str;
655 656 657

      if (strcmp ("(GCC) ", pkgversion_string))
	pkg_version = pkgversion_string;
658 659 660

      ident_str = ACONCAT (("GCC: ", pkg_version, version_string, NULL));
      targetm.asm_out.output_ident (ident_str);
661
    }
662

663 664
  /* Invoke registered plugin callbacks.  */
  invoke_plugin_callbacks (PLUGIN_FINISH_UNIT, NULL);
H.J. Lu committed
665

666 667 668 669
  /* This must be at the end.  Some target ports emit end of file directives
     into the assembly file here, and hence we can not output anything to the
     assembly file after this point.  */
  targetm.asm_out.file_end ();
670

671
  timevar_stop (TV_PHASE_LATE_ASM);
Richard Stallman committed
672
}
673

Richard Henderson committed
674 675 676
/* Print version information to FILE.
   Each line begins with INDENT (for the case where FILE is the
   assembler output file).  */
677

Richard Henderson committed
678 679
void
print_version (FILE *file, const char *indent)
680
{
681
  static const char fmt1[] =
682
#ifdef __GNUC__
683
    N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
684
#else
685
    N_("%s%s%s %sversion %s (%s) compiled by CC, ")
686
#endif
687 688
    ;
  static const char fmt2[] =
689
    N_("GMP version %s, MPFR version %s, MPC version %s\n");
690
  static const char fmt3[] =
691
    N_("%s%swarning: %s header version %s differs from library version %s.\n");
692
  static const char fmt4[] =
693 694 695 696 697 698 699
    N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n");
#ifndef __VERSION__
#define __VERSION__ "[?]"
#endif
  fprintf (file,
	   file == stderr ? _(fmt1) : fmt1,
	   indent, *indent != 0 ? " " : "",
700
	   lang_hooks.name, pkgversion_string, version_string, TARGET_NAME,
701
	   indent, __VERSION__);
702 703

  /* We need to stringify the GMP macro values.  Ugh, gmp_version has
704 705
     two string formats, "i.j.k" and "i.j" when k is zero.  As of
     gmp-4.3.0, GMP always uses the 3 number format.  */
706
#define GCC_GMP_STRINGIFY_VERSION3(X) #X
707
#define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3 (X)
708 709 710 711
#define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z))
#define GCC_GMP_VERSION \
  GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
#if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0
712 713 714
#define GCC_GMP_STRINGIFY_VERSION \
  GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \
  GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR)
715
#else
716 717 718 719
#define GCC_GMP_STRINGIFY_VERSION \
  GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \
  GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR) "." \
  GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_PATCHLEVEL)
720
#endif
721 722
  fprintf (file,
	   file == stderr ? _(fmt2) : fmt2,
723
	   GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING);
724 725 726
  if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
    fprintf (file,
	     file == stderr ? _(fmt3) : fmt3,
727
	     indent, *indent != 0 ? " " : "",
728 729 730 731
	     "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version);
  if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ()))
    fprintf (file,
	     file == stderr ? _(fmt3) : fmt3,
732
	     indent, *indent != 0 ? " " : "",
733
	     "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
734 735 736 737 738
  if (strcmp (MPC_VERSION_STRING, mpc_get_version ()))
    fprintf (file,
	     file == stderr ? _(fmt3) : fmt3,
	     indent, *indent != 0 ? " " : "",
	     "MPC", MPC_VERSION_STRING, mpc_get_version ());
739 740
  fprintf (file,
	   file == stderr ? _(fmt4) : fmt4,
741 742
	   indent, *indent != 0 ? " " : "",
	   PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
743 744

  print_plugins_versions (file, indent);
745 746
}

747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
static int
print_to_asm_out_file (print_switch_type type, const char * text)
{
  bool prepend_sep = true;

  switch (type)
    {
    case SWITCH_TYPE_LINE_END:
      putc ('\n', asm_out_file);
      return 1;

    case SWITCH_TYPE_LINE_START:
      fputs (ASM_COMMENT_START, asm_out_file);
      return strlen (ASM_COMMENT_START);

    case SWITCH_TYPE_DESCRIPTIVE:
      if (ASM_COMMENT_START[0] == 0)
	prepend_sep = false;
      /* Drop through.  */
    case SWITCH_TYPE_PASSED:
    case SWITCH_TYPE_ENABLED:
      if (prepend_sep)
	fputc (' ', asm_out_file);
770
      fputs (text, asm_out_file);
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790
      /* No need to return the length here as
	 print_single_switch has already done it.  */
      return 0;

    default:
      return -1;
    }
}

static int
print_to_stderr (print_switch_type type, const char * text)
{
  switch (type)
    {
    case SWITCH_TYPE_LINE_END:
      putc ('\n', stderr);
      return 1;

    case SWITCH_TYPE_LINE_START:
      return 0;
H.J. Lu committed
791

792 793 794 795 796 797
    case SWITCH_TYPE_PASSED:
    case SWITCH_TYPE_ENABLED:
      fputc (' ', stderr);
      /* Drop through.  */

    case SWITCH_TYPE_DESCRIPTIVE:
798
      fputs (text, stderr);
799 800 801 802 803 804 805 806 807
      /* No need to return the length here as
	 print_single_switch has already done it.  */
      return 0;

    default:
      return -1;
    }
}

808
/* Print an option value and return the adjusted position in the line.
809 810
   ??? print_fn doesn't handle errors, eg disk full; presumably other
   code will catch a disk full though.  */
811 812

static int
813 814 815 816
print_single_switch (print_switch_fn_type print_fn,
		     int pos,
		     print_switch_type type,
		     const char * text)
817
{
818 819
  /* The ultrix fprintf returns 0 on success, so compute the result
     we want here since we need it for the following test.  The +1
820
     is for the separator character that will probably be emitted.  */
821
  int len = strlen (text) + 1;
822 823

  if (pos != 0
824
      && pos + len > MAX_LINE)
825
    {
826
      print_fn (SWITCH_TYPE_LINE_END, NULL);
827 828
      pos = 0;
    }
829

830
  if (pos == 0)
831 832 833 834
    pos += print_fn (SWITCH_TYPE_LINE_START, NULL);

  print_fn (type, text);
  return pos + len;
835 836
}

837
/* Print active target switches using PRINT_FN.
838 839 840 841 842
   POS is the current cursor position and MAX is the size of a "line".
   Each line begins with INDENT and ends with TERM.
   Each switch is separated from the next by SEP.  */

static void
843
print_switch_values (print_switch_fn_type print_fn)
844
{
845
  int pos = 0;
846 847
  size_t j;

848
  /* Fill in the -frandom-seed option, if the user didn't pass it, so
849
     that it can be printed below.  This helps reproducibility.  */
850 851
  if (!flag_random_seed)
    init_random_seed ();
852

853
  /* Print the options as passed.  */
854 855
  pos = print_single_switch (print_fn, pos,
			     SWITCH_TYPE_DESCRIPTIVE, _("options passed: "));
856

857
  for (j = 1; j < save_decoded_options_count; j++)
858
    {
859
      switch (save_decoded_options[j].opt_index)
860
	{
861 862 863 864 865 866 867
	case OPT_o:
	case OPT_d:
	case OPT_dumpbase:
	case OPT_dumpdir:
	case OPT_auxbase:
	case OPT_quiet:
	case OPT_version:
868
	  /* Ignore these.  */
869
	  continue;
870 871
	}

872 873
      pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED,
				 save_decoded_options[j].orig_option_with_args_text);
874 875
    }

876
  if (pos > 0)
877
    print_fn (SWITCH_TYPE_LINE_END, NULL);
878 879 880 881

  /* Print the -f and -m options that have been enabled.
     We don't handle language specific options but printing argv
     should suffice.  */
882 883
  pos = print_single_switch (print_fn, 0,
			     SWITCH_TYPE_DESCRIPTIVE, _("options enabled: "));
884

885
  for (j = 0; j < cl_options_count; j++)
886
    if (cl_options[j].cl_report
887
	&& option_enabled (j, &global_options) > 0)
888 889
      pos = print_single_switch (print_fn, pos,
				 SWITCH_TYPE_ENABLED, cl_options[j].opt_text);
890

891
  print_fn (SWITCH_TYPE_LINE_END, NULL);
892
}
893

894 895 896 897 898
/* Open assembly code output file.  Do this even if -fsyntax-only is
   on, because then the driver will have provided the name of a
   temporary file or bit bucket for us.  NAME is the file specified on
   the command line, possibly NULL.  */
static void
899
init_asm_output (const char *name)
900 901 902 903 904 905
{
  if (name == NULL && asm_file_name == 0)
    asm_out_file = stdout;
  else
    {
      if (asm_file_name == 0)
906 907
	{
	  int len = strlen (dump_base_name);
908
	  char *dumpname = XNEWVEC (char, len + 6);
909

910 911 912 913 914
	  memcpy (dumpname, dump_base_name, len + 1);
	  strip_off_ending (dumpname, len);
	  strcat (dumpname, ".s");
	  asm_file_name = dumpname;
	}
915
      if (!strcmp (asm_file_name, "-"))
916
	asm_out_file = stdout;
917
      else
918
	asm_out_file = fopen (asm_file_name, "w");
919
      if (asm_out_file == 0)
920
	fatal_error ("can%'t open %s for writing: %m", asm_file_name);
921 922 923 924
    }

  if (!flag_syntax_only)
    {
925
      targetm.asm_out.file_start ();
926

927 928 929 930 931 932 933 934 935 936 937 938 939 940
      if (flag_record_gcc_switches)
	{
	  if (targetm.asm_out.record_gcc_switches)
	    {
	      /* Let the target know that we are about to start recording.  */
	      targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
						   NULL);
	      /* Now record the switches.  */
	      print_switch_values (targetm.asm_out.record_gcc_switches);
	      /* Let the target know that the recording is over.  */
	      targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE,
						   NULL);
	    }
	  else
941
	    inform (input_location, "-frecord-gcc-switches is not supported by the current target");
942 943
	}

944 945
      if (flag_verbose_asm)
	{
946 947
	  /* Print the list of switches in effect
	     into the assembler file as comments.  */
948
	  print_version (asm_out_file, ASM_COMMENT_START);
949
	  print_switch_values (print_to_asm_out_file);
950
	  putc ('\n', asm_out_file);
951 952 953
	}
    }
}
954

955 956 957 958 959
/* A helper function; used as the reallocator function for cpp's line
   table.  */
static void *
realloc_for_line_map (void *ptr, size_t len)
{
960
  return GGC_RESIZEVAR (void, ptr, len);
961 962
}

963 964 965 966 967
/* A helper function: used as the allocator function for
   identifier_to_locale.  */
static void *
alloc_for_identifier_to_locale (size_t len)
{
968
  return ggc_alloc_atomic (len);
969 970
}

Eric Botcazou committed
971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988
/* Output stack usage information.  */
void
output_stack_usage (void)
{
  static bool warning_issued = false;
  enum stack_usage_kind_type { STATIC = 0, DYNAMIC, DYNAMIC_BOUNDED };
  const char *stack_usage_kind_str[] = {
    "static",
    "dynamic",
    "dynamic,bounded"
  };
  HOST_WIDE_INT stack_usage = current_function_static_stack_size;
  enum stack_usage_kind_type stack_usage_kind;

  if (stack_usage < 0)
    {
      if (!warning_issued)
	{
989
	  warning (0, "stack usage computation not supported for this target");
Eric Botcazou committed
990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
	  warning_issued = true;
	}
      return;
    }

  stack_usage_kind = STATIC;

  /* Add the maximum amount of space pushed onto the stack.  */
  if (current_function_pushed_stack_size > 0)
    {
      stack_usage += current_function_pushed_stack_size;
      stack_usage_kind = DYNAMIC_BOUNDED;
    }

  /* Now on to the tricky part: dynamic stack allocation.  */
  if (current_function_allocates_dynamic_stack_space)
    {
      if (current_function_has_unbounded_dynamic_stack_size)
	stack_usage_kind = DYNAMIC;
      else
	stack_usage_kind = DYNAMIC_BOUNDED;

      /* Add the size even in the unbounded case, this can't hurt.  */
      stack_usage += current_function_dynamic_stack_size;
    }

1016 1017 1018 1019
  if (flag_stack_usage)
    {
      expanded_location loc
	= expand_location (DECL_SOURCE_LOCATION (current_function_decl));
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
      /* We don't want to print the full qualified name because it can be long,
	 so we strip the scope prefix, but we may need to deal with the suffix
	 created by the compiler.  */
      const char *suffix
	= strchr (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)), '.');
      const char *name
	= lang_hooks.decl_printable_name (current_function_decl, 2);
      if (suffix)
	{
	  const char *dot = strchr (name, '.');
	  while (dot && strcasecmp (dot, suffix) != 0)
	    {
	      name = dot + 1;
	      dot = strchr (name, '.');
	    }
	}
1036
      else
1037 1038 1039 1040 1041
	{
	  const char *dot = strrchr (name, '.');
	  if (dot)
	    name = dot + 1;
	}
1042 1043 1044 1045 1046 1047

      fprintf (stack_usage_file,
	       "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n",
	       lbasename (loc.file),
	       loc.line,
	       loc.column,
1048
	       name,
1049 1050 1051
	       stack_usage,
	       stack_usage_kind_str[stack_usage_kind]);
    }
Eric Botcazou committed
1052

1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
  if (warn_stack_usage >= 0)
    {
      if (stack_usage_kind == DYNAMIC)
	warning (OPT_Wstack_usage_, "stack usage might be unbounded");
      else if (stack_usage > warn_stack_usage)
	{
	  if (stack_usage_kind == DYNAMIC_BOUNDED)
	    warning (OPT_Wstack_usage_, "stack usage might be %wd bytes",
		     stack_usage);
	  else
	    warning (OPT_Wstack_usage_, "stack usage is %wd bytes",
		     stack_usage);
	}
    }
Eric Botcazou committed
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
}

/* Open an auxiliary output file.  */
static FILE *
open_auxiliary_file (const char *ext)
{
  char *filename;
  FILE *file;

  filename = concat (aux_base_name, ".", ext, NULL);
  file = fopen (filename, "w");
  if (!file)
1079
    fatal_error ("can%'t open %s for writing: %m", filename);
Eric Botcazou committed
1080 1081 1082 1083
  free (filename);
  return file;
}

1084 1085 1086 1087
/* Initialization of the front end environment, before command line
   options are parsed.  Signal handlers, internationalization etc.
   ARGV0 is main's argv[0].  */
static void
1088
general_init (const char *argv0)
1089
{
1090
  const char *p;
1091 1092 1093 1094 1095 1096 1097

  p = argv0 + strlen (argv0);
  while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
    --p;
  progname = p;

  xmalloc_set_program_name (progname);
1098

1099 1100
  hex_init ();

1101
  /* Unlock the stdio streams.  */
1102
  unlock_std_streams ();
1103

1104
  gcc_init_libintl ();
1105

1106 1107 1108
  identifier_to_locale_alloc = alloc_for_identifier_to_locale;
  identifier_to_locale_free = ggc_free;

1109 1110
  /* Initialize the diagnostics reporting machinery, so option parsing
     can give warnings and errors.  */
1111
  diagnostic_initialize (global_dc, N_OPTS);
1112 1113
  /* Set a default printer.  Language specific initializations will
     override it later.  */
1114 1115 1116 1117 1118 1119 1120
  tree_diagnostics_defaults (global_dc);
  /* FIXME: This should probably be moved to C-family
     language-specific initializations.  */
  /* By default print macro expansion contexts in the diagnostic
     finalizer -- for tokens resulting from macro expansion.  */
  diagnostic_finalizer (global_dc) = virt_loc_aware_diagnostic_finalizer;

1121 1122
  global_dc->show_caret
    = global_options_init.x_flag_diagnostics_show_caret;
1123 1124 1125 1126
  global_dc->show_option_requested
    = global_options_init.x_flag_diagnostics_show_option;
  global_dc->show_column
    = global_options_init.x_flag_show_column;
1127
  global_dc->internal_error = plugins_internal_error_function;
1128
  global_dc->option_enabled = option_enabled;
1129
  global_dc->option_state = &global_options;
1130
  global_dc->option_name = option_name;
1131

1132 1133 1134
  /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
#ifdef SIGSEGV
  signal (SIGSEGV, crash_signal);
1135
#endif
1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
#ifdef SIGILL
  signal (SIGILL, crash_signal);
#endif
#ifdef SIGBUS
  signal (SIGBUS, crash_signal);
#endif
#ifdef SIGABRT
  signal (SIGABRT, crash_signal);
#endif
#if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
  signal (SIGIOT, crash_signal);
#endif
1148 1149 1150
#ifdef SIGFPE
  signal (SIGFPE, crash_signal);
#endif
1151

1152 1153 1154
  /* Other host-specific signal setup.  */
  (*host_hooks.extra_signals)();

1155 1156 1157 1158
  /* Initialize the garbage-collector, string pools and tree type hash
     table.  */
  init_ggc ();
  init_stringpool ();
1159
  line_table = ggc_alloc_line_maps ();
1160 1161
  linemap_init (line_table);
  line_table->reallocator = realloc_for_line_map;
1162
  line_table->round_alloc_size = ggc_round_alloc_size;
1163
  init_ttree ();
1164

1165 1166
  /* Initialize register usage now so switches may override.  */
  init_reg_sets ();
1167

1168
  /* Register the language-independent parameters.  */
1169
  global_init_params ();
1170

1171 1172
  /* This must be done after global_init_params but before argument
     processing.  */
1173
  init_ggc_heuristics ();
David Malcolm committed
1174

1175 1176
  /* Create the singleton holder for global state.
     Doing so also creates the pass manager and with it the passes.  */
1177
  g = new gcc::context ();
David Malcolm committed
1178

1179
  statistics_early_init ();
1180
  finish_params ();
1181
}
1182

1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196
/* Return true if the current target supports -fsection-anchors.  */

static bool
target_supports_section_anchors_p (void)
{
  if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0)
    return false;

  if (targetm.asm_out.output_anchor == NULL)
    return false;

  return true;
}

1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221
/* Default the align_* variables to 1 if they're still unset, and
   set up the align_*_log variables.  */
static void
init_alignments (void)
{
  if (align_loops <= 0)
    align_loops = 1;
  if (align_loops_max_skip > align_loops)
    align_loops_max_skip = align_loops - 1;
  align_loops_log = floor_log2 (align_loops * 2 - 1);
  if (align_jumps <= 0)
    align_jumps = 1;
  if (align_jumps_max_skip > align_jumps)
    align_jumps_max_skip = align_jumps - 1;
  align_jumps_log = floor_log2 (align_jumps * 2 - 1);
  if (align_labels <= 0)
    align_labels = 1;
  align_labels_log = floor_log2 (align_labels * 2 - 1);
  if (align_labels_max_skip > align_labels)
    align_labels_max_skip = align_labels - 1;
  if (align_functions <= 0)
    align_functions = 1;
  align_functions_log = floor_log2 (align_functions * 2 - 1);
}

1222 1223
/* Process the options that have been parsed.  */
static void
1224
process_options (void)
1225
{
1226 1227 1228 1229
  /* Just in case lang_hooks.post_options ends up calling a debug_hook.
     This can happen with incorrect pre-processed input. */
  debug_hooks = &do_nothing_debug_hooks;

1230 1231
  maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT;

1232 1233 1234 1235 1236 1237 1238
  /* Default to -fdiagnostics-color=auto if GCC_COLORS is in the environment,
     otherwise default to -fdiagnostics-color=never.  */
  if (!global_options_set.x_flag_diagnostics_show_color
      && getenv ("GCC_COLORS"))
    pp_show_color (global_dc->printer)
      = colorize_init (DIAGNOSTICS_COLOR_AUTO);

1239 1240 1241 1242
  /* Allow the front end to perform consistency checks and do further
     initialization based on the command line options.  This hook also
     sets the original filename if appropriate (e.g. foo.i -> foo.c)
     so we can correctly initialize debug output.  */
1243
  no_backend = lang_hooks.post_options (&main_input_filename);
1244

Richard Stallman committed
1245
  /* Some machines may reject certain combinations of options.  */
1246
  targetm.target_option.override ();
Richard Stallman committed
1247

1248 1249 1250 1251
  /* Avoid any informative notes in the second run of -fcompare-debug.  */
  if (flag_compare_debug) 
    diagnostic_inhibit_notes (global_dc);

1252 1253 1254 1255 1256 1257 1258
  if (flag_section_anchors && !target_supports_section_anchors_p ())
    {
      warning (OPT_fsection_anchors,
	       "this target does not support %qs", "-fsection-anchors");
      flag_section_anchors = 0;
    }

1259 1260 1261
  if (flag_short_enums == 2)
    flag_short_enums = targetm.default_short_enums ();

1262 1263 1264
  /* Set aux_base_name if not already set.  */
  if (aux_base_name)
    ;
1265
  else if (main_input_filename)
1266
    {
1267
      char *name = xstrdup (lbasename (main_input_filename));
1268

1269 1270 1271 1272 1273 1274
      strip_off_ending (name, strlen (name));
      aux_base_name = name;
    }
  else
    aux_base_name = "gccaux";

1275 1276
#ifndef HAVE_cloog
  if (flag_graphite
1277
      || flag_graphite_identity
1278 1279
      || flag_loop_block
      || flag_loop_interchange
1280
      || flag_loop_strip_mine
1281
      || flag_loop_parallelize_all)
1282
    sorry ("Graphite loop optimizations cannot be used (-fgraphite, "
1283
	   "-fgraphite-identity, -floop-block, "
1284 1285
	   "-floop-interchange, -floop-strip-mine, -floop-parallelize-all, "
	   "and -ftree-loop-linear)");
1286 1287
#endif

1288 1289 1290 1291 1292
  /* One region RA really helps to decrease the code size.  */
  if (flag_ira_region == IRA_REGION_AUTODETECT)
    flag_ira_region
      = optimize_size || !optimize ? IRA_REGION_ONE : IRA_REGION_MIXED;

1293 1294
  if (flag_strict_volatile_bitfields > 0 && !abi_version_at_least (2))
    {
1295
      warning (0, "-fstrict-volatile-bitfields disabled; "
1296 1297 1298 1299
	       "it is incompatible with ABI versions < 2");
      flag_strict_volatile_bitfields = 0;
    }

Richard Stallman committed
1300 1301 1302 1303
  /* Unrolling all loops implies that standard loop unrolling must also
     be done.  */
  if (flag_unroll_all_loops)
    flag_unroll_loops = 1;
1304

1305
  /* web and rename-registers help when run after loop unrolling.  */
1306 1307
  if (flag_web == AUTODETECT_VALUE)
    flag_web = flag_unroll_loops || flag_peel_loops;
1308

1309 1310
  if (flag_rename_registers == AUTODETECT_VALUE)
    flag_rename_registers = flag_unroll_loops || flag_peel_loops;
Richard Stallman committed
1311

1312 1313 1314 1315 1316
  if (flag_non_call_exceptions)
    flag_asynchronous_unwind_tables = 1;
  if (flag_asynchronous_unwind_tables)
    flag_unwind_tables = 1;

1317 1318 1319
  if (flag_value_profile_transformations)
    flag_profile_values = 1;

Richard Stallman committed
1320 1321 1322
  /* Warn about options that are not supported on this machine.  */
#ifndef INSN_SCHEDULING
  if (flag_schedule_insns || flag_schedule_insns_after_reload)
1323
    warning (0, "instruction scheduling not supported on this target machine");
Richard Stallman committed
1324 1325 1326
#endif
#ifndef DELAY_SLOTS
  if (flag_delayed_branch)
1327
    warning (0, "this target machine does not have delayed branches");
Richard Stallman committed
1328 1329
#endif

1330 1331 1332
  user_label_prefix = USER_LABEL_PREFIX;
  if (flag_leading_underscore != -1)
    {
1333
      /* If the default prefix is more complicated than "" or "_",
1334 1335 1336 1337 1338 1339 1340
	 issue a warning and ignore this option.  */
      if (user_label_prefix[0] == 0 ||
	  (user_label_prefix[0] == '_' && user_label_prefix[1] == 0))
	{
	  user_label_prefix = flag_leading_underscore ? "_" : "";
	}
      else
1341
	warning (0, "-f%sleading-underscore not supported on this target machine",
1342 1343 1344
		 flag_leading_underscore ? "" : "no-");
    }

Richard Stallman committed
1345 1346 1347 1348
  /* If we are in verbose mode, write out the version and maybe all the
     option flags in use.  */
  if (version_flag)
    {
1349
      print_version (stderr, "");
Richard Stallman committed
1350
      if (! quiet_flag)
1351
	print_switch_values (print_to_stderr);
Richard Stallman committed
1352 1353
    }

1354 1355 1356 1357 1358
  if (flag_syntax_only)
    {
      write_symbols = NO_DEBUG;
      profile_flag = 0;
    }
Richard Stallman committed
1359

1360 1361 1362
  if (flag_gtoggle)
    {
      if (debug_info_level == DINFO_LEVEL_NONE)
1363 1364 1365 1366 1367 1368
	{
	  debug_info_level = DINFO_LEVEL_NORMAL;

	  if (write_symbols == NO_DEBUG)
	    write_symbols = PREFERRED_DEBUGGING_TYPE;
	}
1369 1370 1371 1372
      else
	debug_info_level = DINFO_LEVEL_NONE;
    }

1373
  if (flag_dump_final_insns && !flag_syntax_only && !no_backend)
1374 1375 1376 1377
    {
      FILE *final_output = fopen (flag_dump_final_insns, "w");
      if (!final_output)
	{
1378 1379
	  error ("could not open final insn dump file %qs: %m",
		 flag_dump_final_insns);
1380 1381 1382 1383
	  flag_dump_final_insns = NULL;
	}
      else if (fclose (final_output))
	{
1384 1385
	  error ("could not close zeroed insn dump file %qs: %m",
		 flag_dump_final_insns);
1386 1387 1388 1389
	  flag_dump_final_insns = NULL;
	}
    }

1390 1391 1392 1393 1394 1395
  /* A lot of code assumes write_symbols == NO_DEBUG if the debugging
     level is 0.  */
  if (debug_info_level == DINFO_LEVEL_NONE)
    write_symbols = NO_DEBUG;

  if (write_symbols == NO_DEBUG)
1396
    ;
1397
#if defined(DBX_DEBUGGING_INFO)
1398
  else if (write_symbols == DBX_DEBUG)
1399
    debug_hooks = &dbx_debug_hooks;
Richard Stallman committed
1400
#endif
1401
#if defined(XCOFF_DEBUGGING_INFO)
1402
  else if (write_symbols == XCOFF_DEBUG)
1403
    debug_hooks = &xcoff_debug_hooks;
1404
#endif
1405
#ifdef SDB_DEBUGGING_INFO
1406
  else if (write_symbols == SDB_DEBUG)
1407 1408 1409
    debug_hooks = &sdb_debug_hooks;
#endif
#ifdef DWARF2_DEBUGGING_INFO
1410
  else if (write_symbols == DWARF2_DEBUG)
1411
    debug_hooks = &dwarf2_debug_hooks;
1412
#endif
1413
#ifdef VMS_DEBUGGING_INFO
1414
  else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1415 1416
    debug_hooks = &vmsdbg_debug_hooks;
#endif
1417 1418 1419
  else
    error ("target system does not support the \"%s\" debug format",
	   debug_type_names[write_symbols]);
Richard Stallman committed
1420

1421 1422
  /* We know which debug output will be used so we can set flag_var_tracking
     and flag_var_tracking_uninit if the user has not specified them.  */
1423 1424
  if (debug_info_level < DINFO_LEVEL_NORMAL
      || debug_hooks->var_location == do_nothing_debug_hooks.var_location)
1425
    {
1426 1427
      if (flag_var_tracking == 1
	  || flag_var_tracking_uninit == 1)
1428 1429
        {
	  if (debug_info_level < DINFO_LEVEL_NORMAL)
1430
	    warning (0, "variable tracking requested, but useless unless "
1431 1432
		     "producing debug info");
	  else
1433
	    warning (0, "variable tracking requested, but not supported "
1434 1435 1436
		     "by this debug format");
	}
      flag_var_tracking = 0;
1437
      flag_var_tracking_uninit = 0;
1438 1439
    }

Ian Lance Taylor committed
1440 1441 1442 1443 1444 1445
  /* The debug hooks are used to implement -fdump-go-spec because it
     gives a simple and stable API for all the information we need to
     dump.  */
  if (flag_dump_go_spec != NULL)
    debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks);

1446 1447 1448
  /* If the user specifically requested variable tracking with tagging
     uninitialized variables, we need to turn on variable tracking.
     (We already determined above that variable tracking is feasible.)  */
1449
  if (flag_var_tracking_uninit == 1)
1450
    flag_var_tracking = 1;
1451

1452
  if (flag_var_tracking == AUTODETECT_VALUE)
1453 1454
    flag_var_tracking = optimize >= 1;

1455 1456 1457
  if (flag_var_tracking_uninit == AUTODETECT_VALUE)
    flag_var_tracking_uninit = flag_var_tracking;

1458
  if (flag_var_tracking_assignments == AUTODETECT_VALUE)
1459 1460
    flag_var_tracking_assignments = flag_var_tracking
      && !(flag_selective_scheduling || flag_selective_scheduling2);
1461 1462 1463 1464 1465 1466 1467

  if (flag_var_tracking_assignments_toggle)
    flag_var_tracking_assignments = !flag_var_tracking_assignments;

  if (flag_var_tracking_assignments && !flag_var_tracking)
    flag_var_tracking = flag_var_tracking_assignments = -1;

1468 1469 1470 1471
  if (flag_var_tracking_assignments
      && (flag_selective_scheduling || flag_selective_scheduling2))
    warning (0, "var-tracking-assignments changes selective scheduling");

1472 1473 1474 1475 1476 1477 1478
  if (flag_tree_cselim == AUTODETECT_VALUE)
#ifdef HAVE_conditional_move
    flag_tree_cselim = 1;
#else
    flag_tree_cselim = 0;
#endif

1479 1480 1481 1482 1483 1484 1485
  /* If auxiliary info generation is desired, open the output file.
     This goes in the same directory as the source file--unlike
     all the other output files.  */
  if (flag_gen_aux_info)
    {
      aux_info_file = fopen (aux_info_file_name, "w");
      if (aux_info_file == 0)
1486
	fatal_error ("can%'t open %s: %m", aux_info_file_name);
1487
    }
1488

1489
  if (!targetm_common.have_named_sections)
Richard Stallman committed
1490
    {
1491 1492
      if (flag_function_sections)
	{
1493
	  warning (0, "-ffunction-sections not supported for this target");
1494 1495 1496 1497
	  flag_function_sections = 0;
	}
      if (flag_data_sections)
	{
1498
	  warning (0, "-fdata-sections not supported for this target");
1499 1500
	  flag_data_sections = 0;
	}
Richard Stallman committed
1501
    }
1502

1503
#ifndef HAVE_prefetch
1504
  if (flag_prefetch_loop_arrays > 0)
1505
    {
1506
      warning (0, "-fprefetch-loop-arrays not supported for this target");
1507 1508 1509
      flag_prefetch_loop_arrays = 0;
    }
#else
1510
  if (flag_prefetch_loop_arrays > 0 && !HAVE_prefetch)
1511
    {
1512
      warning (0, "-fprefetch-loop-arrays not supported for this target (try -march switches)");
1513 1514 1515 1516
      flag_prefetch_loop_arrays = 0;
    }
#endif

1517 1518
  /* This combination of options isn't handled for i386 targets and doesn't
     make much sense anyway, so don't allow it.  */
1519
  if (flag_prefetch_loop_arrays > 0 && optimize_size)
1520
    {
1521
      warning (0, "-fprefetch-loop-arrays is not supported with -Os");
1522 1523 1524
      flag_prefetch_loop_arrays = 0;
    }

1525 1526 1527
  /* The presence of IEEE signaling NaNs, implies all math can trap.  */
  if (flag_signaling_nans)
    flag_trapping_math = 1;
1528

1529
  /* We cannot reassociate if we want traps or signed zeros.  */
1530 1531 1532 1533 1534 1535
  if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))
    {
      warning (0, "-fassociative-math disabled; other options take precedence");
      flag_associative_math = 0;
    }

1536 1537 1538
  /* With -fcx-limited-range, we do cheap and quick complex arithmetic.  */
  if (flag_cx_limited_range)
    flag_complex_method = 0;
1539

1540 1541 1542 1543
  /* With -fcx-fortran-rules, we do something in-between cheap and C99.  */
  if (flag_cx_fortran_rules)
    flag_complex_method = 1;

1544 1545
  /* Targets must be able to place spill slots at lower addresses.  If the
     target already uses a soft frame pointer, the transition is trivial.  */
1546
  if (!FRAME_GROWS_DOWNWARD && flag_stack_protect)
1547 1548 1549 1550 1551 1552
    {
      warning (0, "-fstack-protector not supported for this target");
      flag_stack_protect = 0;
    }
  if (!flag_stack_protect)
    warn_stack_protect = 0;
1553

Jakub Jelinek committed
1554
  /* Address Sanitizer needs porting to each target architecture.  */
Marek Polacek committed
1555
  if ((flag_sanitize & SANITIZE_ADDRESS)
1556 1557
      && (targetm.asan_shadow_offset == NULL
	  || !FRAME_GROWS_DOWNWARD))
Jakub Jelinek committed
1558
    {
1559
      warning (0, "-fsanitize=address not supported for this target");
Marek Polacek committed
1560
      flag_sanitize &= ~SANITIZE_ADDRESS;
Jakub Jelinek committed
1561 1562
    }

1563 1564 1565 1566 1567 1568 1569 1570 1571
  /* Enable -Werror=coverage-mismatch when -Werror and -Wno-error
     have not been set.  */
  if (!global_options_set.x_warnings_are_errors
      && warn_coverage_mismatch
      && (global_dc->classify_diagnostic[OPT_Wcoverage_mismatch] ==
          DK_UNSPECIFIED))
    diagnostic_classify_diagnostic (global_dc, OPT_Wcoverage_mismatch,
                                    DK_ERROR, UNKNOWN_LOCATION);

1572
  /* Save the current optimization options.  */
1573
  optimization_default_node = build_optimization_node (&global_options);
1574
  optimization_current_node = optimization_default_node;
Richard Stallman committed
1575
}
1576

1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
/* This function can be called multiple times to reinitialize the compiler
   back end when register classes or instruction sets have changed,
   before each function.  */
static void
backend_init_target (void)
{
  /* Initialize alignment variables.  */
  init_alignments ();

  /* This reinitializes hard_frame_pointer, and calls init_reg_modes_target()
     to initialize reg_raw_mode[].  */
  init_emit_regs ();

  /* This invokes target hooks to set fixed_reg[] etc, which is
     mode-dependent.  */
  init_regs ();

  /* This depends on stack_pointer_rtx.  */
  init_fake_stack_mems ();

  /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is
     mode-dependent.  */
  init_alias_target ();

  /* Depends on HARD_FRAME_POINTER_REGNUM.  */
  init_reload ();

  /* The following initialization functions need to generate rtl, so
     provide a dummy function context for them.  */
  init_dummy_function_start ();

  /* rtx_cost is mode-dependent, so cached values need to be recomputed
     on a mode change.  */
  init_expmed ();
1611
  init_lower_subreg ();
1612 1613 1614

  /* We may need to recompute regno_save_code[] and regno_restore_code[]
     after a mode change as well.  */
1615 1616
  caller_save_initialized_p = false;

1617 1618 1619 1620 1621
  expand_dummy_function_end ();
}

/* Initialize the compiler back end.  This function is called only once,
   when starting the compiler.  */
1622
static void
1623
backend_init (void)
1624
{
1625
  init_emit_once ();
1626

1627
  init_rtlanal ();
1628
  init_inline_once ();
1629
  init_varasm_once ();
1630
  save_register_info ();
1631

1632
  /* Initialize the target-specific back end pieces.  */
Vladimir Makarov committed
1633
  ira_init_once ();
1634 1635 1636
  backend_init_target ();
}

1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673
/* Initialize excess precision settings.  */
static void
init_excess_precision (void)
{
  /* Adjust excess precision handling based on the target options.  If
     the front end cannot handle it, flag_excess_precision_cmdline
     will already have been set accordingly in the post_options
     hook.  */
  gcc_assert (flag_excess_precision_cmdline != EXCESS_PRECISION_DEFAULT);
  flag_excess_precision = flag_excess_precision_cmdline;
  if (flag_unsafe_math_optimizations)
    flag_excess_precision = EXCESS_PRECISION_FAST;
  if (flag_excess_precision == EXCESS_PRECISION_STANDARD)
    {
      int flt_eval_method = TARGET_FLT_EVAL_METHOD;
      switch (flt_eval_method)
	{
	case -1:
	case 0:
	  /* Either the target acts unpredictably (-1) or has all the
	     operations required not to have excess precision (0).  */
	  flag_excess_precision = EXCESS_PRECISION_FAST;
	  break;
	case 1:
	case 2:
	  /* In these cases, predictable excess precision makes
	     sense.  */
	  break;
	default:
	  /* Any other implementation-defined FLT_EVAL_METHOD values
	     require the compiler to handle the associated excess
	     precision rules in excess_precision_type.  */
	  gcc_unreachable ();
	}
    }
}

1674 1675 1676 1677 1678
/* Initialize things that are both lang-dependent and target-dependent.
   This function can be called more than once if target parameters change.  */
static void
lang_dependent_init_target (void)
{
1679 1680 1681
  /* This determines excess precision settings.  */
  init_excess_precision ();

1682 1683 1684 1685 1686
  /* This creates various _DECL nodes, so needs to be called after the
     front end is initialized.  It also depends on the HAVE_xxx macros
     generated from the target machine description.  */
  init_optabs ();

1687 1688 1689
  /* The following initialization functions need to generate rtl, so
     provide a dummy function context for them.  */
  init_dummy_function_start ();
1690 1691 1692 1693

  /* Do the target-specific parts of expr initialization.  */
  init_expr_target ();

Vladimir Makarov committed
1694 1695
  /* Although the actions of these functions are language-independent,
     they use optabs, so we cannot call them from backend_init.  */
1696
  init_set_costs ();
Vladimir Makarov committed
1697
  ira_init ();
1698

1699 1700
  expand_dummy_function_end ();
}
1701

1702
/* Language-dependent initialization.  Returns nonzero on success.  */
1703
static int
1704
lang_dependent_init (const char *name)
Richard Stallman committed
1705
{
1706
  location_t save_loc = input_location;
1707
  if (dump_base_name == 0)
1708
    dump_base_name = name && name[0] ? name : "gccdump";
1709

1710
  /* Other front-end initialization.  */
1711
  input_location = BUILTINS_LOCATION;
1712
  if (lang_hooks.init () == 0)
1713
    return 0;
1714
  input_location = save_loc;
Richard Stallman committed
1715

1716 1717 1718
  if (!flag_wpa)
    {
      init_asm_output (name);
1719

1720 1721 1722 1723
      /* If stack usage information is desired, open the output file.  */
      if (flag_stack_usage)
	stack_usage_file = open_auxiliary_file ("su");
    }
Eric Botcazou committed
1724

1725
  /* This creates various _DECL nodes, so needs to be called after the
1726 1727
     front end is initialized.  */
  init_eh ();
1728

1729 1730
  /* Do the target-specific parts of the initialization.  */
  lang_dependent_init_target ();
1731

1732 1733 1734 1735 1736
  if (!flag_wpa)
    {
      /* If dbx symbol table desired, initialize writing it and output the
	 predefined types.  */
      timevar_push (TV_SYMOUT);
Richard Stallman committed
1737

1738 1739 1740
      /* Now we have the correct original filename, we can initialize
	 debug output.  */
      (*debug_hooks->init) (name);
Richard Stallman committed
1741

1742 1743
      timevar_pop (TV_SYMOUT);
    }
1744 1745 1746

  return 1;
}
1747

1748 1749 1750 1751 1752 1753

/* Reinitialize everything when target parameters, such as register usage,
   have changed.  */
void
target_reinit (void)
{
1754 1755
  struct rtl_data saved_x_rtl;
  rtx *saved_regno_reg_rtx;
1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
  tree saved_optimization_current_node;
  struct target_optabs *saved_this_fn_optabs;

  /* Temporarily switch to the default optimization node, so that
     *this_target_optabs is set to the default, not reflecting
     whatever a previous function used for the optimize
     attribute.  */
  saved_optimization_current_node = optimization_current_node;
  saved_this_fn_optabs = this_fn_optabs;
  if (saved_optimization_current_node != optimization_default_node)
    {
      optimization_current_node = optimization_default_node;
      cl_optimization_restore
	(&global_options,
	 TREE_OPTIMIZATION (optimization_default_node));
    }
  this_fn_optabs = this_target_optabs;
1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783

  /* Save *crtl and regno_reg_rtx around the reinitialization
     to allow target_reinit being called even after prepare_function_start.  */
  saved_regno_reg_rtx = regno_reg_rtx;
  if (saved_regno_reg_rtx)
    {  
      saved_x_rtl = *crtl;
      memset (crtl, '\0', sizeof (*crtl));
      regno_reg_rtx = NULL;
    }

1784
  /* Reinitialize RTL backend.  */
1785 1786 1787 1788
  backend_init_target ();

  /* Reinitialize lang-dependent parts.  */
  lang_dependent_init_target ();
1789

1790 1791 1792 1793 1794 1795 1796 1797 1798 1799
  /* Restore the original optimization node.  */
  if (saved_optimization_current_node != optimization_default_node)
    {
      optimization_current_node = saved_optimization_current_node;
      cl_optimization_restore (&global_options,
			       TREE_OPTIMIZATION (optimization_current_node));
    }
  this_fn_optabs = saved_this_fn_optabs;

  /* Restore regno_reg_rtx at the end, as free_after_compilation from
1800 1801 1802 1803 1804 1805 1806
     expand_dummy_function_end clears it.  */
  if (saved_regno_reg_rtx)
    {
      *crtl = saved_x_rtl;
      regno_reg_rtx = saved_regno_reg_rtx;
      saved_regno_reg_rtx = NULL;
    }
1807 1808
}

1809 1810 1811
void
dump_memory_report (bool final)
{
1812
  dump_line_table_statistics ();
1813 1814 1815
  ggc_print_statistics ();
  stringpool_statistics ();
  dump_tree_statistics ();
1816
  dump_gimple_statistics ();
1817 1818 1819
  dump_rtx_statistics ();
  dump_alloc_pool_statistics ();
  dump_bitmap_statistics ();
1820
  dump_vec_loc_statistics ();
1821
  dump_ggc_loc_statistics (final);
1822 1823
  dump_alias_stats (stderr);
  dump_pta_stats (stderr);
1824 1825
}

1826 1827 1828
/* Clean up: close opened files, etc.  */

static void
1829
finalize (bool no_backend)
1830 1831 1832 1833 1834
{
  /* Close the dump files.  */
  if (flag_gen_aux_info)
    {
      fclose (aux_info_file);
Joseph Myers committed
1835
      if (seen_error ())
1836 1837 1838 1839 1840 1841 1842 1843 1844 1845
	unlink (aux_info_file_name);
    }

  /* Close non-debugging input and output files.  Take special care to note
     whether fclose returns an error, since the pages might still be on the
     buffer chain while the file is open.  */

  if (asm_out_file)
    {
      if (ferror (asm_out_file) != 0)
1846
	fatal_error ("error writing to %s: %m", asm_file_name);
1847
      if (fclose (asm_out_file) != 0)
1848
	fatal_error ("error closing %s: %m", asm_file_name);
1849 1850
    }

Eric Botcazou committed
1851 1852 1853
  if (stack_usage_file)
    fclose (stack_usage_file);

1854 1855 1856 1857
  if (!no_backend)
    {
      statistics_fini ();

1858
      g->get_passes ()->finish_optimization_passes ();
1859

1860 1861
      ira_finish_once ();
    }
Vladimir Makarov committed
1862

1863
  if (mem_report)
1864
    dump_memory_report (true);
1865

Jan Hubicka committed
1866
  if (profile_report)
1867 1868
    dump_profile_report ();

1869
  /* Language-specific end of compilation actions.  */
1870
  lang_hooks.finish ();
1871
}
1872

1873 1874
/* Initialize the compiler, and compile the input file.  */
static void
1875
do_compile (void)
1876
{
1877 1878 1879 1880
  /* Initialize timing first.  The C front ends read the main file in
     the post_options hook, and C++ does file timings.  */
  if (time_report || !quiet_flag  || flag_detailed_statistics)
    timevar_init ();
1881 1882
  timevar_start (TV_TOTAL);

1883 1884 1885
  process_options ();

  /* Don't do any more if an error has already occurred.  */
Joseph Myers committed
1886
  if (!seen_error ())
1887
    {
1888 1889
      timevar_start (TV_PHASE_SETUP);

1890 1891 1892 1893 1894
      /* This must be run always, because it is needed to compute the FP
	 predefined macros, such as __LDBL_MAX__, for targets using non
	 default FP formats.  */
      init_adjust_machine_modes ();

1895 1896 1897
      /* Set up the back-end if requested.  */
      if (!no_backend)
	backend_init ();
1898

1899
      /* Language-dependent initialization.  Returns true on success.  */
1900
      if (lang_dependent_init (main_input_filename))
1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921
        {
          /* Initialize yet another pass.  */

          ggc_protect_identifiers = true;

          init_cgraph ();
          init_final (main_input_filename);
          coverage_init (aux_base_name);
          statistics_init ();
          invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL);

          timevar_stop (TV_PHASE_SETUP);

          compile_file ();
        }
      else
        {
          timevar_stop (TV_PHASE_SETUP);
        }

      timevar_start (TV_PHASE_FINALIZE);
1922

1923
      finalize (no_backend);
1924 1925

      timevar_stop (TV_PHASE_FINALIZE);
1926
    }
1927 1928 1929 1930

  /* Stop timing and print the times.  */
  timevar_stop (TV_TOTAL);
  timevar_print (stderr);
1931
}
1932

1933 1934 1935 1936 1937 1938 1939
/* Entry point of cc1, cc1plus, jc1, f771, etc.
   Exit code is FATAL_EXIT_CODE if can't open files or if there were
   any errors, or SUCCESS_EXIT_CODE if compilation succeeded.

   It is not safe to call this function more than once.  */

int
1940
toplev_main (int argc, char **argv)
1941
{
1942 1943 1944 1945
  /* Parsing and gimplification sometimes need quite large stack.
     Increase stack size limits if possible.  */
  stack_limit_increase (64 * 1024 * 1024);

1946 1947
  expandargv (&argc, &argv);

1948
  /* Initialization of GCC's environment, and diagnostics.  */
1949
  general_init (argv[0]);
1950

1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
  /* One-off initialization of options that does not need to be
     repeated when options are added for particular functions.  */
  init_options_once ();

  /* Initialize global options structures; this must be repeated for
     each structure used for parsing options.  */
  init_options_struct (&global_options, &global_options_set);
  lang_hooks.init_options_struct (&global_options);

  /* Convert the options to an array.  */
  decode_cmdline_options_to_array_default_mask (argc,
						CONST_CAST2 (const char **,
							     char **, argv),
						&save_decoded_options,
						&save_decoded_options_count);

  /* Perform language-specific options initialization.  */
  lang_hooks.init_options (save_decoded_options_count, save_decoded_options);

1970 1971
  /* Parse the options and do minimal processing; basically just
     enough to default flags appropriately.  */
1972
  decode_options (&global_options, &global_options_set,
1973
		  save_decoded_options, save_decoded_options_count,
1974
		  UNKNOWN_LOCATION, global_dc);
1975

1976 1977
  handle_common_deferred_options ();

1978
  init_local_tick ();
1979

1980 1981 1982 1983 1984
  initialize_plugins ();

  if (version_flag)
    print_version (stderr, "");

1985 1986 1987
  if (help_flag)
    print_plugins_help (stderr, "");

1988
  /* Exit early if we can (e.g. -help).  */
1989
  if (!exit_after_options)
1990
    do_compile ();
1991

1992
  if (warningcount || errorcount || werrorcount)
1993 1994
    print_ignored_options ();

1995 1996
  /* Invoke registered plugin callbacks if any.  Some plugins could
     emit some diagnostics here.  */
Diego Novillo committed
1997 1998
  invoke_plugin_callbacks (PLUGIN_FINISH, NULL);

1999 2000
  diagnostic_finish (global_dc);

2001
  finalize_plugins ();
2002
  location_adhoc_data_fini (line_table);
2003
  if (seen_error () || werrorcount)
2004 2005 2006
    return (FATAL_EXIT_CODE);

  return (SUCCESS_EXIT_CODE);
Richard Stallman committed
2007
}