Author: Armin Rigo <ar...@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)): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit