Author: David Schneider <david.schnei...@picle.org> Branch: Changeset: r63365:c2d0282acb2a Date: 2013-04-15 15:11 +0200 http://bitbucket.org/pypy/pypy/changeset/c2d0282acb2a/
Log: merge heads diff --git a/rpython/jit/backend/llsupport/test/test_gc_integration.py b/rpython/jit/backend/llsupport/test/test_gc_integration.py --- a/rpython/jit/backend/llsupport/test/test_gc_integration.py +++ b/rpython/jit/backend/llsupport/test/test_gc_integration.py @@ -671,25 +671,31 @@ # people actually wreck xmm registers cpu = self.cpu l = [] + copied_stack = [None] def before(): + # put nonsense on the top of shadowstack + frame = rffi.cast(JITFRAMEPTR, cpu.gc_ll_descr.gcrootmap.stack[0]) + assert getmap(frame).count('1') == 7 # + copied_stack[0] = cpu.gc_ll_descr.gcrootmap.stack[0] + cpu.gc_ll_descr.gcrootmap.stack[0] = 0 l.append("before") def after(): + cpu.gc_ll_descr.gcrootmap.stack[0] = copied_stack[0] l.append("after") invoke_around_extcall(before, after) def f(frame, x): # all the gc pointers are alive p1 -> p7 (but not p0) - assert getmap(frame).count('1') == 7 # assert x == 1 return 2 - + FUNC = lltype.FuncType([JITFRAMEPTR, lltype.Signed], lltype.Signed) fptr = llhelper(lltype.Ptr(FUNC), f) calldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, - EffectInfo.MOST_GENERAL) + EffectInfo.MOST_GENERAL) loop = self.parse(""" [i0, p1, p2, p3, p4, p5, p6, p7] p0 = force_token() diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -1926,6 +1926,9 @@ self.pending_guard_tokens.append(guard_token) def genop_call(self, op, arglocs, resloc): + return self._genop_call(op, arglocs, resloc) + + def _genop_call(self, op, arglocs, resloc, is_call_release_gil=False): from rpython.jit.backend.llsupport.descr import CallDescr sizeloc = arglocs[0] @@ -1943,11 +1946,14 @@ assert isinstance(descr, CallDescr) stack_max = PASS_ON_MY_FRAME - if self._is_asmgcc() and op.getopnum() == rop.CALL_RELEASE_GIL: - from rpython.memory.gctransform import asmgcroot - stack_max -= asmgcroot.JIT_USE_WORDS - can_collect = 3 # asmgcc only: don't write jf_extra_stack_depth, - # and reload ebp from the css + if is_call_release_gil: + if self._is_asmgcc(): + from rpython.memory.gctransform import asmgcroot + stack_max -= asmgcroot.JIT_USE_WORDS + can_collect = 3 # asmgcc only: don't write jf_extra_stack_depth, + # and reload ebp from the css + else: + can_collect = 0 else: can_collect = 1 @@ -2015,10 +2021,13 @@ # first, close the stack in the sense of the asmgcc GC root tracker gcrootmap = self.cpu.gc_ll_descr.gcrootmap if gcrootmap: + noregs = self.cpu.gc_ll_descr.is_shadow_stack() + gcmap = self._regalloc.get_gcmap([eax], noregs=noregs) + self.push_gcmap(self.mc, gcmap, store=True) self.call_release_gil(gcrootmap, arglocs) # do the call self._store_force_index(guard_op) - self.genop_call(op, arglocs, result_loc) + self._genop_call(op, arglocs, result_loc, is_call_release_gil=True) # then reopen the stack if gcrootmap: self.call_reacquire_gil(gcrootmap, result_loc) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit