From patchwork Fri Feb 28 20:02:12 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 325332 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id E15942C00B3 for ; Sat, 1 Mar 2014 07:02:25 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; q= dns; s=default; b=xLfD/CJYs8APUWijWpYRhuDnZ6m++QScQOrPQvnO4Wwpg4 CIWAnAju1zPix0Sk4eTX9vYw4GOscEpOyHeG3u/etav1nZVOWn1KHqQvkjBkrVrA ENZfgXnsS5w5v4f/CSKSI7U8tBj5su1McI+4PXlcXEFWN2kvSSX/nG2TGDmmQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; s= default; bh=yJgSFv0/NLRZBj/QjGec7qfFU1I=; b=iAjR3F9FeiGEm5L23N// yQbB3ZJ829H719v4uw/i4RmLji7EKmfHmvtCYAIM/tQ/3PHCPDCHhz+Uq0gakf8s TmumrZhKFTVdUZ1k+4P7lMeEUT1R5xaYtqIaP/SefODdDoQE1AaSQexx1dm4+Yqu 4Gv3tvkZ+tjLVPCigM9nGCA= Received: (qmail 7407 invoked by alias); 28 Feb 2014 20:02:18 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 7396 invoked by uid 89); 28 Feb 2014 20:02:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.0 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 28 Feb 2014 20:02:15 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s1SK2D6b017062 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Feb 2014 15:02:14 -0500 Received: from [10.10.116.19] ([10.10.116.19]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s1SK2CIt002968; Fri, 28 Feb 2014 15:02:13 -0500 Message-ID: <5310EB44.60602@redhat.com> Date: Fri, 28 Feb 2014 15:02:12 -0500 From: Jason Merrill User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: gcc-patches List , Jan Hubicka Subject: RFA: ipa-devirt PATCH for c++/58678 (devirt causes KDE build failure) Multiple large C++ projects (KDE and libreoffice, at least) have been breaking when GCC speculatively devirtualizes a call to an implicitly-declared virtual destructor, because this leads to references to base destructors and vtables that might be hidden in another DSO. This patch avoids this problem by avoiding speculative devirtualization of calls to implicitly-declared functions. Tested x86_64-pc-linux-gnu. OK for trunk? commit 94eb5df9fb20c796d09151d7293ae89ac012ae79 Author: Jason Merrill Date: Fri Feb 28 14:03:19 2014 -0500 PR c++/58678 * ipa-devirt.c (ipa_devirt): Don't choose an implicitly-declared function. diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 21649cb..27dc27d 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -1710,7 +1710,7 @@ ipa_devirt (void) int npolymorphic = 0, nspeculated = 0, nconverted = 0, ncold = 0; int nmultiple = 0, noverwritable = 0, ndevirtualized = 0, nnotdefined = 0; - int nwrong = 0, nok = 0, nexternal = 0;; + int nwrong = 0, nok = 0, nexternal = 0, nartificial = 0; FOR_EACH_DEFINED_FUNCTION (n) { @@ -1820,6 +1820,16 @@ ipa_devirt (void) nexternal++; continue; } + /* Don't use an implicitly-declared destructor (c++/58678). */ + struct cgraph_node *real_target + = cgraph_function_node (likely_target); + if (DECL_ARTIFICIAL (real_target->decl)) + { + if (dump_file) + fprintf (dump_file, "Target is implicitly declared\n\n"); + nartificial++; + continue; + } if (cgraph_function_body_availability (likely_target) <= AVAIL_OVERWRITABLE && symtab_can_be_discarded (likely_target)) @@ -1862,10 +1872,10 @@ ipa_devirt (void) " %i speculatively devirtualized, %i cold\n" "%i have multiple targets, %i overwritable," " %i already speculated (%i agree, %i disagree)," - " %i external, %i not defined\n", + " %i external, %i not defined, %i artificial\n", npolymorphic, ndevirtualized, nconverted, ncold, nmultiple, noverwritable, nspeculated, nok, nwrong, - nexternal, nnotdefined); + nexternal, nnotdefined, nartificial); return ndevirtualized ? TODO_remove_functions : 0; } diff --git a/gcc/testsuite/g++.dg/ipa/devirt-28.C b/gcc/testsuite/g++.dg/ipa/devirt-28.C new file mode 100644 index 0000000..35c8df1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-28.C @@ -0,0 +1,17 @@ +// PR c++/58678 +// { dg-options "-O3 -fdump-ipa-devirt" } + +struct A { + virtual ~A(); +}; +struct B : A { + virtual int m_fn1(); +}; +void fn1(B* b) { + delete b; +} + +// { dg-final { scan-assembler-not "_ZN1AD2Ev" } } +// { dg-final { scan-assembler-not "_ZN1BD0Ev" } } +// { dg-final { scan-ipa-dump "Target is implicitly declared" "devirt" } } +// { dg-final { cleanup-ipa-dump "devirt" } }