]> gcc.gnu.org Git - gcc.git/commitdiff
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)
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

index 19075c0b2415fe2a4d6203354ae835eeecf7cd49..884d81c12aa0abe4c2d9194313c6299701b71fe2 100644 (file)
@@ -313,6 +313,8 @@ static const char *riscv_tunes[] =
 
 static const char *riscv_supported_std_ext (void);
 
+bool riscv_subset_list::parse_failed = false;
+
 static riscv_subset_list *current_subset_list = NULL;
 
 const riscv_subset_list *riscv_current_subset_list ()
@@ -520,6 +522,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
@@ -548,6 +562,38 @@ riscv_subset_list::add (const char *subset, int major_version,
 
       return;
     }
+  else if (strlen (subset) == 1 && !standard_extensions_p (subset))
+    {
+      error_at (m_loc,
+               "%<-march=%s%>: extension %qs is unsupported standard single "
+               "letter extension",
+               m_arch, subset);
+      return;
+    }
+  else if (subset[0] == 'z' && !standard_extensions_p (subset))
+    {
+      error_at (m_loc,
+               "%<-march=%s%>: extension %qs starts with `z` but is "
+               "unsupported standard extension",
+               m_arch, subset);
+      return;
+    }
+  else if (subset[0] == 's' && !standard_extensions_p (subset))
+    {
+      error_at (m_loc,
+               "%<-march=%s%>: extension %qs starts with `s` but is "
+               "unsupported standard supervisor extension",
+               m_arch, subset);
+      return;
+    }
+  else if (subset[0] == 'x' && !standard_extensions_p (subset))
+    {
+      error_at (m_loc,
+               "%<-march=%s%>: extension %qs starts with `x` but is "
+               "unsupported non-standard extension",
+               m_arch, subset);
+      return;
+    }
 
   riscv_subset_t *s = new riscv_subset_t ();
   riscv_subset_t *itr;
@@ -921,22 +967,16 @@ riscv_subset_list::parse_std_ext (const char *p)
       while (*std_exts && std_ext != *std_exts)
        std_exts++;
 
-      if (std_ext != *std_exts)
-       {
-         if (strchr (all_std_exts, std_ext) == NULL)
-           error_at (m_loc, "%<-march=%s%>: unsupported ISA subset %<%c%>",
-                     m_arch, *p);
-         else
-           error_at (m_loc,
-                     "%<-march=%s%>: ISA string is not in canonical order. "
-                     "%<%c%>", m_arch, *p);
-         return NULL;
-       }
+      subset[0] = std_ext;
+      if (std_ext != *std_exts && standard_extensions_p (subset))
+       error_at (m_loc,
+                 "%<-march=%s%>: ISA string is not in canonical order. "
+                 "%<%c%>",
+                 m_arch, *p);
 
       std_exts++;
 
       p++;
-      subset[0] = std_ext;
 
       p = parsing_subset_version (subset, p, &major_version, &minor_version,
                                  /* std_ext_p= */ true, &explicit_version_p);
