[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