toplev.c 56.7 KB
Newer Older
1
/* Top level of GCC compilers (cc1, cc1plus, etc.)
2
   Copyright (C) 1987-2013 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
#include "realmpfr.h"	/* For GMP/MPFR/MPC versions, in print_version.  */
33
#include "version.h"
Richard Stallman committed
34
#include "rtl.h"
35
#include "tm_p.h"
Richard Stallman committed
36 37
#include "flags.h"
#include "insn-attr.h"
38
#include "insn-config.h"
39
#include "insn-flags.h"
40
#include "hard-reg-set.h"
41
#include "recog.h"
Richard Kenner committed
42
#include "output.h"
Mike Stump committed
43
#include "except.h"
44
#include "function.h"
Jim Wilson committed
45
#include "toplev.h"
46
#include "expr.h"
Kaveh R. Ghazi committed
47
#include "basic-block.h"
48
#include "intl.h"
49
#include "ggc.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 "tree-mudflap.h"
72
#include "asan.h"
73
#include "tsan.h"
74
#include "gimple.h"
75
#include "tree-ssa-alias.h"
Diego Novillo committed
76
#include "plugin.h"
77
#include "diagnostic-color.h"
David Malcolm committed
78
#include "context.h"
79

Kaveh R. Ghazi committed
80
#if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
81 82 83 84 85 86
#include "dbxout.h"
#endif

#ifdef SDB_DEBUGGING_INFO
#include "sdbout.h"
#endif
87 88 89 90 91

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

93
static void general_init (const char *);
94 95 96 97 98
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 *);
99
static void finalize (bool);
100 101 102 103

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

104 105 106
/* True if we don't need a backend (e.g. preprocessing only).  */
static bool no_backend;

107 108 109
/* Length of line when printing switch values.  */
#define MAX_LINE 75

110
/* Decoded options, and number of such options.  */
111 112
struct cl_decoded_option *save_decoded_options;
unsigned int save_decoded_options_count;
113

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

118 119
/* Debug hooks - dependent upon command line options.  */

120
const struct gcc_debug_hooks *debug_hooks;
121

122 123 124 125
/* The FUNCTION_DECL for the function currently being compiled,
   or 0 if between functions.  */
tree current_function_decl;

126
/* Set to the FUNC_BEGIN label of the current function, or NULL
127
   if none.  */
128
const char * current_function_func_begin_label;
129

130
/* A random sequence of characters, unless overridden by user.  */
131
static const char *flag_random_seed;
132 133 134 135 136 137

/* 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;

138 139 140
/* Random number for this compilation */
HOST_WIDE_INT random_seed;

Richard Stallman committed
141 142
/* -f flags.  */

143 144 145 146 147 148 149 150 151
/* 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;

152 153 154 155 156
/* True if the user has tagged the function with the 'section'
   attribute.  */

bool user_defined_section_attribute = false;

157 158 159 160 161 162
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
163

164
/* The user symbol prefix after having resolved same.  */
165
const char *user_label_prefix;
166

Richard Stallman committed
167 168 169 170 171
/* Output files for assembler code (real compiler output)
   and debugging dumps.  */

FILE *asm_out_file;
FILE *aux_info_file;
Eric Botcazou committed
172
FILE *stack_usage_file = NULL;
Richard Stallman committed
173

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
/* 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)
190 191 192 193 194 195
    {
      if (strcmp (src_pwd, pwd) == 0)
	return true;
      else
	return false;
    }
196 197 198 199 200 201 202 203 204 205 206 207 208

  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)
209 210 211 212 213
    {
      src_pwd = getpwd ();
      if (!src_pwd)
	src_pwd = ".";
    }
214 215 216 217

   return src_pwd;
}

218 219 220 221 222 223 224 225
/* 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)
226 227
	fprintf (stderr, "%s ",
		 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl))));
228
      else
229 230
	fprintf (stderr, " %s",
		 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2)));
231 232
      fflush (stderr);
      pp_needs_newline (global_dc->printer) = true;
233
      diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL);
234 235 236
    }
}

237
/* Initialize local_tick with a random number or -1 if
238
   flag_random_seed is set.  */
239 240

static void
241
init_local_tick (void)
242 243 244
{
  if (!flag_random_seed)
    {
245 246 247 248 249 250 251 252 253 254 255
      /* 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  */
256 257
#ifdef HAVE_GETTIMEOFDAY
      {
258
	struct timeval tv;
259

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

	if (now != (time_t)-1)
	  local_tick = (unsigned) now;
      }
#endif
    }
272
  else
273 274 275
    local_tick = -1;
}

276 277 278 279 280 281
/* 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)
{
282 283 284
  if (flag_random_seed)
    {
      char *endp;
285

286 287 288 289 290 291 292
      /* 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 */
293 294
}

