RISC-V: Fix ICE in non-canonical march parsing

Passing in a base extension in non-canonical order (i, e, g) causes GCC
to ICE:
xgcc: error: '-march=rv64ge': ISA string is not in canonical order. 'e'
xgcc: internal compiler error: in add, at common/config/riscv/riscv-common.cc:671
...

This is fixed by skipping to the next extension when a non-canonical
order is detected.

gcc/ChangeLog:

	* common/config/riscv/riscv-common.cc
	(riscv_subset_list::parse_std_ext): Emit an error and skip to
	the next extension when a non-canonical ordering is detected.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/arch-27.c: New test.
	* gcc.target/riscv/arch-28.c: New test.

Signed-off-by: Patrick O'Neill <patrick@rivosinc.com>
This commit is contained in:
Patrick O'Neill 2023-11-14 15:08:31 -08:00
parent 186331063d
commit 026d9454b1
No known key found for this signature in database
GPG Key ID: A021A255BA0CDD04
3 changed files with 27 additions and 4 deletions

View File

@ -1017,15 +1017,24 @@ riscv_subset_list::parse_std_ext (const char *p)
std_ext = *p; std_ext = *p;
/* Checking canonical order. */ /* Checking canonical order. */
const char *prior_std_exts = std_exts;
while (*std_exts && std_ext != *std_exts) while (*std_exts && std_ext != *std_exts)
std_exts++; std_exts++;
subset[0] = std_ext; subset[0] = std_ext;
if (std_ext != *std_exts && standard_extensions_p (subset)) if (std_ext != *std_exts && standard_extensions_p (subset))
error_at (m_loc, {
"%<-march=%s%>: ISA string is not in canonical order. " error_at (m_loc,
"%<%c%>", "%<-march=%s%>: ISA string is not in canonical order. "
m_arch, *p); "%<%c%>",
m_arch, *p);
/* Extension ordering is invalid. Ignore this extension and keep
searching for other issues with remaining extensions. */
std_exts = prior_std_exts;
p++;
continue;
}
std_exts++; std_exts++;

View File

@ -0,0 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-march=rv64ge -mabi=lp64d" } */
int foo()
{
}
/* { dg-error "ISA string is not in canonical order. 'e'" "" { target *-*-* } 0 } */

View File

@ -0,0 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-march=rv64imaefcv -mabi=lp64d" } */
int foo()
{
}
/* { dg-error "ISA string is not in canonical order. 'e'" "" { target *-*-* } 0 } */