summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/lto-streamer-out.c1
-rw-r--r--gcc/tree-streamer-in.c20
-rw-r--r--gcc/tree-streamer-out.c24
4 files changed, 53 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7deeca506dc..4e5c771ab27 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2012-01-05 Richard Guenther <rguenther@suse.de>
+
+ PR lto/50490
+ * tree-streamer-out.c (write_ts_optimization): New function.
+ (streamer_write_tree_body): Call it.
+ * tree-streamer-in.c (lto_input_ts_optimization): New function.
+ (streamer_read_tree_body): Call it.
+ * lto-streamer-out.c (lto_is_streamable): Handle OPTIMIZATION_NODE.
+
2012-01-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/51761
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index 4b3be3bb1ff..054bb85be0b 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -304,7 +304,6 @@ lto_is_streamable (tree expr)
&& code != WITH_CLEANUP_EXPR
&& code != STATEMENT_LIST
&& code != OMP_CLAUSE
- && code != OPTIMIZATION_NODE
&& (code == CASE_LABEL_EXPR
|| code == DECL_EXPR
|| TREE_CODE_CLASS (code) != tcc_statement);
diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c
index 8a18a995b75..c7215105233 100644
--- a/gcc/tree-streamer-in.c
+++ b/gcc/tree-streamer-in.c
@@ -903,6 +903,23 @@ lto_input_ts_target_option (struct lto_input_block *ib, tree expr)
fatal_error ("cl_target_option size mismatch in LTO reader and writer");
}
+/* Input a TS_OPTIMIZATION tree from IB into EXPR. */
+
+static void
+lto_input_ts_optimization (struct lto_input_block *ib, tree expr)
+{
+ unsigned i, len;
+ struct bitpack_d bp;
+ struct cl_optimization *t = TREE_OPTIMIZATION (expr);
+
+ bp = streamer_read_bitpack (ib);
+ len = sizeof (struct cl_optimization);
+ 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_optimization size mismatch in LTO reader and writer");
+}
+
/* Input a TS_TRANSLATION_UNIT_DECL tree from IB and DATA_IN into EXPR. */
static void
@@ -979,6 +996,9 @@ streamer_read_tree_body (struct lto_input_block *ib, struct data_in *data_in,
if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
lto_input_ts_target_option (ib, expr);
+ if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
+ lto_input_ts_optimization (ib, expr);
+
if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
lto_input_ts_translation_unit_decl_tree_pointers (ib, data_in, expr);
}
diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c
index 17b5be78c7c..df8b92aa102 100644
--- a/gcc/tree-streamer-out.c
+++ b/gcc/tree-streamer-out.c
@@ -767,6 +767,27 @@ write_ts_target_option (struct output_block *ob, tree expr)
streamer_write_bitpack (&bp);
}
+/* Write a TS_OPTIMIZATION tree in EXPR to OB. */
+
+static void
+write_ts_optimization (struct output_block *ob, tree expr)
+{
+ struct cl_optimization *t = TREE_OPTIMIZATION (expr);
+ struct bitpack_d bp;
+ unsigned i, len;
+
+ /* The cl_optimizaation is 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_optimization);
+ 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);
+ streamer_write_bitpack (&bp);
+}
+
/* Write a TS_TRANSLATION_UNIT_DECL tree in EXPR to OB. */
static void
@@ -841,6 +862,9 @@ streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
write_ts_target_option (ob, expr);
+ if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
+ write_ts_optimization (ob, expr);
+
if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
write_ts_translation_unit_decl_tree_pointers (ob, expr);
}
OpenPOWER on IntegriCloud