The 02/10/2026 01:06, Yangyu Chen wrote: > Currently, the implementation of TARGET_CHECK_TARGET_CLONE_VERSION for > RISC-V is incomplete and will emit an error for invalid target_clones > versions. This can be problematic during transitions to new extensions, > as it may break builds that have not yet updated their target_clones > versions. > > This commit implements TARGET_CHECK_TARGET_CLONE_VERSION for RISC-V, by > using the riscv_process_target_version_str with loc set to NULL to > prevent emitting errors for invalid versions. This allows for a smoother > transition to new extensions, while still providing a mechanism for > checking target_clones versions when needed.
Just to add, this looks good to me and would be great to align these two targets semantically. > > Signed-off-by: Yangyu Chen <[email protected]> > > gcc/ChangeLog: > > * config/riscv/riscv.cc (riscv_check_target_clone_version): > Fix TARGET_CHECK_TARGET_CLONE_VERSION implementation. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/mvc-warning1.c: New test. > --- > Note: I think it should be safe to push to GCC-16 with the new test, to align > FMV with aarch64 for invalid version string. Future ISA extensions may cause > build breakage if the version string is not updated, and this test can help > catch such issues early. > > Aarch64 in GCC-16 already merged this new feature. X86 [1] may also merge this > feature in GCC-16, but it is not yet clear. If X86 also merges this feature in > GCC-16, then it would be more consistent to also merge the RISC-V > implementation in GCC-16. > > [1] > https://patchwork.sourceware.org/project/gcc/patch/[email protected]/ > --- > gcc/config/riscv/riscv.cc | 29 ++++++++++++++----- > gcc/testsuite/gcc.target/riscv/mvc-warning1.c | 9 ++++++ > 2 files changed, 30 insertions(+), 8 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/riscv/mvc-warning1.c > > diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc > index 3baf0a936b58..706c92ff82a0 100644 > --- a/gcc/config/riscv/riscv.cc > +++ b/gcc/config/riscv/riscv.cc > @@ -15045,16 +15045,29 @@ riscv_compare_version_priority (tree decl1, tree > decl2) > bool > riscv_check_target_clone_version (string_slice str, location_t *loc_p) > { > - struct riscv_feature_bits mask; > - int prio; > + if (str == "default") > + return true; > > - /* Currently it is not possible to parse without emitting errors on failure > - so do not reject on a failed parse, as this would then emit two > - diagnostics. Instead let errors be emitted which will halt > - compilation. */ > - parse_features_for_version (str, loc_p, mask, prio); > + struct cl_target_option cur_target; > + cl_target_option_save (&cur_target, &global_options, > + &global_options_set); > > - return true; > + struct cl_target_option *default_opts > + = TREE_TARGET_OPTION (target_option_default_node); > + cl_target_option_restore (&global_options, &global_options_set, > + default_opts); > + > + bool ok = riscv_process_target_version_str (str, NULL); > + > + cl_target_option_restore (&global_options, &global_options_set, > + &cur_target); > + > + if (!ok && loc_p) > + warning_at (*loc_p, OPT_Wattributes, > + "invalid version %qB for %<target_clones%> attribute", > + &str); > + > + return ok; > } > > /* Implement TARGET_MANGLE_DECL_ASSEMBLER_NAME, to add function > multiversioning > diff --git a/gcc/testsuite/gcc.target/riscv/mvc-warning1.c > b/gcc/testsuite/gcc.target/riscv/mvc-warning1.c > new file mode 100644 > index 000000000000..0ba4b182070c > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/mvc-warning1.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-require-ifunc "" } */ > +/* { dg-options "-O0" } */ > + > +__attribute__((target_clones("default", "random-arch-string"))) > +int foo () /* { dg-warning "invalid version > .*random-arch-string.*target_clones" } */ > +{ > + return 1; > +} > -- > 2.51.0 > -- Alfie Richards
