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