[pypy-commit] pypy better-jit-hooks: update the interface on the pypyjit side

fijal noreply at buildbot.pypy.org
Mon Jan 9 22:06:57 CET 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: better-jit-hooks
Changeset: r51180:aed03c7eb163
Date: 2012-01-09 23:06 +0200
http://bitbucket.org/pypy/pypy/changeset/aed03c7eb163/

Log:	update the interface on the pypyjit side

diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -1796,7 +1796,7 @@
         jd_sd = self.jitdriver_sd
         greenkey = self.current_merge_points[0][0][:jd_sd.num_green_args]
         self.staticdata.warmrunnerdesc.hooks.on_abort(reason, jd_sd.jitdriver,
-                                                      greenkey)
+                           greenkey, jd_sd.warmstate.get_location_str(greenkey))
         self.staticdata.stats.aborted()
 
     def blackhole_if_trace_too_long(self):
diff --git a/pypy/jit/metainterp/test/test_jitiface.py b/pypy/jit/metainterp/test/test_jitiface.py
--- a/pypy/jit/metainterp/test/test_jitiface.py
+++ b/pypy/jit/metainterp/test/test_jitiface.py
@@ -12,14 +12,16 @@
         reasons = []
         
         class MyJitIface(JitHookInterface):
-            def on_abort(self, reason, jitdriver, greenkey):
+            def on_abort(self, reason, jitdriver, greenkey, greenkey_repr):
                 assert jitdriver is myjitdriver
                 assert len(greenkey) == 1
                 reasons.append(reason)
+                assert greenkey_repr == 'blah'
 
         iface = MyJitIface()
 
-        myjitdriver = JitDriver(greens=['foo'], reds=['x', 'total'])
+        myjitdriver = JitDriver(greens=['foo'], reds=['x', 'total'],
+                                get_printable_location=lambda *args: 'blah')
 
         class Foo:
             _immutable_fields_ = ['a?']
diff --git a/pypy/module/pypyjit/interp_resop.py b/pypy/module/pypyjit/interp_resop.py
--- a/pypy/module/pypyjit/interp_resop.py
+++ b/pypy/module/pypyjit/interp_resop.py
@@ -19,8 +19,9 @@
         self.w_abort_hook = space.w_None
         self.w_optimize_hook = space.w_None
 
