]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: Throw compilation error for unknown extensions
authorLehua Ding <lehua.ding@rivai.ai>
Thu, 13 Jul 2023 08:32:09 +0000 (16:32 +0800)
committerLehua Ding <lehua.ding@rivai.ai>
Wed, 19 Jul 2023 08:15:00 +0000 (16:15 +0800)
commitc283c4774d1cbfd12c2a15b51b18347463694ad0
tree468f8dc2bb1a3d668ab1a9334ac2ad8e55c0f491
parent96799fa4d9d4abeb1322f907331258acc4266091
RISC-V: Throw compilation error for unknown extensions

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. Along with two extra changes. The first is to reduce
repeated errors, which are currently reported at least twice. The second is to
report as many mistakes as possible.

e.g.:

Run `riscv64-unknown-elf-gcc -march=rv64gvcw_zvl128_s123_x123 -mabi=lp64d a.c`
will throw these error:

riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': ISA string is not in canonical order. 'c'
riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': extension 'w' is unsupported standard single letter extension
riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': extension 'zvl128' start with `z` but is unsupported standard extension
riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': extension 's123' start with `s` but is unsupported standard supervisor extension
riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': extension 'x123' start with `x` but is unsupported non-standard extension

gcc/ChangeLog:

* common/config/riscv/riscv-common.cc (riscv_supported_std_ext): Init.
(standard_extensions_p): Add check.
(riscv_subset_list::add): Just return NULL if it failed before.
(riscv_subset_list::parse_std_ext): Continue parse when find a error
(riscv_subset_list::parse): Just return NULL if it failed before.
* config/riscv/riscv-subset.h (class riscv_subset_list): Add field.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/arch-2.c: Update -march.
* gcc.target/riscv/arch-3.c: Ditto.
* 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-18.c: Ditto.
* gcc.target/riscv/attribute-19.c: Ditto.
* gcc.target/riscv/attribute-8.c: Ditto.
* gcc.target/riscv/attribute-9.c: Ditto.
* gcc.target/riscv/pr102957.c: Ditto.
* gcc.target/riscv/arch-22.cc: New test.
14 files changed:
gcc/common/config/riscv/riscv-common.cc
gcc/config/riscv/riscv-subset.h
gcc/testsuite/gcc.target/riscv/arch-2.c
gcc/testsuite/gcc.target/riscv/arch-22.cc [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/arch-23.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/arch-3.c
gcc/testsuite/gcc.target/riscv/arch-5.c
gcc/testsuite/gcc.target/riscv/arch-8.c
gcc/testsuite/gcc.target/riscv/attribute-10.c
gcc/testsuite/gcc.target/riscv/attribute-18.c
gcc/testsuite/gcc.target/riscv/attribute-19.c
gcc/testsuite/gcc.target/riscv/attribute-8.c
gcc/testsuite/gcc.target/riscv/attribute-9.c
gcc/testsuite/gcc.target/riscv/pr102957.c