From 0127aae46a182abeadf7419088ad85c9ba5bffc8 Mon Sep 17 00:00:00 2001 From: Richard Guenther <rguenther@suse.de> Date: Mon, 15 Oct 2012 10:39:59 +0000 Subject: [PATCH] tree-streamer-out.c (streamer_pack_tree_bitfields): Back BINFO_BASE_ACCESSES and CONSTRUCTOR lengths here. 2012-10-15 Richard Guenther <rguenther@suse.de> * tree-streamer-out.c (streamer_pack_tree_bitfields): Back BINFO_BASE_ACCESSES and CONSTRUCTOR lengths here. (streamer_write_chain): Write TREE_CHAIN as null-terminated list. (write_ts_exp_tree_pointers): Adjust. (write_ts_binfo_tree_pointers): Likewise. (write_ts_constructor_tree_pointers): Likewise. * tree-streamer-in.c (streamer_read_chain): Read TREE_CHAIN as null-terminated list. (unpack_value_fields): Unpack BINFO_BASE_ACCESSES and CONSTRUCTOR lengths and materialize the arrays. (lto_input_ts_exp_tree_pointers): Adjust. (lto_input_ts_binfo_tree_pointers): Likewise. (lto_input_ts_constructor_tree_pointers): Likewise. From-SVN: r192451 --- gcc/ChangeLog | 16 ++++++++++++ gcc/tree-streamer-in.c | 57 ++++++++++++++++++++++------------------- gcc/tree-streamer-out.c | 20 +++++++++------ 3 files changed, 59 insertions(+), 34 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82427de24ac3..85db69e09f26 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2012-10-15 Richard Guenther <rguenther@suse.de> + + * tree-streamer-out.c (streamer_pack_tree_bitfields): Back + BINFO_BASE_ACCESSES and CONSTRUCTOR lengths here. + (streamer_write_chain): Write TREE_CHAIN as null-terminated list. + (write_ts_exp_tree_pointers): Adjust. + (write_ts_binfo_tree_pointers): Likewise. + (write_ts_constructor_tree_pointers): Likewise. + * tree-streamer-in.c (streamer_read_chain): Read TREE_CHAIN as + null-terminated list. + (unpack_value_fields): Unpack BINFO_BASE_ACCESSES and + CONSTRUCTOR lengths and materialize the arrays. + (lto_input_ts_exp_tree_pointers): Adjust. + (lto_input_ts_binfo_tree_pointers): Likewise. + (lto_input_ts_constructor_tree_pointers): Likewise. + 2012-10-14 Hans-Peter Nilsson <hp@bitrange.com> * config/mmix/mmix.c (mmix_opposite_regno): Handle the diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c index f77a66933f23..856fd6bf665d 100644 --- a/gcc/tree-streamer-in.c +++ b/gcc/tree-streamer-in.c @@ -68,12 +68,11 @@ input_identifier (struct data_in *data_in, struct lto_input_block *ib) tree streamer_read_chain (struct lto_input_block *ib, struct data_in *data_in) { - int i, count; tree first, prev, curr; + /* The chain is written as NULL terminated list of trees. */ first = prev = NULL_TREE; - count = streamer_read_hwi (ib); - for (i = 0; i < count; i++) + do { curr = stream_read_tree (ib, data_in); if (prev) @@ -81,9 +80,9 @@ streamer_read_chain (struct lto_input_block *ib, struct data_in *data_in) else first = curr; - TREE_CHAIN (curr) = NULL_TREE; prev = curr; } + while (curr); return first; } @@ -452,6 +451,20 @@ unpack_value_fields (struct data_in *data_in, struct bitpack_d *bp, tree expr) if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION)) unpack_ts_optimization (bp, expr); + + if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) + { + unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (bp); + if (length > 0) + VEC_safe_grow (tree, gc, BINFO_BASE_ACCESSES (expr), length); + } + + if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) + { + unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (bp); + if (length > 0) + VEC_safe_grow (constructor_elt, gc, CONSTRUCTOR_ELTS (expr), length); + } } @@ -813,12 +826,9 @@ static void lto_input_ts_exp_tree_pointers (struct lto_input_block *ib, struct data_in *data_in, tree expr) { - int i, length; - - length = streamer_read_hwi (ib); - gcc_assert (length == TREE_OPERAND_LENGTH (expr)); + int i; - for (i = 0; i < length; i++) + for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++) TREE_OPERAND (expr, i) = stream_read_tree (ib, data_in); TREE_SET_BLOCK (expr, stream_read_tree (ib, data_in)); @@ -878,7 +888,7 @@ static void lto_input_ts_binfo_tree_pointers (struct lto_input_block *ib, struct data_in *data_in, tree expr) { - unsigned i, len; + unsigned i; tree t; /* Note that the number of slots in EXPR was read in @@ -898,15 +908,12 @@ lto_input_ts_binfo_tree_pointers (struct lto_input_block *ib, BINFO_VTABLE (expr) = stream_read_tree (ib, data_in); BINFO_VPTR_FIELD (expr) = stream_read_tree (ib, data_in); - len = streamer_read_uhwi (ib); - if (len > 0) + /* The vector of BINFO_BASE_ACCESSES is pre-allocated during + unpacking the bitfield section. */ + for (i = 0; i < VEC_length (tree, BINFO_BASE_ACCESSES (expr)); i++) { - VEC_reserve_exact (tree, gc, BINFO_BASE_ACCESSES (expr), len); - for (i = 0; i < len; i++) - { - tree a = stream_read_tree (ib, data_in); - VEC_quick_push (tree, BINFO_BASE_ACCESSES (expr), a); - } + tree a = stream_read_tree (ib, data_in); + VEC_replace (tree, BINFO_BASE_ACCESSES (expr), i, a); } BINFO_INHERITANCE_CHAIN (expr) = stream_read_tree (ib, data_in); @@ -923,16 +930,14 @@ static void lto_input_ts_constructor_tree_pointers (struct lto_input_block *ib, struct data_in *data_in, tree expr) { - unsigned i, len; + unsigned i; - len = streamer_read_uhwi (ib); - for (i = 0; i < len; i++) + for (i = 0; i < CONSTRUCTOR_NELTS (expr); i++) { - tree index, value; - - index = stream_read_tree (ib, data_in); - value = stream_read_tree (ib, data_in); - CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (expr), index, value); + constructor_elt e; + e.index = stream_read_tree (ib, data_in); + e.value = stream_read_tree (ib, data_in); + VEC_replace (constructor_elt, CONSTRUCTOR_ELTS (expr), i, e); } } diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c index fc70eb9f856b..cb2ccf47a46b 100644 --- a/gcc/tree-streamer-out.c +++ b/gcc/tree-streamer-out.c @@ -409,6 +409,12 @@ streamer_pack_tree_bitfields (struct output_block *ob, if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION)) pack_ts_optimization (bp, expr); + + if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) + bp_pack_var_len_unsigned (bp, VEC_length (tree, BINFO_BASE_ACCESSES (expr))); + + if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) + bp_pack_var_len_unsigned (bp, CONSTRUCTOR_NELTS (expr)); } @@ -454,11 +460,7 @@ streamer_write_builtin (struct output_block *ob, tree expr) void streamer_write_chain (struct output_block *ob, tree t, bool ref_p) { - int i, count; - - count = list_length (t); - streamer_write_hwi (ob, count); - for (i = 0; i < count; i++) + while (t) { tree saved_chain; @@ -480,6 +482,9 @@ streamer_write_chain (struct output_block *ob, tree t, bool ref_p) TREE_CHAIN (t) = saved_chain; t = TREE_CHAIN (t); } + + /* Write a sentinel to terminate the chain. */ + stream_write_tree (ob, NULL_TREE, ref_p); } @@ -725,7 +730,6 @@ write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p) { int i; - streamer_write_hwi (ob, TREE_OPERAND_LENGTH (expr)); for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++) stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p); stream_write_tree (ob, TREE_BLOCK (expr), ref_p); @@ -786,7 +790,8 @@ write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p) stream_write_tree (ob, BINFO_VTABLE (expr), ref_p); stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p); - streamer_write_uhwi (ob, VEC_length (tree, BINFO_BASE_ACCESSES (expr))); + /* The number of BINFO_BASE_ACCESSES has already been emitted in + EXPR's bitfield section. */ FOR_EACH_VEC_ELT (tree, BINFO_BASE_ACCESSES (expr), i, t) stream_write_tree (ob, t, ref_p); @@ -807,7 +812,6 @@ write_ts_constructor_tree_pointers (struct output_block *ob, tree expr, unsigned i; tree index, value; - streamer_write_uhwi (ob, CONSTRUCTOR_NELTS (expr)); FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value) { stream_write_tree (ob, index, ref_p); -- GitLab