Alfie Richards <alfie.richa...@arm.com> writes:
> This is a reimplementation of get_target_clone_attr_len,
> get_attr_str, and separate_attrs using string_slice and auto_vec to make
> memory management and use simpler.
>
> gcc/c-family/ChangeLog:
>
>       * c-attribs.cc (handle_target_clones_attribute): Change to use
>       get_clone_versions.
>
> gcc/ChangeLog:
>
>       * tree.cc (get_clone_versions): New function.
>       (get_clone_attr_versions): New function.
>       * tree.h (get_clone_versions): New function.
>       (get_clone_attr_versions): New function.

OK for GCC 16, thanks.

Richard

> ---
>  gcc/c-family/c-attribs.cc |  2 +-
>  gcc/tree.cc               | 40 +++++++++++++++++++++++++++++++++++++++
>  gcc/tree.h                |  3 +++
>  3 files changed, 44 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
> index f3181e7b57c..642d724f6c6 100644
> --- a/gcc/c-family/c-attribs.cc
> +++ b/gcc/c-family/c-attribs.cc
> @@ -6129,7 +6129,7 @@ handle_target_clones_attribute (tree *node, tree name, 
> tree ARG_UNUSED (args),
>           }
>       }
>  
> -      if (get_target_clone_attr_len (args) == -1)
> +      if (get_clone_attr_versions (args).length () == 1)
>       {
>         warning (OPT_Wattributes,
>                  "single %<target_clones%> attribute is ignored");
> diff --git a/gcc/tree.cc b/gcc/tree.cc
> index 0743ed71c78..83dc9f32f96 100644
> --- a/gcc/tree.cc
> +++ b/gcc/tree.cc
> @@ -15356,6 +15356,46 @@ get_target_clone_attr_len (tree arglist)
>    return str_len_sum;
>  }
>  
> +/* Returns an auto_vec of string_slices containing the version strings from
> +   ARGLIST.  DEFAULT_COUNT is incremented for each default version found.  */
> +
> +auto_vec<string_slice>
> +get_clone_attr_versions (const tree arglist, int *default_count)
> +{
> +  gcc_assert (TREE_CODE (arglist) == TREE_LIST);
> +  auto_vec<string_slice> versions;
> +
> +  static const char separator_str[] = {TARGET_CLONES_ATTR_SEPARATOR, 0};
> +  string_slice separators = string_slice (separator_str);
> +
> +  for (tree arg = arglist; arg; arg = TREE_CHAIN (arg))
> +    {
> +      string_slice str = string_slice (TREE_STRING_POINTER (TREE_VALUE 
> (arg)));
> +      while (str.is_valid ())
> +     {
> +       string_slice attr = string_slice::tokenize (&str, separators);
> +       attr = attr.strip ();
> +       if (attr == "default" && default_count)
> +         (*default_count)++;
> +       versions.safe_push (attr);
> +     }
> +    }
> +  return versions;
> +}
> +
> +/* Returns an auto_vec of string_slices containing the version strings from
> +   the target_clone attribute from DECL.  DEFAULT_COUNT is incremented for 
> each
> +   default version found.  */
> +auto_vec<string_slice>
> +get_clone_versions (const tree decl, int *default_count)
> +{
> +  tree attr = lookup_attribute ("target_clones", DECL_ATTRIBUTES (decl));
> +  if (!attr)
> +    return auto_vec<string_slice> ();
> +  tree arglist = TREE_VALUE (attr);
> +  return get_clone_attr_versions (arglist, default_count);
> +}
> +
>  void
>  tree_cc_finalize (void)
>  {
> diff --git a/gcc/tree.h b/gcc/tree.h
> index 21f3cd5525c..70541070c40 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3.  If not see
>  
>  #include "tree-core.h"
>  #include "options.h"
> +#include "vec.h"
>  
>  /* Convert a target-independent built-in function code to a combined_fn.  */
>  
> @@ -7035,5 +7036,7 @@ extern unsigned fndecl_dealloc_argno (tree);
>  extern tree get_attr_nonstring_decl (tree, tree * = NULL);
>  
>  extern int get_target_clone_attr_len (tree);
> +auto_vec<string_slice> get_clone_versions (const tree, int * = NULL);
> +auto_vec<string_slice> get_clone_attr_versions (const tree, int * = NULL);
>  
>  #endif  /* GCC_TREE_H  */

Reply via email to