diff mbox series

[PATCH/RFC] options: Make --help= to emit values post-overrided

Message ID 9eb8a897-e4ee-a80a-4456-1e088ab8f301@linux.ibm.com
State New
Headers show
Series [PATCH/RFC] options: Make --help= to emit values post-overrided | expand

Commit Message

Kewen.Lin Aug. 6, 2020, 12:37 p.m. UTC
Hi,

When I was working to update patch as Richard's review comments
here https://gcc.gnu.org/pipermail/gcc-patches/2020-August/551474.html,
I noticed that the options "-Q --help=params" don't show the final values
after target option overriding, instead it emits the default values in
params.opt (without any explicit param settings).

I guess it's more meaningful to get it to emit values post-overrided,
to avoid possible confusion for users.  Does it make sense?
Or are there any concerns?

btw, not sure whether it's a good idea to move target_option_override_hook
call into print_specific_help and use one function local static
variable to control it's called once for all kinds of help dumping
(possible combination), then can remove the calls in function 
common_handle_option.


BR,
Kewen
-----

gcc/ChangeLog:

	* opts-global.c (decode_options): Adjust call to print_help.
	* opts.c (print_help): Add one function point argument
	target_option_override_hook and call it before print_specific_help.
	* opts.h (print_help): Add one more argument to function declare.

Comments

Segher Boessenkool Aug. 6, 2020, 10:04 p.m. UTC | #1
Hi!

On Thu, Aug 06, 2020 at 08:37:23PM +0800, Kewen.Lin wrote:
> When I was working to update patch as Richard's review comments
> here https://gcc.gnu.org/pipermail/gcc-patches/2020-August/551474.html,
> I noticed that the options "-Q --help=params" don't show the final values
> after target option overriding, instead it emits the default values in
> params.opt (without any explicit param settings).
> 
> I guess it's more meaningful to get it to emit values post-overrided,
> to avoid possible confusion for users.  Does it make sense?
> Or are there any concerns?

I think this makes a lot of sense.

> btw, not sure whether it's a good idea to move target_option_override_hook
> call into print_specific_help and use one function local static
> variable to control it's called once for all kinds of help dumping
> (possible combination), then can remove the calls in function 
> common_handle_option.

I cannot easily imagine what that will look like...  it could easily be
worse than what you have here (callbacks aren't so nice, but there are
worse things).

> @@ -2145,9 +2146,11 @@ print_help (struct gcc_options *opts, unsigned int lang_mask,
>    if (!(include_flags & CL_PARAMS))
>      exclude_flags |= CL_PARAMS;
>  
> -  if (include_flags)
> +  if (include_flags) {
> +    target_option_override_hook ();
>      print_specific_help (include_flags, exclude_flags, 0, opts,
>  			 lang_mask);
> +  }
>  }

Indenting should be like

  if (include_flags)
    {
      target_option_override_hook ();
      print_specific_help (include_flags, exclude_flags, 0, opts, lang_mask);
    }


Segher
Kewen.Lin Aug. 7, 2020, 2:44 a.m. UTC | #2
Hi Segher!

Thanks for the comments!

on 2020/8/7 上午6:04, Segher Boessenkool wrote:
> Hi!
> 
> On Thu, Aug 06, 2020 at 08:37:23PM +0800, Kewen.Lin wrote:
>> When I was working to update patch as Richard's review comments
>> here https://gcc.gnu.org/pipermail/gcc-patches/2020-August/551474.html,
>> I noticed that the options "-Q --help=params" don't show the final values
>> after target option overriding, instead it emits the default values in
>> params.opt (without any explicit param settings).
>>
>> I guess it's more meaningful to get it to emit values post-overrided,
>> to avoid possible confusion for users.  Does it make sense?
>> Or are there any concerns?
> 
> I think this makes a lot of sense.
> 
>> btw, not sure whether it's a good idea to move target_option_override_hook
>> call into print_specific_help and use one function local static
>> variable to control it's called once for all kinds of help dumping
>> (possible combination), then can remove the calls in function 
>> common_handle_option.
> 
> I cannot easily imagine what that will look like...  it could easily be
> worse than what you have here (callbacks aren't so nice, but there are
> worse things).
> 

I attached opts_alt2.diff to be more specific for this, both alt1 and alt2
follow the existing callback scheme, alt2 aims to avoid possible multiple
times target_option_override_hook calls when we have several --help= or
similar, but I guess alt1 is also fine since the hook should be allowed to
be called more than once.

>> @@ -2145,9 +2146,11 @@ print_help (struct gcc_options *opts, unsigned int lang_mask,
>>    if (!(include_flags & CL_PARAMS))
>>      exclude_flags |= CL_PARAMS;
>>  
>> -  if (include_flags)
>> +  if (include_flags) {
>> +    target_option_override_hook ();
>>      print_specific_help (include_flags, exclude_flags, 0, opts,
>>  			 lang_mask);
>> +  }
>>  }
> 
> Indenting should be like
> 
>   if (include_flags)
>     {
>       target_option_override_hook ();
>       print_specific_help (include_flags, exclude_flags, 0, opts, lang_mask);
>     }
> 