-def wrap_greenkey(space, jitdriver, greenkey):
-    if jitdriver.name == 'pypyjit':
+def wrap_greenkey(space, jitdriver, greenkey, greenkey_repr):
+    jitdriver_name = jitdriver.name
+    if jitdriver_name == 'pypyjit':
         next_instr = greenkey[0].getint()
         is_being_profiled = greenkey[1].getint()
         ll_code = lltype.cast_opaque_ptr(lltype.Ptr(OBJECT),
@@ -29,7 +30,7 @@
         return space.newtuple([space.wrap(pycode), space.wrap(next_instr),
                                space.newbool(bool(is_being_profiled))])
     else:
-        return space.wrap('who knows?')
+        return space.wrap(greenkey_repr)
 
 def set_compile_hook(space, w_hook):
     """ set_compile_hook(hook)
@@ -106,7 +107,7 @@
     cache.w_abort_hook = w_hook
     cache.in_recursion = NonConstant(False)
 
-def wrap_oplist(space, logops, operations, ops_offset):
+def wrap_oplist(space, logops, operations, ops_offset=None):
     l_w = []
     for op in operations:
         if ops_offset is None:
diff --git a/pypy/module/pypyjit/policy.py b/pypy/module/pypyjit/policy.py
--- a/pypy/module/pypyjit/policy.py
+++ b/pypy/module/pypyjit/policy.py
@@ -7,7 +7,7 @@
      WrappedOp
 
 class PyPyJitIface(JitHookInterface):
-    def on_abort(self, reason, jitdriver, greenkey):
+    def on_abort(self, reason, jitdriver, greenkey, greenkey_repr):
         space = self.space
         cache = space.fromcache(Cache)
         if cache.in_recursion:
@@ -18,73 +18,75 @@
                 try:
                     space.call_function(cache.w_abort_hook,
                                         space.wrap(jitdriver.name),
-                                        wrap_greenkey(space, jitdriver, greenkey),
+                                        wrap_greenkey(space, jitdriver,
+                                                      greenkey, greenkey_repr),
                                         space.wrap(counter_names[reason]))
                 except OperationError, e:
                     e.write_unraisable(space, "jit hook ", cache.w_abort_hook)
             finally:
                 cache.in_recursion = False
 
-    def after_compile(self, jitdriver, logger, looptoken, operations, type,
-                      greenkey, ops_offset, asmstart, asmlen):
-        self._compile_hook(jitdriver, logger, operations, type,
-                           ops_offset, asmstart, asmlen,
-                           wrap_greenkey(self.space, jitdriver, greenkey))
+    def after_compile(self, debug_info):
+        w_greenkey = wrap_greenkey(self.space, debug_info.get_jitdriver(),
+                                   debug_info.greenkey,
+                                   debug_info.get_greenkey_repr())
+        self._compile_hook(debug_info, w_greenkey)
 
-    def after_compile_bridge(self, jitdriver, logger, orig_looptoken,
-                             operations, n, ops_offset, asmstart, asmlen):
-        self._compile_hook(jitdriver, logger, operations, 'bridge',
-                           ops_offset, asmstart, asmlen,
-                           self.space.wrap(n))
+    def after_compile_bridge(self, debug_info):
+        self._compile_hook(debug_info,
+                           self.space.wrap(debug_info.fail_descr_no))
 
-    def before_compile(self, jitdriver, logger, looptoken, operations, type,
-                      greenkey):
-        self._optimize_hook(jitdriver, logger, operations, type,
-                            wrap_greenkey(self.space, jitdriver, greenkey))
+    def before_compile(self, debug_info):
+        w_greenkey = wrap_greenkey(self.space, debug_info.get_jitdriver(),
+                                   debug_info.greenkey,
+                                   debug_info.get_greenkey_repr())
+        self._optimize_hook(debug_info, w_greenkey)
 
-    def before_compile_bridge(self, jitdriver, logger, orig_looptoken,
-                              operations, n):
-        self._optimize_hook(jitdriver, logger, operations, 'bridge',
-                           self.space.wrap(n))
+    def before_compile_bridge(self, debug_info):
+        self._optimize_hook(debug_info,
+                            self.space.wrap(debug_info.fail_descr_no))
 
-    def _compile_hook(self, jitdriver, logger, operations, type,
-                      ops_offset, asmstart, asmlen, w_arg):
+    def _compile_hook(self, debug_info, w_arg):
         space = self.space
         cache = space.fromcache(Cache)
         if cache.in_recursion:
             return
         if space.is_true(cache.w_compile_hook):
-            logops = logger._make_log_operations()
-            list_w = wrap_oplist(space, logops, operations, ops_offset)
+            logops = debug_info.logger._make_log_operations()
+            list_w = wrap_oplist(space, logops, debug_info.operations,
+                                 debug_info.asminfo.ops_offset)
             cache.in_recursion = True
             try:
                 try:
+                    jd_name = debug_info.get_jitdriver().name
+                    asminfo = debug_info.asminfo
                     space.call_function(cache.w_compile_hook,
-                                        space.wrap(jitdriver.name),
-                                        space.wrap(type),
+                                        space.wrap(jd_name),
+                                        space.wrap(debug_info.type),
                                         w_arg,
                                         space.newlist(list_w),
-                                        space.wrap(asmstart),
-                                        space.wrap(asmlen))
+                                        space.wrap(asminfo.asmaddr),
+                                        space.wrap(asminfo.asmlen))
                 except OperationError, e:
                     e.write_unraisable(space, "jit hook ", cache.w_compile_hook)
             finally:
                 cache.in_recursion = False
 
-    def _optimize_hook(self, jitdriver, logger, operations, type, w_arg):
+    def _optimize_hook(self, debug_info, w_arg):
         space = self.space
         cache = space.fromcache(Cache)
         if cache.in_recursion:
             return
         if space.is_true(cache.w_optimize_hook):
-            logops = logger._make_log_operations()
-            list_w = wrap_oplist(space, logops, operations, {})
+            logops = debug_info.logger._make_log_operations()
+            list_w = wrap_oplist(space, logops, debug_info.operations)
             cache.in_recursion = True
             try:
                 try:
+                    jd_name = debug_info.get_jitdriver().name
                     w_res = space.call_function(cache.w_optimize_hook,
-                                                space.wrap(jitdriver.name),
-                                                space.wrap(type),
+                                                space.wrap(jd_name),
+                                                space.wrap(debug_info.type),
                                                 w_arg,
                                                 space.newlist(list_w))
                     if space.is_w(w_res, space.w_None):
@@ -93,12 +95,12 @@
                     for w_item in space.listview(w_res):
                         item = space.interp_w(WrappedOp, w_item)
                         l.append(jit_hooks._cast_to_resop(item.op))
-                    del operations[:] # modifying operations above is
+                    del debug_info.operations[:] # modifying operations above is
                     # probably not a great idea since types may not work
                     # and we'll end up with half-working list and
                     # a segfault/fatal RPython error
                     for elem in l:
-                        operations.append(elem)
+                        debug_info.operations.append(elem)
                 except OperationError, e:
                     e.write_unraisable(space, "jit hook ", cache.w_compile_hook)
             finally:
diff --git a/pypy/module/pypyjit/test/test_jit_hook.py b/pypy/module/pypyjit/test/test_jit_hook.py
--- a/pypy/module/pypyjit/test/test_jit_hook.py
+++ b/pypy/module/pypyjit/test/test_jit_hook.py
@@ -15,6 +15,7 @@
 from pypy.jit.tool.oparser import parse
 from pypy.jit.metainterp.typesystem import llhelper
 from pypy.jit.metainterp.jitprof import ABORT_TOO_LONG
+from pypy.rlib.jit import JitDebugInfo, AsmInfo
 
 class MockJitDriverSD(object):
     class warmstate(object):
@@ -25,6 +26,9 @@
             pycode = cast_base_ptr_to_instance(PyCode, ll_code)
             return pycode.co_name
 
+    jitdriver = pypyjitdriver
+
+
 class MockSD(object):
     class cpu(object):
         ts = llhelper
@@ -47,7 +51,7 @@
         code_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, ll_code)
         logger = Logger(MockSD())
 
-        cls.origoplist = parse("""
+        oplist = parse("""
         [i1, i2, p2]
         i3 = int_add(i1, i2)
         debug_merge_point(0, 0, 0, 0, ConstPtr(ptr0))
@@ -56,35 +60,43 @@
         """, namespace={'ptr0': code_gcref}).operations
         greenkey = [ConstInt(0), ConstInt(0), ConstPtr(code_gcref)]
         offset = {}
-        for i, op in enumerate(cls.origoplist):
+        for i, op in enumerate(oplist):
             if i != 1:
                offset[op] = i
 
+        di_loop = JitDebugInfo(MockJitDriverSD, logger, JitCellToken(),
+                               oplist, 'loop', greenkey)
+        di_loop_optimize = JitDebugInfo(MockJitDriverSD, logger, JitCellToken(),
+                                        oplist, 'loop', greenkey)
+        di_loop.asminfo = AsmInfo(offset, 0, 0)
+        di_bridge = JitDebugInfo(MockJitDriverSD, logger, JitCellToken(),
+                                 oplist, 'bridge', fail_descr_no=0)
+        di_bridge.asminfo = AsmInfo(offset, 0, 0)
+
         def interp_on_compile():
-            pypy_hooks.after_compile(pypyjitdriver, logger, JitCellToken(),
-                                      cls.oplist, 'loop', greenkey, offset,
-                                      0, 0)
+            di_loop.oplist = cls.oplist
+            pypy_hooks.after_compile(di_loop)
 
         def interp_on_compile_bridge():
-            pypy_hooks.after_compile_bridge(pypyjitdriver, logger,
-                                             JitCellToken(), cls.oplist, 0,
-                                             offset, 0, 0)
+            pypy_hooks.after_compile_bridge(di_bridge)
 
         def interp_on_optimize():
-            pypy_hooks.before_compile(pypyjitdriver, logger, JitCellToken(),
-                                       cls.oplist, 'loop', greenkey)
+            di_loop_optimize.oplist = cls.oplist
+            pypy_hooks.before_compile(di_loop_optimize)
 
         def interp_on_abort():
-            pypy_hooks.on_abort(ABORT_TOO_LONG, pypyjitdriver, greenkey)
+            pypy_hooks.on_abort(ABORT_TOO_LONG, pypyjitdriver, greenkey,
+                                'blah')
         
         cls.w_on_compile = space.wrap(interp2app(interp_on_compile))
         cls.w_on_compile_bridge = space.wrap(interp2app(interp_on_compile_bridge))
         cls.w_on_abort = space.wrap(interp2app(interp_on_abort))
         cls.w_int_add_num = space.wrap(rop.INT_ADD)
         cls.w_on_optimize = space.wrap(interp2app(interp_on_optimize))
+        cls.orig_oplist = oplist
 
     def setup_method(self, meth):
-        self.__class__.oplist = self.origoplist
+        self.__class__.oplist = self.orig_oplist[:]
 
     def test_on_compile(self):
         import pypyjit
diff --git a/pypy/rlib/jit.py b/pypy/rlib/jit.py
--- a/pypy/rlib/jit.py
+++ b/pypy/rlib/jit.py
@@ -779,7 +779,7 @@
     of JIT running like JIT loops compiled, aborts etc.
     An instance of this class will be available as policy.jithookiface.
     """
-    def on_abort(self, reason, jitdriver, greenkey):
+    def on_abort(self, reason, jitdriver, greenkey, greenkey_repr):
         """ A hook called each time a loop is aborted with jitdriver and
         greenkey where it started, reason is a string why it got aborted
         """


More information about the pypy-commit mailing list