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 <mli...@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 <mli...@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 <mli...@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 <mli...@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. */ >