Thanks for catching!  Updated.

BR,
Kewen
diff --git a/gcc/opts-global.c b/gcc/opts-global.c
index b1a8429dc3c..ec960c87c9a 100644
--- a/gcc/opts-global.c
+++ b/gcc/opts-global.c
@@ -328,7 +328,7 @@ decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
   const char *arg;
 
   FOR_EACH_VEC_ELT (help_option_arguments, i, arg)
-    print_help (opts, lang_mask, arg);
+    print_help (opts, lang_mask, arg, target_option_override_hook);
 }
 
 /* Hold command-line options associated with stack limitation.  */
diff --git a/gcc/opts.c b/gcc/opts.c
index 499eb900643..fb4d4b8aa43 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -2017,7 +2017,8 @@ check_alignment_argument (location_t loc, const char *flag, const char *name)
 
 void
 print_help (struct gcc_options *opts, unsigned int lang_mask,
-	    const char *help_option_argument)
+	    const char *help_option_argument,
+	    void (*target_option_override_hook) (void))
 {
   const char *a = help_option_argument;
   unsigned int include_flags = 0;
@@ -2146,8 +2147,11 @@ print_help (struct gcc_options *opts, unsigned int lang_mask,
     exclude_flags |= CL_PARAMS;
 
   if (include_flags)
-    print_specific_help (include_flags, exclude_flags, 0, opts,
-			 lang_mask);
+    {
+      gcc_assert (target_option_override_hook);
+      target_option_override_hook ();
+      print_specific_help (include_flags, exclude_flags, 0, opts, lang_mask);
+    }
 }
 
 /* Handle target- and language-independent options.  Return zero to
diff --git a/gcc/opts.h b/gcc/opts.h
index 8f594b46e33..9a837305af1 100644
--- a/gcc/opts.h
+++ b/gcc/opts.h
@@ -419,8 +419,9 @@ 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, const
-			char *help_option_argument);
+extern void print_help (struct gcc_options *opts, unsigned int lang_mask,
+			const char *help_option_argument,
+			void (*target_option_override_hook) (void));
 extern void default_options_optimization (struct gcc_options *opts,
 					  struct gcc_options *opts_set,
 					  struct cl_decoded_option *decoded_options,
diff --git a/gcc/opts-global.c b/gcc/opts-global.c
index b1a8429dc3c..ec960c87c9a 100644
--- a/gcc/opts-global.c
+++ b/gcc/opts-global.c
@@ -328,7 +328,7 @@ decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
   const char *arg;
 
   FOR_EACH_VEC_ELT (help_option_arguments, i, arg)
-    print_help (opts, lang_mask, arg);
+    print_help (opts, lang_mask, arg, target_option_override_hook);
 }
 
 /* Hold command-line options associated with stack limitation.  */
diff --git a/gcc/opts.c b/gcc/opts.c
index 499eb900643..6d07fa6e17e 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1579,7 +1579,8 @@ print_specific_help (unsigned int include_flags,
 		     unsigned int exclude_flags,
 		     unsigned int any_flags,
 		     struct gcc_options *opts,
-		     unsigned int lang_mask)
+		     unsigned int lang_mask,
+		     void (*target_option_override_hook) (void))
 {
   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
   const char * description = NULL;
@@ -1664,6 +1665,14 @@ print_specific_help (unsigned int include_flags,
 	}
     }
 
+  static bool call_override_once_p = false;
+  if (!call_override_once_p)
+    {
+      gcc_assert (target_option_override_hook);
+      target_option_override_hook ();
+      call_override_once_p = true;
+    }
+
   printf ("%s%s:\n", description, descrip_extra);
   print_filtered_help (include_flags, exclude_flags, any_flags,
 		       opts->x_help_columns, opts, lang_mask);
@@ -2017,7 +2026,8 @@ check_alignment_argument (location_t loc, const char *flag, const char *name)
 
 void
 print_help (struct gcc_options *opts, unsigned int lang_mask,
-	    const char *help_option_argument)
+	    const char *help_option_argument,
+	    void (*target_option_override_hook) (void))
 {
   const char *a = help_option_argument;
   unsigned int include_flags = 0;
@@ -2146,8 +2156,8 @@ print_help (struct gcc_options *opts, unsigned int lang_mask,
     exclude_flags |= CL_PARAMS;
 
   if (include_flags)
-    print_specific_help (include_flags, exclude_flags, 0, opts,
-			 lang_mask);
+    print_specific_help (include_flags, exclude_flags, 0, opts, lang_mask,
+			 target_option_override_hook);
 }
 
 /* Handle target- and language-independent options.  Return zero to
@@ -2186,18 +2196,19 @@ 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
-	    (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
-	     lang_mask);
+	  print_specific_help (1U << i,
+			       (all_langs_mask & (~(1U << i))) | undoc_mask, 0,
+			       opts, lang_mask, target_option_override_hook);
 	/* Next display any multi language specific options.  */
-	print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
+	print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask,
+			     target_option_override_hook);
 	/* Then display any remaining, non-language options.  */
 	for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
 	  if (i != CL_DRIVER)
