[pypy-commit] pypy new-jit-log: (work in progress) adding a new API to the jit driver to return a rather "generic" list of primitive types that describe the execution state of any meta interpreter
plan_rich
pypy.commits at gmail.com
Tue Apr 12 09:49:28 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: new-jit-log
Changeset: r83616:a7f5611a8203
Date: 2016-04-12 15:48 +0200
http://bitbucket.org/pypy/pypy/changeset/a7f5611a8203/
Log: (work in progress) adding a new API to the jit driver to return a
rather "generic" list of primitive types that describe the execution
state of any meta interpreter
diff --git a/pypy/module/pypyjit/interp_jit.py b/pypy/module/pypyjit/interp_jit.py
--- a/pypy/module/pypyjit/interp_jit.py
+++ b/pypy/module/pypyjit/interp_jit.py
@@ -41,6 +41,11 @@
from rpython.rlib import rvmprof
return rvmprof.get_unique_id(bytecode)
+def get_location(next_instr, is_being_profiled, bytecode):
+ from pypy.tool.stdlib_opcode import opcode_method_names
+ name = opcode_method_names[ord(bytecode.co_code[next_instr])]
+ return (bytecode.co_filename,
+ )'%s #%d %s' % (bytecode.get_repr(), next_instr, name)
def should_unroll_one_iteration(next_instr, is_being_profiled, bytecode):
return (bytecode.co_flags & CO_GENERATOR) != 0
diff --git a/rpython/jit/metainterp/jitlog.py b/rpython/jit/metainterp/jitlog.py
--- a/rpython/jit/metainterp/jitlog.py
+++ b/rpython/jit/metainterp/jitlog.py
@@ -197,8 +197,8 @@
def encode_debug_info(self, op):
log = self.logger
jd_sd = self.metainterp_sd.jitdrivers_sd[op.getarg(0).getint()]
- info = jd_sd.warmstate.get_location_str(op.getarg(2))
- log._write_marked(MARK_JITLOG_DEBUG_MERGE_POINT, encode_str(info))
+ filename, = jd_sd.warmstate.get_location(op.getarglist()[3:])
+ log._write_marked(MARK_JITLOG_DEBUG_MERGE_POINT, encode_str(filename))
def encode_op(self, op):
diff --git a/rpython/jit/metainterp/test/test_jitlog.py b/rpython/jit/metainterp/test/test_jitlog.py
--- a/rpython/jit/metainterp/test/test_jitlog.py
+++ b/rpython/jit/metainterp/test/test_jitlog.py
@@ -12,9 +12,11 @@
class FakeJitDriver(object):
class warmstate(object):
@staticmethod
- def get_location_str(ptr):
- if ptr.value == 0:
- return 'string #3 BYTE_CODE'
+ def get_location_str():
+ return 'string #3 BYTE_CODE'
+ def get_location(greenkey_list):
+ assert len(greenkey_list) == 0
+ return '/home/pypy/jit.py', 0
class FakeMetaInterpSd:
cpu = AbstractCPU()
@@ -40,5 +42,20 @@
assert binary.startswith(b'\x00\x04\x00\x00\x00loop')
assert binary.endswith(b'\x24\x06\x00\x00\x00string\x00\x00\x00\x00\x00\x00\x00\x00')
+ def test_debug_merge_point(self, tmpdir):
+ logger = jitlog.VMProfJitLogger()
+ file = tmpdir.join('binary_file')
+ file.ensure()
+ fd = file.open('wb')
+ logger.cintf.jitlog_init(fd.fileno())
+ log_trace = logger.log_trace(0, self.make_metainterp_sd(), None)
+ op = ResOperation(rop.DEBUG_MERGE_POINT, [ConstInt(0), ConstInt(0), ConstInt(0)])
+ log_trace.write([], [op])
+ #the next line will close 'fd'
+ fd.close()
+ logger.finish()
+ binary = file.read()
+ assert binary.startswith(b'\x00\x04\x00\x00\x00loop')
+ assert binary.endswith(b'\x24\x06\x00\x00\x00string\x00\x00\x00\x00\x00\x00\x00\x00')
diff --git a/rpython/jit/metainterp/warmstate.py b/rpython/jit/metainterp/warmstate.py
--- a/rpython/jit/metainterp/warmstate.py
+++ b/rpython/jit/metainterp/warmstate.py
@@ -678,6 +678,23 @@
drivername = jitdriver.name
else:
drivername = '<unknown jitdriver>'
+ # get_location new API
+ get_location_ptr = self.jitdriver_sd._get_location_ptr
+ if get_location_ptr is None:
+ missing = '(%s: no get_location)' % drivername
+ def get_location_str(greenkey):
+ return missing
+ else:
+ unwrap_greenkey = self.make_unwrap_greenkey()
+ def get_location_str(greenkey):
+ greenargs = unwrap_greenkey(greenkey)
+ fn = support.maybe_on_top_of_llinterp(rtyper, get_location_ptr)
+ llres = fn(*greenargs)
+ if not we_are_translated() and isinstance(llres, tuple):
+ return llres
+ return llres # TODO hltuple?
+ self.get_location = get_location
+ #
get_location_ptr = self.jitdriver_sd._get_printable_location_ptr
if get_location_ptr is None:
missing = '(%s: no get_printable_location)' % drivername
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -604,7 +604,7 @@
get_printable_location=None, confirm_enter_jit=None,
can_never_inline=None, should_unroll_one_iteration=None,
name='jitdriver', check_untranslated=True, vectorize=False,
- get_unique_id=None, is_recursive=False):
+ get_unique_id=None, is_recursive=False, get_location=None):
if greens is not None:
self.greens = greens
self.name = name
@@ -638,6 +638,7 @@
assert get_jitcell_at is None, "get_jitcell_at no longer used"
assert set_jitcell_at is None, "set_jitcell_at no longer used"
self.get_printable_location = get_printable_location
+ self.get_location = get_location
if get_unique_id is None:
get_unique_id = lambda *args: 0
self.get_unique_id = get_unique_id
More information about the pypy-commit
mailing list