Author: Armin Rigo <[email protected]>
Branch: stmgc-c4
Changeset: r65101:a163fe15803e
Date: 2013-06-29 19:49 +0200
http://bitbucket.org/pypy/pypy/changeset/a163fe15803e/

Log:    in-progress

diff --git a/rpython/memory/gc/stmgc.py b/rpython/memory/gc/stmgc.py
--- a/rpython/memory/gc/stmgc.py
+++ b/rpython/memory/gc/stmgc.py
@@ -9,16 +9,6 @@
 from rpython.rlib.debug import ll_assert
 
 
-class PrebuiltStmGCHeader(llmemory.Symbolic):
-    def __init__(self, typeid16):
-        self.typeid16 = typeid16
-    def annotation(self):
-        from rpython.annotator import model
-        return model.SomePtr(self.lltype())
-    def lltype(self):
-        return lltype.Ptr(StmGC.HDR)
-
-
 class StmGC(MovingGCBase):
     _alloc_flavor_ = "raw"
     inline_simple_malloc = True
@@ -38,7 +28,15 @@
 
     def init_gc_object_immortal(self, addr, typeid16, flags=0):
         assert flags == 0
-        return PrebuiltStmGCHeader(typeid16)
+        assert isinstance(typeid16, llgroup.GroupMemberOffset)
+        ptr = self.gcheaderbuilder.object_from_header(addr.ptr)
+        prebuilt_hash = lltype.identityhash_nocache(ptr)
+        assert prebuilt_hash != 0     # xxx probably good enough
+        #
+        hdr = llmemory.cast_adr_to_ptr(addr, lltype.Ptr(self.HDR))
+        hdr._obj._name = typeid16.index   # debug only
+        hdr._obj.typeid16 = typeid16
+        hdr._obj.prebuilt_hash = prebuilt_hash
 
     def malloc_fixedsize_clear(self, typeid, size,
                                needs_finalizer=False,
diff --git a/rpython/memory/gctransform/stmframework.py 
b/rpython/memory/gctransform/stmframework.py
--- a/rpython/memory/gctransform/stmframework.py
+++ b/rpython/memory/gctransform/stmframework.py
@@ -1,5 +1,31 @@
-from rpython.memory.gctransform import shadowstack
+from rpython.memory.gctransform.framework import (
+     BaseFrameworkGCTransformer, BaseRootWalker, sizeofaddr)
 
 
-class StmFrameworkGCTransformer(shadowstack.ShadowStackFrameworkGCTransformer):
-    pass
+class StmFrameworkGCTransformer(BaseFrameworkGCTransformer):
+
+    def build_root_walker(self):
+        return StmRootWalker(self)
+
+    def push_roots(self, hop, keep_current_args=False):
+        livevars = self.get_livevars_for_roots(hop, keep_current_args)
+        self.num_pushs += len(livevars)
+        for var in livevars:
+            hop.genop("stm_push_root", [var])
+        return livevars
+
+    def pop_roots(self, hop, livevars):
+        for var in reversed(livevars):
+            hop.genop("stm_pop_root_into", [var])
+
+    def gc_header_for(self, obj, needs_hash=False):
+        return self.gcdata.gc.gcheaderbuilder.header_of_object(obj)
+
+
+class StmRootWalker(BaseRootWalker):
+
+    def need_thread_support(self, gctransform, getfn):
+        pass
+
+    def walk_stack_roots(self, collect_stack_root):
+        raise NotImplementedError
diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -429,6 +429,8 @@
     'stm_get_tid':            LLOp(canfold=True),
     'stm_id':                 LLOp(sideeffects=False),
     'stm_hash':               LLOp(sideeffects=False),
+    'stm_push_root':          LLOp(),
+    'stm_pop_root_into':      LLOp(),
 
     # __________ address operations __________
 
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
@@ -458,11 +458,14 @@
         return 'pypy_asm_stack_bottom();'
 
 class StmFrameworkGcPolicy(BasicFrameworkGcPolicy):
-    
+
     def gettransformer(self):
         from rpython.memory.gctransform import stmframework
         return stmframework.StmFrameworkGCTransformer(self.db.translator)
 
+    def get_prebuilt_hash(self, obj):
+        return None       # done differently with the stmgc
+
 
 name_to_gcpolicy = {
     'boehm': BoehmGcPolicy,
diff --git a/rpython/translator/c/node.py b/rpython/translator/c/node.py
--- a/rpython/translator/c/node.py
+++ b/rpython/translator/c/node.py
@@ -1002,6 +1002,9 @@
         return db.gcpolicy.rtti_node_factory()(db, T, obj)
     if T.hints.get("render_structure", False):
         return ExtType_OpaqueNode(db, T, obj)
+    if T.__name__ == 'struct stm_object_s':
+        from rpython.translator.stm.funcgen import StmHeader_OpaqueNode
+        return StmHeader_OpaqueNode(db, T, obj)
     raise Exception("don't know about %r" % (T,))
 
 
diff --git a/rpython/translator/stm/funcgen.py 
b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -1,20 +1,44 @@
 from rpython.translator.c.support import c_string_constant
+from rpython.translator.c.node import ContainerNode
+from rpython.translator.c.primitive import name_small_integer
 from rpython.translator.stm.stmgcintf import StmOperations
 
 
+class StmHeader_OpaqueNode(ContainerNode):
+    nodekind = 'stmhdr'
+    globalcontainer = True
+    typename = 'struct stm_object_s @'
+    implementationtypename = typename
+    _funccodegen_owner = None
+
+    def __init__(self, db, T, obj):
+        assert isinstance(obj._name, int)
+        self.db = db
+        self.T = T
+        self.obj = obj
+
+    def initializationexpr(self, decoration=''):
+        yield '{ %s | PREBUILT_FLAGS, PREBUILT_REVISION, %dL }' % (
+            name_small_integer(self.obj.typeid16, self.db),
+            self.obj.prebuilt_hash)
+
+
 def stm_start_transaction(funcgen, op):
+    xxx
     # only for testing.  With stmgc, this operation should have been handled
     # already by gctransform.
     assert funcgen.db.translator.config.translation.gc == 'none'
     return 'stm_nogc_start_transaction();'
 
 def stm_stop_transaction(funcgen, op):
+    xxx
     # only for testing.  With stmgc, this operation should have been handled
     # already by gctransform.
     assert funcgen.db.translator.config.translation.gc == 'none'
     return 'stm_nogc_stop_transaction();'
 
 def stm_barrier(funcgen, op):
+    xxx
     category_change = op.args[0].value
     assert type(category_change) is str and len(category_change) == 3   # "x2y"
     arg = funcgen.expr(op.args[1])
@@ -22,12 +46,14 @@
     return '%s = stm_barrier_%s(%s);' % (result, category_change, arg)
 
 def stm_ptr_eq(funcgen, op):
+    xxx
     arg0 = funcgen.expr(op.args[0])
     arg1 = funcgen.expr(op.args[1])
     result = funcgen.expr(op.result)
     return '%s = stm_pointer_equal(%s, %s);' % (result, arg0, arg1)
 
 def stm_become_inevitable(funcgen, op):
+    xxx
     try:
         info = op.args[0].value
     except IndexError:
@@ -39,21 +65,25 @@
 ##    return funcgen.OP_DIRECT_CALL(op)
 
 def stm_abort_info_push(funcgen, op):
+    xxx
     arg0 = funcgen.expr(op.args[0])
     arg1 = funcgen.expr(op.args[1])
     return 'stm_abort_info_push(%s, %s);' % (arg0, arg1)
 
 def stm_extraref_llcount(funcgen, op):
+    xxx
     result = funcgen.expr(op.result)
     return '%s = stm_extraref_llcount();' % (result,)
 
 def stm_extraref_lladdr(funcgen, op):
+    xxx
     arg0 = funcgen.expr(op.args[0])
     result = funcgen.expr(op.result)
     return '%s = (char *)stm_extraref_lladdr(%s);' % (result, arg0)
 
 def _stm_nogc_init_function():
     """Called at process start-up when running with no GC."""
+    xxx
     StmOperations.descriptor_init()
     StmOperations.begin_inevitable_transaction()
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to