[pypy-commit] pypy new-jit-log: extended the return value of get_location
plan_rich
pypy.commits at gmail.com
Wed Apr 13 02:51:07 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: new-jit-log
Changeset: r83648:95f36b9150e4
Date: 2016-04-13 08:50 +0200
http://bitbucket.org/pypy/pypy/changeset/95f36b9150e4/
Log: extended the return value of get_location
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
@@ -44,8 +44,12 @@
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])]
+ # we can probably do better at co_firstlineno?
return (bytecode.co_filename,
- )'%s #%d %s' % (bytecode.get_repr(), next_instr, name)
+ bytecode.co_firstlineno,
+ bytecode.co_name,
+ 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
@@ -54,19 +54,24 @@
chr((val >> 16) & 0xff),
chr((val >> 24) & 0xff)])
+
+ at always_inline
+def encode_le_64bit(val):
+ return ''.join([chr((val >> 0) & 0xff),
+ chr((val >> 8) & 0xff),
+ chr((val >> 16) & 0xff),
+ chr((val >> 24) & 0xff),
+ chr((val >> 32) & 0xff),
+ chr((val >> 40) & 0xff),
+ chr((val >> 48) & 0xff),
+ chr((val >> 56)& 0xff)])
+
@always_inline
def encode_le_addr(val):
if IS_32_BIT:
- return encode_be_32bit(val)
+ return encode_le_32bit(val)
else:
- return ''.join([chr((val >> 0) & 0xff),
- chr((val >> 8) & 0xff),
- chr((val >> 16) & 0xff),
- chr((val >> 24) & 0xff),
- chr((val >> 32) & 0xff),
- chr((val >> 40) & 0xff),
- chr((val >> 48) & 0xff),
- chr((val >> 56)& 0xff)])
+ return encode_le_64bit(val)
class VMProfJitLogger(object):
@@ -197,8 +202,14 @@
def encode_debug_info(self, op):
log = self.logger
jd_sd = self.metainterp_sd.jitdrivers_sd[op.getarg(0).getint()]
- filename, = jd_sd.warmstate.get_location(op.getarglist()[3:])
- log._write_marked(MARK_JITLOG_DEBUG_MERGE_POINT, encode_str(filename))
+ filename, lineno, enclosed, index, opname = jd_sd.warmstate.get_location(op.getarglist()[3:])
+ line = []
+ line.append(encode_str(filename))
+ line.append(encode_le_16bit(lineno))
+ line.append(encode_str(enclosed))
+ line.append(encode_le_64bit(index))
+ line.append(encode_str(opname))
+ log._write_marked(MARK_JITLOG_DEBUG_MERGE_POINT, ''.join(line))
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
@@ -1,5 +1,7 @@
from rpython.jit.tool.oparser import pure_parse
from rpython.jit.metainterp import jitlog
+from rpython.jit.metainterp.jitlog import (encode_str, encode_le_16bit,
+ encode_le_64bit)
from rpython.jit.metainterp.optimizeopt.util import equaloplists
from rpython.jit.metainterp.resoperation import ResOperation, rop
from rpython.jit.backend.model import AbstractCPU
@@ -12,11 +14,9 @@
class FakeJitDriver(object):
class warmstate(object):
@staticmethod
- 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
+ return '/home/pypy/jit.py', 0, 'enclosed', 99, 'DEL'
class FakeMetaInterpSd:
cpu = AbstractCPU()
@@ -40,22 +40,10 @@
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')
+ assert binary.endswith(b'\x24' + \
+ encode_str('/home/pypy/jit.py') + \
+ encode_le_16bit(0) + \
+ encode_str('enclosed') + \
+ encode_le_64bit(99) + \
+ encode_str('DEL'))
- 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/warmspot.py b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -564,6 +564,7 @@
def make_driverhook_graphs(self):
s_Str = annmodel.SomeString()
+ s_Int = annmodel.SomeInteger()
#
annhelper = MixLevelHelperAnnotator(self.translator.rtyper)
for jd in self.jitdrivers_sd:
@@ -579,6 +580,9 @@
jd._should_unroll_one_iteration_ptr = self._make_hook_graph(jd,
annhelper, jd.jitdriver.should_unroll_one_iteration,
annmodel.s_Bool)
+ s_Tuple = annmodel.SomeTuple([s_Str, s_Int, s_Str, s_Int, s_Str])
+ jd._get_location_ptr = self._make_hook_graph(jd,
+ annhelper, jd.jitdriver.get_location, s_Tuple)
annhelper.finish()
def _make_hook_graph(self, jitdriver_sd, annhelper, func,
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
@@ -682,11 +682,11 @@
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
+ def get_location(greenkey):
+ return (missing, 0, '', 0, '')
else:
unwrap_greenkey = self.make_unwrap_greenkey()
- def get_location_str(greenkey):
+ def get_location(greenkey):
greenargs = unwrap_greenkey(greenkey)
fn = support.maybe_on_top_of_llinterp(rtyper, get_location_ptr)
llres = fn(*greenargs)
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -605,6 +605,26 @@
can_never_inline=None, should_unroll_one_iteration=None,
name='jitdriver', check_untranslated=True, vectorize=False,
get_unique_id=None, is_recursive=False, get_location=None):
+ """
+ get_location:
+ The return value is designed to provide enough information to express the
+ state of an interpreter when invoking jit_merge_point.
+ For a bytecode interperter such as PyPy this includes, filename, line number,
+ function name, and more information. However, it should also be able to express
+ the same state for an interpreter that evaluates an AST.
+ return paremter:
+ 0 -> filename. An absolute path specifying the file the interpreter invoked.
+ If the input source is no file it should start with the
+ prefix: "string://<name>"
+ 1 -> line number. The line number in filename. This should at least point to
+ the enclosing name. It can however point to the specific
+ source line of the instruction executed by the interpreter.
+ 2 -> enclosing name. E.g. the function name.
+ 3 -> index. 64 bit number indicating the execution progress. It can either be
+ an offset to byte code, or an index to the node in an AST
+ 4 -> operation name. a name further describing the current program counter.
+ this can be either a byte code name or the name of an AST node
+ """
if greens is not None:
self.greens = greens
self.name = name
More information about the pypy-commit
mailing list