From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1851) id AD3C1385840A; Tue, 1 Mar 2022 09:10:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AD3C1385840A MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Martin Liska To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-7427] ipa: Improve error handling for target_clone single value X-Act-Checkin: gcc X-Git-Author: Martin Liska X-Git-Refname: refs/heads/master X-Git-Oldrev: b88f683e57acb06593959c26c9d78861fcd15cf1 X-Git-Newrev: 6df0c8d417fb33ea130e2957755a60483e9fd692 Message-Id: <20220301091050.AD3C1385840A@sourceware.org> Date: Tue, 1 Mar 2022 09:10:50 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Mar 2022 09:10:50 -0000 https://gcc.gnu.org/g:6df0c8d417fb33ea130e2957755a60483e9fd692 commit r12-7427-g6df0c8d417fb33ea130e2957755a60483e9fd692 Author: Martin Liska Date: Mon Feb 28 13:27:22 2022 +0100 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. Diff: --- gcc/c-family/c-attribs.cc | 6 ++++++ gcc/multiple_target.cc | 26 +------------------------- gcc/testsuite/g++.target/i386/pr104533.C | 11 +++++++++++ gcc/tree.cc | 24 ++++++++++++++++++++++++ gcc/tree.h | 2 ++ 5 files changed, 44 insertions(+), 25 deletions(-) diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc index 3849dba90b2..d394ea9d57e 100644 --- a/gcc/c-family/c-attribs.cc +++ b/gcc/c-family/c-attribs.cc @@ -5486,6 +5486,12 @@ handle_target_clones_attribute (tree *node, tree name, tree ARG_UNUSED (args), "with %qs attribute", name, "target"); *no_add_attrs = true; } + else if (get_target_clone_attr_len (args) == -1) + { + warning (OPT_Wattributes, + "single % attribute is ignored"); + *no_add_attrs = true; + } else /* Do not inline functions with multiple clone targets. */ DECL_UNINLINABLE (*node) = 1; diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc index 5a5a75f0c38..7fe02fb55c8 100644 --- a/gcc/multiple_target.cc +++ b/gcc/multiple_target.cc @@ -185,30 +185,6 @@ create_dispatcher_calls (struct cgraph_node *node) } } -/* Return length of attribute names string, - if arglist chain > 1, -1 otherwise. */ - -static int -get_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; -} - /* Create string with attributes separated by comma. Return number of attributes. */ @@ -342,7 +318,7 @@ expand_target_clones (struct cgraph_node *node, bool definition) return false; tree arglist = TREE_VALUE (attr_target); - int attr_len = get_attr_len (arglist); + int attr_len = get_target_clone_attr_len (arglist); /* No need to clone for 1 target attribute. */ if (attr_len == -1) diff --git a/gcc/testsuite/g++.target/i386/pr104533.C b/gcc/testsuite/g++.target/i386/pr104533.C new file mode 100644 index 00000000000..6a1d8def097 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr104533.C @@ -0,0 +1,11 @@ +/* PR ipa/104533 */ +/* { dg-do compile } */ +/* { dg-additional-options "-std=c++11 -fPIC -Ofast -fno-semantic-interposition" } */ +/* { dg-require-ifunc "" } */ + +struct B +{ + virtual ~B(); +}; +__attribute__((target_clones("avx"))) +B::~B() = default; /* { dg-warning "single .target_clones. attribute is ignored" } */ diff --git a/gcc/tree.cc b/gcc/tree.cc index 2bbef2d6b75..4522d90c4d9 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 { diff --git a/gcc/tree.h b/gcc/tree.h index 95334b077da..36ceed57064 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -6579,4 +6579,6 @@ extern unsigned fndecl_dealloc_argno (tree); object or pointer. Otherwise return null. */ extern tree get_attr_nonstring_decl (tree, tree * = NULL); +extern int get_target_clone_attr_len (tree); + #endif /* GCC_TREE_H */