295
/* Obtain the random_seed.  Unless NOINIT, initialize it if
296 297
   it's not provided in the command line.  */

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

/* 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;
}
316

317
/* Handler for fatal signals, such as SIGSEGV.  These are transformed
318 319
   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
320 321

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

  /* 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);
    }

334
  internal_error ("%s", strsignal (signo));
Richard Stallman committed
335 336
}

337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
/* 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)
{
360 361
  if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl)
      || (TREE_CODE (decl) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (decl)))
362 363 364 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
    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))
    {
391
      struct varpool_node *node;
392
      bool needed = true;
393
      node = varpool_get_node (decl);
394

395
      if (!node && flag_ltrans)
396
	needed = false;
397
      else if (node && node->symbol.definition)
398
	needed = false;
399
      else if (node && node->symbol.alias)
400 401 402 403 404
	needed = false;
      else if (!cgraph_global_info_ready
	       && (TREE_USED (decl)
		   || TREE_USED (DECL_ASSEMBLER_NAME (decl))))
	/* needed */;
405
      else if (node && node->symbol.analyzed)
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
	/* 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;
}

424 425 426
/* 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.
427
   Returns nonzero if anything was put out.  */
428

429
bool
430
wrapup_global_declarations (tree *vec, int len)
431
{
432
  bool reconsider, output_something = false;
433 434 435
  int i;

  for (i = 0; i < len; i++)
436
    wrapup_global_declaration_1 (vec[i]);
437 438 439 440 441 442

  /* 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
    {
443
      reconsider = false;
444
      for (i = 0; i < len; i++)
445
	reconsider |= wrapup_global_declaration_2 (vec[i]);
446
      if (reconsider)
447
	output_something = true;
448 449 450 451 452 453
    }
  while (reconsider);

  return output_something;
}

454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
/* 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)))
473
	pedwarn (input_location, 0, "%q+F used but never defined", decl);
474
      else
475
	warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl);
476 477 478 479 480 481 482 483 484 485 486 487 488 489
      /* 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.  */
490
      && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl)))
491 492 493 494 495 496 497 498
      && ! 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
499 500 501
    warning ((TREE_CODE (decl) == FUNCTION_DECL)
	     ? OPT_Wunused_function
             : OPT_Wunused_variable,
502
	     "%q+D defined but not used", decl);
503 504
}

505
/* Issue appropriate warnings for the global declarations in V (of
506
   which there are LEN).  */
507

508
void
509
check_global_declarations (tree *v, int len)
510 511 512 513
{
  int i;

  for (i = 0; i < len; i++)
514
    check_global_declaration_1 (v[i]);
515
}
516

517 518 519 520 521 522 523 524
/* 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
525
  if (seen_error ())
526 527 528 529 530 531
    return;

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

534 535
/* Compile an entire translation unit.  Write a file of assembly
   output and various debugging dumps.  */
Richard Stallman committed
536 537

static void
538
compile_file (void)
Richard Stallman committed
539
{
540 541
  timevar_start (TV_PHASE_PARSING);
  timevar_push (TV_PARSE_GLOBAL);
Richard Stallman committed
542

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

547 548 549
  timevar_pop (TV_PARSE_GLOBAL);
  timevar_stop (TV_PHASE_PARSING);

Richard Stallman committed
550 551 552
  /* Compilation is now finished except for writing
     what's left of the symbol table output.  */

553
  if (flag_syntax_only || flag_wpa)
554
    return;
555

556 557
  ggc_protect_identifiers = false;

558
  /* This must also call finalize_compilation_unit.  */
559
  lang_hooks.decls.final_write_globals ();
Geoffrey Keating committed
560

Joseph Myers committed
561
  if (seen_error ())
562 563 564
    return;

  timevar_start (TV_PHASE_LATE_ASM);
Geoffrey Keating committed
565

566 567 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)
    {
      /* Likewise for mudflap static object registrations.  */
      if (flag_mudflap)
	mudflap_finish_file ();
573

574 575 576 577
      /* File-scope initialization for AddressSanitizer.  */
      if (flag_asan)
        asan_finish_file ();

578 579 580
      if (flag_tsan)
	tsan_finish_file ();

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

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

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

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

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

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

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

605
      dw2_output_indirect_constants ();
606

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

611 612 613 614 615 616
  /* 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)
617 618 619 620 621 622 623 624 625 626 627 628 629
    {
#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
630 631 632 633 634 635
      /* 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,
636
					  "__gnu_lto_slim",
637 638
					  (unsigned HOST_WIDE_INT) 1, 8);
#elif defined ASM_OUTPUT_ALIGNED_COMMON
639
	  ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
640 641
				     (unsigned HOST_WIDE_INT) 1, 8);
#else
642
	  ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
643 644 645 646
			     (unsigned HOST_WIDE_INT) 1,
			     (unsigned HOST_WIDE_INT) 1);
#endif
        }
647
    }
648

649 650 651 652
  /* 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)
653 654
    {
      const char *pkg_version = "(GNU) ";
655
      char *ident_str;
656 657 658

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

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

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

667 668 669 670
  /* 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 ();
671

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

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

Richard Henderson committed
679 680
void
print_version (FILE *file, const char *indent)
681
{
682
  static const char fmt1[] =
683
#ifdef __GNUC__
684
    N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ")
685
#else
686
    N_("%s%s%s %sversion %s (%s) compiled by CC, ")
687
#endif
688 689
    ;
  static const char fmt2[] =
690
    N_("GMP version %s, MPFR version %s, MPC version %s\n");
691
  static const char fmt3[] =
692
    N_("%s%swarning: %s header version %s differs from library version %s.\n");
693
  static const char fmt4[] =
694 695 696 697 698 699 700
    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 ? " " : "",
701
	   lang_hooks.name, pkgversion_string, version_string, TARGET_NAME,
702
	   indent, __VERSION__);
703 704

  /* We need to stringify the GMP macro values.  Ugh, gmp_version has
705 706
     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.  */
707 708
#define GCC_GMP_STRINGIFY_VERSION3(X) #X
#define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3(X)
709 710 711 712
#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
713 714 715 716 717 718 719
#define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \
  GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR)
