From: Zhongyao Chen <chen.zhong...@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.zhong...@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 +{ + 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 -- 2.43.0