Message ID | 20110412200241.D858F1DA1BE@topo.tor.corp.google.com |
---|---|
State | New |
Headers | show |
LGTM On 4/12/11, Diego Novillo <dnovillo@google.com> wrote: > > This patch, together with the others I sent today, allows us to > reconstruct all the symbols and types stored inside a pph image. This > is not all we need, but it allows me to get basic declarations and > types reconstructed from pph images. > > This causes ~57 failures in pph.exp. The more problematic one is an > infinite recursion that causes memory bloat. I'm not committing this > patch yet until I figure this one out. > > Other failures are due to missing bits in the pickling. I'll be > fixing those in subsequent patches. > > > 2011-04-12 Diego Novillo <dnovillo@google.com> > > * pph.c (pph_add_names_to_namespace): New. > (pph_read_file_contents): Call it. > Call cpp_lt_replay. > > diff --git a/gcc/cp/pph.c b/gcc/cp/pph.c > index 74d1d50..6584e72 100644 > --- a/gcc/cp/pph.c > +++ b/gcc/cp/pph.c > @@ -1937,6 +1937,28 @@ report_validation_error (const char *filename, > } > > > + > +/* Add all the new names declared in NEW_NS to NS. */ > + > +static void > +pph_add_names_to_namespace (tree ns, tree new_ns) > +{ > + struct cp_binding_level *new_level, *level; > + tree t, chain; > + > + level = NAMESPACE_LEVEL (ns); > + new_level = NAMESPACE_LEVEL (new_ns); > + > + for (t = new_level->names; t; t = chain) > + { > + /* Pushing a decl into a scope clobbers its DECL_CHAIN. > + Preserve it. */ > + chain = DECL_CHAIN (t); > + pushdecl_with_scope (t, level, /*is_friend=*/false); > + } > +} > + > + > /* Read contents of PPH file in STREAM. */ > > static void > @@ -1946,25 +1968,27 @@ pph_read_file_contents (pph_stream *stream) > cpp_ident_use *bad_use; > const char *cur_def; > cpp_idents_used idents_used; > + tree file_ns; > > pth_load_identifiers (&idents_used, stream); > > - /*FIXME pph: This validation is weak. */ > + /* FIXME pph: This validation is weak. */ > verified = cpp_lt_verify_1 (parse_in, &idents_used, &bad_use, &cur_def, > true); > if (!verified) > report_validation_error (stream->name, bad_use->ident_str, cur_def, > bad_use->before_str, bad_use->after_str); > > - /* FIXME pph: We cannot replay the macro definitions > - as long as we are still reading the actual file. > + /* Re-instantiate all the pre-processor symbols defined by STREAM. */ > cpp_lt_replay (parse_in, &idents_used); > - */ > > - pph_input_tree (stream); > + /* Read global_namespace from STREAM and add all the names defined > + there to the current global_namespace. */ > + file_ns = pph_input_tree (stream); > + pph_add_names_to_namespace (global_namespace, file_ns); > } > > > -/* Read PPH file. */ > +/* Read PPH file FILENAME. */ > > static void > pph_read_file (const char *filename) > > -- > This patch is available for review at http://codereview.appspot.com/4392047 >
diff --git a/gcc/cp/pph.c b/gcc/cp/pph.c index 74d1d50..6584e72 100644 --- a/gcc/cp/pph.c +++ b/gcc/cp/pph.c @@ -1937,6 +1937,28 @@ report_validation_error (const char *filename, } + +/* Add all the new names declared in NEW_NS to NS. */ + +static void +pph_add_names_to_namespace (tree ns, tree new_ns) +{ + struct cp_binding_level *new_level, *level; + tree t, chain; + + level = NAMESPACE_LEVEL (ns); + new_level = NAMESPACE_LEVEL (new_ns); + + for (t = new_level->names; t; t = chain) + { + /* Pushing a decl into a scope clobbers its DECL_CHAIN. + Preserve it. */ + chain = DECL_CHAIN (t); + pushdecl_with_scope (t, level, /*is_friend=*/false); + } +} + + /* Read contents of PPH file in STREAM. */ static void @@ -1946,25 +1968,27 @@ pph_read_file_contents (pph_stream *stream) cpp_ident_use *bad_use; const char *cur_def; cpp_idents_used idents_used; + tree file_ns; pth_load_identifiers (&idents_used, stream); - /*FIXME pph: This validation is weak. */ + /* FIXME pph: This validation is weak. */ verified = cpp_lt_verify_1 (parse_in, &idents_used, &bad_use, &cur_def, true); if (!verified) report_validation_error (stream->name, bad_use->ident_str, cur_def, bad_use->before_str, bad_use->after_str); - /* FIXME pph: We cannot replay the macro definitions - as long as we are still reading the actual file. + /* Re-instantiate all the pre-processor symbols defined by STREAM. */ cpp_lt_replay (parse_in, &idents_used); - */ - pph_input_tree (stream); + /* Read global_namespace from STREAM and add all the names defined + there to the current global_namespace. */ + file_ns = pph_input_tree (stream); + pph_add_names_to_namespace (global_namespace, file_ns); } -/* Read PPH file. */ +/* Read PPH file FILENAME. */ static void pph_read_file (const char *filename)