[pypy-commit] pypy quad-color-gc: Add transformer skeleton (WIP)

ntruessel pypy.commits at gmail.com
Fri Aug 19 05:55:23 EDT 2016


Author: Nicolas Truessel <ntruessel at njsm.de>
Branch: quad-color-gc
Changeset: r86309:dfbb52a3c9a1
Date: 2016-08-19 11:54 +0200
http://bitbucket.org/pypy/pypy/changeset/dfbb52a3c9a1/

Log:	Add transformer skeleton (WIP)

diff --git a/rpython/config/translationoption.py b/rpython/config/translationoption.py
--- a/rpython/config/translationoption.py
+++ b/rpython/config/translationoption.py
@@ -62,7 +62,7 @@
 
     # gc
     ChoiceOption("gc", "Garbage Collection Strategy",
-                 ["boehm", "ref", "semispace", "statistics",
+                 ["boehm", "qcgc", "ref", "semispace", "statistics",
                   "generation", "hybrid", "minimark",'incminimark', "none"],
                   "ref", requires={
                      "ref": [("translation.rweakref", False), # XXX
@@ -75,6 +75,11 @@
                      "hybrid": [("translation.gctransformer", "framework")],
                      "boehm": [("translation.continuation", False),  # breaks
                                ("translation.gctransformer", "boehm")],
+                     "qcgc": [("translation.gctransformer", "framework"),
+                              ("translation.gcrootfinder", "qcgc"),
+                              ("translation.gcremovetypeptr", True),
+                              ("translation.thread", False),
+                              ("translation.rweakref", False)],
                      "minimark": [("translation.gctransformer", "framework")],
                      "incminimark": [("translation.gctransformer", "framework")],
                      },
@@ -94,7 +99,7 @@
                default=IS_64_BITS, cmdline="--gcremovetypeptr"),
     ChoiceOption("gcrootfinder",
                  "Strategy for finding GC Roots (framework GCs only)",
-                 ["n/a", "shadowstack", "asmgcc"],
+                 ["n/a", "shadowstack", "asmgcc", "qcgc"],
                  "shadowstack",
                  cmdline="--gcrootfinder",
                  requires={
diff --git a/rpython/memory/gc/base.py b/rpython/memory/gc/base.py
--- a/rpython/memory/gc/base.py
+++ b/rpython/memory/gc/base.py
@@ -515,6 +515,7 @@
                "hybrid": "hybrid.HybridGC",
                "minimark" : "minimark.MiniMarkGC",
                "incminimark" : "incminimark.IncrementalMiniMarkGC",
+               "qcgc": "qcgc.QCGC",
                }
     try:
         modulename, classname = classes[config.translation.gc].split('.')
diff --git a/rpython/memory/gc/qcgc.py b/rpython/memory/gc/qcgc.py
new file mode 100644
--- /dev/null
+++ b/rpython/memory/gc/qcgc.py
@@ -0,0 +1,63 @@
+from rpython.memory.gc.base import GCBase
+from rpython.rtyper.lltypesystem import rffi, lltype
+
+class QCGC(GCBase):
+    _alloc_flavor_ = "raw"
+    moving_gc = False
+    needs_write_barrier = True
+    malloc_zero_filled = True
+    prebuilt_gc_objects_are_static_roots = True # XXX: ?
+    can_usually_pin_objects = False
+    object_minimal_size = 16
+    gcflag_extra = 0   # or a real GC flag that is always 0 when not collecting
+
+    typeid_is_in_field = 'tid'
+
+    TRANSLATION_PARAMS = {}
+    HDR = lltype.Struct(
+            'PYPYHDR',
+            ('hdr', rffi.COpaque('object_t')),
+            ('tid', lltype.Unsigned),
+            ('hash', lltype.Unsigned))
+    #HDR = rffi.COpaque('object_t')
+
+    def malloc_fixedsize_clear(self, typeid16, size,
+                               needs_finalizer=False,
+                               is_finalizer_light=False,
+                               contains_weakptr=False):
+        raise NotImplementedError
+        ## XXX finalizers are ignored for now
+        ##ll_assert(not needs_finalizer, 'XXX needs_finalizer')
+        ##ll_assert(not is_finalizer_light, 'XXX is_finalizer_light')
+        #ll_assert(not contains_weakptr, 'contains_weakptr: use malloc_weakref')
+        ## XXX call optimized versions, e.g. if size < GC_NURSERY_SECTION
+        #return llop.stm_allocate(llmemory.GCREF, size, typeid16)
+
+    def malloc_varsize_clear(self, typeid16, length, size, itemsize,
+                             offset_to_length):
+        raise NotImplementedError
+        ## XXX be careful about overflows, and call optimized versions
+        #totalsize = size + itemsize * length
+        #totalsize = llarena.round_up_for_allocation(totalsize)
+        #obj = llop.stm_allocate(llmemory.Address, totalsize, typeid16)
+        #(obj + offset_to_length).signed[0] = length
+        #return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
+
+    def collect(self, gen=1):
+        """Do a minor (gen=0) or major (gen>0) collection."""
+        raise NotImplementedError
+        #if gen > 0:
+        #    llop.stm_major_collect(lltype.Void)
+        #else:
+        #    llop.stm_minor_collect(lltype.Void)
+
+    def writebarrier_before_copy(self, source_addr, dest_addr,
+                                 source_start, dest_start, length):
+        raise NotImplementedError
+        # Possible implementation?
+        #llop.gc_writebarrier(dest_addr)
+        #return True
+
+    def identityhash(self, gcobj):
+        raise NotImplementedError
+
diff --git a/rpython/memory/gctransform/qcgcframework.py b/rpython/memory/gctransform/qcgcframework.py
new file mode 100644
--- /dev/null
+++ b/rpython/memory/gctransform/qcgcframework.py
@@ -0,0 +1,40 @@
+from rpython.annotator import model as annmodel
+from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
+from rpython.memory.gctransform.framework import (BaseFrameworkGCTransformer, BaseRootWalker)
+
+class QcgcFrameworkGCTransformer(BaseFrameworkGCTransformer):
+    def build_root_walker(self):
+        return QcgcRootWalker(self)
+
+    def _declare_functions(self, GCClass, getfn, s_gc, s_typeid16):
+        BaseFrameworkGCTransformer._declare_functions(self, GCClass, getfn,
+                                                      s_gc, s_typeid16)
+        gc = self.gcdata.gc
+        #
+        s_gcref = annmodel.SomePtr(llmemory.GCREF)
+
+        #self.malloc_weakref_ptr = self._getfn(
+        #    GCClass.malloc_weakref.im_func,
+        #    [s_gc, s_typeid16, annmodel.SomeInteger(nonneg=True),
+        #     s_gcref], s_gcref)
+        #
+        def invokecallback(root, visit_fn):
+            visit_fn(root)
+        def pypy_trace_cb(obj, visit_fn):
+            gc.trace(obj, invokecallback, visit_fn)
+        pypy_trace_cb.c_name = "pypy_trace_cb"
+        self.autoregister_ptrs.append(
+            getfn(pypy_trace_cb, [annmodel.SomeAddress(),
+                                     annmodel.SomePtr(GCClass.VISIT_FPTR)],
+                  annmodel.s_None))
+
+    def push_roots(sef, hop, keep_current_args=False):
+        raise NotImplementedError
+
+    def pop_roots(sef, hop, livevars):
+        raise NotImplementedError
+
+
+class QcgcRootWalker(BaseRootWalker):
+    def walk_stack_roots(self, collect_stack_root):
+        raise NotImplementedError
diff --git a/rpython/translator/c/gc.py b/rpython/translator/c/gc.py
--- a/rpython/translator/c/gc.py
+++ b/rpython/translator/c/gc.py
@@ -455,13 +455,19 @@
     def OP_GC_STACK_BOTTOM(self, funcgen, op):
         return 'pypy_asm_stack_bottom();'
 
+class QcgcFrameworkGcPolicy(BasicFrameworkGcPolicy):
+
+    def gettransformer(self, translator):
+        from rpython.memory.gctransform import qcgcframework
+        return qcgcframework.QcgcFrameworkGCTransformer(translator)
 
 name_to_gcpolicy = {
     'boehm': BoehmGcPolicy,
     'ref': RefcountingGcPolicy,
     'none': NoneGcPolicy,
     'framework+shadowstack': ShadowStackFrameworkGcPolicy,
-    'framework+asmgcc': AsmGcRootFrameworkGcPolicy
+    'framework+asmgcc': AsmGcRootFrameworkGcPolicy,
+    'framework+qcgc': QcgcFrameworkGcPolicy
 }
 
 


More information about the pypy-commit mailing list