Author: Armin Rigo <[email protected]>
Branch: remove-globals-in-jit
Changeset: r58931:8c87151e76f0
Date: 2012-11-15 17:56 +0100
http://bitbucket.org/pypy/pypy/changeset/8c87151e76f0/
Log: Fix fix fix, with a hack for now
diff --git a/pypy/jit/backend/llsupport/llmodel.py
b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -194,6 +194,14 @@
deadframe = lltype.cast_opaque_ptr(jitframe.DEADFRAMEPTR, deadframe)
return deadframe.jf_guard_exc
+ def set_savedata_ref(self, deadframe, data):
+ deadframe = lltype.cast_opaque_ptr(jitframe.DEADFRAMEPTR, deadframe)
+ deadframe.jf_savedata = data
+
+ def get_savedata_ref(self, deadframe):
+ deadframe = lltype.cast_opaque_ptr(jitframe.DEADFRAMEPTR, deadframe)
+ return deadframe.jf_savedata
+
def free_loop_and_bridges(self, compiled_loop_token):
AbstractCPU.free_loop_and_bridges(self, compiled_loop_token)
blocks = compiled_loop_token.asmmemmgr_blocks
diff --git a/pypy/jit/backend/test/runner_test.py
b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -33,9 +33,9 @@
else:
return BoxFloat(ll)
-class RandomGcRef(object):
- _TYPE = llmemory.GCREF
-random_gcref = RandomGcRef()
+STUFF = lltype.GcStruct('STUFF')
+random_gcref = lltype.cast_opaque_ptr(llmemory.GCREF,
+ lltype.malloc(STUFF, immortal=True))
class Runner(object):
@@ -2264,6 +2264,7 @@
assert self.cpu.get_latest_value_int(deadframe, 0) == 1
assert self.cpu.get_latest_value_int(deadframe, 1) == 10
assert values == [faildescr, 1, 10]
+ assert self.cpu.get_savedata_ref(deadframe) # not NULL
assert self.cpu.get_savedata_ref(deadframe) == random_gcref
def test_force_operations_returning_int(self):
diff --git a/pypy/jit/backend/x86/assembler.py
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -52,12 +52,13 @@
class GuardToken(object):
def __init__(self, faildescr, failargs, fail_locs, exc,
- is_guard_not_invalidated):
+ is_guard_not_invalidated, is_guard_not_forced):
self.faildescr = faildescr
self.failargs = failargs
self.fail_locs = fail_locs
self.exc = exc
self.is_guard_not_invalidated = is_guard_not_invalidated
+ self.is_guard_not_forced = is_guard_not_forced
DEBUG_COUNTER = lltype.Struct('DEBUG_COUNTER', ('i', lltype.Signed),
('type', lltype.Char), # 'b'ridge, 'l'abel or
@@ -87,6 +88,7 @@
self.propagate_exception_path = 0
self.gcrootmap_retaddr_forced = 0
self.teardown()
+ self.force_token_to_dead_frame = {} # XXX temporary hack
def set_debug(self, v):
r = self._debug
@@ -1818,8 +1820,9 @@
guard_opnum == rop.GUARD_NO_EXCEPTION or
guard_opnum == rop.GUARD_NOT_FORCED)
is_guard_not_invalidated = guard_opnum == rop.GUARD_NOT_INVALIDATED
+ is_guard_not_forced = guard_opnum == rop.GUARD_NOT_FORCED
return GuardToken(faildescr, failargs, fail_locs, exc,
- is_guard_not_invalidated)
+ is_guard_not_invalidated, is_guard_not_forced)
def generate_propagate_error_64(self):
assert WORD == 8
@@ -1853,6 +1856,8 @@
mc.CALL_r(X86_64_SCRATCH_REG.value)
assert mc.get_relative_pos() == start + 13
# write tight data that describes the failure recovery
+ if guardtok.is_guard_not_forced:
+ mc.writechar(chr(self.CODE_FORCED))
self.write_failure_recovery_description(mc, guardtok.failargs,
guardtok.fail_locs)
# write the fail_index too
@@ -1872,6 +1877,7 @@
CODE_STOP = 0 | DESCR_SPECIAL
CODE_HOLE = 4 | DESCR_SPECIAL
CODE_INPUTARG = 8 | DESCR_SPECIAL
+ CODE_FORCED = 12 | DESCR_SPECIAL
def write_failure_recovery_description(self, mc, failargs, locs):
for i in range(len(failargs)):
@@ -1958,6 +1964,7 @@
assert cpu.gc_ll_descr.kind == "boehm", "XXX Boehm only"
#self.fail_ebp = allregisters[16 + ebp.value]
num = 0
+ deadframe = lltype.nullptr(jitframe.DEADFRAME)
# step 1: lots of mess just to count the final value of 'num'
bytecode1 = bytecode
while 1:
@@ -1975,11 +1982,20 @@
continue
if code == Assembler386.CODE_INPUTARG:
continue
+ if code == Assembler386.CODE_FORCED:
+ # resuming from a GUARD_NOT_FORCED
+ token = allregisters[16 + ebp.value]
+ deadframe = (
+ cpu.assembler.force_token_to_dead_frame.pop(token))
+ deadframe = lltype.cast_opaque_ptr(
+ jitframe.DEADFRAMEPTR, deadframe)
+ continue
assert code == Assembler386.CODE_STOP
break
num += 1
# allocate the deadframe
- deadframe = lltype.malloc(jitframe.DEADFRAME, num)
+ if not deadframe:
+ deadframe = lltype.malloc(jitframe.DEADFRAME, num)
# fill it
code_inputarg = False
num = 0
@@ -2019,6 +2035,8 @@
if code == Assembler386.CODE_INPUTARG:
code_inputarg = True
continue
+ if code == Assembler386.CODE_FORCED:
+ continue
assert code == Assembler386.CODE_STOP
break
# 'code' identifies a register: load its value
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
@@ -137,14 +137,17 @@
rffi.cast(TP, addr_of_force_index)[0] = ~fail_index
frb = self.assembler._find_failure_recovery_bytecode(faildescr)
bytecode = rffi.cast(rffi.UCHARP, frb)
- # start of "no gc operation!" block
+ assert (rffi.cast(lltype.Signed, bytecode[0]) ==
+ self.assembler.CODE_FORCED)
+ bytecode = rffi.ptradd(bytecode, 1)
deadframe = self.assembler.grab_frame_values(
self,
bytecode,
addr_of_force_token,
self.all_null_registers)
- # end of "no gc operation!" block
assert self.get_latest_descr(deadframe) is faildescr
+ self.assembler.force_token_to_dead_frame[addr_of_force_token] = (
+ deadframe)
return deadframe
def redirect_call_assembler(self, oldlooptoken, newlooptoken):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit