On Wed, 1 Jun 2011, Diego Novillo wrote:
>
> This patch (split out of
> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00004.html), fixes the
> streaming of enum values when they are larger than a single byte.
>
> Tested with LTO profiledbootstrap on x86_64.
>
> OK for trunk?
Ok.
Thanks,
Richard.
>
> Diego.
>
> * lto-streamer-out.c (lto_output_ts_decl_with_vis_tree_pointers): Call
> output_record_start with LTO_null instead of output_zero.
> (lto_output_ts_binfo_tree_pointers): Likewise.
> (lto_output_tree): Likewise.
> (output_eh_try_list): Likewise.
> (output_eh_region): Likewise.
> (output_eh_lp): Likewise.
> (output_eh_regions): Likewise.
> (output_bb): Likewise.
> (output_function): Likewise.
> (output_unreferenced_globals): Likewise.
> * lto-streamer.h (enum LTO_tags): Reserve MAX_TREE_CODES
> instead of NUM_TREE_CODES.
> (lto_tag_is_tree_code_p): Check max value against MAX_TREE_CODES.
> (lto_output_int_in_range): Change << to >> when shifting VAL.
>
> diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
> index b3b81bd..3d42483 100644
> --- a/gcc/lto-streamer-out.c
> +++ b/gcc/lto-streamer-out.c
> @@ -955,7 +950,7 @@ lto_output_ts_decl_with_vis_tree_pointers (struct
> output_block *ob, tree expr,
> if (DECL_ASSEMBLER_NAME_SET_P (expr))
> lto_output_tree_or_ref (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
> else
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
>
> lto_output_tree_or_ref (ob, DECL_SECTION_NAME (expr), ref_p);
> lto_output_tree_or_ref (ob, DECL_COMDAT_GROUP (expr), ref_p);
> @@ -1136,7 +1131,7 @@ lto_output_ts_binfo_tree_pointers (struct output_block
> *ob, tree expr,
> is needed to build the empty BINFO node on the reader side. */
> FOR_EACH_VEC_ELT (tree, BINFO_BASE_BINFOS (expr), i, t)
> lto_output_tree_or_ref (ob, t, ref_p);
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
>
> lto_output_tree_or_ref (ob, BINFO_OFFSET (expr), ref_p);
> lto_output_tree_or_ref (ob, BINFO_VTABLE (expr), ref_p);
> @@ -1430,7 +1425,7 @@ lto_output_tree (struct output_block *ob, tree expr,
> bool ref_p)
>
> if (expr == NULL_TREE)
> {
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
> return;
> }
>
> @@ -1486,7 +1481,7 @@ output_eh_try_list (struct output_block *ob, eh_catch
> first)
> lto_output_tree_ref (ob, n->label);
> }
>
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
> }
>
>
> @@ -1501,7 +1496,7 @@ output_eh_region (struct output_block *ob, eh_region r)
>
> if (r == NULL)
> {
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
> return;
> }
>
> @@ -1564,7 +1559,7 @@ output_eh_lp (struct output_block *ob, eh_landing_pad
> lp)
> {
> if (lp == NULL)
> {
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
> return;
> }
>
> @@ -1633,9 +1628,9 @@ output_eh_regions (struct output_block *ob, struct
> function *fn)
> }
> }
>
> - /* The 0 either terminates the record or indicates that there are no
> - eh_records at all. */
> - output_zero (ob);
> + /* The LTO_null either terminates the record or indicates that there
> + are no eh_records at all. */
> + output_record_start (ob, LTO_null);
> }
>
>
> @@ -1880,10 +1875,10 @@ output_bb (struct output_block *ob, basic_block bb,
> struct function *fn)
> output_sleb128 (ob, region);
> }
> else
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
> }
>
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
>
> for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
> {
> @@ -1896,7 +1891,7 @@ output_bb (struct output_block *ob, basic_block bb,
> struct function *fn)
> output_phi (ob, phi);
> }
>
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
> }
> }
>
> @@ -2053,7 +2048,7 @@ output_function (struct cgraph_node *node)
> output_bb (ob, bb, fn);
>
> /* The terminator for this function. */
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
>
> output_cfg (ob, fn);
>
> @@ -2167,7 +2162,7 @@ output_unreferenced_globals (cgraph_node_set set,
> varpool_node_set vset)
> }
> symbol_alias_set_destroy (defined);
>
> - output_zero (ob);
> + output_record_start (ob, LTO_null);
>
> produce_asm (ob, NULL);
> destroy_output_block (ob);
> diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
> index e8410d4..9de24ff 100644
> --- a/gcc/lto-streamer.h
> +++ b/gcc/lto-streamer.h
> @@ -186,7 +186,7 @@ enum LTO_tags
>
> Conversely, to map between LTO tags and tree/gimple codes, the
> reverse operation must be applied. */
> - LTO_bb0 = 1 + NUM_TREE_CODES + LAST_AND_UNUSED_GIMPLE_CODE,
> + LTO_bb0 = 1 + MAX_TREE_CODES + LAST_AND_UNUSED_GIMPLE_CODE,
> LTO_bb1,
>
> /* EH region holding the previous statement. */
> @@ -957,7 +957,7 @@ extern VEC(lto_out_decl_state_ptr, heap)
> *lto_function_decl_states;
> static inline bool
> lto_tag_is_tree_code_p (enum LTO_tags tag)
> {
> - return tag > LTO_null && (unsigned) tag <= NUM_TREE_CODES;
> + return tag > LTO_null && (unsigned) tag <= MAX_TREE_CODES;
> }
>
>
> @@ -1226,11 +1226,11 @@ lto_output_int_in_range (struct lto_output_stream
> *obs,
> val -= min;
> lto_output_1_stream (obs, val & 255);
> if (range >= 0xff)
> - lto_output_1_stream (obs, (val << 8) & 255);
> + lto_output_1_stream (obs, (val >> 8) & 255);
> if (range >= 0xffff)
> - lto_output_1_stream (obs, (val << 16) & 255);
> + lto_output_1_stream (obs, (val >> 16) & 255);
> if (range >= 0xffffff)
> - lto_output_1_stream (obs, (val << 24) & 255);
> + lto_output_1_stream (obs, (val >> 24) & 255);
> }
>
> /* Input VAL into OBS and verify it is in range MIN...MAX that is supposed
>
> --
> This patch is available for review at http://codereview.appspot.com/4526099
>
>
--
Richard Guenther <[email protected]>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer