diff options
author | dmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-20 00:48:14 +0000 |
---|---|---|
committer | dmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-20 00:48:14 +0000 |
commit | 9e1adc64622ceef35e977961aa107816c89c904b (patch) | |
tree | 080c5e5b18d9fa59fc4dff4c0c22fc13ee53b87c /gcc/context.h | |
parent | 714a75873ef0edb53559480e93eabbf12d7971be (diff) | |
download | gcc-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.h | 59 |
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 */ |