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