From: jsm28 Date: Wed, 24 Nov 2010 00:51:48 +0000 (+0000) Subject: * flag-types.h (struct visibility_flags): Don't declare here. X-Git-Tag: upstream/4.9.2~24608 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7939616918aae0c21c6b6e415cbae13f7db1a1ae;p=platform%2Fupstream%2Flinaro-gcc.git * flag-types.h (struct visibility_flags): Don't declare here. * flags.h (strip_off_ending, fast_math_flags_set_p, fast_math_flags_struct_set_p): Declare here. (visibility_options): Don't declare here. * opts-common.c (option_enabled, get_option_state): Move from opts.c. * opts-global.c: Include diagnostic.h instead of diagnostic-core.h. Include tree.h, langhooks.h, lto-streamer.h and toplev.h. (const_char_p, ignored_options, in_fnames, num_in_fnames, write_langs, complain_wrong_lang, postpone_unknown_option_warning, print_ignored_options, unknown_option_callback, post_handling_callback, lang_handle_option, add_input_filename, read_cmdline_options, initial_lang_mask, init_options_once, decode_cmdline_options_to_array_default_mask, set_default_handlers, decode_options): Move from opts.c. (print_ignored_options): Use warning_at instead of saving and restoring input_location. * opts.c: Include and . Include rtl.h instead of expr.h. Don't include langhooks.h, except.h or lto-streamer.h. Add more comments on includes. (strip_off_ending, setup_core_dumping, decode_d_option): Move from toplev.c. (visibility_options): Move to c-family/c-common.c. (const_char_p, ignored_options, in_fnames, num_in_fnames, write_langs, complain_wrong_lang, postpone_unknown_option_warning, print_ignored_options, unknown_option_callback, post_handling_callback, lang_handle_option, add_input_filename, read_cmdline_options, initial_lang_mask, init_options_once, decode_cmdline_options_to_array_default_mask, set_default_handlers, decode_options): Move to opts-global.c. (target_handle_option, default_options_optimization, finish_options, common_handle_option): Remove static. (option_enabled, get_option_state): Move to opts-common.c. * opts.h (common_handle_option, target_handle_option, finish_options, default_options_optimization): Declare. * toplev.c: Don't include or . (setup_core_dumping, strip_off_ending, decode_d_option): Move to opts.c. * toplev.h (strip_off_ending, decode_d_option, fast_math_flags_set_p, fast_math_flags_struct_set_p): Don't declare here. * Makefile.in (opts.o, opts-global.o): Update dependencies. c-family: * c-common.c (visibility_options): Move from ../opts.c. * c-common.h (struct visibility_flags, visibility_options): Declare here. * c-opts.c (finish_options): Rename to c_finish_options. (c_common_init): Update call to finish_options. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167105 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index db6f8ab..9b2206b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,49 @@ +2010-11-23 Joseph Myers + + * flag-types.h (struct visibility_flags): Don't declare here. + * flags.h (strip_off_ending, fast_math_flags_set_p, + fast_math_flags_struct_set_p): Declare here. + (visibility_options): Don't declare here. + * opts-common.c (option_enabled, get_option_state): Move from + opts.c. + * opts-global.c: Include diagnostic.h instead of + diagnostic-core.h. Include tree.h, langhooks.h, lto-streamer.h + and toplev.h. + (const_char_p, ignored_options, in_fnames, num_in_fnames, + write_langs, complain_wrong_lang, postpone_unknown_option_warning, + print_ignored_options, unknown_option_callback, + post_handling_callback, lang_handle_option, add_input_filename, + read_cmdline_options, initial_lang_mask, init_options_once, + decode_cmdline_options_to_array_default_mask, + set_default_handlers, decode_options): Move from opts.c. + (print_ignored_options): Use warning_at instead of saving and + restoring input_location. + * opts.c: Include and . Include rtl.h + instead of expr.h. Don't include langhooks.h, except.h or + lto-streamer.h. Add more comments on includes. + (strip_off_ending, setup_core_dumping, decode_d_option): Move from + toplev.c. + (visibility_options): Move to c-family/c-common.c. + (const_char_p, ignored_options, in_fnames, num_in_fnames, + write_langs, complain_wrong_lang, postpone_unknown_option_warning, + print_ignored_options, unknown_option_callback, + post_handling_callback, lang_handle_option, add_input_filename, + read_cmdline_options, initial_lang_mask, init_options_once, + decode_cmdline_options_to_array_default_mask, + set_default_handlers, decode_options): Move to opts-global.c. + (target_handle_option, default_options_optimization, + finish_options, common_handle_option): Remove static. + (option_enabled, get_option_state): Move to opts-common.c. + * opts.h (common_handle_option, target_handle_option, + finish_options, default_options_optimization): Declare. + * toplev.c: Don't include or . + (setup_core_dumping, strip_off_ending, decode_d_option): Move to + opts.c. + * toplev.h (strip_off_ending, decode_d_option, + fast_math_flags_set_p, fast_math_flags_struct_set_p): Don't + declare here. + * Makefile.in (opts.o, opts-global.o): Update dependencies. + 2010-11-23 Dave Korn PR driver/42690 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 57e049c..fb91433 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2824,13 +2824,14 @@ fold-const.o : fold-const.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ diagnostic.o : diagnostic.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ version.h $(INPUT_H) intl.h $(DIAGNOSTIC_H) diagnostic.def opts.o : opts.c $(OPTS_H) $(OPTIONS_H) $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) $(CONFIG_H) $(SYSTEM_H) \ - coretypes.h $(TREE_H) $(TM_H) langhooks.h $(EXPR_H) \ - $(DIAGNOSTIC_H) $(TM_P_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \ + coretypes.h $(TREE_H) $(TM_H) $(RTL_H) \ + $(DIAGNOSTIC_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \ $(FLAGS_H) $(PARAMS_H) $(DBGCNT_H) debug.h \ - $(EXCEPT_H) $(LTO_STREAMER_H) opts-diagnostic.h + opts-diagnostic.h opts-global.o : opts-global.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ - $(DIAGNOSTIC_CORE_H) $(OPTS_H) $(FLAGS_H) $(GGC_H) $(TM_H) $(RTL_H) \ - output.h $(PLUGIN_H) $(TREE_PASS_H) + $(DIAGNOSTIC_H) $(OPTS_H) $(FLAGS_H) $(GGC_H) $(TREE_H) langhooks.h \ + $(TM_H) $(RTL_H) $(LTO_STREAMER_H) output.h $(PLUGIN_H) $(TOPLEV_H) \ + $(TREE_PASS_H) opts-common.o : opts-common.c $(OPTS_H) $(FLAGS_H) $(CONFIG_H) $(SYSTEM_H) \ coretypes.h intl.h $(DIAGNOSTIC_H) $(TM_H) targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \ diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index fe6fe7a..8ca7ba8 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,11 @@ +2010-11-23 Joseph Myers + + * c-common.c (visibility_options): Move from ../opts.c. + * c-common.h (struct visibility_flags, visibility_options): + Declare here. + * c-opts.c (finish_options): Rename to c_finish_options. + (c_common_init): Update call to finish_options. + 2010-11-22 Nicola Pero PR objc/34033 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 8b2fd60..21a6ad4 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -304,6 +304,9 @@ const struct fname_var_t fname_vars[] = {NULL, 0, 0}, }; +/* Global visibility options. */ +struct visibility_flags visibility_options; + static tree c_fully_fold_internal (tree expr, bool, bool *, bool *); static tree check_case_value (tree); static bool check_case_bounds (tree, tree, tree *, tree *); diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 0e60330..11b92fb 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -660,6 +660,15 @@ extern bool done_lexing; #define C_TYPE_OBJECT_OR_INCOMPLETE_P(type) \ (!C_TYPE_FUNCTION_P (type)) +struct visibility_flags +{ + unsigned inpragma : 1; /* True when in #pragma GCC visibility. */ + unsigned inlines_hidden : 1; /* True when -finlineshidden in effect. */ +}; + +/* Global visibility options. */ +extern struct visibility_flags visibility_options; + /* Attribute table common to the C front ends. */ extern const struct attribute_spec c_common_attribute_table[]; extern const struct attribute_spec c_common_format_attribute_table[]; diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index 7d12859..c537306 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -116,7 +116,7 @@ static void add_prefixed_path (const char *, size_t); static void push_command_line_include (void); static void cb_file_change (cpp_reader *, const struct line_map *); static void cb_dir_change (cpp_reader *, const char *); -static void finish_options (void); +static void c_finish_options (void); #ifndef STDC_0_IN_SYSTEM_HEADERS #define STDC_0_IN_SYSTEM_HEADERS 0 @@ -1047,7 +1047,7 @@ c_common_init (void) if (flag_preprocess_only) { - finish_options (); + c_finish_options (); preprocess_file (parse_in); return false; } @@ -1065,7 +1065,7 @@ c_common_parse_file (void) i = 0; for (;;) { - finish_options (); + c_finish_options (); pch_init (); push_file_scope (); c_parse_file (); @@ -1277,7 +1277,7 @@ add_prefixed_path (const char *suffix, size_t chain) /* Handle -D, -U, -A, -imacros, and the first -include. */ static void -finish_options (void) +c_finish_options (void) { if (!cpp_opts->preprocessed) { diff --git a/gcc/flag-types.h b/gcc/flag-types.h index 6046355..307755a 100644 --- a/gcc/flag-types.h +++ b/gcc/flag-types.h @@ -106,12 +106,6 @@ enum symbol_visibility }; #endif -struct visibility_flags -{ - unsigned inpragma : 1; /* True when in #pragma GCC visibility. */ - unsigned inlines_hidden : 1; /* True when -finlineshidden in effect. */ -}; - /* The algorithm used for the integrated register allocator (IRA). */ enum ira_algorithm { diff --git a/gcc/flags.h b/gcc/flags.h index cbee498..47a93a9 100644 --- a/gcc/flags.h +++ b/gcc/flags.h @@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see /* Names of debug_info_type, for error messages. */ extern const char *const debug_type_names[]; +extern void strip_off_ending (char *, int); extern int base_of_path (const char *path, const char **base_out); extern void set_struct_debug_option (struct gcc_options *opts, const char *value); @@ -40,9 +41,6 @@ extern void set_struct_debug_option (struct gcc_options *opts, an actual variable not a macro. */ extern int flag_compare_debug; -/* Global visibility options. */ -extern struct visibility_flags visibility_options; - /* True if this is the LTO front end (lto1). 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 @@ -50,6 +48,10 @@ extern struct visibility_flags visibility_options; extern bool in_lto_p; +/* Return true iff flags are set as if -ffast-math. */ +extern bool fast_math_flags_set_p (const struct gcc_options *); +extern bool fast_math_flags_struct_set_p (struct cl_optimization *); + /* Used to set the level of -Wstrict-aliasing in OPTS, when no level is specified. The external way to set the default level is to use -Wstrict-aliasing=level. diff --git a/gcc/opts-common.c b/gcc/opts-common.c index 79d3f05..9a57402 100644 --- a/gcc/opts-common.c +++ b/gcc/opts-common.c @@ -994,6 +994,78 @@ option_flag_var (int opt_index, struct gcc_options *opts) return (void *)(((char *) opts) + option->flag_var_offset); } +/* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled, + or -1 if it isn't a simple on-off switch. */ + +int +option_enabled (int opt_idx, void *opts) +{ + const struct cl_option *option = &(cl_options[opt_idx]); + struct gcc_options *optsg = (struct gcc_options *) opts; + void *flag_var = option_flag_var (opt_idx, optsg); + + if (flag_var) + switch (option->var_type) + { + case CLVC_BOOLEAN: + return *(int *) flag_var != 0; + + case CLVC_EQUAL: + return *(int *) flag_var == option->var_value; + + case CLVC_BIT_CLEAR: + return (*(int *) flag_var & option->var_value) == 0; + + case CLVC_BIT_SET: + return (*(int *) flag_var & option->var_value) != 0; + + case CLVC_STRING: + case CLVC_DEFER: + break; + } + return -1; +} + +/* Fill STATE with the current state of option OPTION in OPTS. Return + true if there is some state to store. */ + +bool +get_option_state (struct gcc_options *opts, int option, + struct cl_option_state *state) +{ + void *flag_var = option_flag_var (option, opts); + + if (flag_var == 0) + return false; + + switch (cl_options[option].var_type) + { + case CLVC_BOOLEAN: + case CLVC_EQUAL: + state->data = flag_var; + state->size = sizeof (int); + break; + + case CLVC_BIT_CLEAR: + case CLVC_BIT_SET: + state->ch = option_enabled (option, opts); + state->data = &state->ch; + state->size = 1; + break; + + case CLVC_STRING: + state->data = *(const char **) flag_var; + if (state->data == 0) + state->data = ""; + state->size = strlen ((const char *) state->data) + 1; + break; + + case CLVC_DEFER: + return false; + } + return true; +} + /* Set a warning option OPT_INDEX (language mask LANG_MASK, option handlers HANDLERS) to have diagnostic kind KIND for option structures OPTS and OPTS_SET and diagnostic context DC (possibly diff --git a/gcc/opts-global.c b/gcc/opts-global.c index e4e62db..3ed562d 100644 --- a/gcc/opts-global.c +++ b/gcc/opts-global.c @@ -22,16 +22,316 @@ along with GCC; see the file COPYING3. If not see #include "config.h" #include "system.h" #include "coretypes.h" -#include "diagnostic-core.h" +#include "diagnostic.h" #include "opts.h" #include "flags.h" #include "ggc.h" +#include "tree.h" /* Required by langhooks.h. */ +#include "langhooks.h" #include "tm.h" /* Required by rtl.h. */ #include "rtl.h" +#include "lto-streamer.h" #include "output.h" #include "plugin.h" +#include "toplev.h" #include "tree-pass.h" +typedef const char *const_char_p; /* For DEF_VEC_P. */ +DEF_VEC_P(const_char_p); +DEF_VEC_ALLOC_P(const_char_p,heap); + +static VEC(const_char_p,heap) *ignored_options; + +/* Input file names. */ +const char **in_fnames; +unsigned num_in_fnames; + +/* Return a malloced slash-separated list of languages in MASK. */ + +static char * +write_langs (unsigned int mask) +{ + unsigned int n = 0, len = 0; + const char *lang_name; + char *result; + + for (n = 0; (lang_name = lang_names[n]) != 0; n++) + if (mask & (1U << n)) + len += strlen (lang_name) + 1; + + result = XNEWVEC (char, len); + len = 0; + for (n = 0; (lang_name = lang_names[n]) != 0; n++) + if (mask & (1U << n)) + { + if (len) + result[len++] = '/'; + strcpy (result + len, lang_name); + len += strlen (lang_name); + } + + result[len] = 0; + + return result; +} + +/* Complain that switch DECODED does not apply to this front end (mask + LANG_MASK). */ + +static void +complain_wrong_lang (const struct cl_decoded_option *decoded, + unsigned int lang_mask) +{ + const struct cl_option *option = &cl_options[decoded->opt_index]; + const char *text = decoded->orig_option_with_args_text; + char *ok_langs = NULL, *bad_lang = NULL; + unsigned int opt_flags = option->flags; + + if (!lang_hooks.complain_wrong_lang_p (option)) + return; + + opt_flags &= ((1U << cl_lang_count) - 1) | CL_DRIVER; + if (opt_flags != CL_DRIVER) + ok_langs = write_langs (opt_flags); + if (lang_mask != CL_DRIVER) + bad_lang = write_langs (lang_mask); + + if (opt_flags == CL_DRIVER) + error ("command line option %qs is valid for the driver but not for %s", + text, bad_lang); + else if (lang_mask == CL_DRIVER) + gcc_unreachable (); + else + /* Eventually this should become a hard error IMO. */ + warning (0, "command line option %qs is valid for %s but not for %s", + text, ok_langs, bad_lang); + + free (ok_langs); + free (bad_lang); +} + +/* Buffer the unknown option described by the string OPT. Currently, + we only complain about unknown -Wno-* options if they may have + prevented a diagnostic. Otherwise, we just ignore them. Note that + if we do complain, it is only as a warning, not an error; passing + the compiler an unrecognised -Wno-* option should never change + whether the compilation succeeds or fails. */ + +static void +postpone_unknown_option_warning (const char *opt) +{ + VEC_safe_push (const_char_p, heap, ignored_options, opt); +} + +/* Produce a warning for each option previously buffered. */ + +void +print_ignored_options (void) +{ + while (!VEC_empty (const_char_p, ignored_options)) + { + const char *opt; + + opt = VEC_pop (const_char_p, ignored_options); + warning_at (UNKNOWN_LOCATION, 0, + "unrecognized command line option \"%s\"", opt); + } +} + +/* Handle an unknown option DECODED, returning true if an error should + be given. */ + +static bool +unknown_option_callback (const struct cl_decoded_option *decoded) +{ + const char *opt = decoded->arg; + + if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-' + && !(decoded->errors & CL_ERR_NEGATIVE)) + { + /* We don't generate warnings for unknown -Wno-* options unless + we issue diagnostics. */ + postpone_unknown_option_warning (opt); + return false; + } + else + return true; +} + +/* Note that an option DECODED has been successfully handled with a + handler for mask MASK. */ + +static void +post_handling_callback (const struct cl_decoded_option *decoded ATTRIBUTE_UNUSED, + unsigned int mask ATTRIBUTE_UNUSED) +{ +#ifdef ENABLE_LTO + lto_register_user_option (decoded->opt_index, decoded->arg, + decoded->value, mask); +#endif +} + +/* Handle a front-end option; arguments and return value as for + handle_option. */ + +static bool +lang_handle_option (struct gcc_options *opts, + struct gcc_options *opts_set, + const struct cl_decoded_option *decoded, + unsigned int lang_mask ATTRIBUTE_UNUSED, int kind, + location_t loc, + const struct cl_option_handlers *handlers, + diagnostic_context *dc) +{ + gcc_assert (opts == &global_options); + gcc_assert (opts_set == &global_options_set); + gcc_assert (dc == global_dc); + gcc_assert (decoded->canonical_option_num_elements <= 2); + return lang_hooks.handle_option (decoded->opt_index, decoded->arg, + decoded->value, kind, loc, handlers); +} + +/* Handle FILENAME from the command line. */ + +static void +add_input_filename (const char *filename) +{ + num_in_fnames++; + in_fnames = XRESIZEVEC (const char *, in_fnames, num_in_fnames); + in_fnames[num_in_fnames - 1] = filename; +} + +/* Handle the vector of command line options (located at LOC), storing + the results of processing DECODED_OPTIONS and DECODED_OPTIONS_COUNT + in OPTS and OPTS_SET and using DC for diagnostic state. LANG_MASK + contains has a single bit set representing the current language. + HANDLERS describes what functions to call for the options. */ + +static void +read_cmdline_options (struct gcc_options *opts, struct gcc_options *opts_set, + struct cl_decoded_option *decoded_options, + unsigned int decoded_options_count, + location_t loc, + unsigned int lang_mask, + const struct cl_option_handlers *handlers, + diagnostic_context *dc) +{ + unsigned int i; + + for (i = 1; i < decoded_options_count; i++) + { + if (decoded_options[i].opt_index == OPT_SPECIAL_input_file) + { + /* Input files should only ever appear on the main command + line. */ + gcc_assert (opts == &global_options); + gcc_assert (opts_set == &global_options_set); + + if (main_input_filename == NULL) + { + main_input_filename = decoded_options[i].arg; + main_input_baselength + = base_of_path (main_input_filename, &main_input_basename); + } + add_input_filename (decoded_options[i].arg); + continue; + } + + read_cmdline_option (opts, opts_set, + decoded_options + i, loc, lang_mask, handlers, + dc); + } +} + +/* Language mask determined at initialization. */ +static unsigned int initial_lang_mask; + +/* Initialize global options-related settings at start-up. */ + +void +init_options_once (void) +{ + /* Perform language-specific options initialization. */ + initial_lang_mask = lang_hooks.option_lang_mask (); + + lang_hooks.initialize_diagnostics (global_dc); +} + +/* Decode command-line options to an array, like + decode_cmdline_options_to_array and with the same arguments but + using the default lang_mask. */ + +void +decode_cmdline_options_to_array_default_mask (unsigned int argc, + const char **argv, + struct cl_decoded_option **decoded_options, + unsigned int *decoded_options_count) +{ + decode_cmdline_options_to_array (argc, argv, + initial_lang_mask | CL_COMMON | CL_TARGET, + decoded_options, decoded_options_count); +} + +/* Set *HANDLERS to the default set of option handlers for use in the + compilers proper (not the driver). */ +void +set_default_handlers (struct cl_option_handlers *handlers) +{ + handlers->unknown_option_callback = unknown_option_callback; + handlers->wrong_lang_callback = complain_wrong_lang; + handlers->post_handling_callback = post_handling_callback; + handlers->num_handlers = 3; + handlers->handlers[0].handler = lang_handle_option; + handlers->handlers[0].mask = initial_lang_mask; + handlers->handlers[1].handler = common_handle_option; + handlers->handlers[1].mask = CL_COMMON; + handlers->handlers[2].handler = target_handle_option; + handlers->handlers[2].mask = CL_TARGET; +} + +/* Parse command line options and set default flag values. Do minimal + options processing. The decoded options are in *DECODED_OPTIONS + and *DECODED_OPTIONS_COUNT; settings go in OPTS, OPTS_SET and DC; + the options are located at LOC. */ +void +decode_options (struct gcc_options *opts, struct gcc_options *opts_set, + struct cl_decoded_option *decoded_options, + unsigned int decoded_options_count, + location_t loc, diagnostic_context *dc) +{ + struct cl_option_handlers handlers; + + unsigned int lang_mask; + + lang_mask = initial_lang_mask; + + set_default_handlers (&handlers); + + /* Enable -Werror=coverage-mismatch by default. */ + control_warning_option (OPT_Wcoverage_mismatch, (int) DK_ERROR, true, + loc, lang_mask, + &handlers, opts, opts_set, dc); + + default_options_optimization (opts, opts_set, + decoded_options, decoded_options_count, + loc, lang_mask, &handlers, dc); + +#ifdef ENABLE_LTO + /* Clear any options currently held for LTO. */ + lto_clear_user_options (); +#endif + + read_cmdline_options (opts, opts_set, + decoded_options, decoded_options_count, + loc, lang_mask, + &handlers, dc); + + finish_options (opts, opts_set); +} + +/* Process common options that have been deferred until after the + handlers have been called for all options. */ + void handle_common_deferred_options (void) { diff --git a/gcc/opts.c b/gcc/opts.c index 9e9572d..a088bc5 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -21,25 +21,30 @@ along with GCC; see the file COPYING3. If not see #include "config.h" #include "system.h" + +#include + +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif + #include "intl.h" #include "coretypes.h" -#include "tm.h" -#include "tree.h" -#include "expr.h" -#include "langhooks.h" +#include "tm.h" /* Needed by rtl.h and used for DWARF2_DEBUGGING_INFO + and DBX_DEBUGGING_INFO. */ +#include "tree.h" /* For vect_set_verbosity_level. */ +#include "rtl.h" /* Needed by insn-attr.h. */ #include "opts.h" #include "options.h" #include "flags.h" -#include "toplev.h" +#include "toplev.h" /* For set_random_seed and enable_rtl_dump_file. */ #include "params.h" #include "diagnostic.h" #include "opts-diagnostic.h" -#include "insn-attr.h" /* For INSN_SCHEDULING. */ +#include "insn-attr.h" /* For INSN_SCHEDULING and DELAY_SLOTS. */ #include "target.h" #include "dbgcnt.h" #include "debug.h" -#include "except.h" -#include "lto-streamer.h" /* Run the second compilation of -fcompare-debug. Not defined using Var in common.opt because this is used in Ada code and so must be @@ -136,6 +141,25 @@ set_struct_debug_option (struct gcc_options *opts, const char *spec) } } +/* Strip off a legitimate source ending from the input string NAME of + length LEN. Rather than having to know the names used by all of + our front ends, we strip off an ending of a period followed by + up to five characters. (Java uses ".class".) */ + +void +strip_off_ending (char *name, int len) +{ + int i; + for (i = 2; i < 6 && len > i; i++) + { + if (name[len - i] == '.') + { + name[len - i] = '\0'; + break; + } + } +} + /* Find the base name of a path, stripping off both directories and a single final extension. */ int @@ -162,9 +186,6 @@ base_of_path (const char *path, const char **base_out) return dot - base; } -/* Global visibility options. */ -struct visibility_flags visibility_options; - /* What to print when a switch has no documentation. */ static const char undocumented_msg[] = N_("This switch lacks documentation"); @@ -172,32 +193,13 @@ typedef char *char_p; /* For DEF_VEC_P. */ DEF_VEC_P(char_p); DEF_VEC_ALLOC_P(char_p,heap); -typedef const char *const_char_p; /* For DEF_VEC_P. */ -DEF_VEC_P(const_char_p); -DEF_VEC_ALLOC_P(const_char_p,heap); - -static VEC(const_char_p,heap) *ignored_options; - -/* Input file names. */ -const char **in_fnames; -unsigned num_in_fnames; - -static bool common_handle_option (struct gcc_options *opts, - struct gcc_options *opts_set, - const struct cl_decoded_option *decoded, - unsigned int lang_mask, int kind, - location_t loc, - const struct cl_option_handlers *handlers, - diagnostic_context *dc); static void handle_param (struct gcc_options *opts, struct gcc_options *opts_set, const char *carg); -static char *write_langs (unsigned int lang_mask); -static void complain_wrong_lang (const struct cl_decoded_option *, - unsigned int lang_mask); static void set_debug_level (enum debug_info_type type, int extended, const char *arg, struct gcc_options *opts, struct gcc_options *opts_set); static void set_fast_math_flags (struct gcc_options *opts, int set); +static void decode_d_option (const char *arg); static void set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set); static void enable_warning_as_error (const char *arg, int value, @@ -208,155 +210,10 @@ static void enable_warning_as_error (const char *arg, int value, location_t loc, diagnostic_context *dc); -/* Return a malloced slash-separated list of languages in MASK. */ -static char * -write_langs (unsigned int mask) -{ - unsigned int n = 0, len = 0; - const char *lang_name; - char *result; - - for (n = 0; (lang_name = lang_names[n]) != 0; n++) - if (mask & (1U << n)) - len += strlen (lang_name) + 1; - - result = XNEWVEC (char, len); - len = 0; - for (n = 0; (lang_name = lang_names[n]) != 0; n++) - if (mask & (1U << n)) - { - if (len) - result[len++] = '/'; - strcpy (result + len, lang_name); - len += strlen (lang_name); - } - - result[len] = 0; - - return result; -} - -/* Complain that switch DECODED does not apply to this front end (mask - LANG_MASK). */ -static void -complain_wrong_lang (const struct cl_decoded_option *decoded, - unsigned int lang_mask) -{ - const struct cl_option *option = &cl_options[decoded->opt_index]; - const char *text = decoded->orig_option_with_args_text; - char *ok_langs = NULL, *bad_lang = NULL; - unsigned int opt_flags = option->flags; - - if (!lang_hooks.complain_wrong_lang_p (option)) - return; - - opt_flags &= ((1U << cl_lang_count) - 1) | CL_DRIVER; - if (opt_flags != CL_DRIVER) - ok_langs = write_langs (opt_flags); - if (lang_mask != CL_DRIVER) - bad_lang = write_langs (lang_mask); - - if (opt_flags == CL_DRIVER) - error ("command line option %qs is valid for the driver but not for %s", - text, bad_lang); - else if (lang_mask == CL_DRIVER) - gcc_unreachable (); - else - /* Eventually this should become a hard error IMO. */ - warning (0, "command line option %qs is valid for %s but not for %s", - text, ok_langs, bad_lang); - - free (ok_langs); - free (bad_lang); -} - -/* Buffer the unknown option described by the string OPT. Currently, - we only complain about unknown -Wno-* options if they may have - prevented a diagnostic. Otherwise, we just ignore them. - Note that if we do complain, it is only as a warning, not an error; - passing the compiler an unrecognised -Wno-* option should never - change whether the compilation succeeds or fails. */ - -static void postpone_unknown_option_warning(const char *opt) -{ - VEC_safe_push (const_char_p, heap, ignored_options, opt); -} - -/* Produce a warning for each option previously buffered. */ - -void print_ignored_options (void) -{ - location_t saved_loc = input_location; - - input_location = 0; - - while (!VEC_empty (const_char_p, ignored_options)) - { - const char *opt; - opt = VEC_pop (const_char_p, ignored_options); - warning (0, "unrecognized command line option \"%s\"", opt); - } - - input_location = saved_loc; -} - -/* Handle an unknown option DECODED, returning true if an error should be - given. */ - -static bool -unknown_option_callback (const struct cl_decoded_option *decoded) -{ - const char *opt = decoded->arg; - - if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-' - && !(decoded->errors & CL_ERR_NEGATIVE)) - { - /* We don't generate warnings for unknown -Wno-* options unless - we issue diagnostics. */ - postpone_unknown_option_warning (opt); - return false; - } - else - return true; -} - -/* Note that an option DECODED has been successfully handled with a - handler for mask MASK. */ - -static void -post_handling_callback (const struct cl_decoded_option *decoded ATTRIBUTE_UNUSED, - unsigned int mask ATTRIBUTE_UNUSED) -{ -#ifdef ENABLE_LTO - lto_register_user_option (decoded->opt_index, decoded->arg, - decoded->value, mask); -#endif -} - -/* Handle a front-end option; arguments and return value as for - handle_option. */ - -static bool -lang_handle_option (struct gcc_options *opts, - struct gcc_options *opts_set, - const struct cl_decoded_option *decoded, - unsigned int lang_mask ATTRIBUTE_UNUSED, int kind, - location_t loc, - const struct cl_option_handlers *handlers, - diagnostic_context *dc) -{ - gcc_assert (opts == &global_options); - gcc_assert (opts_set == &global_options_set); - gcc_assert (dc == global_dc); - gcc_assert (decoded->canonical_option_num_elements <= 2); - return lang_hooks.handle_option (decoded->opt_index, decoded->arg, - decoded->value, kind, loc, handlers); -} - /* Handle a back-end option; arguments and return value as for handle_option. */ -static bool +bool target_handle_option (struct gcc_options *opts, struct gcc_options *opts_set, const struct cl_decoded_option *decoded, @@ -378,15 +235,6 @@ target_handle_option (struct gcc_options *opts, decoded->value); } -/* Handle FILENAME from the command line. */ -static void -add_input_filename (const char *filename) -{ - num_in_fnames++; - in_fnames = XRESIZEVEC (const char *, in_fnames, num_in_fnames); - in_fnames[num_in_fnames - 1] = filename; -} - /* Add comma-separated strings to a char_p vector. */ static void @@ -428,61 +276,6 @@ add_comma_separated_to_vector (void **pvec, const char *arg) *pvec = vec; } -/* Handle the vector of command line options (located at LOC), storing - the results of processing DECODED_OPTIONS and DECODED_OPTIONS_COUNT - in OPTS and OPTS_SET and using DC for diagnostic state. LANG_MASK - contains has a single bit set representing the current language. - HANDLERS describes what functions to call for the options. */ -static void -read_cmdline_options (struct gcc_options *opts, struct gcc_options *opts_set, - struct cl_decoded_option *decoded_options, - unsigned int decoded_options_count, - location_t loc, - unsigned int lang_mask, - const struct cl_option_handlers *handlers, - diagnostic_context *dc) -{ - unsigned int i; - - for (i = 1; i < decoded_options_count; i++) - { - if (decoded_options[i].opt_index == OPT_SPECIAL_input_file) - { - /* Input files should only ever appear on the main command - line. */ - gcc_assert (opts == &global_options); - gcc_assert (opts_set == &global_options_set); - - if (main_input_filename == NULL) - { - main_input_filename = decoded_options[i].arg; - main_input_baselength - = base_of_path (main_input_filename, &main_input_basename); - } - add_input_filename (decoded_options[i].arg); - continue; - } - - read_cmdline_option (opts, opts_set, - decoded_options + i, loc, lang_mask, handlers, - dc); - } -} - -/* Language mask determined at initialization. */ -static unsigned int initial_lang_mask; - -/* Initialize global options-related settings at start-up. */ - -void -init_options_once (void) -{ - /* Perform language-specific options initialization. */ - initial_lang_mask = lang_hooks.option_lang_mask (); - - lang_hooks.initialize_diagnostics (global_dc); -} - /* Initialize OPTS and OPTS_SET before using them in parsing options. */ void @@ -519,21 +312,6 @@ init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set) targetm.target_option.init_struct (opts); } -/* Decode command-line options to an array, like - decode_cmdline_options_to_array and with the same arguments but - using the default lang_mask. */ - -void -decode_cmdline_options_to_array_default_mask (unsigned int argc, - const char **argv, - struct cl_decoded_option **decoded_options, - unsigned int *decoded_options_count) -{ - decode_cmdline_options_to_array (argc, argv, - initial_lang_mask | CL_COMMON | CL_TARGET, - decoded_options, decoded_options_count); -} - /* If indicated by the optimization level LEVEL (-Os if SIZE is set, -Ofast if FAST is set), apply the option DEFAULT_OPT to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language mask @@ -725,7 +503,7 @@ static const struct default_options default_options_table[] = /* Default the options in OPTS and OPTS_SET based on the optimization settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */ -static void +void default_options_optimization (struct gcc_options *opts, struct gcc_options *opts_set, struct cl_decoded_option *decoded_options, @@ -826,69 +604,10 @@ default_options_optimization (struct gcc_options *opts, ofast, lang_mask, handlers, loc, dc); } -static void finish_options (struct gcc_options *, struct gcc_options *); - -/* Set *HANDLERS to the default set of option handlers for use in the - compilers proper (not the driver). */ -void -set_default_handlers (struct cl_option_handlers *handlers) -{ - handlers->unknown_option_callback = unknown_option_callback; - handlers->wrong_lang_callback = complain_wrong_lang; - handlers->post_handling_callback = post_handling_callback; - handlers->num_handlers = 3; - handlers->handlers[0].handler = lang_handle_option; - handlers->handlers[0].mask = initial_lang_mask; - handlers->handlers[1].handler = common_handle_option; - handlers->handlers[1].mask = CL_COMMON; - handlers->handlers[2].handler = target_handle_option; - handlers->handlers[2].mask = CL_TARGET; -} - -/* Parse command line options and set default flag values. Do minimal - options processing. The decoded options are in *DECODED_OPTIONS - and *DECODED_OPTIONS_COUNT; settings go in OPTS, OPTS_SET and DC; - the options are located at LOC. */ -void -decode_options (struct gcc_options *opts, struct gcc_options *opts_set, - struct cl_decoded_option *decoded_options, - unsigned int decoded_options_count, - location_t loc, diagnostic_context *dc) -{ - struct cl_option_handlers handlers; - - unsigned int lang_mask; - - lang_mask = initial_lang_mask; - - set_default_handlers (&handlers); - - /* Enable -Werror=coverage-mismatch by default. */ - control_warning_option (OPT_Wcoverage_mismatch, (int) DK_ERROR, true, - loc, lang_mask, - &handlers, opts, opts_set, dc); - - default_options_optimization (opts, opts_set, - decoded_options, decoded_options_count, - loc, lang_mask, &handlers, dc); - -#ifdef ENABLE_LTO - /* Clear any options currently held for LTO. */ - lto_clear_user_options (); -#endif - - read_cmdline_options (opts, opts_set, - decoded_options, decoded_options_count, - loc, lang_mask, - &handlers, dc); - - finish_options (opts, opts_set); -} - /* After all options have been read into OPTS and OPTS_SET, finalize settings of those options and diagnose incompatible combinations. */ -static void +void finish_options (struct gcc_options *opts, struct gcc_options *opts_set) { static bool first_time_p = true; @@ -1419,7 +1138,7 @@ print_specific_help (unsigned int include_flags, extra handling need to be listed here; if you simply want DECODED->value assigned to a variable, it happens automatically. */ -static bool +bool common_handle_option (struct gcc_options *opts, struct gcc_options *opts_set, const struct cl_decoded_option *decoded, @@ -2145,76 +1864,71 @@ set_debug_level (enum debug_info_type type, int extended, const char *arg, } } -/* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled, - or -1 if it isn't a simple on-off switch. */ +/* Arrange to dump core on error. (The regular error message is still + printed first, except in the case of abort ().) */ -int -option_enabled (int opt_idx, void *opts) +static void +setup_core_dumping (void) { - const struct cl_option *option = &(cl_options[opt_idx]); - struct gcc_options *optsg = (struct gcc_options *) opts; - void *flag_var = option_flag_var (opt_idx, optsg); - - if (flag_var) - switch (option->var_type) - { - case CLVC_BOOLEAN: - return *(int *) flag_var != 0; - - case CLVC_EQUAL: - return *(int *) flag_var == option->var_value; - - case CLVC_BIT_CLEAR: - return (*(int *) flag_var & option->var_value) == 0; - - case CLVC_BIT_SET: - return (*(int *) flag_var & option->var_value) != 0; - - case CLVC_STRING: - case CLVC_DEFER: - break; - } - return -1; +#ifdef SIGABRT + signal (SIGABRT, SIG_DFL); +#endif +#if defined(HAVE_SETRLIMIT) + { + struct rlimit rlim; + if (getrlimit (RLIMIT_CORE, &rlim) != 0) + fatal_error ("getting core file size maximum limit: %m"); + rlim.rlim_cur = rlim.rlim_max; + if (setrlimit (RLIMIT_CORE, &rlim) != 0) + fatal_error ("setting core file size limit to maximum: %m"); + } +#endif + diagnostic_abort_on_error (global_dc); } -/* Fill STATE with the current state of option OPTION in OPTS. Return - true if there is some state to store. */ +/* Parse a -d command line switch. */ -bool -get_option_state (struct gcc_options *opts, int option, - struct cl_option_state *state) +static void +decode_d_option (const char *arg) { - void *flag_var = option_flag_var (option, opts); - - if (flag_var == 0) - return false; + int c; - switch (cl_options[option].var_type) - { - case CLVC_BOOLEAN: - case CLVC_EQUAL: - state->data = flag_var; - state->size = sizeof (int); - break; - - case CLVC_BIT_CLEAR: - case CLVC_BIT_SET: - state->ch = option_enabled (option, opts); - state->data = &state->ch; - state->size = 1; - break; - - case CLVC_STRING: - state->data = *(const char **) flag_var; - if (state->data == 0) - state->data = ""; - state->size = strlen ((const char *) state->data) + 1; - break; + while (*arg) + switch (c = *arg++) + { + case 'A': + flag_debug_asm = 1; + break; + case 'p': + flag_print_asm_name = 1; + break; + case 'P': + flag_dump_rtl_in_asm = 1; + flag_print_asm_name = 1; + break; + case 'v': + graph_dump_format = vcg; + break; + case 'x': + rtl_dump_and_exit = 1; + break; + case 'D': /* These are handled by the preprocessor. */ + case 'I': + case 'M': + case 'N': + case 'U': + break; + case 'H': + setup_core_dumping (); + break; + case 'a': + enable_rtl_dump_file (); + break; - case CLVC_DEFER: - return false; - } - return true; + default: + warning (0, "unrecognized gcc debugging option: %c", c); + break; + } } /* Enable (or disable if VALUE is 0) a warning option ARG (language diff --git a/gcc/opts.h b/gcc/opts.h index 9bbbced..e819bf3 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -284,4 +284,28 @@ extern void control_warning_option (unsigned int opt_index, int kind, diagnostic_context *dc); extern void print_ignored_options (void); extern void handle_common_deferred_options (void); +extern bool common_handle_option (struct gcc_options *opts, + struct gcc_options *opts_set, + const struct cl_decoded_option *decoded, + unsigned int lang_mask, int kind, + location_t loc, + const struct cl_option_handlers *handlers, + diagnostic_context *dc); +extern bool target_handle_option (struct gcc_options *opts, + struct gcc_options *opts_set, + const struct cl_decoded_option *decoded, + unsigned int lang_mask, int kind, + location_t loc, + const struct cl_option_handlers *handlers, + diagnostic_context *dc); +extern void finish_options (struct gcc_options *opts, + struct gcc_options *opts_set); +extern void default_options_optimization (struct gcc_options *opts, + struct gcc_options *opts_set, + struct cl_decoded_option *decoded_options, + unsigned int decoded_options_count, + location_t loc, + unsigned int lang_mask, + const struct cl_option_handlers *handlers, + diagnostic_context *dc); #endif diff --git a/gcc/toplev.c b/gcc/toplev.c index 6964358..edbb076 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -28,11 +28,6 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "tm.h" -#include - -#ifdef HAVE_SYS_RESOURCE_H -# include -#endif #ifdef HAVE_SYS_TIMES_H # include @@ -114,7 +109,6 @@ static void init_asm_output (const char *); static void finalize (void); static void crash_signal (int) ATTRIBUTE_NORETURN; -static void setup_core_dumping (void); static void compile_file (void); /* True if we don't need a backend (e.g. preprocessing only). */ @@ -480,48 +474,6 @@ crash_signal (int signo) internal_error ("%s", strsignal (signo)); } -/* Arrange to dump core on error. (The regular error message is still - printed first, except in the case of abort().) */ - -static void -setup_core_dumping (void) -{ -#ifdef SIGABRT - signal (SIGABRT, SIG_DFL); -#endif -#if defined(HAVE_SETRLIMIT) - { - struct rlimit rlim; - if (getrlimit (RLIMIT_CORE, &rlim) != 0) - fatal_error ("getting core file size maximum limit: %m"); - rlim.rlim_cur = rlim.rlim_max; - if (setrlimit (RLIMIT_CORE, &rlim) != 0) - fatal_error ("setting core file size limit to maximum: %m"); - } -#endif - diagnostic_abort_on_error (global_dc); -} - - -/* Strip off a legitimate source ending from the input string NAME of - length LEN. Rather than having to know the names used by all of - our front ends, we strip off an ending of a period followed by - up to five characters. (Java uses ".class".) */ - -void -strip_off_ending (char *name, int len) -{ - int i; - for (i = 2; i < 6 && len > i; i++) - { - if (name[len - i] == '.') - { - name[len - i] = '\0'; - break; - } - } -} - /* Output a quoted string. */ void @@ -967,51 +919,6 @@ compile_file (void) targetm.asm_out.file_end (); } -/* Parse a -d... command line switch. */ - -void -decode_d_option (const char *arg) -{ - int c; - - while (*arg) - switch (c = *arg++) - { - case 'A': - flag_debug_asm = 1; - break; - case 'p': - flag_print_asm_name = 1; - break; - case 'P': - flag_dump_rtl_in_asm = 1; - flag_print_asm_name = 1; - break; - case 'v': - graph_dump_format = vcg; - break; - case 'x': - rtl_dump_and_exit = 1; - break; - case 'D': /* These are handled by the preprocessor. */ - case 'I': - case 'M': - case 'N': - case 'U': - break; - case 'H': - setup_core_dumping(); - break; - case 'a': - enable_rtl_dump_file (); - break; - - default: - warning (0, "unrecognized gcc debugging option: %c", c); - break; - } -} - /* Indexed by enum debug_info_type. */ const char *const debug_type_names[] = { diff --git a/gcc/toplev.h b/gcc/toplev.h index b7fd8799..46d9537 100644 --- a/gcc/toplev.h +++ b/gcc/toplev.h @@ -34,7 +34,6 @@ extern struct cl_decoded_option *save_decoded_options; extern unsigned int save_decoded_options_count; extern int toplev_main (int, char **); -extern void strip_off_ending (char *, int); extern void rest_of_decl_compilation (tree, int, int); extern void rest_of_type_compilation (tree, int); extern void tree_rest_of_compilation (tree); @@ -92,13 +91,6 @@ extern const char * default_pch_valid_p (const void *, size_t); /* The hashtable, so that the C front ends can pass it to cpplib. */ extern struct ht *ident_hash; -/* Handle -d switch. */ -extern void decode_d_option (const char *); - -/* Return true iff flags are set as if -ffast-math. */ -extern bool fast_math_flags_set_p (const struct gcc_options *); -extern bool fast_math_flags_struct_set_p (struct cl_optimization *); - /* Inline versions of the above for speed. */ #if GCC_VERSION < 3004