YunQiang Su <yunqiang...@cipunited.com> 于2021年8月31日周二 下午7:09写道: > > Currently, the enums from define_c_enum and define_enum can only > has values one by one from 0. > > In fact we can support the behaviour just like C, aka like > (define_enum "mips_isa" [(mips1 1) mips2 (mips32 32) mips32r2]), > then we can get > enum mips_isa { > MIPS_ISA_MIPS1 = 1, > MIPS_ISA_MIPS2 = 2, > MIPS_ISA_MIPS32 = 32, > MIPS_ISA_MIPS32R2 = 33 > }; > > gcc/ChangeLog: > * read-md.c (md_reader::handle_enum): support value assignation. > * doc/md.texi: record define_c_enum value assignation support. > --- > gcc/doc/md.texi | 4 ++++ > gcc/read-md.c | 28 ++++++++++++++++++++++++---- > 2 files changed, 28 insertions(+), 4 deletions(-) > > diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi > index f8047aefc..2b41cb7fb 100644 > --- a/gcc/doc/md.texi > +++ b/gcc/doc/md.texi > @@ -11074,6 +11074,8 @@ The syntax is as follows: > (define_c_enum "@var{name}" [ > @var{value0} > @var{value1} > + (@var{value32} 32) > + @var{value33} > @dots{} > @var{valuen} > ]) > @@ -11086,6 +11088,8 @@ in @file{insn-constants.h}: > enum @var{name} @{ > @var{value0} = 0, > @var{value1} = 1, > + @var{value32} = 32, > + @var{value33} = 33, > @dots{} > @var{valuen} = @var{n} > @}; > diff --git a/gcc/read-md.c b/gcc/read-md.c > index bb419e0f6..2d01c69fc 100644 > --- a/gcc/read-md.c > +++ b/gcc/read-md.c > @@ -902,7 +902,9 @@ void > md_reader::handle_enum (file_location loc, bool md_p) > { > char *enum_name, *value_name; > - struct md_name name; > + unsigned int cur_value; > + struct md_name name, value; > + bool value_given;
This flag is not needed at all. So please ignore V2. See V3 please. > struct enum_type *def; > struct enum_value *ev; > void **slot; > @@ -928,6 +930,7 @@ md_reader::handle_enum (file_location loc, bool md_p) > *slot = def; > } > > + cur_value = def->num_values; > require_char_ws ('['); > > while ((c = read_skip_spaces ()) != ']') > @@ -937,28 +940,45 @@ md_reader::handle_enum (file_location loc, bool md_p) > error_at (loc, "unterminated construct"); > exit (1); > } > - unread_char (c); > - read_name (&name); > + value_given = false; > + if (c == '(') > + { > + read_name (&name); > + read_name (&value); > + require_char_ws (')'); > + cur_value = atoi(value.string); > + value_given = true; > + } > + else > + { > + unread_char (c); > + read_name (&name); > + } > > ev = XNEW (struct enum_value); > ev->next = 0; > if (md_p) > { > value_name = concat (def->name, "_", name.string, NULL); > + if (value_given) > + cur_value = atoi (value.string); > upcase_string (value_name); > ev->name = xstrdup (name.string); > } > else > { > value_name = xstrdup (name.string); > + if (value_given) > + cur_value = atoi (value.string); > ev->name = value_name; > } > ev->def = add_constant (get_md_constants (), value_name, > - md_decimal_string (def->num_values), def); > + md_decimal_string (cur_value), def); > > *def->tail_ptr = ev; > def->tail_ptr = &ev->next; > def->num_values++; > + cur_value++; > } > } > > -- > 2.30.2 >