[v1,07/16] Add version of make_attribute supporting string_slice.

Message ID 20250203130421.2192732-9-alfie.richards@arm.com
State New
Headers
Series FMV refactor and ACLE compliance. |

Commit Message

Alfie Richards Feb. 3, 2025, 1:04 p.m. UTC
  gcc/ChangeLog:

	* attribs.cc (make_attribute): New function overload.
	* attribs.h (make_attribute): New function overload.
---
 gcc/attribs.cc | 19 ++++++++++++++++++-
 gcc/attribs.h  |  1 +
 2 files changed, 19 insertions(+), 1 deletion(-)
  

Comments

Richard Sandiford Feb. 3, 2025, 5:19 p.m. UTC | #1
Alfie Richards <alfie.richards@arm.com> writes:
> gcc/ChangeLog:
>
> 	* attribs.cc (make_attribute): New function overload.
> 	* attribs.h (make_attribute): New function overload.
> ---
>  gcc/attribs.cc | 19 ++++++++++++++++++-
>  gcc/attribs.h  |  1 +
>  2 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/attribs.cc b/gcc/attribs.cc
> index 5cf45491ada..cb25845715d 100644
> --- a/gcc/attribs.cc
> +++ b/gcc/attribs.cc
> @@ -1090,7 +1090,24 @@ make_attribute (const char *name, const char *arg_name, tree chain)
>    return attr;
>  }
>  
> -
> +/* Makes a function attribute of the form NAME (ARG_NAME) and chains
> +   it to CHAIN.  */
> +
> +tree
> +make_attribute (string_slice name, string_slice arg_name, tree chain)
> +{
> +  tree attr_name;
> +  tree attr_arg_name;
> +  tree attr_args;
> +  tree attr;
> +
> +  attr_name = get_identifier_with_length (name.begin (), name.size ());
> +  attr_arg_name = build_string (arg_name.size (), arg_name.begin ());
> +  attr_args = tree_cons (NULL_TREE, attr_arg_name, NULL_TREE);
> +  attr = tree_cons (attr_name, attr_args, chain);
> +  return attr;
> +}
> +

It seems to be more usual in new code to prefer initialisation over
assignment where possible, so:

  tree attr_name = get_identifier_with_length (name.begin (), name.size ());
  tree attr_arg_name = build_string (arg_name.size (), arg_name.begin ());
  tree attr_args = tree_cons (NULL_TREE, attr_arg_name, NULL_TREE);
  tree attr = tree_cons (attr_name, attr_args, chain);
  return attr;

OK for GCC 16 with that change, thanks.

Richard

>  /* Common functions used for target clone support.  */
>  
>  /* Comparator function to be used in qsort routine to sort attribute
> diff --git a/gcc/attribs.h b/gcc/attribs.h
> index 4b946390f76..e7d592c5b41 100644
> --- a/gcc/attribs.h
> +++ b/gcc/attribs.h
> @@ -46,6 +46,7 @@ extern tree get_attribute_name (const_tree);
>  extern tree get_attribute_namespace (const_tree);
>  extern void apply_tm_attr (tree, tree);
>  extern tree make_attribute (const char *, const char *, tree);
> +extern tree make_attribute (string_slice, string_slice, tree);
>  extern bool attribute_ignored_p (tree);
>  extern bool attribute_ignored_p (const attribute_spec *const);
>  extern bool any_nonignored_attribute_p (tree);
  

Patch

diff --git a/gcc/attribs.cc b/gcc/attribs.cc
index 5cf45491ada..cb25845715d 100644
--- a/gcc/attribs.cc
+++ b/gcc/attribs.cc
@@ -1090,7 +1090,24 @@  make_attribute (const char *name, const char *arg_name, tree chain)
   return attr;
 }
 
-
+/* Makes a function attribute of the form NAME (ARG_NAME) and chains
+   it to CHAIN.  */
+
+tree
+make_attribute (string_slice name, string_slice arg_name, tree chain)
+{
+  tree attr_name;
+  tree attr_arg_name;
+  tree attr_args;
+  tree attr;
+
+  attr_name = get_identifier_with_length (name.begin (), name.size ());
+  attr_arg_name = build_string (arg_name.size (), arg_name.begin ());
+  attr_args = tree_cons (NULL_TREE, attr_arg_name, NULL_TREE);
+  attr = tree_cons (attr_name, attr_args, chain);
+  return attr;
+}
+
 /* Common functions used for target clone support.  */
 
 /* Comparator function to be used in qsort routine to sort attribute
diff --git a/gcc/attribs.h b/gcc/attribs.h
index 4b946390f76..e7d592c5b41 100644
--- a/gcc/attribs.h
+++ b/gcc/attribs.h
@@ -46,6 +46,7 @@  extern tree get_attribute_name (const_tree);
 extern tree get_attribute_namespace (const_tree);
 extern void apply_tm_attr (tree, tree);
 extern tree make_attribute (const char *, const char *, tree);
+extern tree make_attribute (string_slice, string_slice, tree);
 extern bool attribute_ignored_p (tree);
 extern bool attribute_ignored_p (const attribute_spec *const);
 extern bool any_nonignored_attribute_p (tree);