X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fopts.c;h=507b50227ee9b242b9d21e0bce4230809d0d448c;hb=2a7259ea89c2e8fc0cd15f87a22b0dd9458bdd7d;hp=59c24b67db130a9aea15e73ae0f38230b018973e;hpb=33b1ed324ef6e3d54e82c08d99af8086e292bf87;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/opts.c b/gcc/opts.c index 59c24b67db1..507b50227ee 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, 2009 + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Neil Booth. @@ -44,6 +44,7 @@ along with GCC; see the file COPYING3. If not see #include "debug.h" #include "plugin.h" #include "except.h" +#include "lto-streamer.h" /* Value of the -G xx switch, and whether it was passed or not. */ unsigned HOST_WIDE_INT g_switch_value; @@ -432,6 +433,17 @@ complain_wrong_lang (const char *text, const struct cl_option *option, { char *ok_langs, *bad_lang; + /* The LTO front end inherits all the options from the first front + end that was used. However, not all the original front end + options make sense in LTO. + + A real solution would be to filter this in collect2, but collect2 + does not have access to all the option attributes to know what to + filter. So, in lto1 we silently accept inherited flags and do + nothing about it. */ + if (lang_mask & CL_LTO) + return; + ok_langs = write_langs (option->flags); bad_lang = write_langs (lang_mask); @@ -598,44 +610,31 @@ handle_option (const char **argv, unsigned int lang_mask) } if (option->flag_var) - switch (option->var_type) - { - case CLVC_BOOLEAN: - *(int *) option->flag_var = value; - break; - - case CLVC_EQUAL: - *(int *) option->flag_var = (value - ? option->var_value - : !option->var_value); - break; - - case CLVC_BIT_CLEAR: - case CLVC_BIT_SET: - if ((value != 0) == (option->var_type == CLVC_BIT_SET)) - *(int *) option->flag_var |= option->var_value; - else - *(int *) option->flag_var &= ~option->var_value; - if (option->flag_var == &target_flags) - target_flags_explicit |= option->var_value; - break; - - case CLVC_STRING: - *(const char **) option->flag_var = arg; - break; - } + set_option (option, value, arg); if (option->flags & lang_mask) - if (lang_hooks.handle_option (opt_index, arg, value) == 0) - result = 0; + { + if (lang_hooks.handle_option (opt_index, arg, value) == 0) + result = 0; + else + lto_register_user_option (opt_index, arg, value, lang_mask); + } if (result && (option->flags & CL_COMMON)) - if (common_handle_option (opt_index, arg, value, lang_mask) == 0) - result = 0; + { + if (common_handle_option (opt_index, arg, value, lang_mask) == 0) + result = 0; + else + lto_register_user_option (opt_index, arg, value, CL_COMMON); + } if (result && (option->flags & CL_TARGET)) - if (!targetm.handle_option (opt_index, arg, value)) - result = 0; + { + if (!targetm.handle_option (opt_index, arg, value)) + result = 0; + else + lto_register_user_option (opt_index, arg, value, CL_TARGET); + } done: if (dup) @@ -830,12 +829,14 @@ decode_options (unsigned int argc, const char **argv) if (optimize_val != -1) { optimize = optimize_val; + if ((unsigned int) optimize > 255) + optimize = 255; optimize_size = 0; } } } } - + /* Use priority coloring if cover classes is not defined for the target. */ if (targetm.ira_cover_classes == NULL) @@ -857,6 +858,7 @@ decode_options (unsigned int argc, const char **argv) flag_if_conversion2 = opt1; flag_ipa_pure_const = opt1; flag_ipa_reference = opt1; + flag_ipa_profile = opt1; flag_merge_constants = opt1; flag_split_wide_types = opt1; flag_tree_ccp = opt1; @@ -885,7 +887,8 @@ decode_options (unsigned int argc, const char **argv) flag_caller_saves = opt2; flag_peephole2 = opt2; #ifdef INSN_SCHEDULING - flag_schedule_insns = opt2; + /* Only run the pre-regalloc scheduling pass if optimizing for speed. */ + flag_schedule_insns = opt2 && ! optimize_size; flag_schedule_insns_after_reload = opt2; #endif flag_regmove = opt2; @@ -896,8 +899,9 @@ decode_options (unsigned int argc, const char **argv) flag_tree_vrp = opt2; flag_tree_builtin_call_dce = opt2; flag_tree_pre = opt2; - flag_tree_switch_conversion = 1; + flag_tree_switch_conversion = opt2; flag_ipa_cp = opt2; + flag_ipa_sra = opt2; /* Track fields in field-sensitive alias analysis. */ set_param_value ("max-fields-for-field-sensitive", @@ -958,6 +962,9 @@ decode_options (unsigned int argc, const char **argv) flag_unwind_tables = targetm.unwind_tables_default; } + /* Clear any options currently held for LTO. */ + lto_clear_user_options (); + #ifdef OPTIMIZATION_OPTIONS /* Allow default optimizations to be specified on a per-machine basis. */ OPTIMIZATION_OPTIONS (optimize, optimize_size); @@ -965,24 +972,31 @@ decode_options (unsigned int argc, const char **argv) handle_options (argc, argv, lang_mask); - /* Make DUMP_BASE_NAME relative to the AUX_BASE_NAME directory, - typically the directory to contain the object file. */ - if (aux_base_name && ! IS_ABSOLUTE_PATH (dump_base_name)) + if (dump_base_name && ! IS_ABSOLUTE_PATH (dump_base_name)) { - const char *aux_base; - - base_of_path (aux_base_name, &aux_base); - if (aux_base_name != aux_base) + /* First try to make DUMP_BASE_NAME relative to the DUMP_DIR_NAME + directory. Then try to make DUMP_BASE_NAME relative to the + AUX_BASE_NAME directory, typically the directory to contain + the object file. */ + if (dump_dir_name) + dump_base_name = concat (dump_dir_name, dump_base_name, NULL); + else if (aux_base_name) { - int dir_len = aux_base - aux_base_name; - char *new_dump_base_name = - XNEWVEC (char, strlen(dump_base_name) + dir_len + 1); - - /* Copy directory component from AUX_BASE_NAME. */ - memcpy (new_dump_base_name, aux_base_name, dir_len); - /* Append existing DUMP_BASE_NAME. */ - strcpy (new_dump_base_name + dir_len, dump_base_name); - dump_base_name = new_dump_base_name; + const char *aux_base; + + base_of_path (aux_base_name, &aux_base); + if (aux_base_name != aux_base) + { + int dir_len = aux_base - aux_base_name; + char *new_dump_base_name = + XNEWVEC (char, strlen(dump_base_name) + dir_len + 1); + + /* Copy directory component from AUX_BASE_NAME. */ + memcpy (new_dump_base_name, aux_base_name, dir_len); + /* Append existing DUMP_BASE_NAME. */ + strcpy (new_dump_base_name + dir_len, dump_base_name); + dump_base_name = new_dump_base_name; + } } } @@ -1021,6 +1035,7 @@ decode_options (unsigned int argc, const char **argv) flag_pic = flag_pie; if (flag_pic && !flag_pie) flag_shlib = 1; + first_time_p = false; } if (optimize == 0) @@ -1044,7 +1059,7 @@ decode_options (unsigned int argc, const char **argv) #endif )) { - inform (input_location, + inform (input_location, "-freorder-blocks-and-partition does not work with exceptions on this architecture"); flag_reorder_blocks_and_partition = 0; flag_reorder_blocks = 1; @@ -1099,13 +1114,6 @@ decode_options (unsigned int argc, const char **argv) flag_ira_algorithm = IRA_ALGORITHM_PRIORITY; } - /* Save the current optimization options if this is the first call. */ - if (first_time_p) - { - optimization_default_node = build_optimization_node (); - optimization_current_node = optimization_default_node; - first_time_p = false; - } if (flag_conserve_stack) { if (!PARAM_SET_P (PARAM_LARGE_STACK_FRAME)) @@ -1113,7 +1121,34 @@ decode_options (unsigned int argc, const char **argv) if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH)) PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40; } + if (flag_wpa || flag_ltrans) + { + /* These passes are not WHOPR compatible yet. */ + flag_ipa_cp = 0; + flag_ipa_reference = 0; + flag_ipa_type_escape = 0; + flag_ipa_pta = 0; + flag_ipa_struct_reorg = 0; + } + + if (flag_lto || flag_whopr) + { +#ifdef ENABLE_LTO + flag_generate_lto = 1; + + /* When generating IL, do not operate in whole-program mode. + Otherwise, symbols will be privatized too early, causing link + errors later. */ + flag_whole_program = 0; +#else + error ("LTO support has not been enabled in this configuration"); +#endif + } + /* Reconcile -flto and -fwhopr. Set additional flags as appropriate and + check option consistency. */ + if (flag_lto && flag_whopr) + error ("-flto and -fwhopr are mutually exclusive"); } #define LEFT_COLUMN 27 @@ -1309,7 +1344,7 @@ print_filtered_help (unsigned int include_flags, printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"), lang_names[i], lang_names[i]); } - + } else if (! displayed) printf (_(" All options with the desired characteristics have already been displayed\n")); @@ -1512,7 +1547,7 @@ common_handle_option (size_t scode, const char *arg, int value, { NULL, 0 } }; unsigned int * pflags; - char * comma; + const char * comma; unsigned int lang_flag, specific_flag; unsigned int len; unsigned int i; @@ -1614,8 +1649,8 @@ common_handle_option (size_t scode, const char *arg, int value, break; case OPT_Wlarger_than_: - /* This form corresponds to -Wlarger-than-. - Kept for backward compatibility. + /* This form corresponds to -Wlarger-than-. + Kept for backward compatibility. Don't use it as the first argument of warning(). */ case OPT_Wlarger_than_eq: @@ -1677,6 +1712,10 @@ common_handle_option (size_t scode, const char *arg, int value, dump_base_name = arg; break; + case OPT_dumpdir: + dump_dir_name = arg; + break; + case OPT_falign_functions_: align_functions = value; break; @@ -1728,7 +1767,7 @@ common_handle_option (size_t scode, const char *arg, int value, break; case OPT_fdiagnostics_show_option: - global_dc->show_option_requested = true; + global_dc->show_option_requested = value; break; case OPT_fdump_: @@ -2054,7 +2093,7 @@ common_handle_option (size_t scode, const char *arg, int value, break; case OPT_gdwarf_: - if (value < 2 || value > 3) + if (value < 2 || value > 4) error ("dwarf version %d is not supported", value); else dwarf_version = value; @@ -2091,14 +2130,24 @@ common_handle_option (size_t scode, const char *arg, int value, case OPT_fcse_skip_blocks: case OPT_floop_optimize: case OPT_frerun_loop_opt: + case OPT_fsched2_use_traces: case OPT_fstrength_reduce: case OPT_ftree_store_copy_prop: case OPT_fforce_addr: case OPT_ftree_salias: case OPT_ftree_store_ccp: + case OPT_Wunreachable_code: + case OPT_fargument_alias: + case OPT_fargument_noalias: + case OPT_fargument_noalias_anything: + case OPT_fargument_noalias_global: /* These are no-ops, preserved for backward compatibility. */ break; + case OPT_fuse_linker_plugin: + /* No-op. Used by the driver and passed to us because it starts with f.*/ + break; + default: /* If the flag was handled in a standard way, assume the lack of processing here is intentional. */ @@ -2135,7 +2184,7 @@ handle_param (const char *carg) free (arg); } -/* Used to set the level of strict aliasing warnings, +/* 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). ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified, @@ -2168,8 +2217,8 @@ set_fast_math_flags (int set) } } -/* When -funsafe-math-optimizations is set the following - flags are set as well. */ +/* When -funsafe-math-optimizations is set the following + flags are set as well. */ void set_unsafe_math_optimizations_flags (int set) { @@ -2321,6 +2370,56 @@ get_option_state (int option, struct cl_option_state *state) return true; } +/* Set *OPTION according to VALUE and ARG. */ + +void +set_option (const struct cl_option *option, int value, const char *arg) +{ + if (!option->flag_var) + return; + + switch (option->var_type) + { + case CLVC_BOOLEAN: + *(int *) option->flag_var = value; + break; + + case CLVC_EQUAL: + *(int *) option->flag_var = (value + ? option->var_value + : !option->var_value); + break; + + case CLVC_BIT_CLEAR: + case CLVC_BIT_SET: + if ((value != 0) == (option->var_type == CLVC_BIT_SET)) + *(int *) option->flag_var |= option->var_value; + else + *(int *) option->flag_var &= ~option->var_value; + if (option->flag_var == &target_flags) + target_flags_explicit |= option->var_value; + break; + + case CLVC_STRING: + *(const char **) option->flag_var = arg; + break; + } +} + + +/* Callback function, called when -Werror= enables a warning. */ + +static void (*warning_as_error_callback) (int) = NULL; + +/* Register a callback for enable_warning_as_error calls. */ + +void +register_warning_as_error_callback (void (*callback) (int)) +{ + gcc_assert (warning_as_error_callback == NULL || callback == NULL); + warning_as_error_callback = callback; +} + /* Enable a warning option as an error. This is used by -Werror= and also by legacy Werror-implicit-function-declaration. */ @@ -2340,14 +2439,20 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask) } else { - diagnostic_t kind = value ? DK_ERROR : DK_WARNING; + const diagnostic_t kind = value ? DK_ERROR : DK_WARNING; + diagnostic_classify_diagnostic (global_dc, option_index, kind); - - /* -Werror=foo implies -Wfoo. */ - if (cl_options[option_index].var_type == CLVC_BOOLEAN - && cl_options[option_index].flag_var - && kind == DK_ERROR) - *(int *) cl_options[option_index].flag_var = 1; + if (kind == DK_ERROR) + { + const struct cl_option * const option = cl_options + option_index; + + /* -Werror=foo implies -Wfoo. */ + if (option->var_type == CLVC_BOOLEAN && option->flag_var) + *(int *) option->flag_var = 1; + + if (warning_as_error_callback) + warning_as_error_callback (option_index); + } } free (new_option); }