On 10/31/24 17:51, Kito Cheng wrote:
Could you add a test case for what you try to handle?


After carefully reviewing the code, I think this can be dropped in the next revision.

The intuition of this patch is to handle both target and target_versions specified in the attributes. But after checking all the callers for target_option,valid_attribute_p, I see that this case is already being handled, so it dropped.


On Thu, Oct 24, 2024 at 3:15 PM Yangyu Chen <c...@cyyself.name> wrote:

To ensure that the target_version attribute is applied after target
attributes.

gcc/ChangeLog:

         * config/riscv/riscv-target-attr.cc
         (riscv_option_valid_attribute_p): Reapply target_version
         attribute after target attribute
---
  gcc/config/riscv/riscv-target-attr.cc | 13 +++++++++++++
  1 file changed, 13 insertions(+)

diff --git a/gcc/config/riscv/riscv-target-attr.cc 
b/gcc/config/riscv/riscv-target-attr.cc
index 3042562c66b..7dcff0211ea 100644
--- a/gcc/config/riscv/riscv-target-attr.cc
+++ b/gcc/config/riscv/riscv-target-attr.cc
@@ -30,6 +30,8 @@ along with GCC; see the file COPYING3.  If not see
  #include "diagnostic.h"
  #include "opts.h"
  #include "riscv-subset.h"
+#include "stringpool.h"
+#include "attribs.h"

  namespace {
  class riscv_target_attr_parser
@@ -450,6 +452,17 @@ riscv_option_valid_attribute_p (tree fndecl, tree, tree 
args, int)
    ret = riscv_process_target_attr (args, loc);
    if (ret)
      {
+      tree version_attr = lookup_attribute ("target_version",
+                                           DECL_ATTRIBUTES (fndecl));
+      if (version_attr != NULL_TREE)
+       {
+         // Reapply any target_version attribute after target attribute.
+         // This should be equivalent to applying the target_version once
+         // after processing all target attributes.
+         tree version_args = TREE_VALUE (version_attr);
+         riscv_process_target_version_attr (version_args,
+                                            DECL_SOURCE_LOCATION (fndecl));
+       }
        riscv_override_options_internal (&global_options);
        new_target = build_target_option_node (&global_options,
                                              &global_options_set);
--
2.45.2



Reply via email to