From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 114351 invoked by alias); 13 Mar 2018 13:35:24 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 114313 invoked by uid 89); 13 Mar 2018 13:35:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:1974 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 13 Mar 2018 13:35:22 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id EEE53AB32; Tue, 13 Mar 2018 13:35:19 +0000 (UTC) From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Subject: [PATCH] Redirect reference in the symbol table (PR ipa/84833). To: gcc-patches@gcc.gnu.org Cc: Jan Hubicka , Jakub Jelinek Message-ID: <74a3a5dd-2562-a5fc-53a6-93ca823f62ac@suse.cz> Date: Tue, 13 Mar 2018 13:35:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------83D399F0815CCADF2EFE4590" X-IsSubscribed: yes X-SW-Source: 2018-03/txt/msg00590.txt.bz2 This is a multi-part message in MIME format. --------------83D399F0815CCADF2EFE4590 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 799 Hi. This fixed issue where we have an ifunc function called from another ifunc function. One needs to properly make a reference redirection. Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. MVC tests on x86_64 also work fine. Ready for trunk? Thanks, Martin gcc/ChangeLog: 2018-03-13 Martin Liska PR ipa/84833 * multiple_target.c (create_dispatcher_calls): Redirect reference in the symbol table. gcc/testsuite/ChangeLog: 2018-03-13 Martin Liska PR ipa/84833 * gcc.target/i386/mvc11.c: New test. --- gcc/multiple_target.c | 4 ++++ gcc/testsuite/gcc.target/i386/mvc11.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/mvc11.c --------------83D399F0815CCADF2EFE4590 Content-Type: text/x-patch; name="0001-Redirect-reference-in-the-symbol-table-PR-ipa-84833.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-Redirect-reference-in-the-symbol-table-PR-ipa-84833.pat"; filename*1="ch" Content-length: 1200 diff --git a/gcc/multiple_target.c b/gcc/multiple_target.c index a6767985774..46cf7a30733 100644 --- a/gcc/multiple_target.c +++ b/gcc/multiple_target.c @@ -144,6 +144,10 @@ create_dispatcher_calls (struct cgraph_node *node) if (ref->referring->decl != resolver_decl) walk_gimple_stmt (&it, NULL, replace_function_decl, &wi); } + + symtab_node *source = ref->referring; + ref->remove_reference (); + source->create_reference (inode, IPA_REF_ADDR); } else gcc_unreachable (); diff --git a/gcc/testsuite/gcc.target/i386/mvc11.c b/gcc/testsuite/gcc.target/i386/mvc11.c new file mode 100644 index 00000000000..5bd10f4651d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/mvc11.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-std=gnu99" } */ + +__attribute__((noipa)) int +baz (int (*fn) (void)) +{ + asm volatile ("" : "+g" (fn) : : "memory"); + return fn (); +} + +__attribute__((target_clones("arch=sandybridge", "default"))) static int +bar (void) +{ + return 1; +} + +__attribute__((target_clones("arch=sandybridge", "default"))) int +foo (void) +{ + baz (bar) - 1; +} + +int +main () +{ + foo (); +} --------------83D399F0815CCADF2EFE4590--