Hi Geng: Thanks for your patch, committed with minor tweaks for gcc_assert.
On Tue, May 18, 2021 at 2:31 PM Geng Qi via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > gcc/ChangeLog: > * common/config/riscv/riscv-common.c > (riscv_subset_list::parsing_subset_version): Properly parse the letter > 'p' in '-march'. > (riscv_subset_list::parse_std_ext, > riscv_subset_list::parse_multiletter_ext): To handle errors generated > in riscv_subset_list::parsing_subset_version. > > gcc/testsuite/ChangeLog: > * gcc.target/riscv/arch-12.c: New. > * gcc.target/riscv/attribute-19.c: New. > --- > gcc/common/config/riscv/riscv-common.c | 67 > ++++++++++++++------------- > gcc/testsuite/gcc.target/riscv/arch-12.c | 4 ++ > gcc/testsuite/gcc.target/riscv/attribute-19.c | 4 ++ > 3 files changed, 42 insertions(+), 33 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/riscv/arch-12.c > create mode 100644 gcc/testsuite/gcc.target/riscv/attribute-19.c > > diff --git a/gcc/common/config/riscv/riscv-common.c > b/gcc/common/config/riscv/riscv-common.c > index 34b74e5..65e5641 100644 > --- a/gcc/common/config/riscv/riscv-common.c > +++ b/gcc/common/config/riscv/riscv-common.c > @@ -518,40 +518,38 @@ riscv_subset_list::parsing_subset_version (const char > *ext, > unsigned version = 0; > unsigned major = 0; > unsigned minor = 0; > - char np; > *explicit_version_p = false; > > - for (; *p; ++p) > - { > - if (*p == 'p') > - { > - np = *(p + 1); > - > - if (!ISDIGIT (np)) > - { > - /* Might be beginning of `p` extension. */ > - if (std_ext_p) > - { > - get_default_version (ext, major_version, minor_version); > - return p; > - } > - else > - { > - error_at (m_loc, "%<-march=%s%>: Expect number " > - "after %<%dp%>.", m_arch, version); > - return NULL; > - } > - } > - > - major = version; > - major_p = false; > - version = 0; > - } > - else if (ISDIGIT (*p)) > - version = (version * 10) + (*p - '0'); > - else > - break; > - } > + if (*p == 'p') > + gcc_assert (std_ext_p); > + else { > + for (; *p; ++p) > + { > + if (*p == 'p') > + { > + if (!ISDIGIT (*(p+1))) > + { > + error_at (m_loc, "%<-march=%s%>: Expect number " > + "after %<%dp%>.", m_arch, version); > + return NULL; > + } > + if (!major_p) > + { > + error_at (m_loc, "%<-march=%s%>: For %<%s%dp%dp?%>, version " > + "number with more than 2 level is not supported.", > + m_arch, ext, major, version); > + return NULL; > + } > + major = version; > + major_p = false; > + version = 0; > + } > + else if (ISDIGIT (*p)) > + version = (version * 10) + (*p - '0'); > + else > + break; > + } > + } > > if (major_p) > major = version; > @@ -643,7 +641,7 @@ riscv_subset_list::parse_std_ext (const char *p) > return NULL; > } > > - while (*p) > + while (p != NULL && *p) > { > char subset[2] = {0, 0}; > > @@ -771,6 +769,9 @@ riscv_subset_list::parse_multiletter_ext (const char *p, > /* std_ext_p= */ false, > &explicit_version_p); > free (ext); > > + if (end_of_version == NULL) > + return NULL; > + > *q = '\0'; > > if (strlen (subset) == 1) > diff --git a/gcc/testsuite/gcc.target/riscv/arch-12.c > b/gcc/testsuite/gcc.target/riscv/arch-12.c > new file mode 100644 > index 0000000..29e16c3 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/arch-12.c > @@ -0,0 +1,4 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -march=rv64im1p2p3 -mabi=lp64" } */ > +int foo() {} > +/* { dg-error "'-march=rv64im1p2p3': For 'm1p2p\\?', version number with > more than 2 level is not supported." "" { target *-*-* } 0 } */ > diff --git a/gcc/testsuite/gcc.target/riscv/attribute-19.c > b/gcc/testsuite/gcc.target/riscv/attribute-19.c > new file mode 100644 > index 0000000..18f68d9 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/attribute-19.c > @@ -0,0 +1,4 @@ > +/* { dg-do compile } */ > +/* { dg-options "-mriscv-attribute -march=rv64imp0p9 -mabi=lp64" } */ > +int foo() {} > +/* { dg-final { scan-assembler ".attribute arch, \"rv64i2p0_m2p0_p0p9\"" } } > */ > -- > 2.7.4 >