[pypy-commit] pypy stmgc-c4: hopefully in the right direction: now a single cond_call_stm_b because there may be many more variants in the future.
Raemi
noreply at buildbot.pypy.org
Thu Jul 11 18:13:38 CEST 2013
Author: Remi Meier <meierrem at student.ethz.ch>
Branch: stmgc-c4
Changeset: r65346:e1aa4591dc07
Date: 2013-07-11 18:12 +0200
http://bitbucket.org/pypy/pypy/changeset/e1aa4591dc07/
Log: hopefully in the right direction: now a single cond_call_stm_b
because there may be many more variants in the future.
diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -958,11 +958,8 @@
def execute_cond_call_gc_wb_array(self, descr, a, b, c):
py.test.skip("cond_call_gc_wb_array not supported")
- def execute_cond_call_stm_wb(self, descr, a):
- py.test.skip("cond_call_stm_wb not supported")
-
- def execute_cond_call_stm_rb(self, descr, a):
- py.test.skip("cond_call_stm_rb not supported")
+ def execute_cond_call_stm_b(self, descr, a):
+ py.test.skip("cond_call_stm_b not supported")
def execute_keepalive(self, descr, x):
pass
diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -270,23 +270,43 @@
rst_addr = llop.gc_adr_of_root_stack_top(llmemory.Address)
return rffi.cast(lltype.Signed, rst_addr)
+class GcRootMap_stm(object):
+ is_shadow_stack = False # XXX: should it have an is_stmgc?
-class WriteBarrierDescr(AbstractDescr):
+ def __init__(self, gcdescr):
+ pass
+
+ def register_asm_addr(self, start, mark):
+ pass
+
+ def get_root_stack_top_addr(self):
+ rst_addr = llop.gc_adr_of_root_stack_top(llmemory.Address)
+ return rffi.cast(lltype.Signed, rst_addr)
+
+
+class BarrierDescr(AbstractDescr):
def __init__(self, gc_ll_descr):
self.llop1 = gc_ll_descr.llop1
self.returns_modified_object = False
- self.WB_FUNCPTR = lltype.Ptr(lltype.FuncType(
+ self.FUNCPTR = lltype.Ptr(lltype.FuncType(
[llmemory.Address], lltype.Void))
- self.fielddescr_tid = gc_ll_descr.fielddescr_tid
self.gcheaderbuilder = gc_ll_descr.gcheaderbuilder
self.HDRPTR = gc_ll_descr.HDRPTR
- #
+
+ def repr_of_descr(self):
+ raise NotImplementedError
+
+ def __repr(self):
+ raise NotImplementedError
+
+class WriteBarrierDescr(BarrierDescr):
+ def __init__(self, gc_ll_descr):
+ BarrierDescr.__init__(self, gc_ll_descr)
+ self.fielddescr_tid = gc_ll_descr.fielddescr_tid
+
GCClass = gc_ll_descr.GCClass
- if GCClass is None: # for tests
- return
-
self.jit_wb_if_flag = GCClass.JIT_WB_IF_FLAG
self.jit_wb_if_flag_byteofs, self.jit_wb_if_flag_singlebyte = (
self.extract_flag_byte(self.jit_wb_if_flag))
@@ -325,14 +345,9 @@
return (i, struct.unpack('b', value[i])[0])
def get_barrier_funcptr(self, returns_modified_object):
- assert returns_modified_object == self.returns_modified_object
- llop1 = self.llop1
- if returns_modified_object:
- funcptr = self.wb_failing_case_ptr
- else:
- FUNCTYPE = self.WB_FUNCPTR
- funcptr = llop1.get_write_barrier_failing_case(FUNCTYPE)
- return funcptr
+ assert not returns_modified_object
+ FUNCTYPE = self.FUNCPTR
+ return llop1.get_write_barrier_failing_case(FUNCTYPE)
def get_write_barrier_fn(self, cpu, returns_modified_object):
# must pass in 'self.returns_modified_object', to make sure that
@@ -343,16 +358,13 @@
def get_write_barrier_from_array_fn(self, cpu):
# returns a function with arguments [array, index, newvalue]
- assert not self.returns_modified_object
llop1 = self.llop1
funcptr = llop1.get_write_barrier_from_array_failing_case(
- self.WB_FUNCPTR)
+ self.FUNCPTR)
funcaddr = llmemory.cast_ptr_to_adr(funcptr)
return cpu.cast_adr_to_int(funcaddr) # this may return 0
def has_write_barrier_from_array(self, cpu):
- if self.returns_modified_object:
- return False
return self.get_write_barrier_from_array_fn(cpu) != 0
def get_wb_slowpath(self, withcards, withfloats):
@@ -372,15 +384,11 @@
# the GC, and call it immediately
funcptr = self.get_barrier_funcptr(returns_modified_object)
res = funcptr(llmemory.cast_ptr_to_adr(gcref_struct))
- if returns_modified_object:
- return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
- else:
- if returns_modified_object:
- return gcref_struct
-class STMBarrierDescr(WriteBarrierDescr):
+
+class STMBarrierDescr(BarrierDescr):
def __init__(self, gc_ll_descr, stmcat, cfunc_name):
- WriteBarrierDescr.__init__(self, gc_ll_descr)
+ BarrierDescr.__init__(self, gc_ll_descr)
self.stmcat = stmcat
self.returns_modified_object = True
self.WB_FUNCPTR_MOD = lltype.Ptr(lltype.FuncType(
@@ -394,8 +402,14 @@
_nowrapper=True)
def repr_of_descr(self):
- cat = self.stmcat
- return cat
+ return self.stmcat
+
+ def __repr__(self):
+ return '<STMBarrierDescr %r>' % (self.repr_of_descr(),)
+
+ def get_barrier_funcptr(self, returns_modified_object):
+ assert returns_modified_object
+ return self.wb_failing_case_ptr
@specialize.arg(2)
def _do_barrier(self, gcref_struct, returns_modified_object):
@@ -403,8 +417,7 @@
# XXX: fastpath for Read and Write variants
funcptr = self.get_barrier_funcptr(returns_modified_object)
res = funcptr(llmemory.cast_ptr_to_adr(gcref_struct))
- if returns_modified_object:
- return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
+ return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
class STMReadBarrierDescr(STMBarrierDescr):
@@ -412,9 +425,8 @@
assert stmcat == 'P2R'
STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
'stm_read_barrier')
-
-
+
class STMWriteBarrierDescr(STMBarrierDescr):
def __init__(self, gc_ll_descr, stmcat):
assert stmcat in ['P2W', 'R2W']
@@ -448,7 +460,9 @@
self._make_layoutbuilder()
self._make_gcrootmap()
self._setup_gcclass()
- self._setup_tid()
+ if not self.stm:
+ # XXX: not needed with stm/shadowstack??
+ self._setup_tid()
self._setup_write_barrier()
self._setup_str()
self._make_functions(really_not_translated)
diff --git a/rpython/jit/backend/llsupport/stmrewrite.py b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -9,8 +9,8 @@
#
# Any SETFIELD_GC, SETARRAYITEM_GC, SETINTERIORFIELD_GC must be done on a
# W object. The operation that forces an object p1 to be W is
-# COND_CALL_STM_WB(p1, descr=x2Wdescr), for x in 'PGORL'. This
-# COND_CALL_STM_WB is a bit special because if p1 is not W, it *replaces*
+# COND_CALL_STM_B(p1, descr=x2Wdescr), for x in 'PGORL'. This
+# COND_CALL_STM_B is a bit special because if p1 is not W, it *replaces*
# its value with the W copy (by changing the register's value and
# patching the stack location if any). It's still conceptually the same
# object, but the pointer is different.
@@ -121,10 +121,7 @@
except KeyError:
return v_base # no barrier needed
args = [v_base,]
- if target_category == 'W':
- op = rop.COND_CALL_STM_WB
- else:
- op = rop.COND_CALL_STM_RB
+ op = rop.COND_CALL_STM_B
self.newops.append(ResOperation(op, args, None,
descr=write_barrier_descr))
diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
--- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
@@ -44,7 +44,7 @@
jump()
""", """
[p1, p2]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
jump()
""")
@@ -59,7 +59,7 @@
""", """
[p1, p2]
p3 = same_as(ConstPtr(t))
- cond_call_stm_wb(p3, descr=P2Wdescr)
+ cond_call_stm_b(p3, descr=P2Wdescr)
setfield_gc(p3, p2, descr=tzdescr)
jump()
""", t=NULL)
@@ -87,9 +87,9 @@
jump()
""", """
[p1, p2, p3, p4]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
- cond_call_stm_wb(p3, descr=P2Wdescr)
+ cond_call_stm_b(p3, descr=P2Wdescr)
setfield_gc(p3, p4, descr=tzdescr)
jump()
""")
@@ -102,7 +102,7 @@
jump()
""", """
[p1, p2, i3]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
setfield_gc(p1, i3, descr=tydescr)
jump()
@@ -117,10 +117,10 @@
jump(p1)
""", """
[p1, p2, i3]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
label(p1, i3)
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, i3, descr=tydescr)
jump(p1)
""")
@@ -162,7 +162,7 @@
jump(p2)
""", """
[p1]
- cond_call_stm_rb(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=P2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
jump(p2)
""")
@@ -177,7 +177,7 @@
""", """
[p1]
p3 = same_as(ConstPtr(t))
- cond_call_stm_rb(p3, descr=P2Rdescr)
+ cond_call_stm_b(p3, descr=P2Rdescr)
p2 = getfield_gc(p3, descr=tzdescr)
jump(p2)
""", t=NULL)
@@ -190,7 +190,7 @@
jump(i3)
""", """
[p1, i2]
- cond_call_stm_rb(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=P2Rdescr)
i3 = getarrayitem_gc(p1, i2, descr=adescr)
jump(i3)
""")
@@ -202,7 +202,7 @@
jump(i3)
""", """
[p1, i2]
- cond_call_stm_rb(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=P2Rdescr)
i3 = getinteriorfield_gc(p1, i2, descr=adescr)
jump(i3)
""")
@@ -215,7 +215,7 @@
jump(p2, i2)
""", """
[p1]
- cond_call_stm_rb(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=P2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
i2 = getfield_gc(p1, descr=tydescr)
jump(p2, i2)
@@ -229,9 +229,9 @@
jump(p2, i2)
""", """
[p1]
- cond_call_stm_rb(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=P2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
- cond_call_stm_rb(p2, descr=P2Rdescr)
+ cond_call_stm_b(p2, descr=P2Rdescr)
i2 = getfield_gc(p2, descr=tydescr)
jump(p2, i2)
""")
@@ -247,10 +247,10 @@
jump(p1)
""", """
[p1]
- cond_call_stm_rb(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=P2Rdescr)
i1 = getfield_gc(p1, descr=tydescr)
i2 = int_add(i1, 1)
- cond_call_stm_wb(p1, descr=R2Wdescr)
+ cond_call_stm_b(p1, descr=R2Wdescr)
setfield_gc(p1, i2, descr=tydescr)
jump(p1)
""")
@@ -263,7 +263,7 @@
jump(p2)
""", """
[p1]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, 123, descr=tydescr)
p2 = getfield_gc(p1, descr=tzdescr)
jump(p2)
@@ -295,10 +295,10 @@
jump(p2)
""", """
[p1]
- cond_call_stm_rb(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=P2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
call(p2)
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, 5, descr=tydescr)
jump(p2)
""")
@@ -358,9 +358,9 @@
jump()
""", """
[p1, i1, p2, p3, i3, p4]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setarrayitem_gc(p1, i1, p2, descr=adescr)
- cond_call_stm_wb(p3, descr=P2Wdescr)
+ cond_call_stm_b(p3, descr=P2Wdescr)
setarrayitem_gc(p3, i3, p4, descr=adescr)
jump()
""")
@@ -374,7 +374,7 @@
jump()
""", """
[p1, p2, i2, p3, i3]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setarrayitem_gc(p1, i2, p2, descr=adescr)
i4 = read_timestamp()
setarrayitem_gc(p1, i3, p3, descr=adescr)
@@ -390,7 +390,7 @@
jump()
""", """
[p1, p2, i2, p3, i3]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setinteriorfield_gc(p1, i2, p2, descr=adescr)
i4 = read_timestamp()
setinteriorfield_gc(p1, i3, p3, descr=adescr)
@@ -405,7 +405,7 @@
jump()
""", """
[p1, i2, i3]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
strsetitem(p1, i2, i3)
unicodesetitem(p1, i2, i3)
jump()
@@ -432,11 +432,11 @@
jump(i2, p7)
""" % op, """
[i1, i2, i3, p7]
- cond_call_stm_wb(p7, descr=P2Wdescr)
+ cond_call_stm_b(p7, descr=P2Wdescr)
setfield_gc(p7, 10, descr=tydescr)
$INEV
%s
- cond_call_stm_wb(p7, descr=P2Wdescr)
+ cond_call_stm_b(p7, descr=P2Wdescr)
setfield_gc(p7, 20, descr=tydescr)
jump(i2, p7)
""" % op, calldescr2=calldescr2)
@@ -448,8 +448,8 @@
jump()
""", """
[p1, p2, i1, i2, i3]
- cond_call_stm_wb(p2, descr=P2Wdescr)
- cond_call_stm_rb(p1, descr=P2Rdescr)
+ cond_call_stm_b(p2, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Rdescr)
copystrcontent(p1, p2, i1, i2, i3)
jump()
""")
@@ -468,7 +468,7 @@
jump(p1)
""" % op, """
[p1]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, 10, descr=tydescr)
%s
setfield_gc(p1, 20, descr=tydescr)
@@ -491,10 +491,10 @@
jump(p1)
""" % op, """
[p1]
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, 10, descr=tydescr)
%s
- cond_call_stm_wb(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=P2Wdescr)
setfield_gc(p1, 20, descr=tydescr)
jump(p1)
""" % op, calldescr2=calldescr2)
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -346,8 +346,7 @@
rop.CALL_ASSEMBLER,
rop.COND_CALL_GC_WB,
rop.COND_CALL_GC_WB_ARRAY,
- rop.COND_CALL_STM_WB,
- rop.COND_CALL_STM_RB,
+ rop.COND_CALL_STM_B,
rop.DEBUG_MERGE_POINT,
rop.JIT_DEBUG,
rop.SETARRAYITEM_RAW,
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -500,8 +500,7 @@
'STRSETITEM/3',
'UNICODESETITEM/3',
#'RUNTIMENEW/1', # ootype operation
- 'COND_CALL_STM_WB/1d', # objptr (write barrier)
- 'COND_CALL_STM_RB/1d', # objptr (read barrier)
+ 'COND_CALL_STM_B/1d', # objptr (write/read barrier)
'COND_CALL_GC_WB/2d', # [objptr, newvalue] (for the write barrier)
'COND_CALL_GC_WB_ARRAY/3d', # [objptr, arrayindex, newvalue] (write barr.)
'DEBUG_MERGE_POINT/*', # debugging only
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
@@ -45,7 +45,10 @@
VISIT_FPTR = lltype.Ptr(lltype.FuncType([llmemory.Address], lltype.Void))
- TRANSLATION_PARAMS = {}
+ minimal_size_in_nursery = llmemory.sizeof(HDR)
+
+ TRANSLATION_PARAMS = {
+ }
def setup(self):
# Hack: MovingGCBase.setup() sets up stuff related to id(), which
@@ -90,6 +93,15 @@
(obj + offset_to_length).signed[0] = length
return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
+
+ @classmethod
+ def JIT_max_size_of_young_obj(cls):
+ return -1 # XXX: should not be used
+
+ @classmethod
+ def JIT_minimal_size_in_nursery(cls):
+ return cls.minimal_size_in_nursery
+
def collect(self, gen=1):
"""Do a minor (gen=0) or major (gen>0) collection."""
if gen > 0:
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
@@ -46,6 +46,9 @@
def gc_header_for(self, obj, needs_hash=False):
return self.gcdata.gc.gcheaderbuilder.header_of_object(obj)
+ def gct_gc_adr_of_root_stack_top(self, hop):
+ hop.genop("stm_get_root_stack_top")
+
def _gct_with_roots_pushed(self, hop):
livevars = self.push_roots(hop)
self.default(hop)
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
@@ -94,6 +94,11 @@
return '%s = (%s)stm_pop_root();' % (
arg0, cdecl(funcgen.lltypename(op.args[0]), ''))
+def stm_get_root_stack_top(funcgen, op):
+ result = funcgen.expr(op.result)
+ return '%s = (%s)stm_shadowstack;' % (
+ result, cdecl(funcgen.lltypename(op.result), ''))
+
def stm_allocate(funcgen, op):
arg0 = funcgen.expr(op.args[0])
arg1 = funcgen.expr(op.args[1])
More information about the pypy-commit
mailing list