Hi.

The patch prints all values requested in multiple --help options.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

2019-05-03  Martin Liska  <mli...@suse.cz>

        PR other/90315
        * opts-global.c (decode_options): Print help for all
        help_option_arguments.
        * opts.c (print_help): Add new argument.
        (common_handle_option): Remember all values into
        help_option_arguments.
        * opts.h (print_help): Add new argument.
---
 gcc/opts-global.c | 4 ++--
 gcc/opts.c        | 7 ++++---
 gcc/opts.h        | 5 +++--
 3 files changed, 9 insertions(+), 7 deletions(-)


diff --git a/gcc/opts-global.c b/gcc/opts-global.c
index e6eaeb20bf7..ce0b1f61603 100644
--- a/gcc/opts-global.c
+++ b/gcc/opts-global.c
@@ -317,8 +317,8 @@ decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
   finish_options (opts, opts_set, loc);
 
   /* Print --help=* if used.  */
-  if (help_option_argument != NULL)
-    print_help (opts, lang_mask);
+  for (unsigned i = 0; i < help_option_arguments.length (); i++)
+    print_help (opts, lang_mask, help_option_arguments[i]);
 }
 
 /* Hold command-line options associated with stack limitation.  */
diff --git a/gcc/opts.c b/gcc/opts.c
index 71adc21cb26..1658046d2be 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -856,7 +856,7 @@ control_options_for_live_patching (struct gcc_options *opts,
 }
 
 /* --help option argument if set.  */
-const char *help_option_argument = NULL;
+vec<const char *> help_option_arguments;
 
 
 /* After all options at LOC have been read into OPTS and OPTS_SET,
@@ -2061,7 +2061,8 @@ check_alignment_argument (location_t loc, const char *flag, const char *name)
 /* Print help when OPT__help_ is set.  */
 
 void
-print_help (struct gcc_options *opts, unsigned int lang_mask)
+print_help (struct gcc_options *opts, unsigned int lang_mask,
+	    const char *help_option_argument)
 {
   const char *a = help_option_argument;
   unsigned int include_flags = 0;
@@ -2254,7 +2255,7 @@ common_handle_option (struct gcc_options *opts,
 
     case OPT__help_:
       {
-	help_option_argument = arg;
+	help_option_arguments.safe_push (arg);
 	opts->x_exit_after_options = true;
 	break;
       }
diff --git a/gcc/opts.h b/gcc/opts.h
index a8afc2385a9..e5723a946f7 100644
--- a/gcc/opts.h
+++ b/gcc/opts.h
@@ -419,7 +419,8 @@ extern bool target_handle_option (struct gcc_options *opts,
 extern void finish_options (struct gcc_options *opts,
 			    struct gcc_options *opts_set,
 			    location_t loc);
-extern void print_help (struct gcc_options *opts, unsigned int lang_mask);
+extern void print_help (struct gcc_options *opts, unsigned int lang_mask, const
+			char *help_option_argument);
 extern void default_options_optimization (struct gcc_options *opts,
 					  struct gcc_options *opts_set,
 					  struct cl_decoded_option *decoded_options,
@@ -443,7 +444,7 @@ extern const struct sanitizer_opts_s
   bool can_recover;
 } sanitizer_opts[];
 
-extern const char *help_option_argument;
+extern vec<const char *> help_option_arguments;
 
 extern void add_misspelling_candidates (auto_vec<char *> *candidates,
 					const struct cl_option *option,

Reply via email to