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:
Kito Cheng 2020-12-11 16:51:40 +08:00
parent 0b7b471011
commit e3354b6de7
7 changed files with 214 additions and 0 deletions

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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 */

View 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;
}

View 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;
}

View 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;
}

View 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;
}