Author: Richard Plangger <planri...@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)
+        
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to