[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