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. 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
