summaryrefslogtreecommitdiff
path: root/gcc/ggc.h
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2013-08-20 00:54:49 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2013-08-20 00:54:49 +0000
commite42c64cb6dca35a4979db08706033d89b94f196f (patch)
tree05efba88a6ac6bfe88226db36b3f7150d78b74bb /gcc/ggc.h
parent910c02a071adeae2000fedcfeba2172154f52c0d (diff)
downloadgcc-e42c64cb6dca35a4979db08706033d89b94f196f.tar.gz
Make opt_pass and gcc::pass_manager be GC-managed
2013-08-20 David Malcolm <dmalcolm@redhat.com> Make opt_pass and gcc::pass_manager be GC-managed, so that pass instances can own GC refs. * Makefile.in (GTFILES): Add pass_manager.h and tree-pass.h. * context.c (gcc::context::gt_ggc_mx): Traverse passes_. (gcc::context::gt_pch_nx): Likewise. (gcc::context::gt_pch_nx): Likewise. * ggc.h (gt_ggc_mx <T>): New. (gt_pch_nx_with_op <T>): New. (gt_pch_nx <T>): New. * passes.c (opt_pass::gt_ggc_mx): New. (opt_pass::gt_pch_nx): New. (opt_pass::gt_pch_nx_with_op): New. (pass_manager::gt_ggc_mx): New. (pass_manager::gt_pch_nx): New. (pass_manager::gt_pch_nx_with_op): New. (pass_manager::operator new): Use ggc_internal_cleared_alloc_stat rather than xcalloc. * pass_manager.h (class pass_manager): Add GTY((user)) marking. (pass_manager::gt_ggc_mx): New. (pass_manager::gt_pch_nx): New. (pass_manager::gt_pch_nx_with_op): New. * tree-pass.h (class opt_pass): Add GTY((user)) marking. (opt_pass::operator new): New. (opt_pass::gt_ggc_mx): New. (opt_pass::gt_pch_nx): New. (opt_pass::gt_pch_nx_with_op): New. From-SVN: r201865
Diffstat (limited to 'gcc/ggc.h')
-rw-r--r--gcc/ggc.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ggc.h b/gcc/ggc.h
index b31bc80489f..e2a1aaf3334 100644
--- a/gcc/ggc.h
+++ b/gcc/ggc.h
@@ -276,4 +276,50 @@ ggc_alloc_cleared_gimple_statement_d_stat (size_t s MEM_STAT_DECL)
ggc_internal_cleared_alloc_stat (s PASS_MEM_STAT);
}
+/* gengtype will autogenerate traversal functions (in gtype-desc.c) for
+ all GTY-marked types that it sees are referenced by a GTY marker.
+
+ Unfortunately, it will not generate traveral functions for types that
+ are only referenced by GTY((user)) types.
+
+ The following templates are a substitute, providing equivalent
+ traversal functions for such types. They are instantiated for
+ types whose objects that are traversed during GC/PCH, and are
+ called *every time* that an instance of type T is traversed during
+ GC/PCH.
+
+ They require the presence of the following member functions
+
+ void gt_ggc_mx ();
+ void gt_pch_nx ();
+ void gt_pch_nx_with_op (gt_pointer_operator op, void *cookie);
+
+ within class T, which are called *once* per object - the first
+ time the object is visited during the traversal. */
+
+template<class T>
+inline void gt_ggc_mx (T *p)
+{
+ if (ggc_test_and_set_mark (p))
+ p->gt_ggc_mx ();
+}
+
+template<class T>
+void gt_pch_nx_with_op (void *this_obj, void *p,
+ gt_pointer_operator op, void *cookie)
+{
+ if (p == this_obj)
+ {
+ T *t = static_cast<T *>(p);
+ t->gt_pch_nx_with_op (op, cookie);
+ }
+}
+
+template<class T>
+inline void gt_pch_nx (T *p)
+{
+ if (gt_pch_note_object (p, p, gt_pch_nx_with_op<T>))
+ p->gt_pch_nx ();
+}
+
#endif