[pypy-commit] pypy new-jit-log: using the the same trick as done in rlib/jithook to call flush_trace_counters on the assembler
plan_rich
pypy.commits at gmail.com
Wed Jul 6 12:37:50 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: new-jit-log
Changeset: r85583:f669d0340e40
Date: 2016-07-06 18:37 +0200
http://bitbucket.org/pypy/pypy/changeset/f669d0340e40/
Log: using the the same trick as done in rlib/jithook to call
flush_trace_counters on the assembler
diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -10,11 +10,16 @@
debug_print)
from rpython.rlib.rarithmetic import r_uint
from rpython.rlib.objectmodel import specialize, compute_unique_id
+from rpython.rlib.jitlog import _log_jit_counter
from rpython.rtyper.annlowlevel import cast_instance_to_gcref, llhelper
from rpython.rtyper.lltypesystem import rffi, lltype
-from rpython.jit.metainterp.debug import (DEBUG_COUNTER, debug_sd,
- flush_debug_counters)
+DEBUG_COUNTER = lltype.Struct('DEBUG_COUNTER',
+ # 'b'ridge, 'l'abel or # 'e'ntry point
+ ('i', lltype.Signed), # first field, at offset 0
+ ('type', lltype.Char),
+ ('number', lltype.Signed)
+)
class GuardToken(object):
def __init__(self, cpu, gcmap, faildescr, failargs, fail_locs,
@@ -69,6 +74,7 @@
self.memset_addr = 0
self.rtyper = cpu.rtyper
self._debug = False
+ self.loop_run_counters = []
def stitch_bridge(self, faildescr, target):
raise NotImplementedError
@@ -333,7 +339,7 @@
self._call_assembler_patch_jmp(jmp_location)
def get_loop_run_counters(self, index):
- return debug_sd.loop_run_counters[index]
+ return self.loop_run_counters[index]
@specialize.argtype(1)
def _inject_debugging_code(self, looptoken, operations, tp, number):
@@ -366,16 +372,19 @@
else:
assert token
struct.number = compute_unique_id(token)
- debug_sd.loop_run_counters.append(struct)
+ # YYY very minor leak -- we need the counters to stay alive
+ # forever, just because we want to report them at the end
+ # of the process
+ self.loop_run_counters.append(struct)
return struct
def finish_once(self):
if self._debug:
# TODO remove the old logging system when jitlog is complete
debug_start('jit-backend-counts')
- length = len(debug_sd.loop_run_counters)
+ length = len(self.loop_run_counters)
for i in range(length):
- struct = debug_sd.loop_run_counters[i]
+ struct = self.loop_run_counters[i]
if struct.type == 'l':
prefix = 'TargetToken(%d)' % struct.number
else:
@@ -391,7 +400,20 @@
debug_print(prefix + ':' + str(struct.i))
debug_stop('jit-backend-counts')
- flush_debug_counters()
+ self.flush_trace_counters()
+
+ def flush_trace_counters(self):
+ # this is always called, the jitlog knows if it is enabled
+ length = len(self.loop_run_counters)
+ for i in range(length):
+ struct = self.loop_run_counters[i]
+ _log_jit_counter(struct)
+ # reset the counter, flush in a later point in time will
+ # add up the counters!
+ struct.i = 0
+ # here would be the point to free some counters
+ # see YYY comment above! but first we should run this every once in a while
+ # not just when jitlog_disable is called
@staticmethod
@rgc.no_collect
diff --git a/rpython/jit/metainterp/debug.py b/rpython/jit/metainterp/debug.py
deleted file mode 100644
--- a/rpython/jit/metainterp/debug.py
+++ /dev/null
@@ -1,32 +0,0 @@
-from rpython.rtyper.lltypesystem import rffi, lltype
-from rpython.rlib.jitlog import _log_jit_counter
-
-# YYY very minor leak -- we need the counters to stay alive
-# forever, just because we want to report them at the end
-# of the process
-
-class DebugStaticData(object):
- def __init__(self):
- self.loop_run_counters = []
-
-debug_sd = DebugStaticData()
-
-DEBUG_COUNTER = lltype.Struct('DEBUG_COUNTER',
- # 'b'ridge, 'l'abel or # 'e'ntry point
- ('i', lltype.Signed), # first field, at offset 0
- ('type', lltype.Char),
- ('number', lltype.Signed)
-)
-
-def flush_debug_counters():
- # this is always called, the jitlog knows if it is enabled
- length = len(debug_sd.loop_run_counters)
- for i in range(length):
- struct = debug_sd.loop_run_counters[i]
- _log_jit_counter(struct)
- # reset the counter, flush in a later point in time will
- # add up the counters!
- struct.i = 0
- # here would be the point to free some counters
- # see YYY comment above! but first we should run this every once in a while
- # not just when jitlog_disable is called
diff --git a/rpython/jit/metainterp/test/test_ajit.py b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -4,6 +4,7 @@
import weakref
from rpython.rlib import rgc
+from rpython.rlib.debug import debug_flush_trace_counts
from rpython.jit.codewriter.policy import StopAtXPolicy
from rpython.jit.metainterp import history
from rpython.jit.metainterp.test.support import LLJitMixin, noConst
@@ -64,6 +65,20 @@
res = self.interp_operations(f, [8, 98])
assert res == 110
+ def test_flush_trace_count(self):
+ myjitdriver = JitDriver(greens = [], reds = ['i'])
+ def f(i):
+ while i > 0:
+ myjitdriver.can_enter_jit(i=i)
+ myjitdriver.jit_merge_point(i=i)
+ if i == 4:
+ debug_flush_trace_counts(None)
+ print("4")
+ i -= 1
+ return i
+ res = self.meta_interp(f, [40])
+ assert res == 0
+
def test_loop_1(self):
myjitdriver = JitDriver(greens = [], reds = ['x', 'y', 'res'])
def f(x, y):
diff --git a/rpython/jit/metainterp/warmspot.py b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -168,6 +168,7 @@
def find_jit_merge_points(graphs):
results = _find_jit_marker(graphs, 'jit_merge_point')
+ import pdb; pdb.set_trace()
if not results:
raise Exception("no jit_merge_point found!")
seen = set([graph for graph, block, pos in results])
diff --git a/rpython/rlib/jitlog.py b/rpython/rlib/jitlog.py
--- a/rpython/rlib/jitlog.py
+++ b/rpython/rlib/jitlog.py
@@ -12,6 +12,14 @@
from rpython.rlib.objectmodel import compute_unique_id, always_inline
from rpython.rlib.objectmodel import we_are_translated, specialize
from rpython.rlib.unroll import unrolling_iterable
+from rpython.rlib.jit_hooks import register_helper
+from rpython.annotator import model as annmodel
+
+ at register_helper(None)
+def stats_flush_trace_counts(warmrunnerdesc):
+ print("hello")
+ warmrunnerdesc.metainterp_sd.cpu.assembler.flush_trace_counters()
+ return True
def commonprefix(a,b):
"Given a list of pathnames, returns the longest common leading component"
diff --git a/rpython/rlib/rvmprof/rvmprof.py b/rpython/rlib/rvmprof/rvmprof.py
--- a/rpython/rlib/rvmprof/rvmprof.py
+++ b/rpython/rlib/rvmprof/rvmprof.py
@@ -132,8 +132,8 @@
self.cintf.jitlog_write_marked(jl.MARK_JITLOG_HEADER + blob, len(blob) + 1)
def disable_jitlog(self):
- from rpython.jit.metainterp.debug import flush_debug_counters
- flush_debug_counters()
+ from rpython.rlib import debug
+ stats_flush_trace_counts(None)
self.cintf.jitlog_teardown()
def disable(self):
diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -541,17 +541,18 @@
'threadlocalref_enum': LLOp(sideeffects=False), # enum all threadlocalrefs
# __________ debugging __________
- 'debug_view': LLOp(),
- 'debug_print': LLOp(canrun=True),
- 'debug_start': LLOp(canrun=True),
- 'debug_stop': LLOp(canrun=True),
- 'have_debug_prints': LLOp(canrun=True),
- 'have_debug_prints_for':LLOp(canrun=True),
- 'debug_offset': LLOp(canrun=True),
- 'debug_flush': LLOp(canrun=True),
- 'debug_assert': LLOp(tryfold=True),
- 'debug_fatalerror': LLOp(canrun=True),
- 'debug_llinterpcall': LLOp(canraise=(Exception,)),
+ 'debug_flush_trace_counts': LLOp(),
+ 'debug_view': LLOp(),
+ 'debug_print': LLOp(canrun=True),
+ 'debug_start': LLOp(canrun=True),
+ 'debug_stop': LLOp(canrun=True),
+ 'have_debug_prints': LLOp(canrun=True),
+ 'have_debug_prints_for': LLOp(canrun=True),
+ 'debug_offset': LLOp(canrun=True),
+ 'debug_flush': LLOp(canrun=True),
+ 'debug_assert': LLOp(tryfold=True),
+ 'debug_fatalerror': LLOp(canrun=True),
+ 'debug_llinterpcall': LLOp(canraise=(Exception,)),
# Python func call 'res=arg[0](*arg[1:])'
# in backends, abort() or whatever is fine
'debug_start_traceback': LLOp(),
diff --git a/rpython/rtyper/lltypesystem/opimpl.py b/rpython/rtyper/lltypesystem/opimpl.py
--- a/rpython/rtyper/lltypesystem/opimpl.py
+++ b/rpython/rtyper/lltypesystem/opimpl.py
@@ -580,6 +580,9 @@
return hlstr(x)
return x
+def op_debug_flush_log():
+ debug.debug_flush_log()
+
def op_debug_print(*args):
debug.debug_print(*map(_normalize, args))
diff --git a/rpython/translator/c/test/test_standalone.py b/rpython/translator/c/test/test_standalone.py
--- a/rpython/translator/c/test/test_standalone.py
+++ b/rpython/translator/c/test/test_standalone.py
@@ -6,6 +6,7 @@
from rpython.rlib.objectmodel import keepalive_until_here
from rpython.rlib.rarithmetic import r_longlong
from rpython.rlib.debug import ll_assert, have_debug_prints, debug_flush
+from rpython.rlib.jitlog import stats_flush_trace_counts
from rpython.rlib.debug import debug_print, debug_start, debug_stop
from rpython.rlib.debug import debug_offset, have_debug_prints_for
from rpython.rlib.entrypoint import entrypoint_highlevel, secondary_entrypoints
@@ -17,6 +18,7 @@
from rpython.tool.udir import udir
from rpython.translator import cdir
from rpython.conftest import option
+from rpython.rlib.jit import JitDriver
def setup_module(module):
if os.name == 'nt':
More information about the pypy-commit
mailing list