/* Top level of GCC compilers (cc1, cc1plus, etc.)
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+ Free Software Foundation, Inc.
This file is part of GCC.
#include "value-prof.h"
#include "alloc-pool.h"
#include "tree-mudflap.h"
+#include "tree-pass.h"
#if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
#include "dwarf2out.h"
static void setup_core_dumping (void);
static void compile_file (void);
-static int print_single_switch (FILE *, int, int, const char *,
- const char *, const char *,
- const char *, const char *);
-static void print_switch_values (FILE *, int, int, const char *,
- const char *, const char *);
-
/* Nonzero to dump debug info whilst parsing (-dy option). */
static int set_yydebug;
/* Incremented on each change to input_file_stack. */
int input_file_stack_tick;
+/* Record of input_file_stack at each tick. */
+typedef struct file_stack *fs_p;
+DEF_VEC_P(fs_p);
+DEF_VEC_ALLOC_P(fs_p,heap);
+static VEC(fs_p,heap) *input_file_stack_history;
+
+/* Whether input_file_stack has been restored to a previous state (in
+ which case there should be no more pushing). */
+static bool input_file_stack_restored;
+
/* Name to use as base of names for dump output files. */
const char *dump_base_name;
int flag_detailed_statistics = 0;
/* A random sequence of characters, unless overridden by user. */
-const char *flag_random_seed;
+static const char *flag_random_seed;
/* 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
the support provided depends on the backend. */
rtx stack_limit_rtx;
-/* If one, renumber instruction UIDs to reduce the number of
- unused UIDs if there are a lot of instructions. If greater than
- one, unconditionally renumber instruction UIDs. */
-int flag_renumber_insns = 1;
-
/* Nonzero if we should track variables. When
flag_var_tracking == AUTODETECT_VALUE it will be set according
to optimize, debug_info_level and debug_hooks in process_options (). */
static const param_info lang_independent_params[] = {
#define DEFPARAM(ENUM, OPTION, HELP, DEFAULT, MIN, MAX) \
- { OPTION, DEFAULT, MIN, MAX, HELP },
+ { OPTION, DEFAULT, false, MIN, MAX, HELP },
#include "params.def"
#undef DEFPARAM
- { NULL, 0, 0, 0, NULL }
+ { NULL, 0, false, 0, 0, NULL }
};
/* Output files for assembler code (real compiler output)
}
}
-/* Set up a default flag_random_seed and local_tick, unless the user
- already specified one. */
+/* Initialize local_tick with the time of day, or -1 if
+ flag_random_seed is set. */
static void
-randomize (void)
+init_local_tick (void)
{
if (!flag_random_seed)
{
- unsigned HOST_WIDE_INT value;
- static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
-
/* Get some more or less random data. */
#ifdef HAVE_GETTIMEOFDAY
{
- struct timeval tv;
+ struct timeval tv;
- gettimeofday (&tv, NULL);
+ gettimeofday (&tv, NULL);
local_tick = tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
#else
local_tick = (unsigned) now;
}
#endif
- value = local_tick ^ getpid ();
-
- sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
- flag_random_seed = random_seed;
}
- else if (!local_tick)
+ else
local_tick = -1;
}
+/* 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)
+{
+ unsigned HOST_WIDE_INT value;
+ static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
+
+ value = local_tick ^ getpid ();
+
+ sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
+ flag_random_seed = random_seed;
+}
+
+/* Obtain the random_seed string. Unless NOINIT, initialize it if
+ it's not provided in the command line. */
+
+const char *
+get_random_seed (bool noinit)
+{
+ if (!flag_random_seed && !noinit)
+ init_random_seed ();
+ return flag_random_seed;
+}
+
+/* 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;
+}
/* Decode the string P as an integral parameter.
If the string is indeed an integer return its numeric value else
return atoi (p);
}
+/* When compiling with a recent enough GCC, we use the GNU C "extern inline"
+ for floor_log2 and exact_log2; see toplev.h. That construct, however,
+ conflicts with the ISO C++ One Definition Rule. */
+
+#if GCC_VERSION < 3004 || !defined (__cplusplus)
+
/* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
If X is 0, return -1. */
#endif
}
+#endif /* GCC_VERSION < 3004 || !defined (__cplusplus) */
+
/* Handler for fatal signals, such as SIGSEGV. These are transformed
into ICE messages, which is much more user friendly. In case the
error printer crashes, reset the signal to prevent infinite recursion. */
if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
{
- struct cgraph_varpool_node *node;
+ struct varpool_node *node;
bool needed = true;
- node = cgraph_varpool_node (decl);
+ node = varpool_node (decl);
if (node->finalized)
needed = false;
&& ! TREE_USED (decl)
/* The TREE_USED bit for file-scope decls is kept in the identifier,
to handle multiple external decls in different scopes. */
- && ! TREE_USED (DECL_NAME (decl))
+ && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl)))
&& ! DECL_EXTERNAL (decl)
&& ! TREE_PUBLIC (decl)
/* A volatile variable might be used in some non-obvious way. */
{
expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (node));
warning (OPT_Wdeprecated_declarations,
- "%qs is deprecated (declared at %s:%d)",
- IDENTIFIER_POINTER (DECL_NAME (node)),
- xloc.file, xloc.line);
+ "%qD is deprecated (declared at %s:%d)",
+ node, xloc.file, xloc.line);
}
else if (TYPE_P (node))
{
{
struct file_stack *fs;
- fs = xmalloc (sizeof (struct file_stack));
+ gcc_assert (!input_file_stack_restored);
+ if (input_file_stack_tick == (int) ((1U << INPUT_FILE_STACK_BITS) - 1))
+ sorry ("GCC supports only %d input file changes", input_file_stack_tick);
+
+ fs = XNEW (struct file_stack);
fs->location = input_location;
fs->next = input_file_stack;
#ifdef USE_MAPPED_LOCATION
#endif
input_file_stack = fs;
input_file_stack_tick++;
+ VEC_safe_push (fs_p, heap, input_file_stack_history, input_file_stack);
}
/* Pop the top entry off the stack of presently open source files.
{
struct file_stack *fs;
+ gcc_assert (!input_file_stack_restored);
+ if (input_file_stack_tick == (int) ((1U << INPUT_FILE_STACK_BITS) - 1))
+ sorry ("GCC supports only %d input file changes", input_file_stack_tick);
+
fs = input_file_stack;
input_location = fs->location;
input_file_stack = fs->next;
- free (fs);
input_file_stack_tick++;
+ VEC_safe_push (fs_p, heap, input_file_stack_history, input_file_stack);
+}
+
+/* Restore the input file stack to its state as of TICK, for the sake
+ of diagnostics after processing the whole input. Once this has
+ been called, push_srcloc and pop_srcloc may no longer be
+ called. */
+void
+restore_input_file_stack (int tick)
+{
+ if (tick == 0)
+ input_file_stack = NULL;
+ else
+ input_file_stack = VEC_index (fs_p, input_file_stack_history, tick - 1);
+ input_file_stack_tick = tick;
+ input_file_stack_restored = true;
}
/* Compile an entire translation unit. Write a file of assembly
return;
lang_hooks.decls.final_write_globals ();
- cgraph_varpool_assemble_pending_decls ();
+
+ if (errorcount || sorrycount)
+ return;
+
+ varpool_assemble_pending_decls ();
finish_aliases_2 ();
/* This must occur after the loop to output deferred functions.
if (flag_mudflap)
mudflap_finish_file ();
- /* Write out any pending weak symbol declarations. */
+ /* Likewise for emulated thread-local storage. */
+ if (!targetm.have_tls)
+ emutls_finish ();
+ output_shared_constant_pool ();
+ output_object_blocks ();
+
+ /* Write out any pending weak symbol declarations. */
weak_finish ();
/* Do dbx symbols. */
timevar_push (TV_SYMOUT);
-#ifdef DWARF2_UNWIND_INFO
+#if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
if (dwarf2out_do_frame ())
dwarf2out_frame_finish ();
#endif
dw2_output_indirect_constants ();
- /* Flush any pending external directives. cgraph did this for
- assemble_external calls from the front end, but the RTL
- expander can also generate them. */
+ /* Flush any pending external directives. */
process_pending_assemble_externals ();
/* Attach a special .ident directive to the end of the file to identify
{
static const char fmt1[] =
#ifdef __GNUC__
- N_("%s%s%s version %s (%s)\n%s\tcompiled by GNU C version %s.\n")
+ N_("%s%s%s version %s (%s)\n%s\tcompiled by GNU C version %s, ")
#else
- N_("%s%s%s version %s (%s) compiled by CC.\n")
+ N_("%s%s%s version %s (%s) compiled by CC, ")
#endif
;
static const char fmt2[] =
+ N_("GMP version %s, MPFR version %s.\n");
+ static const char fmt3[] =
+ N_("warning: %s header version %s differs from library version %s.\n");
+ static const char fmt4[] =
N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n");
#ifndef __VERSION__
#define __VERSION__ "[?]"
indent, *indent != 0 ? " " : "",
lang_hooks.name, version_string, TARGET_NAME,
indent, __VERSION__);
+
+ /* We need to stringify the GMP macro values. Ugh, gmp_version has
+ two string formats, "i.j.k" and "i.j" when k is zero. */
+#define GCC_GMP_STRINGIFY_VERSION3(X) #X
+#define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3(X)
+#if __GNU_MP_VERSION_PATCHLEVEL == 0
+#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
fprintf (file,
file == stderr ? _(fmt2) : fmt2,
+ GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING);
+ if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
+ fprintf (file,
+ file == stderr ? _(fmt3) : fmt3,
+ "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version);
+ if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ()))
+ fprintf (file,
+ file == stderr ? _(fmt3) : fmt3,
+ "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
+ fprintf (file,
+ file == stderr ? _(fmt4) : fmt4,
indent, *indent != 0 ? " " : "",
PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
}
+#ifdef ASM_COMMENT_START
+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);
+ fprintf (asm_out_file, text);
+ /* No need to return the length here as
+ print_single_switch has already done it. */
+ return 0;
+
+ default:
+ return -1;
+ }
+}
+#endif
+
+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;
+
+ case SWITCH_TYPE_PASSED:
+ case SWITCH_TYPE_ENABLED:
+ fputc (' ', stderr);
+ /* Drop through. */
+
+ case SWITCH_TYPE_DESCRIPTIVE:
+ fprintf (stderr, text);
+ /* No need to return the length here as
+ print_single_switch has already done it. */
+ return 0;
+
+ default:
+ return -1;
+ }
+}
+
/* Print an option value and return the adjusted position in the line.
- ??? We don't handle error returns from fprintf (disk full); presumably
- other code will catch a disk full though. */
+ ??? print_fn doesn't handle errors, eg disk full; presumably other
+ code will catch a disk full though. */
static int
-print_single_switch (FILE *file, int pos, int max,
- const char *indent, const char *sep, const char *term,
- const char *type, const char *name)
+print_single_switch (print_switch_fn_type print_fn,
+ int pos,
+ print_switch_type type,
+ const char * text)
{
- /* The ultrix fprintf returns 0 on success, so compute the result we want
- here since we need it for the following test. */
- int len = strlen (sep) + strlen (type) + strlen (name);
+ /* The ultrix fprintf returns 0 on success, so compute the result
+ we want here since we need it for the following test. The +1
+ is for the separator character that will probably be emitted. */
+ int len = strlen (text) + 1;
if (pos != 0
- && pos + len > max)
+ && pos + len > MAX_LINE)
{
- fprintf (file, "%s", term);
+ print_fn (SWITCH_TYPE_LINE_END, NULL);
pos = 0;
}
+
if (pos == 0)
- {
- fprintf (file, "%s", indent);
- pos = strlen (indent);
- }
- fprintf (file, "%s%s%s", sep, type, name);
- pos += len;
- return pos;
+ pos += print_fn (SWITCH_TYPE_LINE_START, NULL);
+
+ print_fn (type, text);
+ return pos + len;
}
-/* Print active target switches to FILE.
+/* Print active target switches using PRINT_FN.
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
-print_switch_values (FILE *file, int pos, int max,
- const char *indent, const char *sep, const char *term)
+print_switch_values (print_switch_fn_type print_fn)
{
+ int pos = 0;
size_t j;
const char **p;
/* Fill in the -frandom-seed option, if the user didn't pass it, so
that it can be printed below. This helps reproducibility. */
- randomize ();
+ if (!flag_random_seed)
+ init_random_seed ();
/* Print the options as passed. */
- pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
- _("options passed: "), "");
+ pos = print_single_switch (print_fn, pos,
+ SWITCH_TYPE_DESCRIPTIVE, _("options passed: "));
for (p = &save_argv[1]; *p != NULL; p++)
- if (**p == '-')
- {
- /* Ignore these. */
- if (strcmp (*p, "-o") == 0)
- {
- if (p[1] != NULL)
- p++;
+ {
+ if (**p == '-')
+ {
+ /* Ignore these. */
+ if (strcmp (*p, "-o") == 0
+ || strcmp (*p, "-dumpbase") == 0
+ || strcmp (*p, "-auxbase") == 0)
+ {
+ if (p[1] != NULL)
+ p++;
+ continue;
+ }
+
+ if (strcmp (*p, "-quiet") == 0
+ || strcmp (*p, "-version") == 0)
continue;
- }
- if (strcmp (*p, "-quiet") == 0)
- continue;
- if (strcmp (*p, "-version") == 0)
- continue;
- if ((*p)[1] == 'd')
- continue;
-
- pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
- }
+
+ if ((*p)[1] == 'd')
+ continue;
+ }
+
+ pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED, *p);
+ }
+
if (pos > 0)
- fprintf (file, "%s", term);
+ print_fn (SWITCH_TYPE_LINE_END, NULL);
/* Print the -f and -m options that have been enabled.
We don't handle language specific options but printing argv
should suffice. */
-
- pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
- _("options enabled: "), "");
+ pos = print_single_switch (print_fn, 0,
+ SWITCH_TYPE_DESCRIPTIVE, _("options enabled: "));
for (j = 0; j < cl_options_count; j++)
if ((cl_options[j].flags & CL_REPORT)
&& option_enabled (j) > 0)
- pos = print_single_switch (file, pos, max, indent, sep, term,
- "", cl_options[j].opt_text);
+ pos = print_single_switch (print_fn, pos,
+ SWITCH_TYPE_ENABLED, cl_options[j].opt_text);
- fprintf (file, "%s", term);
+ print_fn (SWITCH_TYPE_LINE_END, NULL);
}
/* Open assembly code output file. Do this even if -fsyntax-only is
if (asm_file_name == 0)
{
int len = strlen (dump_base_name);
- char *dumpname = xmalloc (len + 6);
+ char *dumpname = XNEWVEC (char, len + 6);
+
memcpy (dumpname, dump_base_name, len + 1);
strip_off_ending (dumpname, len);
strcat (dumpname, ".s");
{
targetm.asm_out.file_start ();
+ 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
+ inform ("-frecord-gcc-switches is not supported by the current target");
+ }
+
#ifdef ASM_COMMENT_START
if (flag_verbose_asm)
{
- /* Print the list of options in effect. */
+ /* Print the list of switches in effect
+ into the assembler file as comments. */
print_version (asm_out_file, ASM_COMMENT_START);
- print_switch_values (asm_out_file, 0, MAX_LINE,
- ASM_COMMENT_START, " ", "\n");
- /* Add a blank line here so it appears in assembler output but not
- screen output. */
+ print_switch_values (print_to_asm_out_file);
fprintf (asm_out_file, "\n");
}
#endif
if (option_affects_pch_p (i, &state))
*len += state.size;
- result = r = xmalloc (*len);
+ result = r = XNEWVEC (char, *len);
r[0] = flag_pic;
r[1] = flag_pie;
r += 2;
pp_string (pp, n);
}
else
- dump_generic_node (pp, t, 0, 0, 0);
+ dump_generic_node (pp, t, 0, TDF_DIAGNOSTIC, 0);
return true;
}
init_optimization_passes ();
}
+/* 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;
+}
+
/* Process the options that have been parsed. */
static void
process_options (void)
{
+ /* 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;
+
/* 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)
OVERRIDE_OPTIONS;
#endif
+ 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;
+ }
+
if (flag_short_enums == 2)
flag_short_enums = targetm.default_short_enums ();
if (flag_rename_registers == AUTODETECT_VALUE)
flag_rename_registers = flag_unroll_loops || flag_peel_loops;
- /* If explicitly asked to run new loop optimizer, switch off the old
- one. */
- if (flag_loop_optimize2)
- flag_loop_optimize = 0;
-
- /* Enable new loop optimizer pass if any of its optimizations is called. */
- if (flag_move_loop_invariants
- || flag_unswitch_loops
- || flag_peel_loops
- || flag_unroll_loops
- || flag_branch_on_count_reg)
- flag_loop_optimize2 = 1;
-
if (flag_non_call_exceptions)
flag_asynchronous_unwind_tables = 1;
if (flag_asynchronous_unwind_tables)
if (flag_unit_at_a_time && ! lang_hooks.callgraph.expand_function)
flag_unit_at_a_time = 0;
+ if (!flag_unit_at_a_time)
+ flag_section_anchors = 0;
+
if (flag_value_profile_transformations)
flag_profile_values = 1;
{
print_version (stderr, "");
if (! quiet_flag)
- print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
+ print_switch_values (print_to_stderr);
}
if (flag_syntax_only)
default_debug_hooks = &vmsdbg_debug_hooks;
#endif
- debug_hooks = &do_nothing_debug_hooks;
if (write_symbols == NO_DEBUG)
;
#if defined(DBX_DEBUGGING_INFO)
}
#ifndef OBJECT_FORMAT_ELF
+#ifndef OBJECT_FORMAT_MACHO
if (flag_function_sections && write_symbols != NO_DEBUG)
warning (0, "-ffunction-sections may affect debugging on some targets");
#endif
+#endif
/* The presence of IEEE signaling NaNs, implies all math can trap. */
if (flag_signaling_nans)
init_regs ();
init_fake_stack_mems ();
init_alias_once ();
- init_loop ();
+ init_inline_once ();
init_reload ();
init_varasm_once ();
provide a dummy function context for them. */
init_dummy_function_start ();
init_expr_once ();
+
+ /* Although the actions of init_set_costs are language-independent,
+ it uses optabs, so we cannot call it from backend_init. */
+ init_set_costs ();
+
expand_dummy_function_end ();
/* If dbx symbol table desired, initialize writing it and output the
predefined types. */
timevar_push (TV_SYMOUT);
-#ifdef DWARF2_UNWIND_INFO
+#if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO
if (dwarf2out_do_frame ())
dwarf2out_frame_init ();
#endif
return 1;
}
+void
+dump_memory_report (bool final)
+{
+ ggc_print_statistics ();
+ stringpool_statistics ();
+ dump_tree_statistics ();
+ dump_rtx_statistics ();
+ dump_varray_statistics ();
+ dump_alloc_pool_statistics ();
+ dump_bitmap_statistics ();
+ dump_ggc_loc_statistics (final);
+}
+
/* Clean up: close opened files, etc. */
static void
finish_optimization_passes ();
if (mem_report)
- {
- ggc_print_statistics ();
- stringpool_statistics ();
- dump_tree_statistics ();
- dump_rtx_statistics ();
- dump_varray_statistics ();
- dump_alloc_pool_statistics ();
- dump_ggc_loc_statistics ();
- }
+ dump_memory_report (true);
/* Free up memory for the benefit of leak detectors. */
free_reg_info ();
enough to default flags appropriately. */
decode_options (argc, argv);
- randomize ();
+ init_local_tick ();
/* Exit early if we can (e.g. -help). */
if (!exit_after_options)