Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r66455:a0ed5cb4a8eb
Date: 2013-08-30 12:08 +0100
http://bitbucket.org/pypy/pypy/changeset/a0ed5cb4a8eb/
Log: (fijal, antocuni) start storing more complicated structures for
bridges
diff --git a/rpython/jit/backend/llsupport/assembler.py
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -136,14 +136,13 @@
input_i += 1
return locs
- def store_info_on_descr(self, startspos, guardtok):
+ def store_info_on_descr(self, startspos, guardtok, resume_bytecode):
withfloats = guardtok.has_floats
exc = guardtok.exc
target = self.failure_recovery_code[exc + 2 * withfloats]
fail_descr = cast_instance_to_gcref(guardtok.faildescr)
fail_descr = rffi.cast(lltype.Signed, fail_descr)
- # we want the descr to keep loop alive
- guardtok.faildescr.rd_loop_token = self.current_clt
+ guardtok.faildescr.rd_resume_bytecode = resume_bytecode
return fail_descr, target
def call_assembler(self, op, guard_op, argloc, vloc, result_loc, tmploc):
diff --git a/rpython/jit/backend/llsupport/resumebuilder.py
b/rpython/jit/backend/llsupport/resumebuilder.py
--- a/rpython/jit/backend/llsupport/resumebuilder.py
+++ b/rpython/jit/backend/llsupport/resumebuilder.py
@@ -1,6 +1,7 @@
from rpython.jit.metainterp.resoperation import rop
from rpython.jit.metainterp.history import ConstInt
+from rpython.jit.metainterp.resume2 import ResumeBytecode
from rpython.jit.codewriter.jitcode import JitCode
class LivenessAnalyzer(object):
@@ -51,6 +52,9 @@
def get_position(self):
return len(self.newops)
+ def finish(self, parent, clt):
+ return ResumeBytecode(self.newops, parent, clt)
+
def not_implemented_op(self, op):
print "Not implemented", op.getopname()
raise NotImplementedError(op.getopname())
diff --git a/rpython/jit/backend/llsupport/test/test_resume.py
b/rpython/jit/backend/llsupport/test/test_resume.py
--- a/rpython/jit/backend/llsupport/test/test_resume.py
+++ b/rpython/jit/backend/llsupport/test/test_resume.py
@@ -39,4 +39,4 @@
backend_put(28, 0, 2)
leave_frame()
""", namespace={'jitcode': jitcode}).operations
- equaloplists(descr.rd_loop_token.rd_bytecode, expected_resume)
+ equaloplists(descr.rd_resume_bytecode.bc, expected_resume)
diff --git a/rpython/jit/backend/test/runner_test.py
b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -227,6 +227,8 @@
ResOperation(rop.ENTER_FRAME, [ConstInt(-1)], None, descr=jitcode),
ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
+ ResOperation(rop.RESUME_PUT, [i1, ConstInt(0), ConstInt(0)],
+ None),
ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr1),
ResOperation(rop.LEAVE_FRAME, [], None),
ResOperation(rop.JUMP, [i1], None, descr=targettoken),
@@ -239,6 +241,7 @@
bridge = [
ResOperation(rop.INT_LE, [i1b, ConstInt(19)], i3),
ResOperation(rop.GUARD_TRUE, [i3], None, descr=faildescr2),
+ ResOperation(rop.LEAVE_FRAME, [], None),
ResOperation(rop.JUMP, [i1b], None, descr=targettoken),
]
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
@@ -476,6 +476,7 @@
self.update_frame_depth(frame_depth_no_fixed_size +
JITFRAME_FIXED_SIZE)
#
size_excluding_failure_stuff = self.mc.get_relative_pos()
+ self.resume_bytecode = regalloc.resumebuilder.finish(None, looptoken)
self.write_pending_failure_recoveries()
full_size = self.mc.get_relative_pos()
#
@@ -535,6 +536,8 @@
self._check_frame_depth(self.mc, regalloc.get_gcmap())
frame_depth_no_fixed_size = self._assemble(regalloc, inputargs,
operations)
codeendpos = self.mc.get_relative_pos()
+ self.resume_bytecode = regalloc.resumebuilder.finish(
+ faildescr.rd_bytecode, original_loop_token)
self.write_pending_failure_recoveries()
fullsize = self.mc.get_relative_pos()
#
@@ -565,7 +568,8 @@
# for each pending guard, generate the code of the recovery stub
# at the end of self.mc.
for tok in self.pending_guard_tokens:
- tok.pos_recovery_stub = self.generate_quick_failure(tok)
+ tok.pos_recovery_stub = self.generate_quick_failure(tok,
+ self.resume_bytecode)
if WORD == 8 and len(self.pending_memoryerror_trampoline_from) > 0:
self.error_trampoline_64 = self.generate_propagate_error_64()
@@ -1732,11 +1736,12 @@
self.mc.JMP(imm(self.propagate_exception_path))
return startpos
- def generate_quick_failure(self, guardtok):
+ def generate_quick_failure(self, guardtok, resume_bytecode):
""" Gather information about failure
"""
startpos = self.mc.get_relative_pos()
- fail_descr, target = self.store_info_on_descr(startpos, guardtok)
+ fail_descr, target = self.store_info_on_descr(startpos, guardtok,
+ resume_bytecode)
self.mc.PUSH(imm(fail_descr))
self.push_gcmap(self.mc, guardtok.gcmap, push=True)
self.mc.JMP(imm(target))
diff --git a/rpython/jit/metainterp/resume2.py
b/rpython/jit/metainterp/resume2.py
--- a/rpython/jit/metainterp/resume2.py
+++ b/rpython/jit/metainterp/resume2.py
@@ -3,6 +3,16 @@
from rpython.jit.metainterp.history import BoxInt
from rpython.jit.codewriter.jitcode import JitCode
+class ResumeBytecode(object):
+ def __init__(self, bc, parent=None, loop=None):
+ self.bc = bc
+ self.branches = {}
+ self.parent = parent
+ self.loop = loop
+
+ def add_branch(self, pos, bc):
+ self.branches[pos] = ResumeBytecode(bc, self)
+
class AbstractResumeReader(object):
def rebuild(self, faildescr):
bytecode = faildescr.rd_loop.rd_bytecode
@@ -58,5 +68,9 @@
value = cpu.get_int_value(self.deadframe, jitframe_index)
frame.registers_i[pos] = BoxInt(value)
+class ReconstructingResumeReader(AbstractResumeReader):
+ def __init__(self):
+ pass
+
def rebuild_from_resumedata(metainterp, deadframe, faildescr):
BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
diff --git a/rpython/jit/metainterp/test/test_resume2.py
b/rpython/jit/metainterp/test/test_resume2.py
--- a/rpython/jit/metainterp/test/test_resume2.py
+++ b/rpython/jit/metainterp/test/test_resume2.py
@@ -85,7 +85,7 @@
assert f.registers_i[3].getint() == 12 + 3
assert f2.registers_i[4].getint() == 8 + 3
assert f2.registers_i[2].getint() == 11 + 3
-
+
descr.rd_bytecode_position = 7
metainterp.framestack = []
rebuild_from_resumedata(metainterp, "myframe", descr)
@@ -96,3 +96,18 @@
assert f.registers_i[2].getint() == 11 + 3
assert f.registers_i[4].getint() == 8 + 3
+ def test_reconstructing_resume_reader(self):
+ jitcode1 = JitCode("jitcode")
+ jitcode1.setup(num_regs_i=13)
+ resume_loop = parse("""
+ []
+ enter_frame(-1, descr=jitcode1)
+ backend_put(11, 0, 2)
+ enter_frame(12, descr=jitcode2)
+ backend_put(12, 0, 3)
+ backend_put(8, 1, 4)
+ leave_frame()
+ backend_put(10, 0, 1)
+ leave_frame()
+ """)
+ xxx
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit