[pypy-commit] pypy improve-vmprof-testing: Blackhole interp: in-progress

arigo pypy.commits at gmail.com
Sun Aug 7 05:09:36 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: improve-vmprof-testing
Changeset: r86055:3f7d7ab3e4ff
Date: 2016-08-07 11:11 +0200
http://bitbucket.org/pypy/pypy/changeset/3f7d7ab3e4ff/

Log:	Blackhole interp: in-progress

diff --git a/rpython/jit/backend/test/test_rvmprof.py b/rpython/jit/backend/test/test_rvmprof.py
--- a/rpython/jit/backend/test/test_rvmprof.py
+++ b/rpython/jit/backend/test/test_rvmprof.py
@@ -111,76 +111,3 @@
         cintf.vmprof_tl_stack.setraw(null)
         self.meta_interp(main, [30], inline=True)
         assert visited[:3] == [[(1, 12), (1, 8)], [(1, 12), (1, 8)], [(1, 12), (1, 8)]]
-
-
-    def test_one(self):
-#        py.test.skip("needs thread-locals in the JIT, which is only available "
-#                     "after translation")
-        visited = []
-
-        def helper():
-            trace = []
-            stack = cintf.vmprof_tl_stack.getraw()
-            while stack:
-                trace.append((stack.c_kind, stack.c_value))
-                stack = stack.c_next
-            visited.append(trace)
-
-        llfn = llhelper(lltype.Ptr(lltype.FuncType([], lltype.Void)), helper)
-
-        driver = jit.JitDriver(greens=['code'], reds=['c', 'i', 'n', 'codes'])
-
-        class CodeObj(object):
-            def __init__(self, name):
-                self.name = name
-
-        def get_code_fn(codes, code, arg, c):
-            return code
-
-        def get_name(code):
-            return "foo"
-
-        _get_vmprof().use_weaklist = False
-        register_code_object_class(CodeObj, get_name)
-
-        @vmprof_execute_code("main", get_code_fn,
-                             _hack_update_stack_untranslated=True)
-        def f(codes, code, n, c):
-            i = 0
-            while i < n:
-                driver.jit_merge_point(code=code, c=c, i=i, codes=codes, n=n)
-                if code.name == "main":
-                    c = f(codes, codes[1], 1, c)
-                    driver.can_enter_jit(code=code, c=c, i=i, codes=codes, n=n)
-                else:
-                    llfn()
-                    c -= 1
-                    if c < 0:
-                        llfn() # bridge
-                i += 1
-            return c
-
-        def main(n):
-            codes = [CodeObj("main"), CodeObj("not main")]
-            for code in codes:
-                register_code(code, get_name)
-            return f(codes, codes[0], n, 8)
-
-        class Hooks(jit.JitHookInterface):
-            def after_compile(self, debug_info):
-                self.raw_start = debug_info.asminfo.rawstart
-
-        hooks = Hooks()
-
-        null = lltype.nullptr(cintf.VMPROFSTACK)
-        cintf.vmprof_tl_stack.setraw(null)
-        self.meta_interp(main, [30], policy=JitPolicy(hooks), inline=True)
-        assert visited[:3] == [[(1, 12), (1, 8)], [(1, 12), (1, 8)], [(1, 12), (1, 8)]]
-        print visited
-        #v = set(visited)
-        #assert 0 in v
-        #v.remove(0)
-        #assert len(v) == 1
-        #assert 0 <= list(v)[0] - hooks.raw_start <= 10*1024
-        #assert cintf.vmprof_tl_stack.getraw() == null
-        # ^^^ make sure we didn't leave anything dangling
diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -64,6 +64,7 @@
             assert self._insns[value] is None
             self._insns[value] = key
         self.op_catch_exception = insns.get('catch_exception/L', -1)
+        self.op_rvmprof_code = insns.get('rvmprof_code/ii', -1)
         #
         all_funcs = []
         for key in self._insns:
@@ -270,6 +271,7 @@
         self.dispatch_loop      = builder.dispatch_loop
         self.descrs             = builder.descrs
         self.op_catch_exception = builder.op_catch_exception
+        self.op_rvmprof_code    = builder.op_rvmprof_code
         self.count_interpreter  = count_interpreter
         #
         if we_are_translated():
@@ -376,6 +378,20 @@
         # no 'catch_exception' insn follows: just reraise
         reraise(e)
 
+    def handle_rvmprof_enter(self):
+        code = self.jitcode.code
+        position = self.position
+        opcode = ord(code[position])
+        if opcode == self.op_rvmprof_code:
+            arg1 = self.registers_i[ord(code[position + 1])]
+            arg2 = self.registers_i[ord(code[position + 2])]
+            if arg1 == 1:
+                # we are resuming at a position that will do a
+                # jit_rvmprof_code(1), when really executed.  That's a
+                # hint for the need for a jit_rvmprof_code(0).
+                from rpython.rlib.rvmprof import cintf
+                cintf.jit_rvmprof_code(0, arg2)
+
     def copy_constants(self, registers, constants):
         """Copy jitcode.constants[0] to registers[255],
                 jitcode.constants[1] to registers[254],
@@ -1503,7 +1519,8 @@
 
     @arguments("i", "i")
     def bhimpl_rvmprof_code(leaving, unique_id):
-        pass #import pdb;pdb.set_trace()
+        from rpython.rlib.rvmprof import cintf
+        cintf.jit_rvmprof_code(leaving, unique_id)
 
     # ----------
     # helpers to resume running in blackhole mode when a guard failed
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2084,8 +2084,8 @@
                     # continue popping frames.  Decode jit_rvmprof_code
                     # manually here.
                     from rpython.rlib.rvmprof import cintf
-                    arg1 = frame.registers_i[ord(code[position+1])].getint()
-                    arg2 = frame.registers_i[ord(code[position+2])].getint()
+                    arg1 = frame.registers_i[ord(code[position + 1])].getint()
+                    arg2 = frame.registers_i[ord(code[position + 2])].getint()
                     assert arg1 == 1
                     cintf.jit_rvmprof_code(arg1, arg2)
             self.popframe()
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -1343,6 +1343,7 @@
         jitcode = jitcodes[jitcode_pos]
         curbh.setposition(jitcode, pc)
         resumereader.consume_one_section(curbh)
+        curbh.handle_rvmprof_enter()
     return curbh
 
 def force_from_resumedata(metainterp_sd, storage, deadframe, vinfo, ginfo):


More information about the pypy-commit mailing list