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.
This commit is contained in:
parent
0b7b471011
commit
e3354b6de7
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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 */
|
||||
|
43
gcc/testsuite/gcc.target/riscv/predef-10.c
Normal file
43
gcc/testsuite/gcc.target/riscv/predef-10.c
Normal file
@ -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;
|
||||
}
|
43
gcc/testsuite/gcc.target/riscv/predef-11.c
Normal file
43
gcc/testsuite/gcc.target/riscv/predef-11.c
Normal file
@ -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;
|
||||
}
|
43
gcc/testsuite/gcc.target/riscv/predef-12.c
Normal file
43
gcc/testsuite/gcc.target/riscv/predef-12.c
Normal file
@ -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;
|
||||
}
|
43
gcc/testsuite/gcc.target/riscv/predef-13.c
Normal file
43
gcc/testsuite/gcc.target/riscv/predef-13.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user