From patchwork Wed Jul 12 03:27:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lehua Ding X-Patchwork-Id: 1806568 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from server2.sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4R138v1Fwfz20b9 for ; Wed, 12 Jul 2023 13:27:59 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C798F38582B7 for ; Wed, 12 Jul 2023 03:27:56 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtpbg154.qq.com (smtpbg154.qq.com [15.184.224.54]) by sourceware.org (Postfix) with ESMTPS id 7CC063858D20 for ; Wed, 12 Jul 2023 03:27:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7CC063858D20 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivai.ai Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivai.ai X-QQ-mid: bizesmtp89t1689132451t9yoaal9 Received: from server1.localdomain ( [58.60.1.22]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 12 Jul 2023 11:27:30 +0800 (CST) X-QQ-SSF: 01400000000000B0F000000A0000000 X-QQ-FEAT: ytaD8vzdTQCk1PHKmhOvEDBXppBB8takhWl/n24DbarZJkHb3NcatUDVvkZ/4 taRookgeluhsJzFhojvdMNeGsRG70xHmnGLTtL1aTycw2AKuYA8XpH2N8U4cD4kDWfZAAh5 hLjZgGwC+HJRavFIAitCfrNjPXR8+i+feE0tJzoOyUw+53cN0Kedabxj2aGSyXXmEuKb4eR P3F4EpD7vadJSmatDzqG13u2YSsmfr65htHTUn9g3Smuq0X1ExYEFTWBuAWxJnwy7+pOnyh gadSnf3RXHDg/Z9ftb3fxOnKN1hgGTyOq+HXn8OvqHW8QjvfwjqnbHs5e3FySgWtEnSMVMy 7J4MIqLDwP2elNUSeeKyvq3JnBAfBcIQjNrrzRKXRnpHrfPv5gYPZ9ZoksYOA== X-QQ-GoodBg: 2 X-BIZMAIL-ID: 15080834656291379717 From: Lehua Ding To: gcc-patches@gcc.gnu.org Cc: juzhe.zhong@rivai.ai, rdapp.gcc@gmail.com, kito.cheng@gmail.com, palmer@rivosinc.com, jeffreyalaw@gmail.com Subject: [PATCH] RISC-V: Throw compilation error for unknown sub-extension or supervisor extension Date: Wed, 12 Jul 2023 11:27:30 +0800 Message-Id: <20230712032730.40158-1-lehua.ding@rivai.ai> X-Mailer: git-send-email 2.36.1 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:rivai.ai:qybglogicsvrgz:qybglogicsvrgz6a-0 X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Hi, This tiny patch add a check for extension starts with 'z' or 's' in `-march` option. Currently this unknown extension will be passed to the assembler, which then reports an error. With this patch, the compiler will throw a compilation error if the extension starts with 'z' or 's' is not a standard sub-extension or supervisor extension. e.g.: Run `riscv64-unknown-elf-gcc -march=rv64gcv_zvl128_s123 a.c` will throw these error: riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': extension 'zvl' starts with `z` but is not a standard sub-extension riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': extension 's123' start with `s` but not a standard supervisor extension Best, Lehua gcc/ChangeLog: * common/config/riscv/riscv-common.cc (standard_extensions_p): New func. (riscv_subset_list::add): Add check. gcc/testsuite/ChangeLog: * gcc.target/riscv/arch-3.c: Update -march. * gcc.target/riscv/arch-5.c: Ditto. * gcc.target/riscv/arch-8.c: Ditto. * gcc.target/riscv/attribute-10.c: Ditto. * gcc.target/riscv/attribute-9.c: Ditto. * gcc.target/riscv/pr102957.c: Ditto. * gcc.target/riscv/arch-22.cc: New test. --- gcc/common/config/riscv/riscv-common.cc | 29 +++++++++++++++++++ gcc/testsuite/gcc.target/riscv/arch-22.cc | 8 +++++ gcc/testsuite/gcc.target/riscv/arch-3.c | 2 +- gcc/testsuite/gcc.target/riscv/arch-5.c | 2 +- gcc/testsuite/gcc.target/riscv/arch-8.c | 2 +- gcc/testsuite/gcc.target/riscv/attribute-10.c | 2 +- gcc/testsuite/gcc.target/riscv/attribute-9.c | 4 +-- gcc/testsuite/gcc.target/riscv/pr102957.c | 2 ++ 8 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/arch-22.cc diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc index 6091d8f281b..df3c256c80c 100644 --- a/gcc/common/config/riscv/riscv-common.cc +++ b/gcc/common/config/riscv/riscv-common.cc @@ -518,6 +518,18 @@ subset_cmp (const std::string &a, const std::string &b) } } +/* Return true if EXT is a standard extension. */ + +static bool +standard_extensions_p (const char *ext) +{ + const riscv_ext_version *ext_ver; + for (ext_ver = &riscv_ext_version_table[0]; ext_ver->name != NULL; ++ext_ver) + if (strcmp (ext, ext_ver->name) == 0) + return true; + return false; +} + /* Add new subset to list. */ void @@ -546,6 +558,23 @@ riscv_subset_list::add (const char *subset, int major_version, return; } + else if (subset[0] == 'z' && !standard_extensions_p (subset)) + { + error_at (m_loc, + "%<-march=%s%>: extension %qs starts with `z` but is not a " + "standard sub-extension", + m_arch, subset); + return; + } + else if (subset[0] == 's' && !standard_extensions_p (subset)) + { + error_at ( + m_loc, + "%<-march=%s%>: extension %qs start with `s` but not a standard " + "supervisor extension", + m_arch, subset); + return; + } riscv_subset_t *s = new riscv_subset_t (); riscv_subset_t *itr; diff --git a/gcc/testsuite/gcc.target/riscv/arch-22.cc b/gcc/testsuite/gcc.target/riscv/arch-22.cc new file mode 100644 index 00000000000..f9d8b57cb20 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/arch-22.cc @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv_zvl128_z123_s123 -mabi=lp64d" } */ +int foo() +{ +} +/* { dg-error "extension 'zvl128' start with `z` but not a standard sub-extension" "" { target *-*-* } 0 } */ +/* { dg-error "extension 'z123' start with `z` but not a standard sub-extension" "" { target *-*-* } 0 } */ +/* { dg-error "extension 's123' start with `s` but not a standard supervisor extension" "" { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gcc.target/riscv/arch-3.c b/gcc/testsuite/gcc.target/riscv/arch-3.c index 7aa945eca20..dee0fc6656d 100644 --- a/gcc/testsuite/gcc.target/riscv/arch-3.c +++ b/gcc/testsuite/gcc.target/riscv/arch-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv32isabc_xbar -mabi=ilp32" } */ +/* { dg-options "-march=rv32isvinval_xbar -mabi=ilp32" } */ int foo() { } diff --git a/gcc/testsuite/gcc.target/riscv/arch-5.c b/gcc/testsuite/gcc.target/riscv/arch-5.c index 8258552214f..8bdaa9d17b2 100644 --- a/gcc/testsuite/gcc.target/riscv/arch-5.c +++ b/gcc/testsuite/gcc.target/riscv/arch-5.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv32i_zfoo_sabc_xbar -mabi=ilp32" } */ +/* { dg-options "-march=rv32i_zmmul_svnapot_xbar -mabi=ilp32" } */ int foo() { } diff --git a/gcc/testsuite/gcc.target/riscv/arch-8.c b/gcc/testsuite/gcc.target/riscv/arch-8.c index 1b9e51b0e12..ef557aeb673 100644 --- a/gcc/testsuite/gcc.target/riscv/arch-8.c +++ b/gcc/testsuite/gcc.target/riscv/arch-8.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv32id_zicsr_zifence -mabi=ilp32" } */ +/* { dg-options "-march=rv32id_zicsr_zifencei -mabi=ilp32" } */ int foo() { } diff --git a/gcc/testsuite/gcc.target/riscv/attribute-10.c b/gcc/testsuite/gcc.target/riscv/attribute-10.c index 1e121a10753..868adef6ab7 100644 --- a/gcc/testsuite/gcc.target/riscv/attribute-10.c +++ b/gcc/testsuite/gcc.target/riscv/attribute-10.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv32i -march=rv32im_sx_unexpectedstring -mabi=ilp32" } */ +/* { dg-options "-march=rv32i -march=rv32im_svnapot_unexpectedstring -mabi=ilp32" } */ int foo() { } diff --git a/gcc/testsuite/gcc.target/riscv/attribute-9.c b/gcc/testsuite/gcc.target/riscv/attribute-9.c index 7e3741a827c..ec5bab963ae 100644 --- a/gcc/testsuite/gcc.target/riscv/attribute-9.c +++ b/gcc/testsuite/gcc.target/riscv/attribute-9.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ -/* { dg-options "-mriscv-attribute -march=rv32i2p0sabc_xbar -mabi=ilp32e" } */ +/* { dg-options "-mriscv-attribute -march=rv32i2p0svinval_xbar -mabi=ilp32e" } */ int foo() { } -/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_sabc_xbar\"" } } */ +/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_svinval1p0_xbar\"" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr102957.c b/gcc/testsuite/gcc.target/riscv/pr102957.c index 9747dde3038..e11236b8504 100644 --- a/gcc/testsuite/gcc.target/riscv/pr102957.c +++ b/gcc/testsuite/gcc.target/riscv/pr102957.c @@ -3,3 +3,5 @@ int foo() { } + +/* { dg-error "extension 'zb' starts with `z` but is not a standard sub-extension" "" { target *-*-* } 0 } */