[gcc(refs/vendors/riscv/heads/gcc-15-with-riscv-opts)] [PATCH v3] RISC-V: Implement RISC-V profile macro support
Jeff Law
law@gcc.gnu.org
Fri Jan 30 07:06:35 GMT 2026
https://gcc.gnu.org/g:99611cef7ab36b203fb9a5bb8fc03c5f5dfbb3ed
commit 99611cef7ab36b203fb9a5bb8fc03c5f5dfbb3ed
Author: Zhongyao Chen <chenzhongyao.hit@gmail.com>
Date: Mon Oct 13 20:55:40 2025 -0600
[PATCH v3] RISC-V: Implement RISC-V profile macro support
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 from v2:
- clarify get_profile_name comment
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.
(cherry picked from commit 79b8f23a7099a0ff4b4f8796894814f2112c4289)
Diff:
---
gcc/common/config/riscv/riscv-common.cc | 41 ++++++++++++++++++++++
gcc/config/riscv/riscv-c.cc | 9 +++++
gcc/config/riscv/riscv-subset.h | 2 ++
gcc/testsuite/gcc.target/riscv/predef-profiles-1.c | 11 ++++++
gcc/testsuite/gcc.target/riscv/predef-profiles-2.c | 11 ++++++
gcc/testsuite/gcc.target/riscv/predef-profiles-3.c | 11 ++++++
gcc/testsuite/gcc.target/riscv/predef-profiles-4.c | 11 ++++++
gcc/testsuite/gcc.target/riscv/predef-profiles-5.c | 11 ++++++
gcc/testsuite/gcc.target/riscv/predef-profiles-6.c | 11 ++++++
gcc/testsuite/gcc.target/riscv/predef-profiles-7.c | 11 ++++++
gcc/testsuite/gcc.target/riscv/predef-profiles-8.c | 11 ++++++
11 files changed, 140 insertions(+)
diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
index efa2a45a6404..adfd22019a92 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -1404,6 +1404,47 @@ fail:
return NULL;
}
+/* Get the profile that best matches the current architecture string,
+ where best is defined as the most expansive profile. */
+
+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 4fc052817824..d497326e0611 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 4cd860fee59b..1887ed7cc1c3 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 000000000000..5fc17abf118a
--- /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 000000000000..86f2771edeff
--- /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 000000000000..7787549c79f4
--- /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 000000000000..abb20b7d14fc
--- /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 000000000000..0840cdc3de03
--- /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 000000000000..71597804c991
--- /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 000000000000..1366159e9d38
--- /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 000000000000..c0c50034b6c4
--- /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
More information about the Gcc-cvs
mailing list