[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
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
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
@@ -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 *
@@ -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. */
@@ -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 *);
new file mode 100644
@@ -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
new file mode 100644
@@ -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
new file mode 100644
@@ -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
new file mode 100644
@@ -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
new file mode 100644
@@ -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
new file mode 100644
@@ -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
new file mode 100644
@@ -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
new file mode 100644
@@ -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