aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.cc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2022-02-28 13:27:22 +0100
committerMartin Liska <mliska@suse.cz>2022-03-01 10:10:29 +0100
commit6df0c8d417fb33ea130e2957755a60483e9fd692 (patch)
tree0a9cf70f1d60f30e262cbae094ffacfe38955ba4 /gcc/tree.cc
parentb88f683e57acb06593959c26c9d78861fcd15cf1 (diff)
downloadgcc-6df0c8d417fb33ea130e2957755a60483e9fd692.zip
gcc-6df0c8d417fb33ea130e2957755a60483e9fd692.tar.gz
gcc-6df0c8d417fb33ea130e2957755a60483e9fd692.tar.bz2
ipa: Improve error handling for target_clone single value
PR ipa/104533 gcc/c-family/ChangeLog: * c-attribs.cc (handle_target_clones_attribute): Use get_target_clone_attr_len and report warning soon. gcc/ChangeLog: * multiple_target.cc (get_attr_len): Move to tree.c. (expand_target_clones): Remove single value checking. * tree.cc (get_target_clone_attr_len): New fn. * tree.h (get_target_clone_attr_len): Likewise. gcc/testsuite/ChangeLog: * g++.target/i386/pr104533.C: New test.
Diffstat (limited to 'gcc/tree.cc')
-rw-r--r--gcc/tree.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 2bbef2d..4522d90 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -14553,6 +14553,30 @@ get_attr_nonstring_decl (tree expr, tree *ref)
return NULL_TREE;
}
+/* Return length of attribute names string,
+ if arglist chain > 1, -1 otherwise. */
+
+int
+get_target_clone_attr_len (tree arglist)
+{
+ tree arg;
+ int str_len_sum = 0;
+ int argnum = 0;
+
+ for (arg = arglist; arg; arg = TREE_CHAIN (arg))
+ {
+ const char *str = TREE_STRING_POINTER (TREE_VALUE (arg));
+ size_t len = strlen (str);
+ str_len_sum += len + 1;
+ for (const char *p = strchr (str, ','); p; p = strchr (p + 1, ','))
+ argnum++;
+ argnum++;
+ }
+ if (argnum <= 1)
+ return -1;
+ return str_len_sum;
+}
+
#if CHECKING_P
namespace selftest {