[pypy-commit] pypy stm-jit: in-progress
arigo
noreply at buildbot.pypy.org
Wed Aug 8 15:33:37 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: stm-jit
Changeset: r56655:219d5fb056be
Date: 2012-08-08 15:33 +0200
http://bitbucket.org/pypy/pypy/changeset/219d5fb056be/
Log: in-progress
diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -441,10 +441,10 @@
def setcontext(iself, context):
iself.context = context
- def nextleft(iself, gc, range_lowest, prev):
+ def nextleft(iself, gc, prev):
# Return the next valid GC object's address, in right-to-left
# order from the shadowstack array. This usually means just
- # returning "prev - sizeofaddr", until we reach "range_lowest",
+ # returning "prev - sizeofaddr", until we stop being called,
# except that we are skipping NULLs. If "prev - sizeofaddr"
# contains a MARKER_FRAME instead, then we go into
# JIT-frame-lookup mode.
@@ -456,14 +456,12 @@
#
# Look for the next shadowstack address that
# contains a valid pointer
- while prev != range_lowest:
+ while True:
prev -= llmemory.sizeof(llmemory.Address)
if prev.signed[0] == self.MARKER_FRAME:
break
if gc.points_to_valid_gc_object(prev):
return prev
- else:
- return llmemory.NULL # done
#
# It's a JIT frame. Save away 'prev' for later, and
# go into JIT-frame-exploring mode.
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -132,7 +132,11 @@
prev_interpreter = LLInterpreter.current_interpreter
LLInterpreter.current_interpreter = self.debug_ll_interpreter
try:
- fail_index = func(*args)
+ if not self.gc_ll_descr.stm:
+ fail_index = func(*args)
+ else:
+ fail_index = llop.stm_jit_invoke_code(lltype.Signed,
+ func, *args)
finally:
if not self.translate_support_code:
LLInterpreter.current_interpreter = prev_interpreter
diff --git a/pypy/rpython/lltypesystem/lloperation.py b/pypy/rpython/lltypesystem/lloperation.py
--- a/pypy/rpython/lltypesystem/lloperation.py
+++ b/pypy/rpython/lltypesystem/lloperation.py
@@ -413,6 +413,8 @@
'gc_store': LLOp(), # so far, only if stm
'stm_gc_load': LLOp(sideeffects=False),
+ 'stm_jit_invoke_code': LLOp(canmallocgc=True),
+
# __________ address operations __________
'boehm_malloc': LLOp(),
diff --git a/pypy/rpython/memory/gc/stmgc.py b/pypy/rpython/memory/gc/stmgc.py
--- a/pypy/rpython/memory/gc/stmgc.py
+++ b/pypy/rpython/memory/gc/stmgc.py
@@ -423,6 +423,7 @@
stm_operations.tldict_add(obj, localobj)
#
return localobj
+ self._stm_write_barrier_global = _stm_write_barrier_global
#
def stm_normalize_global(obj):
"""Normalize a pointer for the purpose of equality
diff --git a/pypy/rpython/memory/gctransform/framework.py b/pypy/rpython/memory/gctransform/framework.py
--- a/pypy/rpython/memory/gctransform/framework.py
+++ b/pypy/rpython/memory/gctransform/framework.py
@@ -224,6 +224,7 @@
if inline:
self.graphs_to_inline[graph] = True
return annhelper.graph2const(graph)
+ self._getfn = getfn
self.frameworkgc_setup_ptr = getfn(frameworkgc_setup, [],
annmodel.s_None)
@@ -905,6 +906,8 @@
def gct_get_write_barrier_failing_case(self, hop):
op = hop.spaceop
+ assert (lltype.typeOf(self.write_barrier_failing_case_ptr.value) ==
+ op.result.concretetype)
hop.genop("same_as",
[self.write_barrier_failing_case_ptr],
resultvar=op.result)
diff --git a/pypy/rpython/memory/gctransform/stmframework.py b/pypy/rpython/memory/gctransform/stmframework.py
--- a/pypy/rpython/memory/gctransform/stmframework.py
+++ b/pypy/rpython/memory/gctransform/stmframework.py
@@ -34,6 +34,9 @@
self.stm_normalize_global_ptr = getfn(
self.gcdata.gc.stm_normalize_global,
[annmodel.SomeAddress()], annmodel.SomeAddress())
+ self.write_barrier_failing_case_ptr = getfn(
+ self.gcdata.gc._stm_write_barrier_global,
+ [annmodel.SomeAddress()], annmodel.SomeAddress())
def build_root_walker(self):
return StmShadowStackRootWalker(self)
diff --git a/pypy/translator/stm/transform.py b/pypy/translator/stm/transform.py
--- a/pypy/translator/stm/transform.py
+++ b/pypy/translator/stm/transform.py
@@ -301,6 +301,8 @@
if op.opname == 'setinteriorfield':
OUTER = op.args[0].concretetype.TO
return OUTER._immutable_interiorfield(unwraplist(op.args[1:-1]))
+ if op.opname in ('gc_load', 'gc_store'):
+ return False
raise AssertionError(op)
def pre_insert_stm_writebarrier(graph):
@@ -337,13 +339,13 @@
if gcsource.is_gc(op.result) and gcsource.is_gc(op.args[0]):
copies[op.result] = op
elif (op.opname in ('getfield', 'getarrayitem',
- 'getinteriorfield') and
+ 'getinteriorfield', 'gc_load') and
op.result.concretetype is not lltype.Void and
op.args[0].concretetype.TO._gckind == 'gc' and
not is_immutable(op)):
wants_a_writebarrier.setdefault(op, False)
elif (op.opname in ('setfield', 'setarrayitem',
- 'setinteriorfield') and
+ 'setinteriorfield', 'gc_store') and
op.args[-1].concretetype is not lltype.Void and
op.args[0].concretetype.TO._gckind == 'gc' and
not is_immutable(op)):
More information about the pypy-commit
mailing list