Fix --help=target (PR other/39851).
authorMartin Liska <mliska@suse.cz>
Tue, 29 Aug 2017 07:46:10 +0000 (09:46 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 29 Aug 2017 07:46:10 +0000 (07:46 +0000)
2017-08-29  Martin Liska  <mliska@suse.cz>

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  <mliska@suse.cz>

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
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-pragma.c
gcc/gcc.c
gcc/opts-common.c
gcc/opts-global.c
gcc/opts.c
gcc/opts.h
gcc/toplev.c

index 682f4054b040910e51420c020058088a96095c94..6c853d9932132136ca546b0325fe7bdaa7e685cf 100644 (file)
@@ -1,3 +1,24 @@
+2017-08-29  Martin Liska  <mliska@suse.cz>
+
+       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  <rguenther@suse.de>
        Dominik Infuehr <dominik.infuehr@theobroma-systems.com>
 
index 3dd50557907896680ea494f1630e38b0c9078fc1..fc5a807ccfef95b40f958607f553849757ed8cf1 100644 (file)
@@ -1,3 +1,10 @@
+2017-08-29  Martin Liska  <mliska@suse.cz>
+
+       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  <dmalcolm@redhat.com>
 
        * c-lex.c (interpret_float): Use token location
index 156c89d02940ded84bdcc4253df9bbbe687804f0..f4f2819aeceee70477613424f80affadba9def61 100644 (file)
@@ -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();
 
index 48b02b88bb5ce15c3cb4b3d9609b8631b9dfd65a..3b49aefc6ffee858365a4d3cdeadfab3209de074 100644 (file)
@@ -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;
index 6fa523140e7c4275041e7ff40e10178faa1e28d8..f1aad1f23b6ad5bb75599e62259c1ebb9192c1c7 100644 (file)
--- 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;
index 0cab42a021cc5f05e1b480763df484e6901f5233..d756814576851cb66871cca5375d9d3605ab10dc 100644 (file)
@@ -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;
       }
   
index fc55512e5542d79187381244fc0739812e950dda..343dbd3ac2c3892d8f17996395eef89e27417d90 100644 (file)
@@ -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,
index 19e8c7fb7d4d0a8f81b1150322b785ab2e77a7f2..a7f926b587fb3b60b7570639562cd5fa60c524af 100644 (file)
@@ -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;
       }
index 5599711cc7678bfd18a5ae8831ead79c00588f13..2774e2c8b40bdb042bf9a251b7dd1dca72b2bb41 100644 (file)
@@ -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);
index d23714c47738d0c5f8f98d2e6ad3dfd88ff47681..7d2b8fffa0bc545159302e7537beb098c616bedf 100644 (file)
@@ -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 ();