diff options
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 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 */ |