[pypy-commit] pypy jit-hooks-can-be-disabled: add a hook that makes it possible to disable all other hooks.
cfbolz
pypy.commits at gmail.com
Wed Mar 28 08:03:44 EDT 2018
Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: jit-hooks-can-be-disabled
Changeset: r94161:df360c36c909
Date: 2018-03-28 13:28 +0200
http://bitbucket.org/pypy/pypy/changeset/df360c36c909/
Log: add a hook that makes it possible to disable all other hooks.
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -545,15 +545,15 @@
show_procedures(metainterp_sd, loop)
loop.check_consistency()
+ debug_info = None
+ hooks = None
if metainterp_sd.warmrunnerdesc is not None:
hooks = metainterp_sd.warmrunnerdesc.hooks
- debug_info = JitDebugInfo(jitdriver_sd, metainterp_sd.logger_ops,
- original_jitcell_token, loop.operations,
- type, greenkey)
- hooks.before_compile(debug_info)
- else:
- debug_info = None
- hooks = None
+ if hooks.are_hooks_enabled():
+ debug_info = JitDebugInfo(jitdriver_sd, metainterp_sd.logger_ops,
+ original_jitcell_token, loop.operations,
+ type, greenkey)
+ hooks.before_compile(debug_info)
operations = get_deep_immutable_oplist(loop.operations)
metainterp_sd.profiler.start_backend()
debug_start("jit-backend")
@@ -597,15 +597,15 @@
show_procedures(metainterp_sd)
seen = dict.fromkeys(inputargs)
TreeLoop.check_consistency_of_branch(operations, seen)
+ debug_info = None
+ hooks = None
if metainterp_sd.warmrunnerdesc is not None:
hooks = metainterp_sd.warmrunnerdesc.hooks
- debug_info = JitDebugInfo(jitdriver_sd, metainterp_sd.logger_ops,
- original_loop_token, operations, 'bridge',
- fail_descr=faildescr)
- hooks.before_compile_bridge(debug_info)
- else:
- hooks = None
- debug_info = None
+ if hooks.are_hooks_enabled():
+ debug_info = JitDebugInfo(jitdriver_sd, metainterp_sd.logger_ops,
+ original_loop_token, operations, 'bridge',
+ fail_descr=faildescr)
+ hooks.before_compile_bridge(debug_info)
operations = get_deep_immutable_oplist(operations)
metainterp_sd.profiler.start_backend()
debug_start("jit-backend")
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
@@ -2365,7 +2365,9 @@
greenkey = None # we're in the bridge
else:
greenkey = self.current_merge_points[0][0][:jd_sd.num_green_args]
- self.staticdata.warmrunnerdesc.hooks.on_abort(reason,
+ hooks = self.staticdata.warmrunnerdesc.hooks
+ if hooks.are_hooks_enabled():
+ hooks.on_abort(reason,
jd_sd.jitdriver, greenkey,
jd_sd.warmstate.get_location_str(greenkey),
self.staticdata.logger_ops._make_log_operations(
@@ -2374,9 +2376,10 @@
if self.aborted_tracing_jitdriver is not None:
jd_sd = self.aborted_tracing_jitdriver
greenkey = self.aborted_tracing_greenkey
- self.staticdata.warmrunnerdesc.hooks.on_trace_too_long(
- jd_sd.jitdriver, greenkey,
- jd_sd.warmstate.get_location_str(greenkey))
+ if hooks.are_hooks_enabled():
+ hooks.on_trace_too_long(
+ jd_sd.jitdriver, greenkey,
+ jd_sd.warmstate.get_location_str(greenkey))
# no ops for now
self.aborted_tracing_jitdriver = None
self.aborted_tracing_greenkey = None
diff --git a/rpython/jit/metainterp/test/test_jitiface.py b/rpython/jit/metainterp/test/test_jitiface.py
--- a/rpython/jit/metainterp/test/test_jitiface.py
+++ b/rpython/jit/metainterp/test/test_jitiface.py
@@ -238,7 +238,7 @@
hashes = Hashes()
- class Hooks(object):
+ class Hooks(JitHookInterface):
def before_compile(self, debug_info):
pass
@@ -279,6 +279,44 @@
self.meta_interp(main, [1, 1], policy=JitPolicy(hooks))
assert len(hashes.t) == 1
+
+ def test_are_hooks_enabled(self):
+ reasons = []
+
+ class MyJitIface(JitHookInterface):
+ def are_hooks_enabled(self):
+ return False
+
+ def on_abort(self, reason, jitdriver, greenkey, greenkey_repr, logops, ops):
+ reasons.append(reason)
+
+ iface = MyJitIface()
+
+ myjitdriver = JitDriver(greens=['foo'], reds=['x', 'total'],
+ get_printable_location=lambda *args: 'blah')
+
+ class Foo:
+ _immutable_fields_ = ['a?']
+
+ def __init__(self, a):
+ self.a = a
+
+ def f(a, x):
+ foo = Foo(a)
+ total = 0
+ while x > 0:
+ myjitdriver.jit_merge_point(foo=foo, x=x, total=total)
+ total += foo.a
+ foo.a += 1
+ x -= 1
+ return total
+ #
+ assert f(100, 7) == 721
+ res = self.meta_interp(f, [100, 7], policy=JitPolicy(iface))
+ assert res == 721
+ assert reasons == []
+
+
class LLJitHookInterfaceTests(JitHookInterfaceTests):
# use this for any backend, instead of the super class
@@ -320,7 +358,6 @@
# this so far does not work because of the way setup_once is done,
# but fine, it's only about untranslated version anyway
#self.meta_interp(main, [False], ProfilerClass=Profiler)
-
class TestJitHookInterface(JitHookInterfaceTests, LLJitMixin):
pass
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -1094,6 +1094,13 @@
# of the program! A line like ``pypy_hooks.foo = ...`` must not
# appear inside your interpreter's RPython code.
+ def are_hooks_enabled(self):
+ """ A hook that is called to check whether the interpreter's hooks are
+ enabled at all. Only if this function returns True, are the other hooks
+ called. Otherwise, nothing happens. This is done because constructing
+ some of the hooks' arguments is expensive, so we'd rather not do it."""
+ return True
+
def on_abort(self, reason, jitdriver, greenkey, greenkey_repr, logops, operations):
""" 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