From patchwork Wed Sep 1 16:37:32 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 63401 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]) by ozlabs.org (Postfix) with SMTP id 4B869B7102 for ; Thu, 2 Sep 2010 02:37:53 +1000 (EST) Received: (qmail 27184 invoked by alias); 1 Sep 2010 16:37:45 -0000 Received: (qmail 26800 invoked by uid 22791); 1 Sep 2010 16:37:42 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from one.firstfloor.org (HELO one.firstfloor.org) (213.235.205.2) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 01 Sep 2010 16:37:36 +0000 Received: from basil.firstfloor.org (p5B3C8169.dip0.t-ipconnect.de [91.60.129.105]) by one.firstfloor.org (Postfix) with ESMTP id 0B1861A9804F; Wed, 1 Sep 2010 18:37:34 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id D50A1B2812; Wed, 1 Sep 2010 18:37:32 +0200 (CEST) Date: Wed, 1 Sep 2010 18:37:32 +0200 From: Andi Kleen To: gcc-patches@gcc.gnu.org Cc: rth@redhat.com Subject: [PATCH] lto support for target attribute & fixing LTO bootstrap Message-ID: <20100901163732.GA8741@basil.fritz.box> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) 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 This fixes the LTO bootstrap after the __target__ changes in libcpp and makes LTO work with target attributes in general. Otherwise the LTO streamer will error out. I just stream the complete cl_target_option structure, because writing out individual members would require messing with the awk option scripts. The method using the check word was suggested by Richard Guenther Passed full LTO bootstrap and test on x86_64-linux Ok to commit? -Andi 2010-09-01 Andi Kleen PR45475 * lto-streamer-in.c (lto_input_ts_target_option): Add. (lto_input_tree_pointers): Call lto_input_ts_target_option. * lto-streamer-out: (lto_output_ts_target_option): Add. (lto_output_tree_pointers): Call lto_output_ts_target_option. diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index 9ee1510..3c82170 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -2196,6 +2196,22 @@ lto_input_ts_constructor_tree_pointers (struct lto_input_block *ib, } } +/* Input a TS_TARGET_OPTION tree */ + +static void +lto_input_ts_target_option (struct lto_input_block *ib, tree expr) +{ + unsigned i, len; + struct bitpack_d bp; + struct cl_target_option *t = TREE_TARGET_OPTION (expr); + + bp = lto_input_bitpack (ib); + len = sizeof (struct cl_target_option); + for (i = 0; i < len; i++) + ((unsigned char *)t)[i] = bp_unpack_value (&bp, 8); + if (bp_unpack_value (&bp, 32) != 0x12345678) + fatal_error ("cl_target_option size mismatch in LTO reader and writer"); +} /* Helper for lto_input_tree. Read all pointer fields in EXPR from input block IB. DATA_IN contains tables and descriptors for the @@ -2281,9 +2297,7 @@ lto_input_tree_pointers (struct lto_input_block *ib, struct data_in *data_in, } if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) - { - sorry ("target optimization options not supported yet"); - } + lto_input_ts_target_option (ib, expr); } diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index dde86b9..78cd47c 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -1105,6 +1105,26 @@ lto_output_ts_constructor_tree_pointers (struct output_block *ob, tree expr, } } +/* Write a TS_TARGET_OPTION tree. Always write without reference. */ + +static void +lto_output_ts_target_option (struct output_block *ob, tree expr) +{ + struct cl_target_option *t = TREE_TARGET_OPTION (expr); + struct bitpack_d bp; + unsigned i, len; + + /* The cl_target_option is target specific and generated by the options + awk script, so we just recreate a byte-by-byte copy here. */ + + bp = bitpack_create (ob->main_stream); + len = sizeof (struct cl_target_option); + for (i = 0; i < len; i++) + bp_pack_value (&bp, ((unsigned char *)t)[i], 8); + /* Catch struct size mismatches between reader and writer. */ + bp_pack_value (&bp, 0x12345678, 32); + lto_output_bitpack (&bp); +} /* Helper for lto_output_tree. Write all pointer fields in EXPR to output block OB. If REF_P is true, the leaves of EXPR are emitted as @@ -1187,7 +1207,7 @@ lto_output_tree_pointers (struct output_block *ob, tree expr, bool ref_p) sorry ("gimple bytecode streams do not support the optimization attribute"); if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) - sorry ("gimple bytecode streams do not support the target attribute"); + lto_output_ts_target_option (ob, expr); }