Move TEMPLATE_DECL case next to other DECLs in pph_stream_read_tree and pph_stream_write_tree. Move pph_output_chain_filtered to just before its use.
Index: gcc/cp/ChangeLog.pph 2011-05-26 Lawrence Crowl <cr...@google.com> * pph-streamer-in.c (pph_stream_read_tree): Move TEMPLATE_DECL case next to other DECLs. * pph-streamer-out.c (pph_stream_write_tree): Move TEMPLATE_DECL case next to other DECLs. (pph_output_chain_filtered): Move to just before its use. Index: gcc/cp/pph-streamer-in.c =================================================================== --- gcc/cp/pph-streamer-in.c (revision 174301) +++ gcc/cp/pph-streamer-in.c (working copy) @@ -837,6 +837,14 @@ pph_stream_read_tree (struct lto_input_b DECL_ORIGINAL_TYPE (expr) = pph_input_tree (stream); break; + case TEMPLATE_DECL: + DECL_INITIAL (expr) = pph_input_tree (stream); + pph_stream_read_lang_specific (stream, expr); + DECL_TEMPLATE_RESULT (expr) = pph_input_tree (stream); + DECL_TEMPLATE_PARMS (expr) = pph_input_tree (stream); + DECL_CONTEXT (expr) = pph_input_tree (stream); + break; + case STATEMENT_LIST: { HOST_WIDE_INT i, num_trees = pph_input_uint (stream); @@ -894,14 +902,6 @@ pph_stream_read_tree (struct lto_input_b BASELINK_ACCESS_BINFO (expr) = pph_input_tree (stream); break; - case TEMPLATE_DECL: - DECL_INITIAL (expr) = pph_input_tree (stream); - pph_stream_read_lang_specific (stream, expr); - DECL_TEMPLATE_RESULT (expr) = pph_input_tree (stream); - DECL_TEMPLATE_PARMS (expr) = pph_input_tree (stream); - DECL_CONTEXT (expr) = pph_input_tree (stream); - break; - case TEMPLATE_INFO: TI_TYPEDEFS_NEEDING_ACCESS_CHECKING (expr) = pph_stream_read_qual_use_vec (stream); Index: gcc/cp/pph-streamer-out.c =================================================================== --- gcc/cp/pph-streamer-out.c (revision 174301) +++ gcc/cp/pph-streamer-out.c (working copy) @@ -378,6 +378,55 @@ pph_stream_write_label_binding (pph_stre } +/* Output a chain of nodes to STREAM starting with FIRST. Skip any + nodes that do not match FILTER. REF_P is true if nodes in the chain + should be emitted as references. */ + +void +pph_output_chain_filtered (pph_stream *stream, tree first, bool ref_p, + enum chain_filter filter) +{ + unsigned count; + tree t; + + /* Special case. If the caller wants no filtering, it is much + faster to just call pph_output_chain directly. */ + if (filter == NONE) + { + pph_output_chain (stream, first, ref_p); + return; + } + + /* Count all the nodes that match the filter. */ + for (t = first, count = 0; t; t = TREE_CHAIN (t)) + { + if (filter == NO_BUILTINS && DECL_P (t) && DECL_IS_BUILTIN (t)) + continue; + count++; + } + pph_output_uint (stream, count); + + /* Output all the nodes that match the filter. */ + for (t = first; t; t = TREE_CHAIN (t)) + { + tree saved_chain; + + /* Apply filters to T. */ + if (filter == NO_BUILTINS && DECL_P (t) && DECL_IS_BUILTIN (t)) + continue; + + /* Clear TREE_CHAIN to avoid blindly recursing into the rest + of the list. */ + saved_chain = TREE_CHAIN (t); + TREE_CHAIN (t) = NULL_TREE; + + pph_output_tree_or_ref_1 (stream, t, ref_p, 2); + + TREE_CHAIN (t) = saved_chain; + } +} + + /* Write all the fields of cp_binding_level instance BL to STREAM. If REF_P is true, tree fields will be written as references. */ @@ -838,6 +887,14 @@ pph_stream_write_tree (struct output_blo pph_output_tree_or_ref_1 (stream, DECL_ORIGINAL_TYPE (expr), ref_p, 3); break; + case TEMPLATE_DECL: + pph_output_tree_or_ref_1 (stream, DECL_INITIAL (expr), ref_p, 3); + pph_stream_write_lang_specific (stream, expr, ref_p); + pph_output_tree_or_ref_1 (stream, DECL_TEMPLATE_RESULT (expr), ref_p, 3); + pph_output_tree_or_ref_1 (stream, DECL_TEMPLATE_PARMS (expr), ref_p, 3); + pph_output_tree_or_ref_1 (stream, DECL_CONTEXT (expr), ref_p, 3); + break; + case STATEMENT_LIST: { tree_stmt_iterator i; @@ -901,14 +958,6 @@ pph_stream_write_tree (struct output_blo pph_output_tree_or_ref_1 (stream, BASELINK_ACCESS_BINFO (expr), ref_p, 3); break; - case TEMPLATE_DECL: - pph_output_tree_or_ref_1 (stream, DECL_INITIAL (expr), ref_p, 3); - pph_stream_write_lang_specific (stream, expr, ref_p); - pph_output_tree_or_ref_1 (stream, DECL_TEMPLATE_RESULT (expr), ref_p, 3); - pph_output_tree_or_ref_1 (stream, DECL_TEMPLATE_PARMS (expr), ref_p, 3); - pph_output_tree_or_ref_1 (stream, DECL_CONTEXT (expr), ref_p, 3); - break; - case TEMPLATE_INFO: pph_stream_write_qual_use_vec (stream, TI_TYPEDEFS_NEEDING_ACCESS_CHECKING (expr), ref_p); @@ -925,52 +974,3 @@ pph_stream_write_tree (struct output_blo tree_code_name[TREE_CODE (expr)]); } } - - -/* Output a chain of nodes to STREAM starting with FIRST. Skip any - nodes that do not match FILTER. REF_P is true if nodes in the chain - should be emitted as references. */ - -void -pph_output_chain_filtered (pph_stream *stream, tree first, bool ref_p, - enum chain_filter filter) -{ - unsigned count; - tree t; - - /* Special case. If the caller wants no filtering, it is much - faster to just call pph_output_chain directly. */ - if (filter == NONE) - { - pph_output_chain (stream, first, ref_p); - return; - } - - /* Count all the nodes that match the filter. */ - for (t = first, count = 0; t; t = TREE_CHAIN (t)) - { - if (filter == NO_BUILTINS && DECL_P (t) && DECL_IS_BUILTIN (t)) - continue; - count++; - } - pph_output_uint (stream, count); - - /* Output all the nodes that match the filter. */ - for (t = first; t; t = TREE_CHAIN (t)) - { - tree saved_chain; - - /* Apply filters to T. */ - if (filter == NO_BUILTINS && DECL_P (t) && DECL_IS_BUILTIN (t)) - continue; - - /* Clear TREE_CHAIN to avoid blindly recursing into the rest - of the list. */ - saved_chain = TREE_CHAIN (t); - TREE_CHAIN (t) = NULL_TREE; - - pph_output_tree_or_ref_1 (stream, t, ref_p, 2); - - TREE_CHAIN (t) = saved_chain; - } -} -- This patch is available for review at http://codereview.appspot.com/4517108