]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Make gcc::context be GC-managed
authordmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Aug 2013 00:48:14 +0000 (00:48 +0000)
committerdmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Aug 2013 00:48:14 +0000 (00:48 +0000)
* 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

gcc/ChangeLog
gcc/Makefile.in
gcc/context.c
gcc/context.h
gcc/gengtype.c

index 3a2d8f4c25ebc295fec349f759acebe908599a48..f12c23be36f7b5c137048cee1ed20eaedd0cd107 100644 (file)
@@ -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
index 6034046374a96e66b89d772d724fb400d304d2be..79c54e1e6624f67f9ecd3d569463c480bbf32303 100644 (file)
@@ -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,
index b5152419a971a427f5508c74d40bc27e4fea3ad3..ba6f33553331bcdb40a7cca71d5708e2527c5b8f 100644 (file)
@@ -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.  */
+}
index 66260cd279a782209e29855c6c82ac36f6af43f6..2211dc43ee9ebc6a9569cda70f43a9b9d91d5101 100644 (file)
@@ -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 */
index c12a4e2393d750da08a1acc3e89d34a6b8ca6da9..9db67382a10bbf34dc82a9ed4a25ef2ad6b21652 100644 (file)
@@ -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;