LGTM juzhe.zhong@rivai.ai From: Lehua Ding Date: 2023-07-12 11:27 To: gcc-patches CC: juzhe.zhong; rdapp.gcc; kito.cheng; palmer; jeffreyalaw Subject: [PATCH] RISC-V: Throw compilation error for unknown sub-extension or supervisor extension 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 } */ -- 2.36.1