From 130fcab02f1fbb097fc52fc9a8892472e3fa0c6c Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 29 Aug 2017 09:46:10 +0200 Subject: [PATCH] Fix --help=target (PR other/39851). 2017-08-29 Martin Liska PR other/39851 * gcc.c (driver_handle_option): Add new argument. * opts-common.c (handle_option): Pass target_option_override_hook. * opts-global.c (lang_handle_option): Add new option. (set_default_handlers): Add new argument. (decode_options): Likewise. * opts.c (target_handle_option): Likewise. (common_handle_option): Call target_option_override_hook. * opts.h (struct cl_option_handler_func): Add hook for target option override. (struct cl_option_handlers): Likewise. (set_default_handlers): Add new argument. (decode_options): Likewise. (common_handle_option): Likewise. (target_handle_option): Likewise. * toplev.c (toplev::main): Pass targetm.target_option.override hook. 2017-08-29 Martin Liska PR other/39851 * c-common.c (parse_optimize_options): Add argument to function call. * c-pragma.c (handle_pragma_diagnostic): Likewise. From-SVN: r251400 --- gcc/ChangeLog | 21 +++++++++++++++++++++ gcc/c-family/ChangeLog | 7 +++++++ gcc/c-family/c-common.c | 2 +- gcc/c-family/c-pragma.c | 2 +- gcc/gcc.c | 3 ++- gcc/opts-common.c | 3 ++- gcc/opts-global.c | 12 ++++++++---- gcc/opts.c | 14 ++++++++++---- gcc/opts.h | 18 +++++++++++++----- gcc/toplev.c | 3 ++- 10 files changed, 67 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 682f4054b04..6c853d99321 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2017-08-29 Martin Liska + + PR other/39851 + * gcc.c (driver_handle_option): Add new argument. + * opts-common.c (handle_option): Pass + target_option_override_hook. + * opts-global.c (lang_handle_option): Add new option. + (set_default_handlers): Add new argument. + (decode_options): Likewise. + * opts.c (target_handle_option): Likewise. + (common_handle_option): Call target_option_override_hook. + * opts.h (struct cl_option_handler_func): Add hook for + target option override. + (struct cl_option_handlers): Likewise. + (set_default_handlers): Add new argument. + (decode_options): Likewise. + (common_handle_option): Likewise. + (target_handle_option): Likewise. + * toplev.c (toplev::main): Pass targetm.target_option.override + hook. + 2017-08-29 Richard Biener Dominik Infuehr diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 3dd50557907..fc5a807ccfe 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2017-08-29 Martin Liska + + PR other/39851 + * c-common.c (parse_optimize_options): Add argument to function + call. + * c-pragma.c (handle_pragma_diagnostic): Likewise. + 2017-08-24 David Malcolm * c-lex.c (interpret_float): Use token location diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 156c89d0294..f4f2819aece 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -5497,7 +5497,7 @@ parse_optimize_options (tree args, bool attr_p) /* And apply them. */ decode_options (&global_options, &global_options_set, decoded_options, decoded_options_count, - input_location, global_dc); + input_location, global_dc, NULL); targetm.override_options_after_change(); diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c index 48b02b88bb5..3b49aefc6ff 100644 --- a/gcc/c-family/c-pragma.c +++ b/gcc/c-family/c-pragma.c @@ -815,7 +815,7 @@ handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy)) } struct cl_option_handlers handlers; - set_default_handlers (&handlers); + set_default_handlers (&handlers, NULL); const char *arg = NULL; if (cl_options[option_index].flags & CL_JOINED) arg = option_string + 1 + cl_options[option_index].opt_len; diff --git a/gcc/gcc.c b/gcc/gcc.c index 6fa523140e7..f1aad1f23b6 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -3769,7 +3769,8 @@ driver_handle_option (struct gcc_options *opts, unsigned int lang_mask ATTRIBUTE_UNUSED, int kind, location_t loc, const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED, - diagnostic_context *dc) + diagnostic_context *dc, + void (*) (void)) { size_t opt_index = decoded->opt_index; const char *arg = decoded->arg; diff --git a/gcc/opts-common.c b/gcc/opts-common.c index 0cab42a021c..d7568145768 100644 --- a/gcc/opts-common.c +++ b/gcc/opts-common.c @@ -993,7 +993,8 @@ handle_option (struct gcc_options *opts, { if (!handlers->handlers[i].handler (opts, opts_set, decoded, lang_mask, kind, loc, - handlers, dc)) + handlers, dc, + handlers->target_option_override_hook)) return false; } diff --git a/gcc/opts-global.c b/gcc/opts-global.c index fc55512e554..343dbd3ac2c 100644 --- a/gcc/opts-global.c +++ b/gcc/opts-global.c @@ -169,7 +169,8 @@ lang_handle_option (struct gcc_options *opts, unsigned int lang_mask ATTRIBUTE_UNUSED, int kind, location_t loc, const struct cl_option_handlers *handlers, - diagnostic_context *dc) + diagnostic_context *dc, + void (*) (void)) { gcc_assert (opts == &global_options); gcc_assert (opts_set == &global_options_set); @@ -269,10 +270,12 @@ decode_cmdline_options_to_array_default_mask (unsigned int argc, /* 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) +set_default_handlers (struct cl_option_handlers *handlers, + void (*target_option_override_hook) (void)) { handlers->unknown_option_callback = unknown_option_callback; handlers->wrong_lang_callback = complain_wrong_lang; + handlers->target_option_override_hook = target_option_override_hook; handlers->num_handlers = 3; handlers->handlers[0].handler = lang_handle_option; handlers->handlers[0].mask = initial_lang_mask; @@ -290,7 +293,8 @@ 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) + location_t loc, diagnostic_context *dc, + void (*target_option_override_hook) (void)) { struct cl_option_handlers handlers; @@ -298,7 +302,7 @@ decode_options (struct gcc_options *opts, struct gcc_options *opts_set, lang_mask = initial_lang_mask; - set_default_handlers (&handlers); + set_default_handlers (&handlers, target_option_override_hook); default_options_optimization (opts, opts_set, decoded_options, decoded_options_count, diff --git a/gcc/opts.c b/gcc/opts.c index 19e8c7fb7d4..a7f926b587f 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -217,7 +217,7 @@ target_handle_option (struct gcc_options *opts, unsigned int lang_mask ATTRIBUTE_UNUSED, int kind, location_t loc, const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED, - diagnostic_context *dc) + diagnostic_context *dc, void (*) (void)) { gcc_assert (dc == global_dc); gcc_assert (kind == DK_UNSPECIFIED); @@ -1716,7 +1716,8 @@ common_handle_option (struct gcc_options *opts, unsigned int lang_mask, int kind ATTRIBUTE_UNUSED, location_t loc, const struct cl_option_handlers *handlers, - diagnostic_context *dc) + diagnostic_context *dc, + void (*target_option_override_hook) (void)) { size_t scode = decoded->opt_index; const char *arg = decoded->arg; @@ -1743,6 +1744,7 @@ common_handle_option (struct gcc_options *opts, undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings) ? 0 : CL_UNDOCUMENTED); + target_option_override_hook (); /* First display any single language specific options. */ for (i = 0; i < cl_lang_count; i++) print_specific_help @@ -1762,6 +1764,7 @@ common_handle_option (struct gcc_options *opts, if (lang_mask == CL_DRIVER) break; + target_option_override_hook (); print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask); opts->x_exit_after_options = true; break; @@ -1888,8 +1891,11 @@ common_handle_option (struct gcc_options *opts, } if (include_flags) - print_specific_help (include_flags, exclude_flags, 0, opts, - lang_mask); + { + target_option_override_hook (); + print_specific_help (include_flags, exclude_flags, 0, opts, + lang_mask); + } opts->x_exit_after_options = true; break; } diff --git a/gcc/opts.h b/gcc/opts.h index 5599711cc76..2774e2c8b40 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -272,7 +272,8 @@ struct cl_option_handler_func const struct cl_decoded_option *decoded, unsigned int lang_mask, int kind, location_t loc, const struct cl_option_handlers *handlers, - diagnostic_context *dc); + diagnostic_context *dc, + void (*target_option_override_hook) (void)); /* The mask that must have some bit in common with the flags for the option for this particular handler to be used. */ @@ -294,6 +295,9 @@ struct cl_option_handlers void (*wrong_lang_callback) (const struct cl_decoded_option *decoded, unsigned int lang_mask); + /* Target option override hook. */ + void (*target_option_override_hook) (void); + /* The number of individual handlers. */ size_t num_handlers; @@ -338,13 +342,15 @@ extern 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); -extern void set_default_handlers (struct cl_option_handlers *handlers); +extern void set_default_handlers (struct cl_option_handlers *handlers, + void (*target_option_override_hook) (void)); extern 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); + diagnostic_context *dc, + void (*target_option_override_hook) (void)); extern int option_enabled (int opt_idx, void *opts); extern bool get_option_state (struct gcc_options *, int, struct cl_option_state *); @@ -391,14 +397,16 @@ extern bool common_handle_option (struct gcc_options *opts, unsigned int lang_mask, int kind, location_t loc, const struct cl_option_handlers *handlers, - diagnostic_context *dc); + diagnostic_context *dc, + void (*target_option_override_hook) (void)); 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); + diagnostic_context *dc, + void (*target_option_override_hook) (void)); extern void finish_options (struct gcc_options *opts, struct gcc_options *opts_set, location_t loc); diff --git a/gcc/toplev.c b/gcc/toplev.c index d23714c4773..7d2b8fffa0b 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -2149,7 +2149,8 @@ toplev::main (int argc, char **argv) enough to default flags appropriately. */ decode_options (&global_options, &global_options_set, save_decoded_options, save_decoded_options_count, - UNKNOWN_LOCATION, global_dc); + UNKNOWN_LOCATION, global_dc, + targetm.target_option.override); handle_common_deferred_options (); -- 2.30.2