| Index: gcc/gcc/toplev.c
|
| diff --git a/gcc/gcc/toplev.c b/gcc/gcc/toplev.c
|
| index 5089965208f89f390b7cc8fbb66d7d2e7b1dcdab..68a1b8c15ed1811407d7707f8f2b493654ad160e 100644
|
| --- a/gcc/gcc/toplev.c
|
| +++ b/gcc/gcc/toplev.c
|
| @@ -1,6 +1,6 @@
|
| /* 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, 2006, 2007, 2008
|
| + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
| Free Software Foundation, Inc.
|
|
|
| This file is part of GCC.
|
| @@ -84,6 +84,8 @@ along with GCC; see the file COPYING3. If not see
|
| #include "tree-mudflap.h"
|
| #include "tree-pass.h"
|
| #include "gimple.h"
|
| +#include "tree-ssa-alias.h"
|
| +#include "plugin.h"
|
|
|
| #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
|
| #include "dwarf2out.h"
|
| @@ -150,6 +152,10 @@ struct line_maps *line_table;
|
|
|
| const char *dump_base_name;
|
|
|
| +/* Directory used for dump output files. */
|
| +
|
| +const char *dump_dir_name;
|
| +
|
| /* Name to use as a base for auxiliary output files. */
|
|
|
| const char *aux_base_name;
|
| @@ -196,6 +202,17 @@ int optimize = 0;
|
|
|
| int optimize_size = 0;
|
|
|
| +/* True if this is the lto front end. This is used to disable
|
| + gimple generation and lowering passes that are normally run on the
|
| + output of a front end. These passes must be bypassed for lto since
|
| + they have already been done before the gimple was written. */
|
| +
|
| +bool in_lto_p = false;
|
| +
|
| +/* Nonzero if we should write GIMPLE bytecode for link-time optimization. */
|
| +
|
| +int flag_generate_lto;
|
| +
|
| /* The FUNCTION_DECL for the function currently being compiled,
|
| or 0 if between functions. */
|
| tree current_function_decl;
|
| @@ -281,6 +298,11 @@ enum ira_region flag_ira_region = IRA_REGION_MIXED;
|
|
|
| unsigned int flag_ira_verbose = 5;
|
|
|
| +/* Set the default for excess precision. */
|
| +
|
| +enum excess_precision flag_excess_precision_cmdline = EXCESS_PRECISION_DEFAULT;
|
| +enum excess_precision flag_excess_precision = EXCESS_PRECISION_DEFAULT;
|
| +
|
| /* Nonzero means change certain warnings into errors.
|
| Usually these are warnings about failure to conform to some standard. */
|
|
|
| @@ -312,11 +334,23 @@ int flag_dump_rtl_in_asm = 0;
|
| the support provided depends on the backend. */
|
| rtx stack_limit_rtx;
|
|
|
| -/* 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 (). */
|
| +/* Positive if we should track variables, negative if we should run
|
| + the var-tracking pass only to discard debug annotations, zero if
|
| + we're not to run it. When flag_var_tracking == AUTODETECT_VALUE it
|
| + will be set according to optimize, debug_info_level and debug_hooks
|
| + in process_options (). */
|
| int flag_var_tracking = AUTODETECT_VALUE;
|
|
|
| +/* Positive if we should track variables at assignments, negative if
|
| + we should run the var-tracking pass only to discard debug
|
| + annotations. When flag_var_tracking_assignments ==
|
| + AUTODETECT_VALUE it will be set according to flag_var_tracking. */
|
| +int flag_var_tracking_assignments = AUTODETECT_VALUE;
|
| +
|
| +/* Nonzero if we should toggle flag_var_tracking_assignments after
|
| + processing options and computing its default. */
|
| +int flag_var_tracking_assignments_toggle = 0;
|
| +
|
| /* Type of stack check. */
|
| enum stack_check_type flag_stack_check = NO_STACK_CHECK;
|
|
|
| @@ -420,9 +454,11 @@ announce_function (tree decl)
|
| if (!quiet_flag)
|
| {
|
| if (rtl_dump_and_exit)
|
| - fprintf (stderr, "%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
|
| + fprintf (stderr, "%s ",
|
| + identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl))));
|
| else
|
| - fprintf (stderr, " %s", lang_hooks.decl_printable_name (decl, 2));
|
| + fprintf (stderr, " %s",
|
| + identifier_to_locale (lang_hooks.decl_printable_name (decl, 2)));
|
| fflush (stderr);
|
| pp_needs_newline (global_dc->printer) = true;
|
| diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL);
|
| @@ -523,11 +559,11 @@ read_integral_parameter (const char *p, const char *pname, const int defval)
|
| 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
|
|
|
| -#if GCC_VERSION < 3004 || !defined (__cplusplus)
|
| +/* The functions floor_log2 and exact_log2 are defined as inline
|
| + functions in toplev.h if GCC_VERSION >= 3004. The definitions here
|
| + are used for older versions of gcc. */
|
|
|
| /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
|
| If X is 0, return -1. */
|
| @@ -540,9 +576,6 @@ floor_log2 (unsigned HOST_WIDE_INT x)
|
| if (x == 0)
|
| return -1;
|
|
|
| -#ifdef CLZ_HWI
|
| - t = HOST_BITS_PER_WIDE_INT - 1 - (int) CLZ_HWI (x);
|
| -#else
|
| if (HOST_BITS_PER_WIDE_INT > 64)
|
| if (x >= (unsigned HOST_WIDE_INT) 1 << (t + 64))
|
| t += 64;
|
| @@ -559,7 +592,6 @@ floor_log2 (unsigned HOST_WIDE_INT x)
|
| t += 2;
|
| if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 1))
|
| t += 1;
|
| -#endif
|
|
|
| return t;
|
| }
|
| @@ -572,14 +604,10 @@ exact_log2 (unsigned HOST_WIDE_INT x)
|
| {
|
| if (x != (x & -x))
|
| return -1;
|
| -#ifdef CTZ_HWI
|
| - return x ? CTZ_HWI (x) : -1;
|
| -#else
|
| return floor_log2 (x);
|
| -#endif
|
| }
|
|
|
| -#endif /* GCC_VERSION < 3004 || !defined (__cplusplus) */
|
| +#endif /* GCC_VERSION < 3004 */
|
|
|
| /* Handler for fatal signals, such as SIGSEGV. These are transformed
|
| into ICE messages, which is much more user friendly. In case the
|
| @@ -698,7 +726,7 @@ output_file_directive (FILE *asm_file, const char *input_name)
|
| #else
|
| fprintf (asm_file, "\t.file\t");
|
| output_quoted_string (asm_file, na);
|
| - fputc ('\n', asm_file);
|
| + putc ('\n', asm_file);
|
| #endif
|
| }
|
|
|
| @@ -862,9 +890,9 @@ check_global_declaration_1 (tree decl)
|
| && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
|
| /* Otherwise, ask the language. */
|
| && lang_hooks.decls.warn_unused_global (decl))
|
| - warning ((TREE_CODE (decl) == FUNCTION_DECL)
|
| - ? OPT_Wunused_function
|
| - : OPT_Wunused_variable,
|
| + warning ((TREE_CODE (decl) == FUNCTION_DECL)
|
| + ? OPT_Wunused_function
|
| + : OPT_Wunused_variable,
|
| "%q+D defined but not used", decl);
|
| }
|
|
|
| @@ -899,30 +927,58 @@ emit_debug_global_declarations (tree *vec, int len)
|
|
|
| /* Warn about a use of an identifier which was marked deprecated. */
|
| void
|
| -warn_deprecated_use (tree node)
|
| +warn_deprecated_use (tree node, tree attr)
|
| {
|
| + const char *msg;
|
| +
|
| if (node == 0 || !warn_deprecated_decl)
|
| return;
|
|
|
| + if (!attr)
|
| + {
|
| + if (DECL_P (node))
|
| + attr = DECL_ATTRIBUTES (node);
|
| + else if (TYPE_P (node))
|
| + {
|
| + tree decl = TYPE_STUB_DECL (node);
|
| + if (decl)
|
| + attr = lookup_attribute ("deprecated",
|
| + TYPE_ATTRIBUTES (TREE_TYPE (decl)));
|
| + }
|
| + }
|
| +
|
| + if (attr)
|
| + attr = lookup_attribute ("deprecated", attr);
|
| +
|
| + if (attr)
|
| + msg = TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)));
|
| + else
|
| + msg = NULL;
|
| +
|
| if (DECL_P (node))
|
| {
|
| expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (node));
|
| - warning (OPT_Wdeprecated_declarations,
|
| - "%qD is deprecated (declared at %s:%d)",
|
| - node, xloc.file, xloc.line);
|
| + if (msg)
|
| + warning (OPT_Wdeprecated_declarations,
|
| + "%qD is deprecated (declared at %s:%d): %s",
|
| + node, xloc.file, xloc.line, msg);
|
| + else
|
| + warning (OPT_Wdeprecated_declarations,
|
| + "%qD is deprecated (declared at %s:%d)",
|
| + node, xloc.file, xloc.line);
|
| }
|
| else if (TYPE_P (node))
|
| {
|
| - const char *what = NULL;
|
| + tree what = NULL_TREE;
|
| tree decl = TYPE_STUB_DECL (node);
|
|
|
| if (TYPE_NAME (node))
|
| {
|
| if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
|
| - what = IDENTIFIER_POINTER (TYPE_NAME (node));
|
| + what = TYPE_NAME (node);
|
| else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
|
| && DECL_NAME (TYPE_NAME (node)))
|
| - what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)));
|
| + what = DECL_NAME (TYPE_NAME (node));
|
| }
|
|
|
| if (decl)
|
| @@ -930,20 +986,46 @@ warn_deprecated_use (tree node)
|
| expanded_location xloc
|
| = expand_location (DECL_SOURCE_LOCATION (decl));
|
| if (what)
|
| - warning (OPT_Wdeprecated_declarations,
|
| - "%qs is deprecated (declared at %s:%d)", what,
|
| - xloc.file, xloc.line);
|
| + {
|
| + if (msg)
|
| + warning (OPT_Wdeprecated_declarations,
|
| + "%qE is deprecated (declared at %s:%d): %s",
|
| + what, xloc.file, xloc.line, msg);
|
| + else
|
| + warning (OPT_Wdeprecated_declarations,
|
| + "%qE is deprecated (declared at %s:%d)", what,
|
| + xloc.file, xloc.line);
|
| + }
|
| else
|
| - warning (OPT_Wdeprecated_declarations,
|
| - "type is deprecated (declared at %s:%d)",
|
| - xloc.file, xloc.line);
|
| + {
|
| + if (msg)
|
| + warning (OPT_Wdeprecated_declarations,
|
| + "type is deprecated (declared at %s:%d): %s",
|
| + xloc.file, xloc.line, msg);
|
| + else
|
| + warning (OPT_Wdeprecated_declarations,
|
| + "type is deprecated (declared at %s:%d)",
|
| + xloc.file, xloc.line);
|
| + }
|
| }
|
| else
|
| {
|
| if (what)
|
| - warning (OPT_Wdeprecated_declarations, "%qs is deprecated", what);
|
| + {
|
| + if (msg)
|
| + warning (OPT_Wdeprecated_declarations, "%qE is deprecated: %s",
|
| + what, msg);
|
| + else
|
| + warning (OPT_Wdeprecated_declarations, "%qE is deprecated", what);
|
| + }
|
| else
|
| - warning (OPT_Wdeprecated_declarations, "type is deprecated");
|
| + {
|
| + if (msg)
|
| + warning (OPT_Wdeprecated_declarations, "type is deprecated: %s",
|
| + msg);
|
| + else
|
| + warning (OPT_Wdeprecated_declarations, "type is deprecated");
|
| + }
|
| }
|
| }
|
| }
|
| @@ -962,6 +1044,7 @@ compile_file (void)
|
| init_final (main_input_filename);
|
| coverage_init (aux_base_name);
|
| statistics_init ();
|
| + invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL);
|
|
|
| timevar_push (TV_PARSE);
|
|
|
| @@ -978,6 +1061,7 @@ compile_file (void)
|
|
|
| ggc_protect_identifiers = false;
|
|
|
| + /* This must also call cgraph_finalize_compilation_unit. */
|
| lang_hooks.decls.final_write_globals ();
|
|
|
| if (errorcount || sorrycount)
|
| @@ -986,11 +1070,6 @@ compile_file (void)
|
| varpool_assemble_pending_decls ();
|
| finish_aliases_2 ();
|
|
|
| - /* This must occur after the loop to output deferred functions.
|
| - Else the coverage initializer would not be emitted if all the
|
| - functions in this compilation unit were deferred. */
|
| - coverage_finish ();
|
| -
|
| /* Likewise for mudflap static object registrations. */
|
| if (flag_mudflap)
|
| mudflap_finish_file ();
|
| @@ -1005,6 +1084,10 @@ compile_file (void)
|
| /* Write out any pending weak symbol declarations. */
|
| weak_finish ();
|
|
|
| + /* This must be at the end before unwind and debug info.
|
| + Some target ports emit PIC setup thunks here. */
|
| + targetm.asm_out.code_end ();
|
| +
|
| /* Do dbx symbols. */
|
| timevar_push (TV_SYMOUT);
|
|
|
| @@ -1023,6 +1106,27 @@ compile_file (void)
|
| /* Flush any pending external directives. */
|
| process_pending_assemble_externals ();
|
|
|
| + /* 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)
|
| + {
|
| +#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
|
| + }
|
| +
|
| /* 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. */
|
| @@ -1038,6 +1142,9 @@ compile_file (void)
|
| }
|
| #endif
|
|
|
| + /* Invoke registered plugin callbacks. */
|
| + invoke_plugin_callbacks (PLUGIN_FINISH_UNIT, NULL);
|
| +
|
| /* 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. */
|
| @@ -1113,7 +1220,7 @@ print_version (FILE *file, const char *indent)
|
| #endif
|
| ;
|
| static const char fmt2[] =
|
| - N_("GMP version %s, MPFR version %s.\n");
|
| + N_("GMP version %s, MPFR version %s, MPC version %s\n");
|
| static const char fmt3[] =
|
| N_("%s%swarning: %s header version %s differs from library version %s.\n");
|
| static const char fmt4[] =
|
| @@ -1145,7 +1252,7 @@ print_version (FILE *file, const char *indent)
|
| #endif
|
| fprintf (file,
|
| file == stderr ? _(fmt2) : fmt2,
|
| - GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING);
|
| + GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING);
|
| if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
|
| fprintf (file,
|
| file == stderr ? _(fmt3) : fmt3,
|
| @@ -1156,10 +1263,17 @@ print_version (FILE *file, const char *indent)
|
| file == stderr ? _(fmt3) : fmt3,
|
| indent, *indent != 0 ? " " : "",
|
| "MPFR", MPFR_VERSION_STRING, mpfr_get_version ());
|
| + if (strcmp (MPC_VERSION_STRING, mpc_get_version ()))
|
| + fprintf (file,
|
| + file == stderr ? _(fmt3) : fmt3,
|
| + indent, *indent != 0 ? " " : "",
|
| + "MPC", MPC_VERSION_STRING, mpc_get_version ());
|
| fprintf (file,
|
| file == stderr ? _(fmt4) : fmt4,
|
| indent, *indent != 0 ? " " : "",
|
| PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
|
| +
|
| + print_plugins_versions (file, indent);
|
| }
|
|
|
| #ifdef ASM_COMMENT_START
|
| @@ -1186,7 +1300,7 @@ print_to_asm_out_file (print_switch_type type, const char * text)
|
| case SWITCH_TYPE_ENABLED:
|
| if (prepend_sep)
|
| fputc (' ', asm_out_file);
|
| - fprintf (asm_out_file, text);
|
| + fputs (text, asm_out_file);
|
| /* No need to return the length here as
|
| print_single_switch has already done it. */
|
| return 0;
|
| @@ -1208,14 +1322,14 @@ print_to_stderr (print_switch_type type, const char * text)
|
|
|
| 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);
|
| + fputs (text, stderr);
|
| /* No need to return the length here as
|
| print_single_switch has already done it. */
|
| return 0;
|
| @@ -1282,6 +1396,7 @@ print_switch_values (print_switch_fn_type print_fn)
|
| /* Ignore these. */
|
| if (strcmp (*p, "-o") == 0
|
| || strcmp (*p, "-dumpbase") == 0
|
| + || strcmp (*p, "-dumpdir") == 0
|
| || strcmp (*p, "-auxbase") == 0)
|
| {
|
| if (p[1] != NULL)
|
| @@ -1375,7 +1490,7 @@ init_asm_output (const char *name)
|
| into the assembler file as comments. */
|
| print_version (asm_out_file, ASM_COMMENT_START);
|
| print_switch_values (print_to_asm_out_file);
|
| - fprintf (asm_out_file, "\n");
|
| + putc ('\n', asm_out_file);
|
| }
|
| #endif
|
| }
|
| @@ -1401,20 +1516,20 @@ option_affects_pch_p (int option, struct cl_option_state *state)
|
| most targets, but completely right for very few. */
|
|
|
| void *
|
| -default_get_pch_validity (size_t *len)
|
| +default_get_pch_validity (size_t *sz)
|
| {
|
| struct cl_option_state state;
|
| size_t i;
|
| char *result, *r;
|
|
|
| - *len = 2;
|
| + *sz = 2;
|
| if (targetm.check_pch_target_flags)
|
| - *len += sizeof (target_flags);
|
| + *sz += sizeof (target_flags);
|
| for (i = 0; i < cl_options_count; i++)
|
| if (option_affects_pch_p (i, &state))
|
| - *len += state.size;
|
| + *sz += state.size;
|
|
|
| - result = r = XNEWVEC (char, *len);
|
| + result = r = XNEWVEC (char, *sz);
|
| r[0] = flag_pic;
|
| r[1] = flag_pie;
|
| r += 2;
|
| @@ -1491,8 +1606,8 @@ default_pch_valid_p (const void *data_p, size_t len)
|
| }
|
|
|
| /* Default tree printer. Handles declarations only. */
|
| -static bool
|
| -default_tree_printer (pretty_printer * pp, text_info *text, const char *spec,
|
| +bool
|
| +default_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
|
| int precision, bool wide, bool set_locus, bool hash)
|
| {
|
| tree t;
|
| @@ -1503,6 +1618,15 @@ default_tree_printer (pretty_printer * pp, text_info *text, const char *spec,
|
|
|
| switch (*spec)
|
| {
|
| + case 'E':
|
| + t = va_arg (*text->args_ptr, tree);
|
| + if (TREE_CODE (t) == IDENTIFIER_NODE)
|
| + {
|
| + pp_identifier (pp, IDENTIFIER_POINTER (t));
|
| + return true;
|
| + }
|
| + break;
|
| +
|
| case 'D':
|
| t = va_arg (*text->args_ptr, tree);
|
| if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
|
| @@ -1524,8 +1648,8 @@ default_tree_printer (pretty_printer * pp, text_info *text, const char *spec,
|
| if (DECL_P (t))
|
| {
|
| const char *n = DECL_NAME (t)
|
| - ? lang_hooks.decl_printable_name (t, 2)
|
| - : "<anonymous>";
|
| + ? identifier_to_locale (lang_hooks.decl_printable_name (t, 2))
|
| + : _("<anonymous>");
|
| pp_string (pp, n);
|
| }
|
| else
|
| @@ -1675,6 +1799,10 @@ process_options (void)
|
| if (warn_unused_value == -1)
|
| warn_unused_value = warn_unused;
|
|
|
| + /* This replaces set_Wextra. */
|
| + if (warn_uninitialized == -1)
|
| + warn_uninitialized = extra_warnings;
|
| +
|
| /* 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)
|
| @@ -1686,6 +1814,10 @@ process_options (void)
|
| OVERRIDE_OPTIONS;
|
| #endif
|
|
|
| + /* Avoid any informative notes in the second run of -fcompare-debug. */
|
| + if (flag_compare_debug)
|
| + diagnostic_inhibit_notes (global_dc);
|
| +
|
| if (flag_section_anchors && !target_supports_section_anchors_p ())
|
| {
|
| warning (OPT_fsection_anchors,
|
| @@ -1714,7 +1846,8 @@ process_options (void)
|
| || flag_loop_block
|
| || flag_loop_interchange
|
| || flag_loop_strip_mine
|
| - || flag_graphite_identity)
|
| + || flag_graphite_identity
|
| + || flag_loop_parallelize_all)
|
| sorry ("Graphite loop optimizations cannot be used");
|
| #endif
|
|
|
| @@ -1725,11 +1858,12 @@ process_options (void)
|
|
|
| /* The loop unrolling code assumes that cse will be run after loop.
|
| web and rename-registers also help when run after loop unrolling. */
|
| -
|
| if (flag_rerun_cse_after_loop == AUTODETECT_VALUE)
|
| flag_rerun_cse_after_loop = flag_unroll_loops || flag_peel_loops;
|
| +
|
| if (flag_web == AUTODETECT_VALUE)
|
| flag_web = flag_unroll_loops || flag_peel_loops;
|
| +
|
| if (flag_rename_registers == AUTODETECT_VALUE)
|
| flag_rename_registers = flag_unroll_loops || flag_peel_loops;
|
|
|
| @@ -1781,6 +1915,41 @@ process_options (void)
|
| profile_flag = 0;
|
| }
|
|
|
| + if (flag_gtoggle)
|
| + {
|
| + if (debug_info_level == DINFO_LEVEL_NONE)
|
| + {
|
| + debug_info_level = DINFO_LEVEL_NORMAL;
|
| +
|
| + if (write_symbols == NO_DEBUG)
|
| + write_symbols = PREFERRED_DEBUGGING_TYPE;
|
| + }
|
| + else
|
| + debug_info_level = DINFO_LEVEL_NONE;
|
| + }
|
| +
|
| + if (flag_dump_final_insns && !flag_syntax_only && !no_backend)
|
| + {
|
| + FILE *final_output = fopen (flag_dump_final_insns, "w");
|
| + if (!final_output)
|
| + {
|
| + error ("could not open final insn dump file %qs: %s",
|
| + flag_dump_final_insns, strerror (errno));
|
| + flag_dump_final_insns = NULL;
|
| + }
|
| + else if (fclose (final_output))
|
| + {
|
| + error ("could not close zeroed insn dump file %qs: %s",
|
| + flag_dump_final_insns, strerror (errno));
|
| + flag_dump_final_insns = NULL;
|
| + }
|
| + }
|
| +
|
| + /* Unless over-ridden for the target, assume that all DWARF levels
|
| + may be emitted, if DWARF2_DEBUG is selected. */
|
| + if (dwarf_strict < 0)
|
| + dwarf_strict = 0;
|
| +
|
| /* A lot of code assumes write_symbols == NO_DEBUG if the debugging
|
| level is 0. */
|
| if (debug_info_level == DINFO_LEVEL_NONE)
|
| @@ -1838,9 +2007,8 @@ process_options (void)
|
| error ("target system does not support the \"%s\" debug format",
|
| debug_type_names[write_symbols]);
|
|
|
| - /* Now we know which debug output will be used so we can set
|
| - flag_var_tracking, flag_rename_registers if the user has
|
| - not specified them. */
|
| + /* 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. */
|
| if (debug_info_level < DINFO_LEVEL_NORMAL
|
| || debug_hooks->var_location == do_nothing_debug_hooks.var_location)
|
| {
|
| @@ -1858,13 +2026,29 @@ process_options (void)
|
| flag_var_tracking_uninit = 0;
|
| }
|
|
|
| - if (flag_rename_registers == AUTODETECT_VALUE)
|
| - flag_rename_registers = default_debug_hooks->var_location
|
| - != do_nothing_debug_hooks.var_location;
|
| + /* 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.) */
|
| + if (flag_var_tracking_uninit)
|
| + flag_var_tracking = 1;
|
|
|
| if (flag_var_tracking == AUTODETECT_VALUE)
|
| flag_var_tracking = optimize >= 1;
|
|
|
| + if (flag_var_tracking_assignments == AUTODETECT_VALUE)
|
| + flag_var_tracking_assignments = flag_var_tracking
|
| + && !(flag_selective_scheduling || flag_selective_scheduling2);
|
| +
|
| + 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;
|
| +
|
| + if (flag_var_tracking_assignments
|
| + && (flag_selective_scheduling || flag_selective_scheduling2))
|
| + warning (0, "var-tracking-assignments changes selective scheduling");
|
| +
|
| if (flag_tree_cselim == AUTODETECT_VALUE)
|
| #ifdef HAVE_conditional_move
|
| flag_tree_cselim = 1;
|
| @@ -1872,12 +2056,6 @@ process_options (void)
|
| flag_tree_cselim = 0;
|
| #endif
|
|
|
| - /* 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.) */
|
| - if (flag_var_tracking_uninit)
|
| - flag_var_tracking = 1;
|
| -
|
| /* 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. */
|
| @@ -1934,7 +2112,7 @@ process_options (void)
|
| if (flag_signaling_nans)
|
| flag_trapping_math = 1;
|
|
|
| - /* We cannot reassociate if we want traps or signed zeros. */
|
| + /* We cannot reassociate if we want traps or signed zeros. */
|
| if (flag_associative_math && (flag_trapping_math || flag_signed_zeros))
|
| {
|
| warning (0, "-fassociative-math disabled; other options take precedence");
|
| @@ -1970,6 +2148,10 @@ process_options (void)
|
| "for correctness");
|
| flag_omit_frame_pointer = 0;
|
| }
|
| +
|
| + /* Save the current optimization options. */
|
| + optimization_default_node = build_optimization_node ();
|
| + optimization_current_node = optimization_default_node;
|
| }
|
|
|
| /* This function can be called multiple times to reinitialize the compiler
|
| @@ -2009,8 +2191,8 @@ backend_init_target (void)
|
|
|
| /* We may need to recompute regno_save_code[] and regno_restore_code[]
|
| after a mode change as well. */
|
| - if (flag_caller_saves)
|
| - init_caller_save ();
|
| + caller_save_initialized_p = false;
|
| +
|
| expand_dummy_function_end ();
|
| }
|
|
|
| @@ -2019,13 +2201,7 @@ backend_init_target (void)
|
| static void
|
| backend_init (void)
|
| {
|
| - init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
|
| - || debug_info_level == DINFO_LEVEL_VERBOSE
|
| -#ifdef VMS_DEBUGGING_INFO
|
| - /* Enable line number info for traceback. */
|
| - || debug_info_level > DINFO_LEVEL_NONE
|
| -#endif
|
| - || flag_test_coverage);
|
| + init_emit_once ();
|
|
|
| init_rtlanal ();
|
| init_inline_once ();
|
| @@ -2037,11 +2213,51 @@ backend_init (void)
|
| backend_init_target ();
|
| }
|
|
|
| +/* 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 ();
|
| + }
|
| + }
|
| +}
|
| +
|
| /* 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)
|
| {
|
| + /* This determines excess precision settings. */
|
| + init_excess_precision ();
|
| +
|
| /* 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. */
|
| @@ -2129,6 +2345,8 @@ dump_memory_report (bool final)
|
| dump_bitmap_statistics ();
|
| dump_vec_loc_statistics ();
|
| dump_ggc_loc_statistics (final);
|
| + dump_alias_stats (stderr);
|
| + dump_pta_stats (stderr);
|
| }
|
|
|
| /* Clean up: close opened files, etc. */
|
| @@ -2154,6 +2372,8 @@ finalize (void)
|
| fatal_error ("error writing to %s: %m", asm_file_name);
|
| if (fclose (asm_out_file) != 0)
|
| fatal_error ("error closing %s: %m", asm_file_name);
|
| + if (flag_wpa)
|
| + unlink_if_ordinary (asm_file_name);
|
| }
|
|
|
| statistics_fini ();
|
| @@ -2211,26 +2431,40 @@ do_compile (void)
|
| It is not safe to call this function more than once. */
|
|
|
| int
|
| -toplev_main (unsigned int argc, const char **argv)
|
| +toplev_main (int argc, char **argv)
|
| {
|
| - save_argv = argv;
|
| + expandargv (&argc, &argv);
|
| +
|
| + save_argv = CONST_CAST2 (const char **, char **, argv);
|
|
|
| /* Initialization of GCC's environment, and diagnostics. */
|
| general_init (argv[0]);
|
|
|
| /* Parse the options and do minimal processing; basically just
|
| enough to default flags appropriately. */
|
| - decode_options (argc, argv);
|
| + decode_options (argc, CONST_CAST2 (const char **, char **, argv));
|
|
|
| init_local_tick ();
|
|
|
| + initialize_plugins ();
|
| +
|
| + if (version_flag)
|
| + print_version (stderr, "");
|
| +
|
| + if (help_flag)
|
| + print_plugins_help (stderr, "");
|
| +
|
| /* Exit early if we can (e.g. -help). */
|
| if (!exit_after_options)
|
| do_compile ();
|
|
|
| - if (warningcount || errorcount)
|
| + if (warningcount || errorcount)
|
| print_ignored_options ();
|
|
|
| + /* Invoke registered plugin callbacks if any. */
|
| + invoke_plugin_callbacks (PLUGIN_FINISH, NULL);
|
| +
|
| + finalize_plugins ();
|
| if (errorcount || sorrycount)
|
| return (FATAL_EXIT_CODE);
|
|
|
|
|