-	    print_specific_help (i, undoc_mask, 0, opts, lang_mask);
+	    print_specific_help (i, undoc_mask, 0, opts, lang_mask,
+				 target_option_override_hook);
 	opts->x_exit_after_options = true;
 	break;
       }
@@ -2206,8 +2217,8 @@ 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);
+      print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask,
+			   target_option_override_hook);
       opts->x_exit_after_options = true;
       break;
 
diff --git a/gcc/opts.h b/gcc/opts.h
index 8f594b46e33..9a837305af1 100644
--- a/gcc/opts.h
+++ b/gcc/opts.h
@@ -419,8 +419,9 @@ 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, const
-			char *help_option_argument);
+extern void print_help (struct gcc_options *opts, unsigned int lang_mask,
+			const char *help_option_argument,
+			void (*target_option_override_hook) (void));
 extern void default_options_optimization (struct gcc_options *opts,
 					  struct gcc_options *opts_set,
 					  struct cl_decoded_option *decoded_options,
Segher Boessenkool Aug. 7, 2020, 2:42 p.m. UTC | #3
Hi!

On Fri, Aug 07, 2020 at 10:44:10AM +0800, Kewen.Lin wrote:
> > I think this makes a lot of sense.
> > 
> >> btw, not sure whether it's a good idea to move target_option_override_hook
> >> call into print_specific_help and use one function local static
> >> variable to control it's called once for all kinds of help dumping
> >> (possible combination), then can remove the calls in function 
> >> common_handle_option.
> > 
> > I cannot easily imagine what that will look like...  it could easily be
> > worse than what you have here (callbacks aren't so nice, but there are
> > worse things).
> > 
> 
> I attached opts_alt2.diff to be more specific for this, both alt1 and alt2
> follow the existing callback scheme, alt2 aims to avoid possible multiple
> times target_option_override_hook calls when we have several --help= or
> similar, but I guess alt1 is also fine since the hook should be allowed to
> be called more than once.

It could take quadratic time in alt1...  Mostly a theoretical problem I
think, but still.

All options look fine to me, but you need someone else to approve this ;-)

One thing:

> @@ -1664,6 +1665,14 @@ print_specific_help (unsigned int include_flags,
>  	}
>      }
>  
> +  static bool call_override_once_p = false;
> +  if (!call_override_once_p)
> +    {
> +      gcc_assert (target_option_override_hook);
> +      target_option_override_hook ();
> +      call_override_once_p = true;
> +    }

That assert is pretty random, nothing else using the hook assert it
isn't zero; it immediately and always calls the hook right away, so you
will get a nice ICE with backtrace if it is zero *anyway*.

Cheers,


Segher
Martin Liška Aug. 10, 2020, 8:05 a.m. UTC | #4
On 8/7/20 12:04 AM, Segher Boessenkool wrote:
> I think this makes a lot of sense.

Hello.

I also support the patch (as Segher, I can't approve it).

Martin
diff mbox series

Patch

diff --git a/gcc/opts-global.c b/gcc/opts-global.c
index b1a8429dc3c..ec960c87c9a 100644
--- a/gcc/opts-global.c
+++ b/gcc/opts-global.c
@@ -328,7 +328,7 @@  decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
   const char *arg;
 
   FOR_EACH_VEC_ELT (help_option_arguments, i, arg)
-    print_help (opts, lang_mask, arg);
+    print_help (opts, lang_mask, arg, target_option_override_hook);
 }
 
 /* Hold command-line options associated with stack limitation.  */
diff --git a/gcc/opts.c b/gcc/opts.c
index 499eb900643..df184f909e6 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -2017,7 +2017,8 @@  check_alignment_argument (location_t loc, const char *flag, const char *name)
 
 void
 print_help (struct gcc_options *opts, unsigned int lang_mask,
-	    const char *help_option_argument)
+	    const char *help_option_argument,
+	    void (*target_option_override_hook) (void))
 {
   const char *a = help_option_argument;
   unsigned int include_flags = 0;
@@ -2145,9 +2146,11 @@  print_help (struct gcc_options *opts, unsigned int lang_mask,
   if (!(include_flags & CL_PARAMS))
     exclude_flags |= CL_PARAMS;
 
-  if (include_flags)
+  if (include_flags) {
+    target_option_override_hook ();
     print_specific_help (include_flags, exclude_flags, 0, opts,
 			 lang_mask);
+  }
 }
 
 /* Handle target- and language-independent options.  Return zero to
diff --git a/gcc/opts.h b/gcc/opts.h
index 8f594b46e33..9a837305af1 100644
--- a/gcc/opts.h
+++ b/gcc/opts.h
@@ -419,8 +419,9 @@  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, const
-			char *help_option_argument);
+extern void print_help (struct gcc_options *opts, unsigned int lang_mask,
+			const char *help_option_argument,
+			void (*target_option_override_hook) (void));
 extern void default_options_optimization (struct gcc_options *opts,
 					  struct gcc_options *opts_set,
 					  struct cl_decoded_option *decoded_options,