#else
#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)
#endif
720 721
  fprintf (file,
	   file == stderr ? _(fmt2) : fmt2,
722
	   GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING);
723 724 725
  if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
    fprintf (file,
	     file == stderr ? _(fmt3) : fmt3,
726
	     indent, *indent != 0 ? " " : "",
727 728 729 730
	     "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version);
  if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ()))
    fprintf (file,
	     file == stderr ? _(fmt3) : fmt3,
731
	     indent, *indent != 0 ? " " : "",
732
	     "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
733 734 735 736 737
  if (strcmp (MPC_VERSION_STRING, mpc_get_version ()))
    fprintf (file,
	     file == stderr ? _(fmt3) : fmt3,
	     indent, *indent != 0 ? " " : "",
	     "MPC", MPC_VERSION_STRING, mpc_get_version ());
738 739
  fprintf (file,
	   file == stderr ? _(fmt4) : fmt4,
740 741
	   indent, *indent != 0 ? " " : "",
	   PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
742 743

  print_plugins_versions (file, indent);
744 745
}

746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
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);
769
      fputs (text, asm_out_file);
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789
      /* 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
790

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

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

    default:
      return -1;
    }
}

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

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

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

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

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

836
/* Print active target switches using PRINT_FN.
837 838 839 840 841
   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
842
print_switch_values (print_switch_fn_type print_fn)
843
{
844
  int pos = 0;
845 846
  size_t j;

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

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

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

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

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

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

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

890
  print_fn (SWITCH_TYPE_LINE_END, NULL);
891
}
892

893 894 895 896 897
/* 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
898
init_asm_output (const char *name)
899 900 901 902 903 904
{
  if (name == NULL && asm_file_name == 0)
    asm_out_file = stdout;
  else
    {
      if (asm_file_name == 0)
905 906
	{
	  int len = strlen (dump_base_name);
907
	  char *dumpname = XNEWVEC (char, len + 6);
908

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

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

926 927 928 929 930 931 932 933 934 935 936 937 938 939
      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
940
	    inform (input_location, "-frecord-gcc-switches is not supported by the current target");
941 942
	}

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

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

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

Eric Botcazou committed
970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
/* 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)
	{
988
	  warning (0, "stack usage computation not supported for this target");
Eric Botcazou committed
989 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
	  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;
    }

1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
  if (flag_stack_usage)
    {
      expanded_location loc
	= expand_location (DECL_SOURCE_LOCATION (current_function_decl));
      const char *raw_id, *id;

      /* Strip the scope prefix if any.  */
      raw_id = lang_hooks.decl_printable_name (current_function_decl, 2);
      id = strrchr (raw_id, '.');
      if (id)
	id++;
      else
	id = raw_id;

      fprintf (stack_usage_file,
	       "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n",
	       lbasename (loc.file),
	       loc.line,
	       loc.column,
	       id,
	       stack_usage,
	       stack_usage_kind_str[stack_usage_kind]);
    }
Eric Botcazou committed
1038

1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
  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
1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064
}

/* 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)
1065
    fatal_error ("can%'t open %s for writing: %m", filename);
Eric Botcazou committed
1066 1067 1068 1069
  free (filename);
  return file;
}

1070 1071 1072 1073
/* Initialization of the front end environment, before command line
   options are parsed.  Signal handlers, internationalization etc.
   ARGV0 is main's argv[0].  */
