[v2] RISC-V: Implement RISC-V profile macro support

Message ID 20250911150811.4125-1-chenzhongyao.hit@gmail.com
State Changes Requested, archived
Delegated to: Jeff Law
Headers
Series [v2] RISC-V: Implement RISC-V profile macro support |

Checks

Context Check Description
rivoscibot/toolchain-ci-rivos-lint success Lint passed
rivoscibot/toolchain-ci-rivos-apply-patch success Patch applied
rivoscibot/toolchain-ci-rivos-build--newlib-rv64gcv-lp64d-multilib success Build passed
rivoscibot/toolchain-ci-rivos-test success Testing passed

Commit Message

Zhongyao Chen Sept. 11, 2025, 3:08 p.m. UTC
  From: Zhongyao Chen <chen.zhongyao@zte.com.cn>

users can now write code like the following to adapt to the
current RISC-V profile selected at compile time:

```c
  #ifdef __riscv_rva23u64
    // Code specific to the rva23u64 profile
  #endif
```

Changes since v1:
        add testcases

gcc/
        * common/config/riscv/riscv-common.cc (riscv_subset_list::get_profile_name):
        New function.
        * config/riscv/riscv-c.cc (riscv_cpu_cpp_builtins): Define
        profile macro if a profile is detected.
        * config/riscv/riscv-subset.h (riscv_subset_list::get_profile_name): Declare.

gcc/testsuite/
        * gcc.target/riscv/predef-profiles-1.c: New test for __riscv_rvi20u64.
        * gcc.target/riscv/predef-profiles-2.c: New test for __riscv_rvi20u32.
        * gcc.target/riscv/predef-profiles-3.c: New test for __riscv_rva20u64.
        * gcc.target/riscv/predef-profiles-4.c: New test for __riscv_rva22u64.
        * gcc.target/riscv/predef-profiles-5.c: New test for __riscv_rva23u64.
        * gcc.target/riscv/predef-profiles-6.c: New test for __riscv_rva23s64.
        * gcc.target/riscv/predef-profiles-7.c: New test for __riscv_rvb23u64.
        * gcc.target/riscv/predef-profiles-8.c: New test for __riscv_rvb23s64.

Signed-off-by: Zhongyao Chen <chen.zhongyao@zte.com.cn>
---
 gcc/common/config/riscv/riscv-common.cc       | 40 +++++++++++++++++++
 gcc/config/riscv/riscv-c.cc                   |  9 +++++
 gcc/config/riscv/riscv-subset.h               |  2 +
 .../gcc.target/riscv/predef-profiles-1.c      | 11 +++++
 .../gcc.target/riscv/predef-profiles-2.c      | 11 +++++
 .../gcc.target/riscv/predef-profiles-3.c      | 11 +++++
 .../gcc.target/riscv/predef-profiles-4.c      | 11 +++++
 .../gcc.target/riscv/predef-profiles-5.c      | 11 +++++
 .../gcc.target/riscv/predef-profiles-6.c      | 11 +++++
 .../gcc.target/riscv/predef-profiles-7.c      | 11 +++++
 .../gcc.target/riscv/predef-profiles-8.c      | 11 +++++
 11 files changed, 139 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-1.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-2.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-3.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-4.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-5.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-6.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-7.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-8.c
  

Comments

