Nice solution :)! A few things inline below: > + /* Read and process the symbol table. */ > + pph_in_symtab (stream); > } >
Why read the symbol table last? I would expect that we would read this first, before reading the bindings, then we don't need to change the actual pph_in_* functions to delay some of the input as the bindings read would read a shared cache entry and simply get the already allocated structure. > > @@ -1479,10 +1497,7 @@ pph_in_function_decl (pph_stream *stream, tree fndecl) > DECL_INITIAL (fndecl) = pph_in_tree (stream); > pph_in_lang_specific (stream, fndecl); > DECL_SAVED_TREE (fndecl) = pph_in_tree (stream); > - DECL_STRUCT_FUNCTION (fndecl) = pph_in_struct_function (stream, fndecl); > DECL_CHAIN (fndecl) = pph_in_tree (stream); > - if (DECL_SAVED_TREE (fndecl)) > - VEC_safe_push (tree, gc, stream->fns_to_expand, fndecl); > } > (If we read symbol table first we can probably keep this logic as is) > @@ -1282,13 +1320,19 @@ pph_out_tree_header (struct output_block *ob, tree > expr) > static void > pph_out_function_decl (pph_stream *stream, tree fndecl, bool ref_p) > { > + /* Note that we do not output DECL_STRUCT_FUNCTION here. This is > + emitted at the end of the PPH file in pph_out_symtab. > + This way, we will be able to re-instantiate them in the same > + order when reading the image (the allocation of > + DECL_STRUCT_FUNCTION has the side effect of generating function > + sequence numbers (function.funcdef_no). */ > pph_out_tree_or_ref_1 (stream, DECL_INITIAL (fndecl), ref_p, 3); > pph_out_lang_specific (stream, fndecl, ref_p); > pph_out_tree_or_ref_1 (stream, DECL_SAVED_TREE (fndecl), ref_p, 3); > - pph_out_struct_function (stream, DECL_STRUCT_FUNCTION (fndecl), ref_p); > pph_out_tree_or_ref_1 (stream, DECL_CHAIN (fndecl), ref_p, 3); > } > (again, i think we should output this normally, but output the symtab first so that at this point this is just a ref) > +/* Add DECL to the list of symbols that need to be registered with the > + middle end when reading current_pph_stream. */ > + > +void > +pph_add_decl_to_register (tree decl) > +{ > + if (decl) > + VEC_safe_push (tree, heap, decls_to_register, decl); > +} should we inline this? > -- > This patch is available for review at http://codereview.appspot.com/4732043 > Cheers, Gab