static void
1074
general_init (const char *argv0)
1075
{
1076
  const char *p;
1077 1078 1079 1080 1081 1082 1083

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

  xmalloc_set_program_name (progname);
1084

1085 1086
  hex_init ();

1087
  /* Unlock the stdio streams.  */
1088
  unlock_std_streams ();
1089

1090
  gcc_init_libintl ();
1091

1092 1093 1094
  identifier_to_locale_alloc = alloc_for_identifier_to_locale;
  identifier_to_locale_free = ggc_free;

1095 1096
  /* Initialize the diagnostics reporting machinery, so option parsing
     can give warnings and errors.  */
1097
  diagnostic_initialize (global_dc, N_OPTS);
1098 1099
  /* Set a default printer.  Language specific initializations will
     override it later.  */
1100 1101 1102 1103 1104 1105 1106
  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;

1107 1108
  global_dc->show_caret
    = global_options_init.x_flag_diagnostics_show_caret;
1109 1110 1111 1112
  global_dc->show_option_requested
    = global_options_init.x_flag_diagnostics_show_option;
  global_dc->show_column
    = global_options_init.x_flag_show_column;
1113
  global_dc->internal_error = plugins_internal_error_function;
1114
  global_dc->option_enabled = option_enabled;
1115
  global_dc->option_state = &global_options;
1116
  global_dc->option_name = option_name;
1117

1118 1119 1120
  /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages.  */
#ifdef SIGSEGV
  signal (SIGSEGV, crash_signal);
1121
#endif
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133
#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
1134 1135 1136
#ifdef SIGFPE
  signal (SIGFPE, crash_signal);
#endif
1137

1138 1139 1140
  /* Other host-specific signal setup.  */
  (*host_hooks.extra_signals)();

1141 1142 1143 1144
  /* Initialize the garbage-collector, string pools and tree type hash
     table.  */
  init_ggc ();
  init_stringpool ();
1145
  line_table = ggc_alloc_line_maps ();
1146 1147
  linemap_init (line_table);
  line_table->reallocator = realloc_for_line_map;
1148
  line_table->round_alloc_size = ggc_round_alloc_size;
1149
  init_ttree ();
1150

1151 1152
  /* Initialize register usage now so switches may override.  */
  init_reg_sets ();
1153

1154
  /* Register the language-independent parameters.  */
1155
  global_init_params ();
1156

1157 1158
  /* This must be done after global_init_params but before argument
     processing.  */
1159
  init_ggc_heuristics();
David Malcolm committed
1160 1161 1162 1163

  /* Create the singleton holder for global state.  */
  g = new gcc::context();

1164
  init_optimization_passes ();
1165
  statistics_early_init ();
1166
  finish_params ();
1167
}
1168

1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182
/* 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;
}

1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207
/* 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);
}

1208 1209
/* Process the options that have been parsed.  */
static void
1210
process_options (void)
1211
{
1212 1213 1214 1215
  /* 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;

1216 1217
  maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT;

1218 1219 1220 1221 1222 1223 1224
  /* 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);

1225 1226 1227 1228
  /* 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.  */
1229
  no_backend = lang_hooks.post_options (&main_input_filename);
1230

Richard Stallman committed
1231
  /* Some machines may reject certain combinations of options.  */
1232
  targetm.target_option.override ();
Richard Stallman committed
1233

1234 1235 1236 1237
  /* Avoid any informative notes in the second run of -fcompare-debug.  */
  if (flag_compare_debug) 
    diagnostic_inhibit_notes (global_dc);

1238 1239 1240 1241 1242 1243 1244
  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;
    }

1245 1246 1247
  if (flag_short_enums == 2)
    flag_short_enums = targetm.default_short_enums ();

1248 1249 1250
  /* Set aux_base_name if not already set.  */
  if (aux_base_name)
    ;
1251
  else if (main_input_filename)
1252
    {
1253
      char *name = xstrdup (lbasename (main_input_filename));
1254

1255 1256 1257 1258 1259 1260
      strip_off_ending (name, strlen (name));
      aux_base_name = name;
    }
  else
    aux_base_name = "gccaux";

1261 1262
#ifndef HAVE_cloog
  if (flag_graphite
1263
      || flag_graphite_identity
1264 1265
      || flag_loop_block
      || flag_loop_interchange
1266
      || flag_loop_strip_mine
1267
      || flag_loop_parallelize_all)
1268
    sorry ("Graphite loop optimizations cannot be used (-fgraphite, "
1269
	   "-fgraphite-identity, -floop-block, "
1270 1271
	   "-floop-interchange, -floop-strip-mine, -floop-parallelize-all, "
	   "and -ftree-loop-linear)");
1272 1273
#endif

1274 1275 1276
  if (flag_mudflap && flag_lto)
    sorry ("mudflap cannot be used together with link-time optimization");

