c: check if target_clone attrs are all string
Checks
Commit Message
Hi.
The patch checks all attribute arguments if they are string. If not,
an error message is emitted.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
Ready to be installed?
Thanks,
Martin
PR c/107993
gcc/c-family/ChangeLog:
* c-attribs.cc (handle_target_clones_attribute): Check for
string constant for all target_clone attribute values.
gcc/testsuite/ChangeLog:
* gcc.target/i386/pr107993.c: New test.
---
gcc/c-family/c-attribs.cc | 14 ++++++++++----
gcc/testsuite/gcc.target/i386/pr107993.c | 9 +++++++++
2 files changed, 19 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/i386/pr107993.c
Comments
On Wed, Dec 28, 2022 at 9:17 AM Martin Liška <mliska@suse.cz> wrote:
>
> Hi.
>
> The patch checks all attribute arguments if they are string. If not,
> an error message is emitted.
>
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
> Ready to be installed?
OK.
Richard.
> Thanks,
> Martin
>
> PR c/107993
>
> gcc/c-family/ChangeLog:
>
> * c-attribs.cc (handle_target_clones_attribute): Check for
> string constant for all target_clone attribute values.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/i386/pr107993.c: New test.
> ---
> gcc/c-family/c-attribs.cc | 14 ++++++++++----
> gcc/testsuite/gcc.target/i386/pr107993.c | 9 +++++++++
> 2 files changed, 19 insertions(+), 4 deletions(-)
> create mode 100644 gcc/testsuite/gcc.target/i386/pr107993.c
>
> diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
> index b36dd97802b..33d84cb6e07 100644
> --- a/gcc/c-family/c-attribs.cc
> +++ b/gcc/c-family/c-attribs.cc
> @@ -5574,12 +5574,18 @@ handle_target_clones_attribute (tree *node, tree name, tree ARG_UNUSED (args),
> /* Ensure we have a function type. */
> if (TREE_CODE (*node) == FUNCTION_DECL)
> {
> - if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
> + for (tree t = args; t != NULL_TREE; t = TREE_CHAIN (t))
> {
> - error ("%qE attribute argument not a string constant", name);
> - *no_add_attrs = true;
> + tree value = TREE_VALUE (t);
> + if (TREE_CODE (value) != STRING_CST)
> + {
> + error ("%qE attribute argument not a string constant", name);
> + *no_add_attrs = true;
> + return NULL_TREE;
> + }
> }
> - else if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
> +
> + if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
> {
> warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
> "with %qs attribute", name, "always_inline");
> diff --git a/gcc/testsuite/gcc.target/i386/pr107993.c b/gcc/testsuite/gcc.target/i386/pr107993.c
> new file mode 100644
> index 00000000000..b0b84a677d8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr107993.c
> @@ -0,0 +1,9 @@
> +/* PR c/107993 */
> +/* { dg-do compile } */
> +
> +typedef union { int x; } u;
> +__attribute__((target_clones("arch=alderlake",!"default")))
> +int f (u *x)
> +{ /* { dg-error ".target_clones. attribute argument not a string constant" } */
> + return 0;
> +}
> --
> 2.39.0
>
@@ -5574,12 +5574,18 @@ handle_target_clones_attribute (tree *node, tree name, tree ARG_UNUSED (args),
/* Ensure we have a function type. */
if (TREE_CODE (*node) == FUNCTION_DECL)
{
- if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
+ for (tree t = args; t != NULL_TREE; t = TREE_CHAIN (t))
{
- error ("%qE attribute argument not a string constant", name);
- *no_add_attrs = true;
+ tree value = TREE_VALUE (t);
+ if (TREE_CODE (value) != STRING_CST)
+ {
+ error ("%qE attribute argument not a string constant", name);
+ *no_add_attrs = true;
+ return NULL_TREE;
+ }
}
- else if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
+
+ if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
{
warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
"with %qs attribute", name, "always_inline");
new file mode 100644
@@ -0,0 +1,9 @@
+/* PR c/107993 */
+/* { dg-do compile } */
+
+typedef union { int x; } u;
+__attribute__((target_clones("arch=alderlake",!"default")))
+int f (u *x)
+{ /* { dg-error ".target_clones. attribute argument not a string constant" } */
+ return 0;
+}