Jeffrey Law Oct. 4, 2025, 5:57 p.m. UTC | #1
On 9/11/25 9:08 AM, Zhongyao Chen wrote:
> From: Zhongyao Chen <chen.zhongyao@zte.com.cn>
> 
> users can now write code like the following to adapt to the
> current RISC-V profile selected at compile time:
> 
> ```c
>    #ifdef __riscv_rva23u64
>      // Code specific to the rva23u64 profile
>    #endif
> ```
> 
> Changes since v1:
>          add testcases
> 
> gcc/
>          * common/config/riscv/riscv-common.cc (riscv_subset_list::get_profile_name):
>          New function.
>          * config/riscv/riscv-c.cc (riscv_cpu_cpp_builtins): Define
>          profile macro if a profile is detected.
>          * config/riscv/riscv-subset.h (riscv_subset_list::get_profile_name): Declare.
> 
> gcc/testsuite/
>          * gcc.target/riscv/predef-profiles-1.c: New test for __riscv_rvi20u64.
>          * gcc.target/riscv/predef-profiles-2.c: New test for __riscv_rvi20u32.
>          * gcc.target/riscv/predef-profiles-3.c: New test for __riscv_rva20u64.
>          * gcc.target/riscv/predef-profiles-4.c: New test for __riscv_rva22u64.
>          * gcc.target/riscv/predef-profiles-5.c: New test for __riscv_rva23u64.
>          * gcc.target/riscv/predef-profiles-6.c: New test for __riscv_rva23s64.
>          * gcc.target/riscv/predef-profiles-7.c: New test for __riscv_rvb23u64.
>          * gcc.target/riscv/predef-profiles-8.c: New test for __riscv_rvb23s64.
> 
> Signed-off-by: Zhongyao Chen <chen.zhongyao@zte.com.cn>
> ---
>   gcc/common/config/riscv/riscv-common.cc       | 40 +++++++++++++++++++
>   gcc/config/riscv/riscv-c.cc                   |  9 +++++
>   gcc/config/riscv/riscv-subset.h               |  2 +
>   .../gcc.target/riscv/predef-profiles-1.c      | 11 +++++
>   .../gcc.target/riscv/predef-profiles-2.c      | 11 +++++
>   .../gcc.target/riscv/predef-profiles-3.c      | 11 +++++
>   .../gcc.target/riscv/predef-profiles-4.c      | 11 +++++
>   .../gcc.target/riscv/predef-profiles-5.c      | 11 +++++
>   .../gcc.target/riscv/predef-profiles-6.c      | 11 +++++
>   .../gcc.target/riscv/predef-profiles-7.c      | 11 +++++
>   .../gcc.target/riscv/predef-profiles-8.c      | 11 +++++
>   11 files changed, 139 insertions(+)
>   create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-1.c
>   create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-2.c
>   create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-3.c
>   create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-4.c
>   create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-5.c
>   create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-6.c
>   create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-7.c
>   create mode 100644 gcc/testsuite/gcc.target/riscv/predef-profiles-8.c
> 
> diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
> index a165506f4..e7536edab 100644
> --- a/gcc/common/config/riscv/riscv-common.cc
> +++ b/gcc/common/config/riscv/riscv-common.cc
> @@ -1450,6 +1450,46 @@ fail:
>     return NULL;
>   }
>   
> +/* Get profile name from the subset_list.  */
> +
> +const char *
> +riscv_subset_list::get_profile_name () const
So would a better comment be?

/* Get the profile that best matches the current architecture
    string, where best is defined as the most expansive profile.  */

ie, if the set of features enabled is rva23 compliant, then the set is 
also rva22 and rva20 compliant.  In that scenario we want to return 
rva23 as it's the most expansive profile.

Otherwise I think this is ready to go into the tree.

jeff
  

Patch

diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
index a165506f4..e7536edab 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -1450,6 +1450,46 @@  fail:
   return NULL;
 }
 
+/* Get profile name from the subset_list.  */
+
+const char *
+riscv_subset_list::get_profile_name () const
+{
+  const char *best_profile = NULL;
+  int max_ext_count = -1;
+
+  for (int i = 0; riscv_profiles_table[i].profile_name != nullptr; ++i)
+    {
+      riscv_subset_list *subset_list = riscv_subset_list::parse (
+      riscv_profiles_table[i].profile_string, NULL);
+      if (!subset_list)
+	continue;
+      if (subset_list->xlen () == this->xlen ())
+	{
+	  int ext_count = 0;
+	  bool all_found = true;
+	  for (riscv_subset_t *p = subset_list->m_head; p != NULL;
+		p = p->next, ++ext_count)
+	    {
+	      if (!this->lookup (p->name.c_str (),
+			p->major_version,
+			p->minor_version))
+		{
+		  all_found = false;
+		  break;
+		}
+	    }
+	  if (all_found && ext_count > max_ext_count)
+	    {
+	      max_ext_count = ext_count;
+	      best_profile = riscv_profiles_table[i].profile_name;
+	    }
+	}
+      delete subset_list;
+    }
+  return best_profile;
+}
+
 /* Clone whole subset list.  */
 
 riscv_subset_list *
diff --git a/gcc/config/riscv/riscv-c.cc b/gcc/config/riscv/riscv-c.cc
index 4fc052817..d497326e0 100644
--- a/gcc/config/riscv/riscv-c.cc
+++ b/gcc/config/riscv/riscv-c.cc
@@ -165,6 +165,15 @@  riscv_cpu_cpp_builtins (cpp_reader *pfile)
   if (!subset_list)
     return;
 
