Commit e674ee15 by Kito Cheng

RISC-V: Update march parser

 - The arch string rule has changed in latest spec, it introduced new
   multi-letter extension prefix with 'h' and 'z', and drop `sx`. also
   adjust parsing order for 's' and 'x'.

gcc/ChangeLog

	* riscv-common.c (parse_sv_or_non_std_ext): Rename to
	parse_multiletter_ext.
	(parse_multiletter_ext): Add parsing `h` and `z`, drop `sx`,
	adjust parsing order for 's' and 'x'.

gcc/testsuite/ChangeLog

	* gcc.target/riscv/arch-3.c: Adjust option.
	* gcc.target/riscv/arch-5.c: New.
	* gcc.target/riscv/attribute-9.c: Adjust option and test
	condition.
parent 5503cc19
...@@ -70,8 +70,8 @@ private: ...@@ -70,8 +70,8 @@ private:
const char *parse_std_ext (const char *); const char *parse_std_ext (const char *);
const char *parse_sv_or_non_std_ext (const char *, const char *, const char *parse_multiletter_ext (const char *, const char *,
const char *); const char *);
public: public:
~riscv_subset_list (); ~riscv_subset_list ();
...@@ -357,7 +357,7 @@ riscv_subset_list::parse_std_ext (const char *p) ...@@ -357,7 +357,7 @@ riscv_subset_list::parse_std_ext (const char *p)
{ {
char subset[2] = {0, 0}; char subset[2] = {0, 0};
if (*p == 'x' || *p == 's') if (*p == 'x' || *p == 's' || *p == 'h' || *p == 'z')
break; break;
if (*p == '_') if (*p == '_')
...@@ -399,20 +399,20 @@ riscv_subset_list::parse_std_ext (const char *p) ...@@ -399,20 +399,20 @@ riscv_subset_list::parse_std_ext (const char *p)
return p; return p;
} }
/* Parsing function for non-standard and supervisor extensions. /* Parsing function for multi-letter extensions.
Return Value: Return Value:
Points to the end of extensions. Points to the end of extensions.
Arguments: Arguments:
`p`: Current parsing position. `p`: Current parsing position.
`ext_type`: What kind of extensions, 'x', 's' or 'sx'. `ext_type`: What kind of extensions, 's', 'h', 'z' or 'x'.
`ext_type_str`: Full name for kind of extension. */ `ext_type_str`: Full name for kind of extension. */
const char * const char *
riscv_subset_list::parse_sv_or_non_std_ext (const char *p, riscv_subset_list::parse_multiletter_ext (const char *p,
const char *ext_type, const char *ext_type,
const char *ext_type_str) const char *ext_type_str)
{ {
unsigned major_version = 0; unsigned major_version = 0;
unsigned minor_version = 0; unsigned minor_version = 0;
...@@ -429,11 +429,6 @@ riscv_subset_list::parse_sv_or_non_std_ext (const char *p, ...@@ -429,11 +429,6 @@ riscv_subset_list::parse_sv_or_non_std_ext (const char *p,
if (strncmp (p, ext_type, ext_type_len) != 0) if (strncmp (p, ext_type, ext_type_len) != 0)
break; break;
/* It's non-standard supervisor extension if it prefix with sx. */
if ((ext_type[0] == 's') && (ext_type_len == 1)
&& (*(p + 1) == 'x'))
break;
char *subset = xstrdup (p); char *subset = xstrdup (p);
char *q = subset; char *q = subset;
const char *end_of_version; const char *end_of_version;
...@@ -494,21 +489,26 @@ riscv_subset_list::parse (const char *arch, location_t loc) ...@@ -494,21 +489,26 @@ riscv_subset_list::parse (const char *arch, location_t loc)
if (p == NULL) if (p == NULL)
goto fail; goto fail;
/* Parsing non-standard extension. */ /* Parsing supervisor extension. */
p = subset_list->parse_sv_or_non_std_ext (p, "x", "non-standard extension"); p = subset_list->parse_multiletter_ext (p, "s", "supervisor extension");
if (p == NULL) if (p == NULL)
goto fail; goto fail;
/* Parsing supervisor extension. */ /* Parsing hypervisor extension. */
p = subset_list->parse_sv_or_non_std_ext (p, "s", "supervisor extension"); p = subset_list->parse_multiletter_ext (p, "h", "hypervisor extension");
if (p == NULL) if (p == NULL)
goto fail; goto fail;
/* Parsing non-standard supervisor extension. */ /* Parsing sub-extensions. */
p = subset_list->parse_sv_or_non_std_ext p = subset_list->parse_multiletter_ext (p, "z", "sub-extension");
(p, "sx", "non-standard supervisor extension");
if (p == NULL)
goto fail;
/* Parsing non-standard extension. */
p = subset_list->parse_multiletter_ext (p, "x", "non-standard extension");
if (p == NULL) if (p == NULL)
goto fail; goto fail;
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -march=rv32ixbar_sabc_sxfoo -mabi=ilp32" } */ /* { dg-options "-O -march=rv32isabc_xbar -mabi=ilp32" } */
int foo() int foo()
{ {
} }
/* { dg-do compile } */
/* { dg-options "-O -march=rv32isabc_hghi_zfoo_xbar -mabi=ilp32" } */
int foo()
{
}
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -mriscv-attribute -march=rv32i2p0xbar_sabc_sxfoo -mabi=ilp32e" } */ /* { dg-options "-O -mriscv-attribute -march=rv32i2p0sabc_xbar -mabi=ilp32e" } */
int foo() int foo()
{ {
} }
/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_xbar2p0_sabc2p0_sxfoo2p0\"" } } */ /* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_sabc2p0_xbar2p0\"" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment