https://gcc.gnu.org/g:5a0016576f04ffbde19a4895063da4798fe0dd5c

commit r16-7983-g5a0016576f04ffbde19a4895063da4798fe0dd5c
Author: Yangyu Chen <[email protected]>
Date:   Tue Mar 10 08:00:10 2026 -0600

    [PATCH] RISC-V: Fix TARGET_CHECK_TARGET_CLONE_VERSION implementation
    
    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]>
    
    ---
    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/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.

Diff:
---
 gcc/config/riscv/riscv.cc                     | 29 +++++++++++++++++++--------
 gcc/testsuite/gcc.target/riscv/mvc-warning1.c |  9 +++++++++
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 27fbe6029f53..282cf71ad61c 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;
+}

Reply via email to