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