[pypy-commit] pypy default: merge heads
bivab
noreply at buildbot.pypy.org
Mon Apr 15 15:11:51 CEST 2013
Author: David Schneider <david.schneider at 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)
More information about the pypy-commit
mailing list