[pypy-commit] pypy default: merge redirect-assembler-jitlog
plan_rich
pypy.commits at gmail.com
Wed Aug 24 05:57:56 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch:
Changeset: r86471:4b3bf21d99c6
Date: 2016-08-24 11:53 +0200
http://bitbucket.org/pypy/pypy/changeset/4b3bf21d99c6/
Log: merge redirect-assembler-jitlog
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
@@ -1064,6 +1064,8 @@
else:
assert mc.get_relative_pos() <= 13
mc.copy_to_raw_memory(oldadr)
+ # log the redirection of the call_assembler_* operation
+ jl.redirect_assembler(oldlooptoken, newlooptoken, target)
def dump(self, text):
if not self.verbose:
diff --git a/rpython/rlib/rjitlog/rjitlog.py b/rpython/rlib/rjitlog/rjitlog.py
--- a/rpython/rlib/rjitlog/rjitlog.py
+++ b/rpython/rlib/rjitlog/rjitlog.py
@@ -212,7 +212,7 @@
return method
return decor
-JITLOG_VERSION = 2
+JITLOG_VERSION = 3
JITLOG_VERSION_16BIT_LE = struct.pack("<H", JITLOG_VERSION)
marks = [
@@ -244,6 +244,7 @@
('COMMON_PREFIX',),
('ABORT_TRACE',),
('SOURCE_CODE',),
+ ('REDIRECT_ASSEMBLER',),
]
start = 0x11
@@ -309,6 +310,17 @@
content = ''.join(list)
jitlog_write_marked(content, len(content))
+def redirect_assembler(oldtoken, newtoken, target):
+ if not jitlog_enabled():
+ return
+ descr_nmr = compute_unique_id(oldtoken)
+ new_descr_nmr = compute_unique_id(newtoken)
+ list = [MARK_REDIRECT_ASSEMBLER, encode_le_addr(descr_nmr),
+ encode_le_addr(new_descr_nmr), encode_le_addr(target)]
+ content = ''.join(list)
+ jitlog_write_marked(content, len(content))
+
+
class JitLogger(object):
def __init__(self, cpu=None):
self.cpu = cpu
diff --git a/rpython/rlib/rjitlog/test/test_jitlog.py b/rpython/rlib/rjitlog/test/test_jitlog.py
--- a/rpython/rlib/rjitlog/test/test_jitlog.py
+++ b/rpython/rlib/rjitlog/test/test_jitlog.py
@@ -6,6 +6,15 @@
from rpython.jit.backend.model import AbstractCPU
from rpython.jit.metainterp.history import ConstInt, ConstPtr
from rpython.rlib.rjitlog import rjitlog as jl
+from rpython.jit.metainterp.history import AbstractDescr
+from rpython.rlib.objectmodel import compute_unique_id
+
+class FakeCallAssemblerLoopToken(AbstractDescr):
+ def __init__(self, target):
+ self._ll_function_addr = target
+
+ def repr_of_descr(self):
+ return 'looptoken'
class FakeLog(object):
def __init__(self):
@@ -109,3 +118,31 @@
with py.test.raises(AssertionError):
jl.commonprefix(None,None)
+ def test_redirect_assembler(self, tmpdir):
+ looptoken = FakeCallAssemblerLoopToken(0x0)
+ newlooptoken = FakeCallAssemblerLoopToken(0x1234)
+ #
+ logger = jl.JitLogger()
+ file = tmpdir.join('binary_file')
+ file.ensure()
+ fd = file.open('wb')
+ jl.jitlog_init(fd.fileno())
+ logger.start_new_trace(self.make_metainterp_sd(), jd_name='jdname')
+ log_trace = logger.log_trace(jl.MARK_TRACE, None, None)
+ op = ResOperation(rop.CALL_ASSEMBLER_I, [], descr=looptoken)
+ log_trace.write([], [op])
+ jl.redirect_assembler(looptoken, newlooptoken, 0x1234)
+ #the next line will close 'fd', instead of logger.finish()
+ fd.close()
+ binary = file.read()
+ opnum = jl.encode_le_16bit(rop.CALL_ASSEMBLER_I)
+ id_looptoken = compute_unique_id(looptoken)
+ new_id_looptoken = compute_unique_id(newlooptoken)
+ end = jl.MARK_RESOP_DESCR + opnum + jl.encode_str('i0,looptoken') + \
+ jl.encode_le_addr(id_looptoken) + jl.encode_str('') + \
+ jl.MARK_REDIRECT_ASSEMBLER + \
+ jl.encode_le_addr(id_looptoken) + \
+ jl.encode_le_addr(new_id_looptoken) + \
+ jl.encode_le_addr(newlooptoken._ll_function_addr)
+ assert binary.endswith(end)
+
More information about the pypy-commit
mailing list