From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2093) id 43CED3858408; Thu, 6 Jan 2022 16:56:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 43CED3858408 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Kito Cheng To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-6286] RISC-V: Allow extension name contain digit X-Act-Checkin: gcc X-Git-Author: Kito Cheng X-Git-Refname: refs/heads/master X-Git-Oldrev: 2793af17db239429ea3a2e26834e74daa6cff2c0 X-Git-Newrev: c8bdb3452054506f90283ea198a42a811679653d Message-Id: <20220106165635.43CED3858408@sourceware.org> Date: Thu, 6 Jan 2022 16:56:35 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 06 Jan 2022 16:56:35 -0000 https://gcc.gnu.org/g:c8bdb3452054506f90283ea198a42a811679653d commit r12-6286-gc8bdb3452054506f90283ea198a42a811679653d Author: Kito Cheng Date: Fri Dec 3 23:50:53 2021 +0800 RISC-V: Allow extension name contain digit RISC-V spec only allow alphabetical name for extension before, however vector extension add several extension named with digits, so we try to extend the naming rule. Ref: https://github.com/riscv/riscv-isa-manual/pull/718 gcc/ChangeLog: * common/config/riscv/riscv-common.c (riscv_subset_list::parse_multiletter_ext): Allow ext. name has digit. Diff: --- gcc/common/config/riscv/riscv-common.c | 42 ++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/gcc/common/config/riscv/riscv-common.c b/gcc/common/config/riscv/riscv-common.c index 338d09fb211..ecbca6cc544 100644 --- a/gcc/common/config/riscv/riscv-common.c +++ b/gcc/common/config/riscv/riscv-common.c @@ -785,24 +785,58 @@ riscv_subset_list::parse_multiletter_ext (const char *p, bool explicit_version_p = false; char *ext; char backup; + size_t len; + size_t end_of_version_pos, i; + bool found_any_number = false; + bool found_minor_version = false; - while (*++q != '\0' && *q != '_' && !ISDIGIT (*q)) + /* Parse until end of this extension including version number. */ + while (*++q != '\0' && *q != '_') ; backup = *q; *q = '\0'; - ext = xstrdup (subset); + len = q - subset; *q = backup; + end_of_version_pos = len; + /* Find the begin of version string. */ + for (i = len -1; i > 0; --i) + { + if (ISDIGIT (subset[i])) + { + found_any_number = true; + continue; + } + /* Might be version seperator, but need to check one more char, + we only allow p, so we could stop parsing if found + any more `p`. */ + if (subset[i] == 'p' && + !found_minor_version && + found_any_number && ISDIGIT (subset[i-1])) + { + found_minor_version = true; + continue; + } + + end_of_version_pos = i + 1; + break; + } + + backup = subset[end_of_version_pos]; + subset[end_of_version_pos] = '\0'; + ext = xstrdup (subset); + subset[end_of_version_pos] = backup; + end_of_version - = parsing_subset_version (ext, q, &major_version, &minor_version, + = parsing_subset_version (ext, subset + end_of_version_pos, &major_version, &minor_version, /* std_ext_p= */ false, &explicit_version_p); free (ext); if (end_of_version == NULL) return NULL; - *q = '\0'; + subset[end_of_version_pos] = '\0'; if (strlen (subset) == 1) {