On Fri, 2013-08-02 at 14:31 -0400, David Malcolm wrote: > On Thu, 2013-08-01 at 11:28 -1000, Richard Henderson wrote: > > On 07/26/2013 05:04 AM, David Malcolm wrote: > > > +/* Functions relating to the garbage collector. */ > > > +void > > > +gcc::context::gt_ggc_mx () > > > +{ > > > + /* Currently a no-op. */ > > > +} > > > + > > > +void > > > +gcc::context::gt_pch_nx () > > > +{ > > > + /* Currently a no-op. */ > > > +} > > > + > > > +void > > > +gcc::context::gt_pch_nx (gt_pointer_operator op ATTRIBUTE_UNUSED, > > > + void *cookie ATTRIBUTE_UNUSED) > > > +{ > > > + /* Currently a no-op. */ > > > +} > > > > I suppose these are members because you'll want to access private members > > later, and that's easier than playing with "friend"? > > Exactly. The patch adds a comment about this to gcc/context.h. > > > > +void gt_ggc_mx (gcc::context *ctxt) > > > +{ > > > + ctxt->gt_ggc_mx (); > > > +} > > > + > > > +void gt_pch_nx (gcc::context *ctxt) > > > +{ > > > + ctxt->gt_pch_nx (); > > > +} > > > + > > > +void gt_pch_nx (gcc::context *ctxt, gt_pointer_operator op, void *cookie) > > > +{ > > > + ctxt->gt_pch_nx (op, cookie); > > > +} > > > > Should these be inline functions in context.h, so that the call does direct? > > Or do we take their address, making that sorta pointless? > > > > It seems like there's one level of indirection here that is avoidable... > > It looks like they can be inlined - their addresses are not taken, and > they're only used by gtype-desc.c, inside the autogenerated functions > gt_ggc_mx_context, gt_pch_nx_context, and gt_pch_p_7context. > > I'll make them inline in context.h
Here's an updated version of the patch which makes them inline. I've successfully bootstrapped the *end result* of the revised patch series 3-11 (plus the patch "3.1" from [1]) on x86_64-unknown-linux-gnu: all testcases show the same results as an unpatched build (relative to r201397). OK for trunk? [1] http://gcc.gnu.org/ml/gcc-patches/2013-08/msg00118.html
>From f5fba88b187c68f92e3c797b83a3ff4b6e6c2e48 Mon Sep 17 00:00:00 2001 From: David Malcolm <dmalc...@redhat.com> Date: Tue, 30 Jul 2013 12:30:15 -0400 Subject: [PATCH 11/15] Make gcc::context be GC-managed This patch makes gcc::context instances be allocated within the GC-heap, and adds traversal hooks for GC/PCH so that a gcc::context can own refs to other GC-allocated objects. gcc/ * Makefile.in (GTFILES): Add context.h. * context.c (gcc::context::operator new): New. (gcc::context::gt_ggc_mx): New. (gcc::context::gt_pch_nx): New. (gcc::context::gt_pch_nx): New. * context.h (gcc::context): Add GTY((user)) marking. (gcc::context::operator new): New. (gcc::context::gt_ggc_mx): New. (gcc::context::gt_pch_nx): New. (gcc::context::gt_pch_nx): New. (g): Add GTY marking. (gt_ggc_mx (gcc::context *)): New. (gt_pch_nx (gcc::context *)): New. (gt_pch_nx (gcc::context *ctxt, gt_pointer_operator op, void *cookie)): New. * gengtype.c (open_base_files) <ifiles>: Add context.h. --- gcc/Makefile.in | 1 + gcc/context.c | 26 +++++++++++++++++++++++++ gcc/context.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- gcc/gengtype.c | 2 +- 4 files changed, 85 insertions(+), 3 deletions(-) diff --git a/gcc/Makefile.in b/gcc/Makefile.in index afce540..61a4d7c 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -3819,6 +3819,7 @@ GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h $(srcdir)/coretypes.h \ $(srcdir)/ipa-inline.h \ $(srcdir)/asan.c \ $(srcdir)/tsan.c \ + $(srcdir)/context.h \ @all_gtfiles@ # Compute the list of GT header files from the corresponding C sources, diff --git a/gcc/context.c b/gcc/context.c index b515241..ba6f335 100644 --- a/gcc/context.c +++ b/gcc/context.c @@ -27,7 +27,33 @@ along with GCC; see the file COPYING3. If not see /* The singleton holder of global state: */ gcc::context *g; +void * +gcc::context::operator new (std::size_t size) +{ + return ggc_internal_cleared_alloc_stat (size MEM_STAT_INFO); +} + gcc::context::context() { passes_ = new gcc::pass_manager (this); } + +/* Functions relating to the garbage collector. */ +void +gcc::context::gt_ggc_mx () +{ + /* Currently a no-op. */ +} + +void +gcc::context::gt_pch_nx () +{ + /* Currently a no-op. */ +} + +void +gcc::context::gt_pch_nx (gt_pointer_operator op ATTRIBUTE_UNUSED, + void *cookie ATTRIBUTE_UNUSED) +{ + /* Currently a no-op. */ +} diff --git a/gcc/context.h b/gcc/context.h index 66260cd..2211dc4 100644 --- a/gcc/context.h +++ b/gcc/context.h @@ -27,11 +27,30 @@ class pass_manager; /* GCC's internal state can be divided into zero or more "parallel universe" of state; an instance of this class is one such context of state. */ -class context +class GTY((user)) context { public: + /* Ensure that instances are allocated within the GC-heap. */ + void *operator new (std::size_t size); + context(); + /* Garbage-collector integration. + + Each context assumes it has full control of the GC-heap that it + is associated with. It acts as a root for that GC-heap, owning + references to within it. + + Note that context instances are allocated within their own GC + heap. + + The methods are called the *first time* that the context is reached + during a ggc/pch traversal, rather than every time. */ + + void gt_ggc_mx (); + void gt_pch_nx (); + void gt_pch_nx (gt_pointer_operator op, void *cookie); + /* Pass-management. */ pass_manager *get_passes () { gcc_assert (passes_); return passes_; } @@ -46,6 +65,42 @@ private: /* The global singleton context aka "g". (the name is chosen to be easy to type in a debugger). */ -extern gcc::context *g; +extern GTY(()) gcc::context *g; + +/* Global hooks for ggc/pch. + + The gcc::context class is marked with GTY((user)), which leads to + gengtype creating autogenerated functions for handling context within + gtype-desc.c: + + void gt_ggc_mx_context (void *x_p); + void gt_pch_nx_context (void *x_p) + void gt_pch_p_7context (void *this_obj, + void *x_p, + gt_pointer_operator op, + void *cookie); + + Those functions call the following global functions the first time + that the context is reached during a traversal, and the following + global functions in turn simply call the corresponding methods of the + context (so that they can access private fields of the context). */ + +inline void +gt_ggc_mx (gcc::context *ctxt) +{ + ctxt->gt_ggc_mx (); +} + +inline void +gt_pch_nx (gcc::context *ctxt) +{ + ctxt->gt_pch_nx (); +} + +inline void +gt_pch_nx (gcc::context *ctxt, gt_pointer_operator op, void *cookie) +{ + ctxt->gt_pch_nx (op, cookie); +} #endif /* ! GCC_CONTEXT_H */ diff --git a/gcc/gengtype.c b/gcc/gengtype.c index 50efa9b..941c6e1 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -1733,7 +1733,7 @@ open_base_files (void) "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h", "except.h", "output.h", "gimple.h", "cfgloop.h", "target.h", "ipa-prop.h", "lto-streamer.h", "target-globals.h", - "ipa-inline.h", "dwarf2out.h", NULL + "ipa-inline.h", "dwarf2out.h", "context.h", NULL }; const char *const *ifp; outf_p gtype_desc_c; -- 1.7.11.7