From e3354b6de7a348386425879847c4f18ef1e82791 Mon Sep 17 00:00:00 2001 From: Kito Cheng Date: Fri, 11 Dec 2020 16:51:40 +0800 Subject: [PATCH] RISC-V: Implement new style of architecture extension test macros. - This patch introduce new set of architecture extension test macros which is accept on riscv-c-api-doc recently. - https://github.com/riscv/riscv-c-api-doc/blob/master/riscv-c-api.md#architecture-extension-test-macro - We will also mark deprecated for legacy architecture extension test macros in GCC 11, but still support that for 1 or 2 release cycles. gcc/ChangeLog: * common/config/riscv/riscv-common.c (riscv_current_subset_list): New. * config/riscv/riscv-c.c (riscv-subset.h): New. (INCLUDE_STRING): Define. (riscv_cpu_cpp_builtins): Add new style architecture extension test macros. * config/riscv/riscv-subset.h (riscv_subset_list::begin): New. (riscv_subset_list::end): New. (riscv_current_subset_list): New. gcc/testsuite/ChangeLog: * gcc.target/riscv/predef-10.c: New. * gcc.target/riscv/predef-11.c: New. * gcc.target/riscv/predef-12.c: New. * gcc.target/riscv/predef-13.c: New. --- gcc/common/config/riscv/riscv-common.c | 5 ++++ gcc/config/riscv/riscv-c.c | 32 ++++++++++++++++++++++ gcc/config/riscv/riscv-subset.h | 5 ++++ gcc/testsuite/gcc.target/riscv/predef-10.c | 43 ++++++++++++++++++++++++++++++ gcc/testsuite/gcc.target/riscv/predef-11.c | 43 ++++++++++++++++++++++++++++++ gcc/testsuite/gcc.target/riscv/predef-12.c | 43 ++++++++++++++++++++++++++++++ gcc/testsuite/gcc.target/riscv/predef-13.c | 43 ++++++++++++++++++++++++++++++ 7 files changed, 214 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/predef-10.c create mode 100644 gcc/testsuite/gcc.target/riscv/predef-11.c create mode 100644 gcc/testsuite/gcc.target/riscv/predef-12.c create mode 100644 gcc/testsuite/gcc.target/riscv/predef-13.c diff --git a/gcc/common/config/riscv/riscv-common.c b/gcc/common/config/riscv/riscv-common.c index 934c716..b3f5c07 100644 --- a/gcc/common/config/riscv/riscv-common.c +++ b/gcc/common/config/riscv/riscv-common.c @@ -112,6 +112,11 @@ static const char *riscv_supported_std_ext (void); static riscv_subset_list *current_subset_list = NULL; +const riscv_subset_list *riscv_current_subset_list () +{ + return current_subset_list; +} + riscv_subset_t::riscv_subset_t () : name (), major_version (0), minor_version (0), next (NULL), explicit_version_p (false), implied_p (false) diff --git a/gcc/config/riscv/riscv-c.c b/gcc/config/riscv/riscv-c.c index 8c52f74..efd4a61 100644 --- a/gcc/config/riscv/riscv-c.c +++ b/gcc/config/riscv/riscv-c.c @@ -20,12 +20,14 @@ along with GCC; see the file COPYING3. If not see #define IN_TARGET_CODE 1 +#define INCLUDE_STRING #include "config.h" #include "system.h" #include "coretypes.h" #include "tm.h" #include "c-family/c-common.h" #include "cpplib.h" +#include "riscv-subset.h" #define builtin_define(TXT) cpp_define (pfile, TXT) @@ -101,4 +103,34 @@ riscv_cpu_cpp_builtins (cpp_reader *pfile) break; } + + /* Define architecture extension test macros. */ + builtin_define_with_int_value ("__riscv_arch_test", 1); + + const riscv_subset_list *subset_list = riscv_current_subset_list (); + size_t max_ext_len = 0; + + /* Figure out the max length of extension name for reserving buffer. */ + for (const riscv_subset_t *subset = subset_list->begin (); + subset != subset_list->end (); + subset = subset->next) + max_ext_len = MAX (max_ext_len, subset->name.length ()); + + char *buf = (char *)alloca (max_ext_len + 10 /* For __riscv_ and '\0'. */); + + for (const riscv_subset_t *subset = subset_list->begin (); + subset != subset_list->end (); + subset = subset->next) + { + int version_value = (subset->major_version * 1000000) + + (subset->minor_version * 1000); + /* Special rule for zicsr and zifencei, it's used for ISA spec 2.2 or + earlier. */ + if ((subset->name == "zicsr" || subset->name == "zifencei") + && version_value == 0) + version_value = 2000000; + + sprintf (buf, "__riscv_%s", subset->name.c_str ()); + builtin_define_with_int_value (buf, version_value); + } } diff --git a/gcc/config/riscv/riscv-subset.h b/gcc/config/riscv/riscv-subset.h index ae7401a..793655a 100644 --- a/gcc/config/riscv/riscv-subset.h +++ b/gcc/config/riscv/riscv-subset.h @@ -85,6 +85,11 @@ public: unsigned xlen () const {return m_xlen;}; static riscv_subset_list *parse (const char *, location_t); + + const riscv_subset_t *begin () const {return m_head;}; + const riscv_subset_t *end () const {return NULL;}; }; +extern const riscv_subset_list *riscv_current_subset_list (void); + #endif /* ! GCC_RISCV_SUBSET_H */ diff --git a/gcc/testsuite/gcc.target/riscv/predef-10.c b/gcc/testsuite/gcc.target/riscv/predef-10.c new file mode 100644 index 0000000..7c447bf --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/predef-10.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=rv32i2p0 -mabi=ilp32 -mcmodel=medlow -misa-spec=2.2" } */ + +int main () { + +#ifndef __riscv_arch_test +#error "__riscv_arch_test" +#endif + +#if __riscv_xlen != 32 +#error "__riscv_xlen" +#endif + +#if !defined(__riscv_i) || (__riscv_i != (2 * 1000 * 1000)) +#error "__riscv_i" +#endif + +#if defined(__riscv_c) +#error "__riscv_c" +#endif + +#if defined(__riscv_e) +#error "__riscv_e" +#endif + +#if defined(__riscv_a) +#error "__riscv_a" +#endif + +#if defined(__riscv_m) +#error "__riscv_m" +#endif + +#if defined(__riscv_f) +#error "__riscv_f" +#endif + +#if defined(__riscv_d) +#error "__riscv_d" +#endif + + return 0; +} diff --git a/gcc/testsuite/gcc.target/riscv/predef-11.c b/gcc/testsuite/gcc.target/riscv/predef-11.c new file mode 100644 index 0000000..80f4811 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/predef-11.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=rv64gc -mabi=lp64 -mcmodel=medlow -misa-spec=2.2" } */ + +int main () { + +#ifndef __riscv_arch_test +#error "__riscv_arch_test" +#endif + +#if __riscv_xlen != 64 +#error "__riscv_xlen" +#endif + +#if !defined(__riscv_i) || (__riscv_i != (2 * 1000 * 1000)) +#error "__riscv_i" +#endif + +#if !defined(__riscv_c) || (__riscv_c != (2 * 1000 * 1000)) +#error "__riscv_c" +#endif + +#if defined(__riscv_e) +#error "__riscv_e" +#endif + +#if !defined(__riscv_a) || (__riscv_a != (2 * 1000 * 1000)) +#error "__riscv_a" +#endif + +#if !defined(__riscv_m) || (__riscv_m != (2 * 1000 * 1000)) +#error "__riscv_m" +#endif + +#if !defined(__riscv_f) || (__riscv_f != (2 * 1000 * 1000)) +#error "__riscv_f" +#endif + +#if !defined(__riscv_d) || (__riscv_d != (2 * 1000 * 1000)) +#error "__riscv_d" +#endif + + return 0; +} diff --git a/gcc/testsuite/gcc.target/riscv/predef-12.c b/gcc/testsuite/gcc.target/riscv/predef-12.c new file mode 100644 index 0000000..dd35dbd --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/predef-12.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=rv64gc -mabi=lp64 -mcmodel=medlow -misa-spec=20191213" } */ + +int main () { + +#ifndef __riscv_arch_test +#error "__riscv_arch_test" +#endif + +#if __riscv_xlen != 64 +#error "__riscv_xlen" +#endif + +#if !defined(__riscv_i) || (__riscv_i != (2 * 1000 * 1000 + 1 * 1000)) +#error "__riscv_i" +#endif + +#if !defined(__riscv_c) || (__riscv_c != (2 * 1000 * 1000)) +#error "__riscv_c" +#endif + +#if defined(__riscv_e) +#error "__riscv_e" +#endif + +#if !defined(__riscv_a) || (__riscv_a != (2 * 1000 * 1000 + 1 * 1000)) +#error "__riscv_a" +#endif + +#if !defined(__riscv_m) || (__riscv_m != (2 * 1000 * 1000)) +#error "__riscv_m" +#endif + +#if !defined(__riscv_f) || (__riscv_f != (2 * 1000 * 1000 + 2 * 1000)) +#error "__riscv_f" +#endif + +#if !defined(__riscv_d) || (__riscv_d != (2 * 1000 * 1000 + 2 * 1000)) +#error "__riscv_d" +#endif + + return 0; +} diff --git a/gcc/testsuite/gcc.target/riscv/predef-13.c b/gcc/testsuite/gcc.target/riscv/predef-13.c new file mode 100644 index 0000000..95cf001 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/predef-13.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=rv32e -mabi=ilp32e -mcmodel=medlow -misa-spec=2.2" } */ + +int main () { + +#ifndef __riscv_arch_test +#error "__riscv_arch_test" +#endif + +#if __riscv_xlen != 32 +#error "__riscv_xlen" +#endif + +#if defined(__riscv_i) +#error "__riscv_i" +#endif + +#if defined(__riscv_c) +#error "__riscv_c" +#endif + +#if !defined(__riscv_e) || (__riscv_e != (1 * 1000 * 1000 + 9 * 1000)) +#error "__riscv_e" +#endif + +#if defined(__riscv_a) +#error "__riscv_a" +#endif + +#if defined(__riscv_m) +#error "__riscv_m" +#endif + +#if defined(__riscv_f) +#error "__riscv_f" +#endif + +#if defined(__riscv_d) +#error "__riscv_d" +#endif + + return 0; +} -- 2.7.4