+  /* Define profile macro if a profile was used.  */
+  const char *profile_name = subset_list->get_profile_name ();
+  if (profile_name)
+    {
+      char *profile_macro = (char *)alloca (strlen (profile_name) + 10);
+      sprintf (profile_macro, "__riscv_%s", profile_name);
+      builtin_define (profile_macro);
+    }
+
   size_t max_ext_len = 0;
 
   /* Figure out the max length of extension name for reserving buffer.   */
diff --git a/gcc/config/riscv/riscv-subset.h b/gcc/config/riscv/riscv-subset.h
index 4cd860fee..1887ed7cc 100644
--- a/gcc/config/riscv/riscv-subset.h
+++ b/gcc/config/riscv/riscv-subset.h
@@ -105,6 +105,8 @@  public:
 
   unsigned xlen () const {return m_xlen;};
 
+  const char *get_profile_name () const;
+
   riscv_subset_list *clone () const;
 
   static riscv_subset_list *parse (const char *, location_t *);
diff --git a/gcc/testsuite/gcc.target/riscv/predef-profiles-1.c b/gcc/testsuite/gcc.target/riscv/predef-profiles-1.c
new file mode 100644
index 000000000..5fc17abf1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/predef-profiles-1.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rvi20u64 -mabi=lp64" } */
+
+int main () {
+
+#ifndef __riscv_rvi20u64
+#error "__riscv_rvi20u64"
+#endif
+
+  return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/riscv/predef-profiles-2.c b/gcc/testsuite/gcc.target/riscv/predef-profiles-2.c
new file mode 100644
index 000000000..86f2771ed
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/predef-profiles-2.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rvi20u32 -mabi=ilp32" } */
+
+int main () {
+
+#ifndef __riscv_rvi20u32
+#error "__riscv_rvi20u32"
+#endif
+
+  return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/riscv/predef-profiles-3.c b/gcc/testsuite/gcc.target/riscv/predef-profiles-3.c
new file mode 100644
index 000000000..7787549c7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/predef-profiles-3.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rva20u64 -mabi=lp64d" } */
+
+int main () {
+
+#ifndef __riscv_rva20u64
+#error "__riscv_rva20u64"
+#endif
+
+  return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/riscv/predef-profiles-4.c b/gcc/testsuite/gcc.target/riscv/predef-profiles-4.c
new file mode 100644
index 000000000..abb20b7d1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/predef-profiles-4.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rva22u64 -mabi=lp64d" } */
+
+int main () {
+
+#ifndef __riscv_rva22u64
+#error "__riscv_rva22u64"
+#endif
+
+  return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/riscv/predef-profiles-5.c b/gcc/testsuite/gcc.target/riscv/predef-profiles-5.c
new file mode 100644
index 000000000..0840cdc3d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/predef-profiles-5.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rva23u64 -mabi=lp64d" } */
+
+int main () {
+
+#ifndef __riscv_rva23u64
+#error "__riscv_rva23u64"
+#endif
+
+  return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/riscv/predef-profiles-6.c b/gcc/testsuite/gcc.target/riscv/predef-profiles-6.c
new file mode 100644
index 000000000..71597804c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/predef-profiles-6.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rva23s64 -mabi=lp64d" } */
+
+int main () {
+
+#ifndef __riscv_rva23s64
+#error "__riscv_rva23s64"
+#endif
+
+  return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/riscv/predef-profiles-7.c b/gcc/testsuite/gcc.target/riscv/predef-profiles-7.c
new file mode 100644
index 000000000..1366159e9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/predef-profiles-7.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rvb23u64 -mabi=lp64d" } */
+
+int main () {
+
+#ifndef __riscv_rvb23u64
+#error "__riscv_rvb23u64"
+#endif
+
+  return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/riscv/predef-profiles-8.c b/gcc/testsuite/gcc.target/riscv/predef-profiles-8.c
new file mode 100644
index 000000000..c0c50034b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/predef-profiles-8.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rvb23s64 -mabi=lp64d" } */
+
+int main () {
+
+#ifndef __riscv_rvb23s64
+#error "__riscv_rvb23s64"
+#endif
+
+  return 0;
+}
\ No newline at end of file