[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