[pypy-commit] pypy default: merge redirect assembler
plan_rich
pypy.commits at gmail.com
Mon Oct 10 06:15:14 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch:
Changeset: r87690:37093b51ec75
Date: 2016-10-10 12:14 +0200
http://bitbucket.org/pypy/pypy/changeset/37093b51ec75/
Log: merge redirect 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
@@ -31,6 +31,7 @@
from rpython.rtyper import rclass
from rpython.jit.backend.arm import callbuilder
from rpython.rlib.rarithmetic import r_uint
+from rpython.rlib.rjitlog import rjitlog as jl
class ArmGuardToken(GuardToken):
@@ -1012,6 +1013,8 @@
mc = InstrBuilder(self.cpu.cpuinfo.arch_version)
mc.B(target)
mc.copy_to_raw_memory(oldadr)
+ #
+ jl.redirect_assembler(oldlooptoken, newlooptoken, newlooptoken.number)
def emit_op_guard_not_forced(self, op, arglocs, regalloc, fcond):
ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
diff --git a/rpython/jit/backend/ppc/opassembler.py b/rpython/jit/backend/ppc/opassembler.py
--- a/rpython/jit/backend/ppc/opassembler.py
+++ b/rpython/jit/backend/ppc/opassembler.py
@@ -29,6 +29,7 @@
from rpython.jit.codewriter.effectinfo import EffectInfo
from rpython.jit.backend.ppc import callbuilder
from rpython.rlib.rarithmetic import r_uint
+from rpython.rlib.rjitlog import rjitlog as jl
class IntOpAssembler(object):
@@ -1321,6 +1322,7 @@
mc = PPCBuilder()
mc.b_abs(target)
mc.copy_to_raw_memory(oldadr)
+ jl.redirect_assembler(oldlooptoken, newlooptoken, newlooptoken.number)
class OpAssembler(IntOpAssembler, GuardOpAssembler,
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
@@ -466,6 +466,7 @@
operations, looptoken, log):
'''adds the following attributes to looptoken:
_ll_function_addr (address of the generated func, as an int)
+ _ll_raw_start (jitlog: address of the first byte to asm memory)
_ll_loop_code (debug: addr of the start of the ResOps)
_x86_fullsize (debug: full size including failure)
'''
@@ -539,10 +540,11 @@
looptoken._x86_fullsize = full_size
looptoken._x86_ops_offset = ops_offset
looptoken._ll_function_addr = rawstart + functionpos
+ looptoken._ll_raw_start = rawstart
- if logger:
- log = logger.log_trace(jl.MARK_TRACE_ASM, None, self.mc)
- log.write(inputargs, operations, ops_offset=ops_offset)
+ if log and logger:
+ l = logger.log_trace(jl.MARK_TRACE_ASM, None, self.mc)
+ l.write(inputargs, operations, ops_offset=ops_offset)
# legacy
if logger.logger_ops:
@@ -594,6 +596,7 @@
fullsize = self.mc.get_relative_pos()
#
rawstart = self.materialize_loop(original_loop_token)
+ original_loop_token._ll_raw_start = rawstart
self.patch_gcref_table(original_loop_token, rawstart)
self.patch_stack_checks(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE,
rawstart)
@@ -1065,7 +1068,8 @@
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)
+ asm_adr = newlooptoken._ll_raw_start
+ jl.redirect_assembler(oldlooptoken, newlooptoken, asm_adr)
def dump(self, text):
if not self.verbose:
diff --git a/rpython/jit/backend/zarch/opassembler.py b/rpython/jit/backend/zarch/opassembler.py
--- a/rpython/jit/backend/zarch/opassembler.py
+++ b/rpython/jit/backend/zarch/opassembler.py
@@ -9,6 +9,7 @@
from rpython.jit.metainterp.history import (ConstInt)
from rpython.jit.backend.zarch.codebuilder import ZARCHGuardToken, InstrBuilder
from rpython.jit.backend.llsupport import symbolic, jitframe
+from rpython.rlib.rjitlog import rjitlog as jl
import rpython.jit.backend.zarch.conditions as c
import rpython.jit.backend.zarch.registers as r
import rpython.jit.backend.zarch.locations as l
@@ -1155,6 +1156,8 @@
mc.load_imm(r.SCRATCH, target)
mc.BCR(c.ANY, r.SCRATCH)
mc.copy_to_raw_memory(oldadr)
+ #
+ jl.redirect_assembler(oldlooptoken, newlooptoken, newlooptoken.number)
class MiscOpAssembler(object):
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -7,6 +7,7 @@
from rpython.rlib import rstack
from rpython.rlib.jit import JitDebugInfo, Counters, dont_look_inside
from rpython.rlib.rjitlog import rjitlog as jl
+from rpython.rlib.objectmodel import compute_unique_id
from rpython.conftest import option
from rpython.jit.metainterp.resoperation import ResOperation, rop,\
@@ -1121,6 +1122,10 @@
version of the code may end up replacing it.
"""
jitcell_token = make_jitcell_token(jitdriver_sd)
+ #
+ # record the target of a temporary callback to the interpreter
+ jl.tmp_callback(jitcell_token)
+ #
nb_red_args = jitdriver_sd.num_red_args
assert len(redargtypes) == nb_red_args
inputargs = []
@@ -1156,6 +1161,7 @@
operations[1].setfailargs([])
operations = get_deep_immutable_oplist(operations)
cpu.compile_loop(inputargs, operations, jitcell_token, log=False)
+
if memory_manager is not None: # for tests
memory_manager.keep_loop_alive(jitcell_token)
return jitcell_token
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 = 3
+JITLOG_VERSION = 4
JITLOG_VERSION_16BIT_LE = struct.pack("<H", JITLOG_VERSION)
marks = [
@@ -245,6 +245,7 @@
('ABORT_TRACE',),
('SOURCE_CODE',),
('REDIRECT_ASSEMBLER',),
+ ('TMP_CALLBACK',),
]
start = 0x11
@@ -254,12 +255,13 @@
if __name__ == "__main__":
print("# generated constants from rpython/rlib/jitlog.py")
- print 'MARK_JITLOG_START = struct.pack("b", "%s")' % hex(0x10)
+ print('import struct')
+ print('MARK_JITLOG_START = struct.pack("b", %s)' % hex(0x10))
for mark, in marks:
nmr = globals()['MARK_' + mark]
h = hex(ord(nmr))
- print '%s = struct.pack("b", "%s")' % ('MARK_' + mark, h)
- print 'MARK_JITLOG_END = struct.pack("b", "%s")' % hex(start)
+ print '%s = struct.pack("b", %s)' % ('MARK_' + mark, h)
+ print 'MARK_JITLOG_END = struct.pack("b", %s)' % hex(start)
for key,value in locals().items():
if key.startswith("MP_"):
print '%s = (%s,"%s")' % (key, hex(value[0]), value[1])
@@ -310,16 +312,22 @@
content = ''.join(list)
jitlog_write_marked(content, len(content))
-def redirect_assembler(oldtoken, newtoken, target):
+def redirect_assembler(oldtoken, newtoken, asm_adr):
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)]
+ encode_le_addr(new_descr_nmr), encode_le_addr(asm_adr)]
content = ''.join(list)
jitlog_write_marked(content, len(content))
+def tmp_callback(looptoken):
+ mark_tmp_callback = ''.join([
+ MARK_TMP_CALLBACK,
+ encode_le_addr(compute_unique_id(looptoken)),
+ encode_le_64bit(looptoken.number)])
+ jitlog_write_marked(mark_tmp_callback, len(mark_tmp_callback))
class JitLogger(object):
def __init__(self, cpu=None):
@@ -343,6 +351,10 @@
def finish(self):
jitlog_teardown()
+ def next_id(self):
+ self.trace_id += 1
+ return self.trace_id
+
def start_new_trace(self, metainterp_sd, faildescr=None, entry_bridge=False, jd_name=""):
# even if the logger is not enabled, increment the trace id
self.trace_id += 1
More information about the pypy-commit
mailing list