> > > +            cgraph_node *cgn = static_cast <cgraph_node *> (x);
> > > +            gt_ggc_m_11cgraph_edge (cgn->callers);
> > > +            gt_ggc_m_11cgraph_node (cgn->origin);
> > > +            gt_ggc_m_11cgraph_node (cgn->nested);
> > > +            gt_ggc_m_11cgraph_node (cgn->next_nested);
> > > +            gt_ggc_m_11cgraph_node (cgn->next_sibling_clone);
> > > +            gt_ggc_m_11cgraph_node (cgn->prev_sibling_clone);
> > > +            gt_ggc_m_11cgraph_node (cgn->clones);
> > > +            gt_ggc_m_11cgraph_node (cgn->clone_of);
> > Same as here.
> 
> Sorry, it's not clear to me what you meant by "Same as here." here.  Do
> you mean that I can skip marking them because they're within the symbol
> table?   If so, are you referring to all 10 fields above ("callees"
> through "clone_of")?

All those pointers above points inside symbol table, so none of them needs
to be marked.  Actually those two needs however, I missed them with prevoius
reading:
> > > +            gt_ggc_m_11cgraph_edge (cgn->indirect_calls);
> > > +            gt_ggc_m_11cgraph_edge (cgn->callees);

Otherwise edges will probably get lost.
> 
> 
> > 
> > > +            gt_ggc_m_P11cgraph_edge4htab (cgn->call_site_hash);
> > Move call site hash out of GGC rather than introducing hack.
> 
> I see that this is allocated in cgraph_edge (), and it appears to be an
> index.  I can create it with htab_create rather than htab_create_ggc,
> but if so, there doesn't seem a natural place to call htab_delete.  Is
> that OK?

Delete it in cgraph_remove_node.
> 
> 
> > > +            gt_ggc_m_9tree_node (cgn->former_clone_of);
> > > +            gt_ggc_m_11cgraph_node (cgn->global.inlined_to);
> > And here
> 
> Again, do you mean that "inlined_to" can be skipped since it's in the
> symbol table?

yes.
> > > +            cgraph_node *cgn = static_cast <cgraph_node *> (x);
> > > +            gt_pch_n_11cgraph_edge (cgn->callees);
> > > +            gt_pch_n_11cgraph_edge (cgn->callers);
> > > +            gt_pch_n_11cgraph_edge (cgn->indirect_calls);
> > > +            gt_pch_n_11cgraph_node (cgn->origin);
> > > +            gt_pch_n_11cgraph_node (cgn->nested);
> > > +            gt_pch_n_11cgraph_node (cgn->next_nested);
> > > +            gt_pch_n_11cgraph_node (cgn->next_sibling_clone);
> > > +            gt_pch_n_11cgraph_node (cgn->prev_sibling_clone);
> > > +            gt_pch_n_11cgraph_node (cgn->clones);
> > > +            gt_pch_n_11cgraph_node (cgn->clone_of);
> > > +            gt_pch_n_P11cgraph_edge4htab (cgn->call_site_hash);
> > > +            gt_pch_n_9tree_node (cgn->former_clone_of);
> > > +            gt_pch_n_11cgraph_node (cgn->global.inlined_to);
> > > +            gt_pch_n_28vec_ipa_replace_map_p_va_gc_ 
> > > (cgn->clone.tree_map);
> > > +            gt_pch_n_15bitmap_head_def (cgn->clone.args_to_skip);
> > > +            gt_pch_n_15bitmap_head_def 
> > > (cgn->clone.combined_args_to_skip);
> > > +            gt_pch_n_9tree_node (cgn->thunk.alias);
> > 
> > We can skip good part of those. Just small of those is build at PCH time. 
> > But lets do that incrementally, PCH is touchy business.
> 
> OK.  I'll just make analogous changes here to those made to the
> gt_ggc_mx function.

I think some of the pointers that do not need to be marked still needs to be
streamed and fixed by PCH, so we probably want to keep them.  All the cloning
pointers above are not live at PCH time (they are always NULL).  Only reason
why PCH lives at that point is that C++ FE produces Cgraph nodes early for
funny reason. The nodes are not analyzed at that point and call edges do not
exist (if I recall right) Probably I can do this incrementally - we do not want
to break PCH with a large patch and then spend weeks analyzing it.  That things
can bite ;)

Honza

Reply via email to