summaryrefslogtreecommitdiff
path: root/gcc/context.h
diff options
context:
space:
mode:
authordmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>2013-08-20 00:48:14 +0000
committerdmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>2013-08-20 00:48:14 +0000
commit9e1adc64622ceef35e977961aa107816c89c904b (patch)
tree080c5e5b18d9fa59fc4dff4c0c22fc13ee53b87c /gcc/context.h
parent714a75873ef0edb53559480e93eabbf12d7971be (diff)
downloadgcc-9e1adc64622ceef35e977961aa107816c89c904b.tar.gz
Make gcc::context be GC-managed
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201864 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/context.h')
-rw-r--r--gcc/context.h59
1 files changed, 57 insertions, 2 deletions
diff --git a/gcc/context.h b/gcc/context.h
index 66260cd279a..2211dc43ee9 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 */