Comments
Patch
@@ -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);
}
@@ -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);
}
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 <ak@linux.intel.com> 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.