@@ -1165,6 +1205,9 @@ riscv_subset_list::parse_multiletter_ext (const char *p,
 riscv_subset_list *
 riscv_subset_list::parse (const char *arch, location_t loc)
 {
+  if (riscv_subset_list::parse_failed)
+    return NULL;
+
   riscv_subset_list *subset_list = new riscv_subset_list (arch, loc);
   riscv_subset_t *itr;
   const char *p = arch;
@@ -1234,6 +1277,7 @@ riscv_subset_list::parse (const char *arch, location_t loc)
 
 fail:
   delete subset_list;
+  riscv_subset_list::parse_failed = true;
   return NULL;
 }
 
index 84a7a82db635c406d3b571c217357dbcb22770ed..dca07284efa7d7fd13760c42fcefee607360c04b 100644 (file)
@@ -41,6 +41,11 @@ struct riscv_subset_t
 /* Subset list.  */
 class riscv_subset_list
 {
+public:
+  /* Because the parse method is called in several places, to prevent repeated
+     errors, use this flag to prevent it from repeating parse. */
+  static bool parse_failed;
+
 private:
   /* Original arch string.  */
   const char *m_arch;
index 8908b4b3a8cf6fff60837942900ab95446e4bc7d..e308bf7407cbc5400406c703f42f27467f785884 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32ixabc_xfoo -mabi=ilp32" } */
+/* { dg-options "-march=rv32ixtheadba_xtheadsync -mabi=ilp32" } */
 int foo()
 {
 }
diff --git a/gcc/testsuite/gcc.target/riscv/arch-22.cc b/gcc/testsuite/gcc.target/riscv/arch-22.cc
new file mode 100644 (file)
index 0000000..1cb5588
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gvcw_zvl128_s123_x123 -mabi=lp64d" } */
+int foo()
+{
+}
+
+/* { dg-error "ISA string is not in canonical order. 'c'" "" { target *-*-* } 0 } */
+/* { dg-error "extension 'w' is unsupported standard single letter extension" "" { target *-*-* } 0 } */
+/* { dg-error "extension 'zvl' starts with `z` but is unsupported standard extension" "" { target *-*-* } 0 } */
+/* { dg-error "extension 's123' starts with `s` but is unsupported standard supervisor extension" "" { target *-*-* } 0 } */
+/* { dg-error "extension 'x123' starts with `x` but is unsupported non-standard extension" "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/gcc.target/riscv/arch-23.c b/gcc/testsuite/gcc.target/riscv/arch-23.c
new file mode 100644 (file)
index 0000000..1cb5588
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gvcw_zvl128_s123_x123 -mabi=lp64d" } */
+int foo()
+{
+}
+
+/* { dg-error "ISA string is not in canonical order. 'c'" "" { target *-*-* } 0 } */
+/* { dg-error "extension 'w' is unsupported standard single letter extension" "" { target *-*-* } 0 } */
+/* { dg-error "extension 'zvl' starts with `z` but is unsupported standard extension" "" { target *-*-* } 0 } */
+/* { dg-error "extension 's123' starts with `s` but is unsupported standard supervisor extension" "" { target *-*-* } 0 } */
+/* { dg-error "extension 'x123' starts with `x` but is unsupported non-standard extension" "" { target *-*-* } 0 } */
index 7aa945eca20454414141bc3cf420ea9402a78c11..ac733746fd6b36d3430144702e01f0092cda5ba7 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32isabc_xbar -mabi=ilp32" } */
+/* { dg-options "-march=rv32isvinval_xtheadba -mabi=ilp32" } */
 int foo()
 {
 }
index 8258552214f8b44dcb1e6ee38f00f9d9bc10eb91..b8b6cd048f7673c977f0895b8bb8bc48d2e60c7a 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32i_zfoo_sabc_xbar -mabi=ilp32" } */
+/* { dg-options "-march=rv32i_zmmul_svnapot_xtheadba -mabi=ilp32" } */
 int foo()
 {
 }
index 1b9e51b0e12242f154c0cdae06a538d495eaeb55..ef557aeb673b486c12d2f7b92dd5c0374c186437 100644 (file)
@@ -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()
 {
 }
index 1e121a10753b9d6a1b94be917612940b922d5656..868adef6ab7d9b0a40187bef75964597e7457479 100644 (file)
@@ -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()
 {
 }
index 492360cf7c1179173e2f5cddc34bf32ed094fc87..fddbf15fc3eef174d5cd8d14938ea4240dc7f19e 100644 (file)
@@ -1,4 +1,4 @@
 /* { dg-do compile } */
-/* { dg-options "-mriscv-attribute -march=rv64imafdcp -mabi=lp64d -misa-spec=2.2" } */
+/* { dg-options "-mriscv-attribute -march=rv64imafdc -mabi=lp64d -misa-spec=2.2" } */
 int foo() {}
-/* { dg-final { scan-assembler ".attribute arch, \"rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0_p\"" } } */
+/* { dg-final { scan-assembler ".attribute arch, \"rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0\"" } } */
index 562f80893615bd734b2742c5a72d3555b8ae8275..8150452f5b1076ab5a6be9d85c802a3d47098212 100644 (file)
@@ -1,4 +1,4 @@
 /* { dg-do compile } */
-/* { dg-options "-mriscv-attribute -march=rv64imp0p9 -mabi=lp64 -misa-spec=2.2" } */
+/* { dg-options "-mriscv-attribute -march=rv64im -mabi=lp64 -misa-spec=2.2" } */
 int foo() {}
-/* { dg-final { scan-assembler ".attribute arch, \"rv64i2p0_m2p0_p0p9\"" } } */
+/* { dg-final { scan-assembler ".attribute arch, \"rv64i2p0_m2p0\"" } } */
index 4c91b9e6369e1972aa5013b590d653c0447a13b7..2065f74b9777996ac7527bf4fa4eb41323d99798 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
-/* { dg-options "-mriscv-attribute -march=rv32i2p0xabc_xv5 -mabi=ilp32" } */
+/* { dg-options "-mriscv-attribute -march=rv32i2p0xtheadba_xtheadbb -mabi=ilp32" } */
 int foo()
 {
 }
-/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_xabc_xv5p0\"" } } */
+/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_xtheadba1p0_xtheadbb1p0\"" } } */
index 7e3741a827c7f103eaa725faccecc56062b348ef..3c31848ed8008bb11efcee1bd8d0f2f457b1ff3b 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
-/* { dg-options "-mriscv-attribute -march=rv32i2p0sabc_xbar -mabi=ilp32e" } */
+/* { dg-options "-mriscv-attribute -march=rv32i2p0svinval_xtheadba -mabi=ilp32e" } */
 int foo()
 {
 }
-/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_sabc_xbar\"" } } */
+/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_svinval1p0_xtheadba1p0\"" } } */
index 9747dde3038f9417ac6d91aab5aa8f069ce7ea44..322d49c62d4146b227e5d05010933a7f428350bd 100644 (file)
@@ -3,3 +3,5 @@
 int foo()
 {
 }
+
+/* { dg-error "extension 'zb' starts with `z` but is unsupported standard extension" "" { target *-*-* } 0 } */
This page took 0.078454 seconds and 5 git commands to generate.