This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Show valid options for -march and -mtune in --help=target for arm32 (PR driver/83193).
On 19/07/18 10:56, Martin Liška wrote:
> On 07/19/2018 11:28 AM, Richard Earnshaw (lists) wrote:
>> On 19/07/18 08:30, Martin Liška wrote:
>>> This is correct version of the patch. Anyway, I'm thinking about the ForceHelp
>>> attribute. I may do it in a bit different version. Let me come up with one another
>>> version of the patch.
>>>
>>> Martin
>>>
>>
>> I don't understand how this is supposed to work. -mcpu, -march and
>> -mtune all take strings now and have to be parsed to identify various
>> sub-components of the parameter. So why do you talk about these being
>> enum types?
>
> Yes, they are string types. But for purpose of --help output, it's nice
> to present to a user a list of possible values. That's the enum type.
>
> Please take a look at attached patch.
>
But that isn't the list of possible values. Please see the manual. A
valid CPU name can look something like
cortex-a53+crypto
and architectures names can be even more complex.
You can't get this from that list of enum values.
R.
> Thanks,
> Martin
>
>>
>> R.
>>
>>>
>>> 0001-Show-valid-options-for-march-and-mtune-in-help-targe-v3.patch
>>>
>>>
>>> From 9bfc1400213911b4508e90198df7b2dd11efc85c Mon Sep 17 00:00:00 2001
>>> From: marxin <mliska@suse.cz>
>>> Date: Tue, 20 Feb 2018 10:39:09 +0100
>>> Subject: [PATCH] Show valid options for -march and -mtune in --help=target for
>>> arm32 (PR driver/83193).
>>>
>>> gcc/ChangeLog:
>>>
>>> 2018-07-18 Martin Liska <mliska@suse.cz>
>>>
>>> PR driver/83193
>>> * config/arm/arm-tables.opt: Add ForceHelp flag for
>>> processor_type and arch_name enum types.
>>> * config/arm/parsecpu.awk: Likewise.
>>> * doc/options.texi: Document new flag ForceHelp.
>>> * opt-read.awk: Parse ForceHelp and set it in construction.
>>> * optc-gen.awk: Likewise.
>>> * opts.c (print_filtered_help): Handle force_help option.
>>> * opts.h (struct cl_enum): New field force_help.
>>> ---
>>> gcc/config/arm/arm-tables.opt | 4 ++--
>>> gcc/config/arm/parsecpu.awk | 4 ++--
>>> gcc/doc/options.texi | 4 ++++
>>> gcc/opt-read.awk | 3 +++
>>> gcc/optc-gen.awk | 3 ++-
>>> gcc/opts.c | 3 ++-
>>> gcc/opts.h | 3 +++
>>> 7 files changed, 18 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/gcc/config/arm/arm-tables.opt b/gcc/config/arm/arm-tables.opt
>>> index eacee746a39..c74229e27d7 100644
>>> --- a/gcc/config/arm/arm-tables.opt
>>> +++ b/gcc/config/arm/arm-tables.opt
>>> @@ -21,7 +21,7 @@
>>> ; <http://www.gnu.org/licenses/>.
>>>
>>> Enum
>>> -Name(processor_type) Type(enum processor_type)
>>> +Name(processor_type) Type(enum processor_type) ForceHelp
>>> Known ARM CPUs (for use with the -mcpu= and -mtune= options):
>>>
>>> EnumValue
>>> @@ -298,7 +298,7 @@ EnumValue
>>> Enum(processor_type) String(cortex-r52) Value( TARGET_CPU_cortexr52)
>>>
>>> Enum
>>> -Name(arm_arch) Type(int)
>>> +Name(arm_arch) Type(int) ForceHelp
>>> Known ARM architectures (for use with the -march= option):
>>>
>>> EnumValue
>>> diff --git a/gcc/config/arm/parsecpu.awk b/gcc/config/arm/parsecpu.awk
>>> index aabe1b0c64c..c499a5ed0ce 100644
>>> --- a/gcc/config/arm/parsecpu.awk
>>> +++ b/gcc/config/arm/parsecpu.awk
>>> @@ -441,7 +441,7 @@ function gen_opt () {
>>> boilerplate("md")
>>>
>>> print "Enum"
>>> - print "Name(processor_type) Type(enum processor_type)"
>>> + print "Name(processor_type) Type(enum processor_type) ForceHelp"
>>> print "Known ARM CPUs (for use with the -mcpu= and -mtune= options):\n"
>>>
>>> ncpus = split (cpu_list, cpus)
>>> @@ -454,7 +454,7 @@ function gen_opt () {
>>> }
>>>
>>> print "Enum"
>>> - print "Name(arm_arch) Type(int)"
>>> + print "Name(arm_arch) Type(int) ForceHelp"
>>> print "Known ARM architectures (for use with the -march= option):\n"
>>>
>>> narchs = split (arch_list, archs)
>>> diff --git a/gcc/doc/options.texi b/gcc/doc/options.texi
>>> index b3ca9f6fce6..af77ad78e8c 100644
>>> --- a/gcc/doc/options.texi
>>> +++ b/gcc/doc/options.texi
>>> @@ -120,6 +120,10 @@ being described by this record.
>>> This property is required; it says what value (representable as
>>> @code{int}) should be used for the given string.
>>>
>>> +@item ForceHelp
>>> +This property is optional. If present, enum values are printed
>>> +in @option{--help} output.
>>> +
>>> @item Canonical
>>> This property is optional. If present, it says the present string is
>>> the canonical one among all those with the given value. Other strings
>>> diff --git a/gcc/opt-read.awk b/gcc/opt-read.awk
>>> index 2072958e6ba..6d2be9e99d7 100644
>>> --- a/gcc/opt-read.awk
>>> +++ b/gcc/opt-read.awk
>>> @@ -89,6 +89,9 @@ BEGIN {
>>> enum_index[name] = n_enums
>>> enum_unknown_error[name] = unknown_error
>>> enum_help[name] = $3
>>> + enum_force_help[name] = test_flag("ForceHelp", props, "true")
>>> + if (enum_force_help[name] == "")
>>> + enum_force_help[name] = "false"
>>> n_enums++
>>> }
>>> else if ($1 == "EnumValue") {
>>> diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk
>>> index bf177e86330..5c4f4239db0 100644
>>> --- a/gcc/optc-gen.awk
>>> +++ b/gcc/optc-gen.awk
>>> @@ -167,7 +167,8 @@ for (i = 0; i < n_enums; i++) {
>>> print " cl_enum_" name "_data,"
>>> print " sizeof (" enum_type[name] "),"
>>> print " cl_enum_" name "_set,"
>>> - print " cl_enum_" name "_get"
>>> + print " cl_enum_" name "_get,"
>>> + print " " enum_force_help[name]
>>> print " },"
>>> }
>>> print "};"
>>> diff --git a/gcc/opts.c b/gcc/opts.c
>>> index b8ae8756b4f..214ef806cd5 100644
>>> --- a/gcc/opts.c
>>> +++ b/gcc/opts.c
>>> @@ -1337,7 +1337,8 @@ print_filtered_help (unsigned int include_flags,
>>> {
>>> unsigned int j, pos;
>>>
>>> - if (opts->x_help_enum_printed[i] != 1)
>>> + if (opts->x_help_enum_printed[i] != 1
>>> + && !cl_enums[i].force_help)
>>> continue;
>>> if (cl_enums[i].help == NULL)
>>> continue;
>>> diff --git a/gcc/opts.h b/gcc/opts.h
>>> index 3723bdbf95b..c8777b3cd6a 100644
>>> --- a/gcc/opts.h
>>> +++ b/gcc/opts.h
>>> @@ -193,6 +193,9 @@ struct cl_enum
>>>
>>> /* Function to get the value of a variable of this type. */
>>> int (*get) (const void *var);
>>> +
>>> + /* Force enum to be printed in help. */
>>> + bool force_help;
>>> };
>>>
>>> extern const struct cl_enum cl_enums[];
>>>
>>
>
>
> 0001-Show-valid-options-for-march-and-mtune-in-help-targe.patch
>
>
> From dcb80bbe7b82388f5c7147320d509d6e5a687033 Mon Sep 17 00:00:00 2001
> From: marxin <mliska@suse.cz>
> Date: Tue, 20 Feb 2018 10:39:09 +0100
> Subject: [PATCH] Show valid options for -march and -mtune in --help=target for
> arm32 (PR driver/83193).
>
> gcc/ChangeLog:
>
> 2018-07-19 Martin Liska <mliska@suse.cz>
>
> * config/arm/arm.opt: Use HelpEnum flag.
> * doc/options.texi: Document it.
> * opt-functions.awk: Parse HelpEnum and fill up
> proper index into enum list.
> * opts.c (print_filtered_help): Mention also enums
> that are not directly, but mentioned in HelpEnum.
> * opts.h (struct cl_option): Add new field var_enum_help
> and change var_enum to signed version.
> ---
> gcc/config/arm/arm.opt | 6 +++---
> gcc/doc/options.texi | 5 +++++
> gcc/opt-functions.awk | 25 +++++++++++++++----------
> gcc/opts.c | 3 +++
> gcc/opts.h | 5 ++++-
> 5 files changed, 30 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt
> index a1286a4a861..f182208edd1 100644
> --- a/gcc/config/arm/arm.opt
> +++ b/gcc/config/arm/arm.opt
> @@ -82,7 +82,7 @@ mapcs-stack-check
> Target Report Mask(APCS_STACK) Undocumented
>
> march=
> -Target RejectNegative ToLower Joined Var(arm_arch_string)
> +Target RejectNegative ToLower Joined Var(arm_arch_string) HelpEnum(arm_arch)
> Specify the name of the target architecture.
>
> ; Other arm_arch values are loaded from arm-tables.opt
> @@ -107,7 +107,7 @@ Target Report Mask(CALLER_INTERWORKING)
> Thumb: Assume function pointers may go to non-Thumb aware code.
>
> mcpu=
> -Target RejectNegative ToLower Joined Var(arm_cpu_string)
> +Target RejectNegative ToLower Joined Var(arm_cpu_string) HelpEnum(processor_type)
> Specify the name of the target CPU.
>
> mfloat-abi=
> @@ -232,7 +232,7 @@ Target Report Mask(TPCS_LEAF_FRAME)
> Thumb: Generate (leaf) stack frames even if not needed.
>
> mtune=
> -Target RejectNegative ToLower Joined Var(arm_tune_string)
> +Target RejectNegative ToLower Joined Var(arm_tune_string) HelpEnum(processor_type)
> Tune code for the given processor.
>
> mprint-tune-info
> diff --git a/gcc/doc/options.texi b/gcc/doc/options.texi
> index b3ca9f6fce6..e234cc809d5 100644
> --- a/gcc/doc/options.texi
> +++ b/gcc/doc/options.texi
> @@ -120,6 +120,11 @@ being described by this record.
> This property is required; it says what value (representable as
> @code{int}) should be used for the given string.
>
> +@item EnumHelp(@var{name})
> +Some string options accept enum values as arguments.
> +When using @samp{EnumHelp}, list of possible values is listed
> +in @option{--help} output.
> +
> @item Canonical
> This property is optional. If present, it says the present string is
> the canonical one among all those with the given value. Other strings
> diff --git a/gcc/opt-functions.awk b/gcc/opt-functions.awk
> index 2c371e5a23a..9737b6b115b 100644
> --- a/gcc/opt-functions.awk
> +++ b/gcc/opt-functions.awk
> @@ -232,37 +232,42 @@ function var_type_struct(flags)
> }
>
> # Given that an option has flags FLAGS, return an initializer for the
> -# "var_enum", "var_type" and "var_value" fields of its cl_options[] entry.
> +# "var_enum", "var_enum_help", "var_type" and "var_value" fields of its cl_options[] entry.
> function var_set(flags)
> {
> + help_enum_index = "-1"
> + if (flag_set_p("HelpEnum.*", flags)) {
> + help_enum_index = enum_index[opt_args("HelpEnum", flags)];
> + }
> +
> if (flag_set_p("Defer", flags))
> - return "0, CLVC_DEFER, 0"
> + return "-1, -1, CLVC_DEFER, 0"
> s = nth_arg(1, opt_args("Var", flags))
> if (s != "")
> - return "0, CLVC_EQUAL, " s
> + return "-1, -1, CLVC_EQUAL, " s
> s = opt_args("Mask", flags);
> if (s != "") {
> vn = var_name(flags);
> if (vn)
> - return "0, CLVC_BIT_SET, OPTION_MASK_" s
> + return "-1, -1, CLVC_BIT_SET, OPTION_MASK_" s
> else
> - return "0, CLVC_BIT_SET, MASK_" s
> + return "-1, -1, CLVC_BIT_SET, MASK_" s
> }
> s = nth_arg(0, opt_args("InverseMask", flags));
> if (s != "") {
> vn = var_name(flags);
> if (vn)
> - return "0, CLVC_BIT_CLEAR, OPTION_MASK_" s
> + return "-1, -1, CLVC_BIT_CLEAR, OPTION_MASK_" s
> else
> - return "0, CLVC_BIT_CLEAR, MASK_" s
> + return "-1, -1, CLVC_BIT_CLEAR, MASK_" s
> }
> if (flag_set_p("Enum.*", flags)) {
> en = opt_args("Enum", flags);
> - return enum_index[en] ", CLVC_ENUM, 0"
> + return enum_index[en] ", -1, CLVC_ENUM, 0"
> }
> if (var_type(flags) == "const char *")
> - return "0, CLVC_STRING, 0"
> - return "0, CLVC_BOOLEAN, 0"
> + return "-1, " help_enum_index ", CLVC_STRING, 0"
> + return "-1, -1, CLVC_BOOLEAN, 0"
> }
>
> # Given that an option called NAME has flags FLAGS, return an initializer
> diff --git a/gcc/opts.c b/gcc/opts.c
> index b8ae8756b4f..37e779e8732 100644
> --- a/gcc/opts.c
> +++ b/gcc/opts.c
> @@ -1303,6 +1303,9 @@ print_filtered_help (unsigned int include_flags,
> if (option->var_type == CLVC_ENUM
> && opts->x_help_enum_printed[option->var_enum] != 2)
> opts->x_help_enum_printed[option->var_enum] = 1;
> + else if (option->var_enum_help != -1
> + && opts->x_help_enum_printed[option->var_enum_help] != 2)
> + opts->x_help_enum_printed[option->var_enum_help] = 1;
> }
>
> if (! found)
> diff --git a/gcc/opts.h b/gcc/opts.h
> index 3723bdbf95b..ba79a36d7ab 100644
> --- a/gcc/opts.h
> +++ b/gcc/opts.h
> @@ -107,7 +107,10 @@ struct cl_option
> unsigned short flag_var_offset;
> /* Index in cl_enums of enum used for this option's arguments, for
> CLVC_ENUM options. */
> - unsigned short var_enum;
> + short var_enum;
> + /* Index in cl_enums of enum used for string options which
> + have strings as possible values. */
> + short var_enum_help;
> /* How this option's value is determined and sets a field. */
> enum cl_var_type var_type;
> /* Value or bit-mask with which to set a field. */
>