From 427eb57db6fd5cd7e46da432e2ea46dc1be92905 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Wed, 1 Sep 2010 17:03:56 +0000 Subject: [PATCH] re PR target/45475 (target attribute use in libcpp breaks LTO bootstrap) 2010-09-01 Andi Kleen PR lto/45475 * 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. From-SVN: r163740 --- gcc/ChangeLog | 8 ++++++++ gcc/lto-streamer-in.c | 21 ++++++++++++++++++--- gcc/lto-streamer-out.c | 22 +++++++++++++++++++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4e79cd850a70..d55b8b650c59 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-09-01 Andi Kleen + + PR lto/45475 + * 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. + 2010-09-01 Kai Tietz PR/target 45452 diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index 9ee15108fae4..14d87ed20fd8 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -2197,6 +2197,23 @@ lto_input_ts_constructor_tree_pointers (struct lto_input_block *ib, } +/* Input a TS_TARGET_OPTION tree from IB into EXPR. */ + +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 file being read. */ @@ -2281,9 +2298,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 dde86b94595f..80d818c6d1c7 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 in EXPR to OB. */ + +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); }