diff options
author | David Malcolm <dmalcolm@redhat.com> | 2013-08-20 00:48:14 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2013-08-20 00:48:14 +0000 |
commit | 910c02a071adeae2000fedcfeba2172154f52c0d (patch) | |
tree | 080c5e5b18d9fa59fc4dff4c0c22fc13ee53b87c | |
parent | c28878251aae25c0ce4ff7dfaf8fa22e9565757b (diff) | |
download | gcc-910c02a071adeae2000fedcfeba2172154f52c0d.zip gcc-910c02a071adeae2000fedcfeba2172154f52c0d.tar.gz gcc-910c02a071adeae2000fedcfeba2172154f52c0d.tar.bz2 |
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.
From-SVN: r201864
-rw-r--r-- | gcc/ChangeLog | 19 | ||||
-rw-r--r-- | gcc/Makefile.in | 1 | ||||
-rw-r--r-- | gcc/context.c | 26 | ||||
-rw-r--r-- | gcc/context.h | 59 | ||||
-rw-r--r-- | gcc/gengtype.c | 2 |
5 files changed, 104 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3a2d8f4..f12c23b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +2013-08-20 David Malcolm <dmalcolm@redhat.com> + + * 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. + 2013-08-20 Alan Modra <amodra@gmail.com> PR target/57865 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 6034046..79c54e1 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -3831,6 +3831,7 @@ GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h $(srcdir)/coretypes.h \ $(srcdir)/vtable-verify.c \ $(srcdir)/asan.c \ $(srcdir)/tsan.c $(srcdir)/ipa-devirt.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 c12a4e2..9db6738 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -1739,7 +1739,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; |