1277 1278 1279 1280 1281
  /* 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;

1282 1283
  if (flag_strict_volatile_bitfields > 0 && !abi_version_at_least (2))
    {
1284
      warning (0, "-fstrict-volatile-bitfields disabled; "
1285 1286 1287 1288
	       "it is incompatible with ABI versions < 2");
      flag_strict_volatile_bitfields = 0;
    }

Richard Stallman committed
1289 1290 1291 1292
  /* Unrolling all loops implies that standard loop unrolling must also
     be done.  */
  if (flag_unroll_all_loops)
    flag_unroll_loops = 1;
1293

1294
  /* web and rename-registers help when run after loop unrolling.  */
1295 1296
  if (flag_web == AUTODETECT_VALUE)
    flag_web = flag_unroll_loops || flag_peel_loops;
1297

1298 1299
  if (flag_rename_registers == AUTODETECT_VALUE)
    flag_rename_registers = flag_unroll_loops || flag_peel_loops;
Richard Stallman committed
1300

1301 1302 1303 1304 1305
  if (flag_non_call_exceptions)
    flag_asynchronous_unwind_tables = 1;
  if (flag_asynchronous_unwind_tables)
    flag_unwind_tables = 1;

1306 1307 1308
  if (flag_value_profile_transformations)
    flag_profile_values = 1;

Richard Stallman committed
1309 1310 1311
  /* Warn about options that are not supported on this machine.  */
#ifndef INSN_SCHEDULING
  if (flag_schedule_insns || flag_schedule_insns_after_reload)
1312
    warning (0, "instruction scheduling not supported on this target machine");
Richard Stallman committed
1313 1314 1315
#endif
#ifndef DELAY_SLOTS
  if (flag_delayed_branch)
1316
    warning (0, "this target machine does not have delayed branches");
Richard Stallman committed
1317 1318
#endif

