From patchwork Mon Feb 28 13:27:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 51446 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EAC613858C3A for ; Mon, 28 Feb 2022 13:27:31 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id BC86A3858C83 for ; Mon, 28 Feb 2022 13:27:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org BC86A3858C83 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.cz Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id A4A1521991 for ; Mon, 28 Feb 2022 13:27:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1646054834; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7P4GXj8HhdZtx8xBKqXBEZwXhfAea8jE0BK4W9851NI=; b=i2aG5GZCn++EwdZmp/B0y6ZpmKSGS0HjHoXda5JqKArW2U6fnLyTE39getuxpULk/rbwa7 bmiDE91re51bRwNaKbyDFCZoWrMkg3mYod1EFJUJyddNYN0ITg02lx1hBv+sXrOgQHTKDl ReG6PAGTAkrfHW8hfYZiQV887W72mjg= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1646054834; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7P4GXj8HhdZtx8xBKqXBEZwXhfAea8jE0BK4W9851NI=; b=ZWtoxwgDBts38npzeFSB8r/osVxFN6P1l6DsJuxQ1ET9d88mJyLuKhMsVvJ1kPyx3I5tqR hLNYMv6haST1CXAg== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 9305213C29 for ; Mon, 28 Feb 2022 13:27:14 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id KTObIrLNHGLGQgAAMHmgww (envelope-from ) for ; Mon, 28 Feb 2022 13:27:14 +0000 Message-ID: Date: Mon, 28 Feb 2022 14:27:14 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 From: =?utf-8?q?Martin_Li=C5=A1ka?= Subject: [PATCH] ipa: Improve error handling for target_clone single value To: gcc-patches@gcc.gnu.org Content-Language: en-US X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" The patch moves attribute checking to handle_target_clones_attribute where we drop the attribute if it contains only a single value. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin 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. --- 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(-) create mode 100644 gcc/testsuite/g++.target/i386/pr104533.C 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 */