X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Fopts.c;h=1170967b949b9760083525381f29b595f112835d;hp=9bae6ea834904b9bbf6fcf8407f8d91994edbaf1;hb=a0ded67b3e35726ed986085c74843913a3034cdf;hpb=cd8171dd88ae95d9e06c4e9a22bf445ba14babd6 diff --git a/gcc/opts.c b/gcc/opts.c index 9bae6ea8349..1170967b949 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1,5 +1,5 @@ /* Command line option handling. - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Contributed by Neil Booth. @@ -42,6 +42,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-pass.h" #include "dbgcnt.h" #include "debug.h" +#include "plugin.h" /* Value of the -G xx switch, and whether it was passed or not. */ unsigned HOST_WIDE_INT g_switch_value; @@ -53,9 +54,6 @@ bool sel_sched_switch_set; /* True if we should exit after parsing options. */ bool exit_after_options; -/* Print various extra warnings. -W/-Wextra. */ -bool extra_warnings; - /* True to warn about any objects definitions whose size is larger than N bytes. Also want about function definitions whose returned values are larger than N bytes, where N is `larger_than_size'. */ @@ -338,11 +336,7 @@ enum symbol_visibility default_visibility = VISIBILITY_DEFAULT; struct visibility_flags visibility_options; /* What to print when a switch has no documentation. */ -#ifdef ENABLE_CHECKING static const char undocumented_msg[] = N_("This switch lacks documentation"); -#else -static const char undocumented_msg[] = ""; -#endif /* Used for bookkeeping on whether user set these flags so -fprofile-use/-fprofile-generate does not use them. */ @@ -368,12 +362,6 @@ DEF_VEC_ALLOC_P(const_char_p,heap); static VEC(const_char_p,heap) *ignored_options; -/* Function calls disallowed under -Wdisallowed-function-list=... */ -static VEC(char_p,heap) *warning_disallowed_functions; - -/* If -Wdisallowed-function-list=... */ -bool warn_disallowed_functions = false; - /* Input file names. */ const char **in_fnames; unsigned num_in_fnames; @@ -381,7 +369,6 @@ unsigned num_in_fnames; static int common_handle_option (size_t scode, const char *arg, int value, unsigned int lang_mask); static void handle_param (const char *); -static void set_Wextra (int); static unsigned int handle_option (const char **argv, unsigned int lang_mask); static char *write_langs (unsigned int lang_mask); static void complain_wrong_lang (const char *, const struct cl_option *, @@ -741,30 +728,6 @@ flag_instrument_functions_exclude_p (tree fndecl) } -/* Return whether this function call is disallowed. */ -void -warn_if_disallowed_function_p (const_tree exp) -{ - if (TREE_CODE(exp) == CALL_EXPR - && VEC_length (char_p, warning_disallowed_functions) > 0) - { - int i; - char *s; - const char *fnname = - IDENTIFIER_POINTER (DECL_NAME (get_callee_fndecl (exp))); - for (i = 0; VEC_iterate (char_p, warning_disallowed_functions, i, s); - ++i) - { - if (strcmp (fnname, s) == 0) - { - warning (OPT_Wdisallowed_function_list_, - "disallowed call to %qs", fnname); - break; - } - } - } -} - /* Decode and handle the vector of command line options. LANG_MASK contains has a single bit set representing the current language. */ @@ -807,10 +770,9 @@ void decode_options (unsigned int argc, const char **argv) { static bool first_time_p = true; - static int initial_max_aliased_vops; - static int initial_avg_aliased_vops; static int initial_min_crossjump_insns; static int initial_max_fields_for_field_sensitive; + static int initial_loop_invariant_max_bbs_in_loop; static unsigned int initial_lang_mask; unsigned int i, lang_mask; @@ -827,12 +789,12 @@ decode_options (unsigned int argc, const char **argv) lang_hooks.initialize_diagnostics (global_dc); /* Save initial values of parameters we reset. */ - initial_max_aliased_vops = MAX_ALIASED_VOPS; - initial_avg_aliased_vops = AVG_ALIASED_VOPS; initial_min_crossjump_insns = compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value; initial_max_fields_for_field_sensitive = compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value; + initial_loop_invariant_max_bbs_in_loop + = compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value; } else lang_mask = initial_lang_mask; @@ -870,10 +832,10 @@ decode_options (unsigned int argc, const char **argv) } } -#ifdef IRA_COVER_CLASSES - /* Use IRA if it is implemented for the target. */ - flag_ira = 1; -#endif + /* Use priority coloring if cover classes is not defined for the + target. */ + if (targetm.ira_cover_classes == NULL) + flag_ira_algorithm = IRA_ALGORITHM_PRIORITY; /* -O1 optimizations. */ opt1 = (optimize >= 1); @@ -925,7 +887,6 @@ decode_options (unsigned int argc, const char **argv) flag_regmove = opt2; flag_strict_aliasing = opt2; flag_strict_overflow = opt2; - flag_delete_null_pointer_checks = opt2; flag_reorder_blocks = opt2; flag_reorder_functions = opt2; flag_tree_vrp = opt2; @@ -934,15 +895,14 @@ decode_options (unsigned int argc, const char **argv) flag_tree_switch_conversion = 1; flag_ipa_cp = opt2; - /* Allow more virtual operators to increase alias precision. */ - - set_param_value ("max-aliased-vops", - (opt2) ? 500 : initial_max_aliased_vops); - /* Track fields in field-sensitive alias analysis. */ set_param_value ("max-fields-for-field-sensitive", (opt2) ? 100 : initial_max_fields_for_field_sensitive); + /* For -O1 only do loop invariant motion for very small loops. */ + set_param_value ("loop-invariant-max-bbs-in-loop", + (opt2) ? initial_loop_invariant_max_bbs_in_loop : 1000); + /* -O3 optimizations. */ opt3 = (optimize >= 3); flag_predictive_commoning = opt3; @@ -954,13 +914,6 @@ decode_options (unsigned int argc, const char **argv) if (flag_ipa_cp_clone) flag_ipa_cp = 1; - /* Allow even more virtual operators. Max-aliased-vops was set above for - -O2, so don't reset it unless we are at -O3. */ - if (opt3) - set_param_value ("max-aliased-vops", 1000); - - set_param_value ("avg-aliased-vops", (opt3) ? 3 : initial_avg_aliased_vops); - /* Just -O1/-O0 optimizations. */ opt1_max = (optimize <= 1); align_loops = opt1_max; @@ -1008,21 +961,32 @@ decode_options (unsigned int argc, const char **argv) handle_options (argc, argv, lang_mask); - /* -fno-unit-at-a-time and -fno-toplevel-reorder handling. */ + /* Handle related options for unit-at-a-time, toplevel-reorder, and + section-anchors. */ if (!flag_unit_at_a_time) { + if (flag_section_anchors == 1) + error ("Section anchors must be disabled when unit-at-a-time " + "is disabled."); flag_section_anchors = 0; + if (flag_toplevel_reorder == 1) + error ("Toplevel reorder must be disabled when unit-at-a-time " + "is disabled."); + flag_toplevel_reorder = 0; + } + /* Unless the user has asked for section anchors, we disable toplevel + reordering at -O0 to disable transformations that might be surprising + to end users and to get -fno-toplevel-reorder tested. */ + if (!optimize && flag_toplevel_reorder == 2 && flag_section_anchors != 1) + { flag_toplevel_reorder = 0; + flag_section_anchors = 0; } - else if (!optimize && flag_toplevel_reorder == 2) - /* We disable toplevel reordering at -O0 to disable transformations that - might be surprising to end users and to get -fno-toplevel-reorder - tested, but we keep section anchors. */ - flag_toplevel_reorder = 0; - else if (!flag_toplevel_reorder) + if (!flag_toplevel_reorder) { if (flag_section_anchors == 1) - error ("section anchors must be disabled when toplevel reorder is disabled"); + error ("section anchors must be disabled when toplevel reorder" + " is disabled"); flag_section_anchors = 0; } @@ -1086,13 +1050,13 @@ decode_options (unsigned int argc, const char **argv) if (!flag_sel_sched_pipelining) flag_sel_sched_pipelining_outer_loops = 0; -#ifndef IRA_COVER_CLASSES - if (flag_ira) + if (!targetm.ira_cover_classes + && flag_ira_algorithm == IRA_ALGORITHM_CB) { - inform (input_location, "-fira does not work on this architecture"); - flag_ira = 0; + inform (input_location, + "-fira-algorithm=CB does not work on this architecture"); + flag_ira_algorithm = IRA_ALGORITHM_PRIORITY; } -#endif /* Save the current optimization options if this is the first call. */ if (first_time_p) @@ -1101,6 +1065,14 @@ decode_options (unsigned int argc, const char **argv) optimization_current_node = optimization_default_node; first_time_p = false; } + if (flag_conserve_stack) + { + if (!PARAM_SET_P (PARAM_LARGE_STACK_FRAME)) + PARAM_VALUE (PARAM_LARGE_STACK_FRAME) = 100; + if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH)) + PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40; + } + } #define LEFT_COLUMN 27 @@ -1370,7 +1342,7 @@ print_specific_help (unsigned int include_flags, default: if (i >= cl_lang_count) break; - if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0) + if (exclude_flags & all_langs_mask) description = _("The following options are specific to just the language "); else description = _("The following options are supported by the language "); @@ -1383,8 +1355,12 @@ print_specific_help (unsigned int include_flags, { if (any_flags == 0) { - if (include_flags == CL_UNDOCUMENTED) + if (include_flags & CL_UNDOCUMENTED) description = _("The following options are not documented"); + else if (include_flags & CL_SEPARATE) + description = _("The following options take separate arguments"); + else if (include_flags & CL_JOINED) + description = _("The following options take joined arguments"); else { internal_error ("unrecognized include_flags 0x%x passed to print_specific_help", @@ -1513,6 +1489,11 @@ common_handle_option (size_t scode, const char *arg, int value, len = strlen (a); else len = comma - a; + if (len == 0) + { + a = comma + 1; + continue; + } /* Check to see if the string matches an option class name. */ for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++) @@ -1521,7 +1502,7 @@ common_handle_option (size_t scode, const char *arg, int value, specific_flag = specifics[i].flag; break; } - + /* Check to see if the string matches a language name. Note - we rely upon the alpha-sorted nature of the entries in the lang_names array, specifically that shorter names appear @@ -1572,8 +1553,8 @@ common_handle_option (size_t scode, const char *arg, int value, break; } + case OPT_fversion: case OPT__version: - print_version (stderr, ""); exit_after_options = true; break; @@ -1587,25 +1568,10 @@ common_handle_option (size_t scode, const char *arg, int value, /* Currently handled in a prescan. */ break; - case OPT_W: - /* For backward compatibility, -W is the same as -Wextra. */ - set_Wextra (value); - break; - - case OPT_Wdisallowed_function_list_: - warn_disallowed_functions = true; - add_comma_separated_to_vector - (&warning_disallowed_functions, arg); - break; - case OPT_Werror_: enable_warning_as_error (arg, value, lang_mask); break; - case OPT_Wextra: - set_Wextra (value); - break; - case OPT_Wlarger_than_: /* This form corresponds to -Wlarger-than-. Kept for backward compatibility. @@ -1729,6 +1695,15 @@ common_handle_option (size_t scode, const char *arg, int value, return 0; break; + case OPT_fexcess_precision_: + if (!strcmp (arg, "fast")) + flag_excess_precision_cmdline = EXCESS_PRECISION_FAST; + else if (!strcmp (arg, "standard")) + flag_excess_precision_cmdline = EXCESS_PRECISION_STANDARD; + else + error ("unknown excess precision style \"%s\"", arg); + break; + case OPT_ffast_math: set_fast_math_flags (value); break; @@ -1775,6 +1750,22 @@ common_handle_option (size_t scode, const char *arg, int value, flag_peel_loops_set = true; break; + case OPT_fplugin_: +#ifdef ENABLE_PLUGIN + add_new_plugin (arg); +#else + error ("Plugin support is disabled. Configure with --enable-plugin."); +#endif + break; + + case OPT_fplugin_arg_: +#ifdef ENABLE_PLUGIN + parse_plugin_arg_opt (arg); +#else + error ("Plugin support is disabled. Configure with --enable-plugin."); +#endif + break; + case OPT_fprofile_arcs: profile_arc_flag_set = true; break; @@ -1962,16 +1953,25 @@ common_handle_option (size_t scode, const char *arg, int value, break; case OPT_fira_algorithm_: - if (!strcmp (arg, "regional")) - flag_ira_algorithm = IRA_ALGORITHM_REGIONAL; - else if (!strcmp (arg, "CB")) + if (!strcmp (arg, "CB")) flag_ira_algorithm = IRA_ALGORITHM_CB; - else if (!strcmp (arg, "mixed")) - flag_ira_algorithm = IRA_ALGORITHM_MIXED; + else if (!strcmp (arg, "priority")) + flag_ira_algorithm = IRA_ALGORITHM_PRIORITY; else warning (0, "unknown ira algorithm \"%s\"", arg); break; + case OPT_fira_region_: + if (!strcmp (arg, "one")) + flag_ira_region = IRA_REGION_ONE; + else if (!strcmp (arg, "all")) + flag_ira_region = IRA_REGION_ALL; + else if (!strcmp (arg, "mixed")) + flag_ira_region = IRA_REGION_MIXED; + else + warning (0, "unknown ira region \"%s\"", arg); + break; + case OPT_fira_verbose_: flag_ira_verbose = value; break; @@ -2048,6 +2048,7 @@ common_handle_option (size_t scode, const char *arg, int value, case OPT_ftree_store_copy_prop: case OPT_fforce_addr: case OPT_ftree_salias: + case OPT_ftree_store_ccp: /* These are no-ops, preserved for backward compatibility. */ break; @@ -2087,21 +2088,6 @@ handle_param (const char *carg) free (arg); } -/* Handle -W and -Wextra. */ -static void -set_Wextra (int setting) -{ - extra_warnings = setting; - - /* We save the value of warn_uninitialized, since if they put - -Wuninitialized on the command line, we need to generate a - warning about not using it without also specifying -O. */ - if (setting == 0) - warn_uninitialized = 0; - else if (warn_uninitialized != 1) - warn_uninitialized = 2; -} - /* Used to set the level of strict aliasing warnings, when no level is specified (i.e., when -Wstrict-aliasing, and not -Wstrict-aliasing=level was given). @@ -2211,15 +2197,17 @@ set_debug_level (enum debug_info_type type, int extended, const char *arg) if (*arg == '\0') { if (!debug_info_level) - debug_info_level = 2; + debug_info_level = DINFO_LEVEL_NORMAL; } else { - debug_info_level = integral_argument (arg); - if (debug_info_level == (unsigned int) -1) + int argval = integral_argument (arg); + if (argval == -1) error ("unrecognised debug output level \"%s\"", arg); - else if (debug_info_level > 3) + else if (argval > 3) error ("debug output level %s is too high", arg); + else + debug_info_level = (enum debug_info_level) argval; } } @@ -2305,7 +2293,7 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask) } else { - int kind = value ? DK_ERROR : DK_WARNING; + diagnostic_t kind = value ? DK_ERROR : DK_WARNING; diagnostic_classify_diagnostic (global_dc, option_index, kind); /* -Werror=foo implies -Wfoo. */