1319 1320 1321
  user_label_prefix = USER_LABEL_PREFIX;
  if (flag_leading_underscore != -1)
    {
1322
      /* If the default prefix is more complicated than "" or "_",
1323 1324 1325 1326 1327 1328 1329
	 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
1330
	warning (0, "-f%sleading-underscore not supported on this target machine",
1331 1332 1333
		 flag_leading_underscore ? "" : "no-");
    }

Richard Stallman committed
1334 1335 1336 1337
  /* If we are in verbose mode, write out the version and maybe all the
     option flags in use.  */
  if (version_flag)
    {
1338
      print_version (stderr, "");
Richard Stallman committed
1339
      if (! quiet_flag)
1340
	print_switch_values (print_to_stderr);
Richard Stallman committed
1341 1342
    }

1343 1344 1345 1346 1347
  if (flag_syntax_only)
    {
      write_symbols = NO_DEBUG;
      profile_flag = 0;
    }
Richard Stallman committed
1348

1349 1350 1351
  if (flag_gtoggle)
    {
      if (debug_info_level == DINFO_LEVEL_NONE)
1352 1353 1354 1355 1356 1357
	{
	  debug_info_level = DINFO_LEVEL_NORMAL;

	  if (write_symbols == NO_DEBUG)
	    write_symbols = PREFERRED_DEBUGGING_TYPE;
	}
1358 1359 1360 1361
      else
	debug_info_level = DINFO_LEVEL_NONE;
    }

1362
  if (flag_dump_final_insns && !flag_syntax_only && !no_backend)
1363 1364 1365 1366
    {
      FILE *final_output = fopen (flag_dump_final_insns, "w");
      if (!final_output)
	{
1367 1368
	  error ("could not open final insn dump file %qs: %m",
		 flag_dump_final_insns);
1369 1370 1371 1372
	  flag_dump_final_insns = NULL;
	}
      else if (fclose (final_output))
	{
1373 1374
	  error ("could not close zeroed insn dump file %qs: %m",
		 flag_dump_final_insns);
1375 1376 1377 1378
	  flag_dump_final_insns = NULL;
	}
    }

1379 1380 1381 1382 1383 1384
  /* 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)
1385
    ;
1386
#if defined(DBX_DEBUGGING_INFO)
1387
  else if (write_symbols == DBX_DEBUG)
1388
    debug_hooks = &dbx_debug_hooks;
Richard Stallman committed
1389
#endif
1390
#if defined(XCOFF_DEBUGGING_INFO)
1391
  else if (write_symbols == XCOFF_DEBUG)
1392
    debug_hooks = &xcoff_debug_hooks;
1393
#endif
1394
#ifdef SDB_DEBUGGING_INFO
1395
  else if (write_symbols == SDB_DEBUG)
1396 1397 1398
    debug_hooks = &sdb_debug_hooks;
#endif
#ifdef DWARF2_DEBUGGING_INFO
1399
  else if (write_symbols == DWARF2_DEBUG)
1400
    debug_hooks = &dwarf2_debug_hooks;
1401
#endif
1402
#ifdef VMS_DEBUGGING_INFO
1403
  else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1404 1405
    debug_hooks = &vmsdbg_debug_hooks;
#endif
1406 1407 1408
  else
    error ("target system does not support the \"%s\" debug format",
	   debug_type_names[write_symbols]);
Richard Stallman committed
1409

1410 1411
  /* 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.  */
1412 1413
  if (debug_info_level < DINFO_LEVEL_NORMAL
      || debug_hooks->var_location == do_nothing_debug_hooks.var_location)
1414
    {
1415 1416
      if (flag_var_tracking == 1
	  || flag_var_tracking_uninit == 1)
1417 1418
        {
	  if (debug_info_level < DINFO_LEVEL_NORMAL)
1419
	    warning (0, "variable tracking requested, but useless unless "
1420 1421
		     "producing debug info");
	  else
1422
	    warning (0, "variable tracking requested, but not supported "
1423 1424 1425
		     "by this debug format");
	}
      flag_var_tracking = 0;
1426
      flag_var_tracking_uninit = 0;
1427 1428
    }

Ian Lance Taylor committed
1429 1430 1431 1432 1433 1434
  /* 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);

1435 1436 1437
  /* 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.)  */
1438
  if (flag_var_tracking_uninit == 1)
1439
    flag_var_tracking = 1;
1440

1441
  if (flag_var_tracking == AUTODETECT_VALUE)
1442 1443
    flag_var_tracking = optimize >= 1;

1444 1445 1446
  if (flag_var_tracking_uninit == AUTODETECT_VALUE)
    flag_var_tracking_uninit = flag_var_tracking;

1447
  if (flag_var_tracking_assignments == AUTODETECT_VALUE)
1448 1449
    flag_var_tracking_assignments = flag_var_tracking
      && !(flag_selective_scheduling || flag_selective_scheduling2);
1450 1451 1452 1453 1454 1455 1456

  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;

1457 1458 1459 1460
  if (flag_var_tracking_assignments
      && (flag_selective_scheduling || flag_selective_scheduling2))
    warning (0, "var-tracking-assignments changes selective scheduling");

1461 1462 1463 1464 1465 1466 1467
  if (flag_tree_cselim == AUTODETECT_VALUE)
#ifdef HAVE_conditional_move
    flag_tree_cselim = 1;
#else
    flag_tree_cselim = 0;
#endif

1468 1469 1470 1471 1472 1473 1474
  /* 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)
1475
	fatal_error ("can%'t open %s: %m", aux_info_file_name);
1476
    }
1477

1478
  if (!targetm_common.have_named_sections)
Richard Stallman committed
1479
    {
1480 1481
      if (flag_function_sections)
	{
1482
	  warning (0, "-ffunction-sections not supported for this target");
1483 1484 1485 1486
	  flag_function_sections = 0;
	}
      if (flag_data_sections)
	{
1487
	  warning (0, "-fdata-sections not supported for this target");
1488 1489
	  flag_data_sections = 0;
	}
Richard Stallman committed
1490
    }
1491

1492
#ifndef HAVE_prefetch
1493
  if (flag_prefetch_loop_arrays > 0)
1494
    {
1495
      warning (0, "-fprefetch-loop-arrays not supported for this target");
1496 1497 1498
      flag_prefetch_loop_arrays = 0;
    }
#else
1499
  if (flag_prefetch_loop_arrays > 0 && !HAVE_prefetch)
1500
    {
1501
      warning (0, "-fprefetch-loop-arrays not supported for this target (try -march switches)");
1502 1503 1504 1505
      flag_prefetch_loop_arrays = 0;
    }
#endif

1506 1507
  /* This combination of options isn't handled for i386 targets and doesn't
     make much sense anyway, so don't allow it.  */
1508
  if (flag_prefetch_loop_arrays > 0 && optimize_size)
1509
    {
1510
      warning (0, "-fprefetch-loop-arrays is not supported with -Os");
1511 1512 1513
      flag_prefetch_loop_arrays = 0;
    }

1514 1515 1516
  /* The presence of IEEE signaling NaNs, implies all math can trap.  */
  if (flag_signaling_nans)
    flag_trapping_math = 1;
1517

1518
  /* We cannot reassociate if we want traps or signed zeros.  */
1519 1520 1521 1522 1523 1524
  if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))
    {
      warning (0, "-fassociative-math disabled; other options take precedence");
      flag_associative_math = 0;
    }

1525 1526 1527
  /* With -fcx-limited-range, we do cheap and quick complex arithmetic.  */
  if (flag_cx_limited_range)
    flag_complex_method = 0;
1528

1529 1530 1531 1532
  /* With -fcx-fortran-rules, we do something in-between cheap and C99.  */
  if (flag_cx_fortran_rules)
    flag_complex_method = 1;

