Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60837:9e0fcf9d51a9
Date: 2013-02-03 17:03 +0200
http://bitbucket.org/pypy/pypy/changeset/9e0fcf9d51a9/
Log: Try to fix the problem with redirect_call_assembler
diff --git a/rpython/jit/backend/arm/opassembler.py
b/rpython/jit/backend/arm/opassembler.py
--- a/rpython/jit/backend/arm/opassembler.py
+++ b/rpython/jit/backend/arm/opassembler.py
@@ -1294,6 +1294,8 @@
# we overwrite the instructions at the old _arm_func_adddr
# to start with a JMP to the new _arm_func_addr.
# Ideally we should rather patch all existing CALLs, but well.
+ XXX # this is wrong, copy the logic from x86, but also, shouldn't
+ # it live on a base class instead?
oldadr = oldlooptoken._arm_func_addr
target = newlooptoken._arm_func_addr
mc = ARMv7Builder()
diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -1,3 +1,4 @@
+import weakref
from rpython.rlib.debug import debug_start, debug_print, debug_stop
from rpython.rtyper.lltypesystem import lltype
@@ -293,25 +294,14 @@
self.cpu = cpu
self.number = number
self.bridges_count = 0
- # This growing list gives the 'descr_number' of all fail descrs
- # that belong to this loop or to a bridge attached to it.
- # Filled by the frontend calling record_faildescr_index().
- self.faildescr_indices = []
self.invalidate_positions = []
+ # a list of weakrefs to looptokens that has been redirected to
+ # this one
+ self.looptokens_redirected_to = []
debug_start("jit-mem-looptoken-alloc")
debug_print("allocating Loop #", self.number)
debug_stop("jit-mem-looptoken-alloc")
- def record_faildescr_index(self, n):
- self.faildescr_indices.append(n)
-
- def reserve_and_record_some_faildescr_index(self):
- # like record_faildescr_index(), but invent and return a new,
- # unused faildescr index
- n = self.cpu.reserve_some_free_fail_descr_number()
- self.record_faildescr_index(n)
- return n
-
def compiling_a_bridge(self):
self.cpu.tracker.total_compiled_bridges += 1
self.bridges_count += 1
@@ -319,6 +309,19 @@
debug_print("allocating Bridge #", self.bridges_count, "of Loop #",
self.number)
debug_stop("jit-mem-looptoken-alloc")
+ def update_frame_info(self, oldlooptoken, baseofs):
+ new_fi = self.frame_info
+ new_loop_tokens = []
+ for ref in oldlooptoken.looptokens_redirected_to:
+ looptoken = ref()
+ if looptoken:
+ looptoken.frame_info.set_frame_depth(baseofs,
+ new_fi.jfi_frame_depth)
+ new_loop_tokens.append(ref)
+ oldlooptoken.frame_info.set_frame_depth(baseofs,
new_fi.jfi_frame_depth)
+ new_loop_tokens.append(weakref.ref(oldlooptoken))
+ self.looptokens_redirected_to = new_loop_tokens
+
def __del__(self):
#debug_start("jit-mem-looptoken-free")
#debug_print("freeing Loop #", self.number, 'with',
diff --git a/rpython/jit/backend/test/test_model.py
b/rpython/jit/backend/test/test_model.py
--- a/rpython/jit/backend/test/test_model.py
+++ b/rpython/jit/backend/test/test_model.py
@@ -1,21 +1,32 @@
-from rpython.jit.metainterp.history import AbstractFailDescr
-from rpython.jit.backend.model import AbstractCPU
+from rpython.jit.backend.model import CompiledLoopToken
+class FakeCPU(object):
+ class tracker:
+ total_compiled_loops = 0
+ total_freed_loops = 0
+ total_freed_bridges = 0
-def test_faildescr_numbering():
- cpu = AbstractCPU()
- fail_descr1 = AbstractFailDescr()
- fail_descr2 = AbstractFailDescr()
+ def free_loop_and_bridges(self, *args):
+ pass
- n1 = cpu.get_fail_descr_number(fail_descr1)
- n2 = cpu.get_fail_descr_number(fail_descr2)
- assert n1 != n2
+class FrameInfo(object):
+ def __init__(self, depth):
+ self.jfi_frame_depth = depth
- fail_descr = cpu.get_fail_descr_from_number(n1)
- assert fail_descr is fail_descr1
- fail_descr = cpu.get_fail_descr_from_number(n2)
- assert fail_descr is fail_descr2
+ def set_frame_depth(self, baseofs, newdepth):
+ self.jfi_frame_depth = newdepth
- # provides interning on its own
- n1_1 = cpu.get_fail_descr_number(fail_descr1)
- assert n1_1 == n1
+def test_redirect_loop_token():
+ cpu = FakeCPU()
+ c = CompiledLoopToken(cpu, 0)
+ c2 = CompiledLoopToken(cpu, 0)
+ c.frame_info = FrameInfo(1)
+ c2.frame_info = FrameInfo(2)
+ c2.update_frame_info(c, 0)
+ assert c.frame_info.jfi_frame_depth == 2
+ c3 = CompiledLoopToken(cpu, 0)
+ c3.frame_info = FrameInfo(3)
+ c3.update_frame_info(c2, 0)
+ assert c.frame_info.jfi_frame_depth == 3
+ assert c2.frame_info.jfi_frame_depth == 3
+
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
@@ -892,16 +892,15 @@
old_nbargs = oldlooptoken.compiled_loop_token._debug_nbargs
new_nbargs = newlooptoken.compiled_loop_token._debug_nbargs
assert old_nbargs == new_nbargs
- # we overwrite the instructions at the old _x86_direct_bootstrap_code
- # to start with a JMP to the new _x86_direct_bootstrap_code.
+ # we overwrite the instructions at the old _x86_function_addr
+ # to start with a JMP to the new _x86_function_addr.
# Ideally we should rather patch all existing CALLs, but well.
oldadr = oldlooptoken._x86_function_addr
target = newlooptoken._x86_function_addr
# copy frame-info data
- old_fi = oldlooptoken.compiled_loop_token.frame_info
- new_fi = newlooptoken.compiled_loop_token.frame_info
baseofs = self.cpu.get_baseofs_of_frame_field()
- old_fi.set_frame_depth(baseofs, new_fi.jfi_frame_depth)
+ newlooptoken.compiled_loop_token.update_frame_info(
+ oldlooptoken.compiled_loop_token, baseofs)
mc = codebuf.MachineCodeBlockWrapper()
mc.JMP(imm(target))
if WORD == 4: # keep in sync with prepare_loop()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit