[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