1533 1534
  /* Targets must be able to place spill slots at lower addresses.  If the
     target already uses a soft frame pointer, the transition is trivial.  */
1535
  if (!FRAME_GROWS_DOWNWARD && flag_stack_protect)
1536 1537 1538 1539 1540 1541
    {
      warning (0, "-fstack-protector not supported for this target");
      flag_stack_protect = 0;
    }
  if (!flag_stack_protect)
    warn_stack_protect = 0;
1542

Jakub Jelinek committed
1543
  /* Address Sanitizer needs porting to each target architecture.  */
1544 1545 1546
  if (flag_asan
      && (targetm.asan_shadow_offset == NULL
	  || !FRAME_GROWS_DOWNWARD))
Jakub Jelinek committed
1547
    {
1548
      warning (0, "-fsanitize=address not supported for this target");
Jakub Jelinek committed
1549 1550 1551
      flag_asan = 0;
    }

1552 1553 1554 1555 1556 1557 1558 1559 1560
  /* 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);

1561 1562 1563
  /* Save the current optimization options.  */
  optimization_default_node = build_optimization_node ();
  optimization_current_node = optimization_default_node;
Richard Stallman committed
1564
}
1565

1566 1567 1568 1569 1570 1571 1572 1573 1574 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
/* 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 ();
1600
  init_lower_subreg ();
1601 1602 1603

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

1606 1607 1608 1609 1610
  expand_dummy_function_end ();
}

/* Initialize the compiler back end.  This function is called only once,
   when starting the compiler.  */
1611
static void
1612
backend_init (void)
1613
{
1614
  init_emit_once ();
1615

1616
  init_rtlanal ();
1617
  init_inline_once ();
1618
  init_varasm_once ();
1619
  save_register_info ();
1620

1621
  /* Initialize the target-specific back end pieces.  */
Vladimir Makarov committed
1622
  ira_init_once ();
1623 1624 1625
  backend_init_target ();
}

1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 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
/* 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 ();
	}
    }
}

1663 1664 1665 1666 1667
/* 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)
{
1668 1669 1670
  /* This determines excess precision settings.  */
  init_excess_precision ();

1671 1672 1673 1674 1675
  /* 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 ();

1676 1677 1678
  /* The following initialization functions need to generate rtl, so
     provide a dummy function context for them.  */
  init_dummy_function_start ();
1679 1680 1681 1682

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

Vladimir Makarov committed
1683 1684
  /* Although the actions of these functions are language-independent,
     they use optabs, so we cannot call them from backend_init.  */
1685
  init_set_costs ();
Vladimir Makarov committed
1686
  ira_init ();
1687

1688 1689
  expand_dummy_function_end ();
}
1690

1691
/* Language-dependent initialization.  Returns nonzero on success.  */
1692
static int
1693
lang_dependent_init (const char *name)
Richard Stallman committed
1694
{
1695
  location_t save_loc = input_location;
1696
  if (dump_base_name == 0)
1697
    dump_base_name = name && name[0] ? name : "gccdump";
1698

1699
  /* Other front-end initialization.  */
1700
  input_location = BUILTINS_LOCATION;
1701
  if (lang_hooks.init () == 0)
1702
    return 0;
1703
  input_location = save_loc;
Richard Stallman committed
1704

1705 1706 1707
  if (!flag_wpa)
    {
      init_asm_output (name);
1708

1709 1710 1711 1712
      /* If stack usage information is desired, open the output file.  */
      if (flag_stack_usage)
	stack_usage_file = open_auxiliary_file ("su");
    }
Eric Botcazou committed
1713

1714
  /* This creates various _DECL nodes, so needs to be called after the
1715 1716
     front end is initialized.  */
  init_eh ();
1717

1718 1719
  /* Do the target-specific parts of the initialization.  */
  lang_dependent_init_target ();
1720

1721 1722 1723 1724 1725
  if (!flag_wpa)
    {
      /* If dbx symbol table desired, initialize writing it and output the
	 predefined types.  */
      timevar_push (TV_SYMOUT);
Richard Stallman committed
1726

1727 1728 1729
      /* Now we have the correct original filename, we can initialize
	 debug output.  */
      (*debug_hooks->init) (name);
Richard Stallman committed
1730

1731 1732
      timevar_pop (TV_SYMOUT);
    }
1733 1734 1735

  return 1;
}
1736

1737 1738 1739 1740 1741 1742

/* Reinitialize everything when target parameters, such as register usage,
   have changed.  */
