From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23493 invoked by alias); 9 Jan 2011 01:01:59 -0000 Received: (qmail 23483 invoked by uid 22791); 9 Jan 2011 01:01:58 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from nikam-dmz.ms.mff.cuni.cz (HELO nikam.ms.mff.cuni.cz) (195.113.20.16) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 09 Jan 2011 01:01:53 +0000 Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id 964C59AC823; Sun, 9 Jan 2011 02:01:50 +0100 (CET) Date: Sun, 09 Jan 2011 01:22:00 -0000 From: Jan Hubicka To: gcc-patches@gcc.gnu.org, dnovillo@redhat.com, rguenther@suse.de Subject: PR lto/46083 (destructor priorities are wrong) Message-ID: <20110109010150.GE28524@kam.mff.cuni.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) 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 X-SW-Source: 2011-01/txt/msg00469.txt.bz2 Hi, the PR is about testsuite/initpri1.c failing with lto. I am not sure why the testcase is not run with -flto flags. It is declared as /* { dg-do run { target init_priority } } */ and thus I would expect all default flags to be cycled over. The problem is simple - FINI_PRIORITY is not streamed at all. The reason for apparent omision seems to be assymetry in between INIT and FINI priorities. While INIT priorities are defined for VAR_DECLs too, FINI priorities are defined only for functions. I wonder whether we ever need VAR_DECL init priorities at all, I would expect all constructors to be lowered to functions at that time, so perhaps the streaming can be guarded by the same test as I use for FINI_PRIORITY. Anyway, that can be subsequent clenaup. x86_64 bootstrap/regtested in progress. OK if it passes? PR lto/46083 * lto-streamer-out.c (pack_ts_decl_with_vis_value_fields): Store DECL_FINI_PRIORITY. * lto-streamer-in.c )unpack_ts_decl_with_vis_value_fields): Restore DECL_FINI_PRIORITY. Index: lto-streamer-out.c =================================================================== --- lto-streamer-out.c (revision 168596) +++ lto-streamer-out.c (working copy) @@ -464,7 +464,11 @@ pack_ts_decl_with_vis_value_fields (stru } if (VAR_OR_FUNCTION_DECL_P (expr)) - bp_pack_value (bp, DECL_INIT_PRIORITY (expr), HOST_BITS_PER_SHORT); + { + bp_pack_value (bp, DECL_INIT_PRIORITY (expr), HOST_BITS_PER_SHORT); + if (TREE_CODE (expr) == FUNCTION_DECL && DECL_STATIC_DESTRUCTOR (expr)) + bp_pack_value (bp, DECL_FINI_PRIORITY (expr), HOST_BITS_PER_SHORT); + } } Index: lto-streamer-in.c =================================================================== --- lto-streamer-in.c (revision 168596) +++ lto-streamer-in.c (working copy) @@ -1654,6 +1654,11 @@ unpack_ts_decl_with_vis_value_fields (st priority_type p; p = (priority_type) bp_unpack_value (bp, HOST_BITS_PER_SHORT); SET_DECL_INIT_PRIORITY (expr, p); + if (TREE_CODE (expr) == FUNCTION_DECL && DECL_STATIC_DESTRUCTOR (expr)) + { + p = (priority_type) bp_unpack_value (bp, HOST_BITS_PER_SHORT); + SET_DECL_FINI_PRIORITY (expr, p); + } } }