This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Updated patch 10 (was Re: [PATCH 10/11] Make gcc::context be GC-managed)
- From: David Malcolm <dmalcolm at redhat dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 02 Aug 2013 20:43:06 -0400
- Subject: Updated patch 10 (was Re: [PATCH 10/11] Make gcc::context be GC-managed)
- References: <1374851081-32153-1-git-send-email-dmalcolm at redhat dot com> <1374851081-32153-11-git-send-email-dmalcolm at redhat dot com> <51FAD2F8 dot 20105 at redhat dot com> <1375468277 dot 4994 dot 68 dot camel at surprise>
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 <dmalcolm@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