void
target_reinit (void)
{
1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
  struct rtl_data saved_x_rtl;
  rtx *saved_regno_reg_rtx;

  /* 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;
    }

1756
  /* Reinitialize RTL backend.  */
1757 1758 1759 1760
  backend_init_target ();

  /* Reinitialize lang-dependent parts.  */
  lang_dependent_init_target ();
1761 1762 1763 1764 1765 1766 1767 1768 1769

  /* And restore it at the end, as free_after_compilation from
     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;
    }
1770 1771
}

1772 1773 1774
void
dump_memory_report (bool final)
{
1775
  dump_line_table_statistics ();
1776 1777 1778
  ggc_print_statistics ();
  stringpool_statistics ();
  dump_tree_statistics ();
1779
  dump_gimple_statistics ();
1780 1781 1782
  dump_rtx_statistics ();
  dump_alloc_pool_statistics ();
  dump_bitmap_statistics ();
1783
  dump_vec_loc_statistics ();
1784
  dump_ggc_loc_statistics (final);
1785 1786
  dump_alias_stats (stderr);
  dump_pta_stats (stderr);
1787 1788
}

1789 1790 1791
/* Clean up: close opened files, etc.  */

static void
1792
finalize (bool no_backend)
1793 1794 1795 1796 1797
{
  /* Close the dump files.  */
  if (flag_gen_aux_info)
    {
      fclose (aux_info_file);
Joseph Myers committed
1798
      if (seen_error ())
1799 1800 1801 1802 1803 1804 1805 1806 1807 1808
	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)
1809
	fatal_error ("error writing to %s: %m", asm_file_name);
1810
      if (fclose (asm_out_file) != 0)
1811
	fatal_error ("error closing %s: %m", asm_file_name);
1812 1813
    }

Eric Botcazou committed
1814 1815 1816
  if (stack_usage_file)
    fclose (stack_usage_file);

1817 1818 1819 1820 1821
  if (!no_backend)
    {
      statistics_fini ();

      finish_optimization_passes ();
1822

1823 1824
      ira_finish_once ();
    }
Vladimir Makarov committed
1825

1826
  if (mem_report)
1827
    dump_memory_report (true);
1828

Jan Hubicka committed
1829
  if (profile_report)
1830 1831
    dump_profile_report ();

1832
  /* Language-specific end of compilation actions.  */
1833
  lang_hooks.finish ();
1834
}
1835

1836 1837
/* Initialize the compiler, and compile the input file.  */
static void
1838
do_compile (void)
1839
{
1840 1841 1842 1843
  /* 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 ();
1844 1845
  timevar_start (TV_TOTAL);

1846 1847 1848
  process_options ();

  /* Don't do any more if an error has already occurred.  */
Joseph Myers committed
1849
  if (!seen_error ())
1850
    {
1851 1852
      timevar_start (TV_PHASE_SETUP);

1853 1854 1855 1856 1857
      /* 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 ();

1858 1859 1860
      /* Set up the back-end if requested.  */
      if (!no_backend)
	backend_init ();
1861

1862
      /* Language-dependent initialization.  Returns true on success.  */
1863
      if (lang_dependent_init (main_input_filename))
1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884
        {
          /* 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);
1885

1886
      finalize (no_backend);
1887 1888

      timevar_stop (TV_PHASE_FINALIZE);
1889
    }
1890 1891 1892 1893

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

1896 1897 1898 1899 1900 1901 1902
/* 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
1903
toplev_main (int argc, char **argv)
1904
{
1905 1906 1907 1908
  /* Parsing and gimplification sometimes need quite large stack.
     Increase stack size limits if possible.  */
  stack_limit_increase (64 * 1024 * 1024);

1909 1910
  expandargv (&argc, &argv);

1911
  /* Initialization of GCC's environment, and diagnostics.  */
1912
  general_init (argv[0]);
1913

1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932
  /* 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);

1933 1934
  /* Parse the options and do minimal processing; basically just
     enough to default flags appropriately.  */
1935
  decode_options (&global_options, &global_options_set,
1936
		  save_decoded_options, save_decoded_options_count,
1937
		  UNKNOWN_LOCATION, global_dc);
1938

1939 1940
  handle_common_deferred_options ();

1941
  init_local_tick ();
1942

1943 1944 1945 1946 1947
  initialize_plugins ();

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

1948 1949 1950
  if (help_flag)
    print_plugins_help (stderr, "");

1951
  /* Exit early if we can (e.g. -help).  */
1952
  if (!exit_after_options)
1953
    do_compile ();
1954

1955
  if (warningcount || errorcount || werrorcount)
1956
    print_ignored_options ();
1957
  diagnostic_finish (global_dc);
1958

Diego Novillo committed
1959 1960 1961
  /* Invoke registered plugin callbacks if any.  */
  invoke_plugin_callbacks (PLUGIN_FINISH, NULL);

1962
  finalize_plugins ();
1963
  location_adhoc_data_fini (line_table);
1964
  if (seen_error () || werrorcount)
1965 1966 1967
    return (FATAL_EXIT_CODE);

  return (SUCCESS_EXIT_CODE);
Richard Stallman committed
1968
}