From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 37ADE3858401 for ; Tue, 31 Aug 2021 09:45:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 37ADE3858401 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9A87F1FB; Tue, 31 Aug 2021 02:45:26 -0700 (PDT) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.126]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 230403F5A1; Tue, 31 Aug 2021 02:45:26 -0700 (PDT) From: Richard Sandiford To: YunQiang Su Mail-Followup-To: YunQiang Su , gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH 1/3] md/define_c_enum: support value assignation References: <20210828120549.263010-1-yunqiang.su@cipunited.com> Date: Tue, 31 Aug 2021 10:45:24 +0100 In-Reply-To: <20210828120549.263010-1-yunqiang.su@cipunited.com> (YunQiang Su's message of "Sat, 28 Aug 2021 08:05:47 -0400") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=0.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, MEDICAL_SUBJECT, SPF_HELO_NONE, SPF_PASS, TXREP, UNWANTED_LANGUAGE_BODY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Aug 2021 09:45:29 -0000 YunQiang Su writes: > 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. This seems like a nice feature to have. However, the current (historical, more lisp-like) syntax for define_constants uses: (NAME VALUE) instead of: NAME = VALUE I think we should do the same here for consistency. Thanks, Richard > --- > gcc/doc/md.texi | 4 ++++ > gcc/read-md.c | 15 +++++++++++++-- > 2 files changed, 17 insertions(+), 2 deletions(-) > > diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi > index f8047aefc..1c1282c4c 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..43dfbe264 100644 > --- a/gcc/read-md.c > +++ b/gcc/read-md.c > @@ -901,7 +901,8 @@ md_decimal_string (int number) > void > md_reader::handle_enum (file_location loc, bool md_p) > { > - char *enum_name, *value_name; > + char *enum_name, *value_name, *token; > + unsigned int cur_value; > struct md_name name; > struct enum_type *def; > struct enum_value *ev; > @@ -928,6 +929,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 ()) != ']') > @@ -945,20 +947,29 @@ md_reader::handle_enum (file_location loc, bool md_p) > if (md_p) > { > value_name = concat (def->name, "_", name.string, NULL); > + value_name = strtok (value_name, "="); > + token = strtok (NULL, "="); > + if (token) > + cur_value = atoi (token); > upcase_string (value_name); > ev->name = xstrdup (name.string); > } > else > { > value_name = xstrdup (name.string); > + value_name = strtok (value_name, "="); > + token = strtok (NULL, "="); > + if (token) > + cur_value = atoi (token); > 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++; > } > }