Author: Maciej Fijalkowski <[email protected]>
Branch:
Changeset: r72453:889b1712379e
Date: 2014-07-16 11:36 +0200
http://bitbucket.org/pypy/pypy/changeset/889b1712379e/
Log: Experimental logparser2json
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
@@ -1377,49 +1377,53 @@
def do_residual_call(self, funcbox, argboxes, descr, pc,
assembler_call=False,
assembler_call_jd=None):
- # First build allboxes: it may need some reordering from the
- # list provided in argboxes, depending on the order in which
- # the arguments are expected by the function
- #
- allboxes = self._build_allboxes(funcbox, argboxes, descr)
- effectinfo = descr.get_extra_info()
- if (assembler_call or
- effectinfo.check_forces_virtual_or_virtualizable()):
- # residual calls require attention to keep virtualizables in-sync
- self.metainterp.clear_exception()
- if effectinfo.oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUAL:
- resbox = self._do_jit_force_virtual(allboxes, descr, pc)
+ debug_start("jit-residual-call")
+ try:
+ # First build allboxes: it may need some reordering from the
+ # list provided in argboxes, depending on the order in which
+ # the arguments are expected by the function
+ #
+ allboxes = self._build_allboxes(funcbox, argboxes, descr)
+ effectinfo = descr.get_extra_info()
+ if (assembler_call or
+ effectinfo.check_forces_virtual_or_virtualizable()):
+ # residual calls require attention to keep virtualizables
in-sync
+ self.metainterp.clear_exception()
+ if effectinfo.oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUAL:
+ resbox = self._do_jit_force_virtual(allboxes, descr, pc)
+ if resbox is not None:
+ return resbox
+ self.metainterp.vable_and_vrefs_before_residual_call()
+ resbox = self.metainterp.execute_and_record_varargs(
+ rop.CALL_MAY_FORCE, allboxes, descr=descr)
+ if effectinfo.is_call_release_gil():
+ self.metainterp.direct_call_release_gil()
+ self.metainterp.vrefs_after_residual_call()
+ vablebox = None
+ if assembler_call:
+ vablebox = self.metainterp.direct_assembler_call(
+ assembler_call_jd)
if resbox is not None:
- return resbox
- self.metainterp.vable_and_vrefs_before_residual_call()
- resbox = self.metainterp.execute_and_record_varargs(
- rop.CALL_MAY_FORCE, allboxes, descr=descr)
- if effectinfo.is_call_release_gil():
- self.metainterp.direct_call_release_gil()
- self.metainterp.vrefs_after_residual_call()
- vablebox = None
- if assembler_call:
- vablebox = self.metainterp.direct_assembler_call(
- assembler_call_jd)
- if resbox is not None:
- self.make_result_of_lastop(resbox)
- self.metainterp.vable_after_residual_call(funcbox)
- self.metainterp.generate_guard(rop.GUARD_NOT_FORCED, None)
- if vablebox is not None:
- self.metainterp.history.record(rop.KEEPALIVE, [vablebox], None)
- self.metainterp.handle_possible_exception()
- # XXX refactor: direct_libffi_call() is a hack
- if effectinfo.oopspecindex == effectinfo.OS_LIBFFI_CALL:
- self.metainterp.direct_libffi_call()
- return resbox
- else:
- effect = effectinfo.extraeffect
- if effect == effectinfo.EF_LOOPINVARIANT:
- return self.execute_varargs(rop.CALL_LOOPINVARIANT, allboxes,
- descr, False, False)
- exc = effectinfo.check_can_raise()
- pure = effectinfo.check_is_elidable()
- return self.execute_varargs(rop.CALL, allboxes, descr, exc, pure)
+ self.make_result_of_lastop(resbox)
+ self.metainterp.vable_after_residual_call(funcbox)
+ self.metainterp.generate_guard(rop.GUARD_NOT_FORCED, None)
+ if vablebox is not None:
+ self.metainterp.history.record(rop.KEEPALIVE, [vablebox],
None)
+ self.metainterp.handle_possible_exception()
+ # XXX refactor: direct_libffi_call() is a hack
+ if effectinfo.oopspecindex == effectinfo.OS_LIBFFI_CALL:
+ self.metainterp.direct_libffi_call()
+ return resbox
+ else:
+ effect = effectinfo.extraeffect
+ if effect == effectinfo.EF_LOOPINVARIANT:
+ return self.execute_varargs(rop.CALL_LOOPINVARIANT,
allboxes,
+ descr, False, False)
+ exc = effectinfo.check_can_raise()
+ pure = effectinfo.check_is_elidable()
+ return self.execute_varargs(rop.CALL, allboxes, descr, exc,
pure)
+ finally:
+ debug_stop("jit-residual-call")
def do_conditional_call(self, condbox, funcbox, argboxes, descr, pc):
if isinstance(condbox, ConstInt) and condbox.value == 0:
diff --git a/rpython/jit/tool/oparser_model.py
b/rpython/jit/tool/oparser_model.py
--- a/rpython/jit/tool/oparser_model.py
+++ b/rpython/jit/tool/oparser_model.py
@@ -124,6 +124,15 @@
class ExtendedTreeLoop(model.TreeLoop):
+ def as_json(self):
+ return {
+ 'comment': self.comment,
+ 'name': self.name,
+ 'operations': [op.as_json() for op in self.operations],
+ 'inputargs': self.inputargs,
+ 'last_offset': self.last_offset
+ }
+
def getboxes(self):
def opboxes(operations):
for op in operations:
diff --git a/rpython/tool/jitlogparser/logparser2json.py
b/rpython/tool/jitlogparser/logparser2json.py
new file mode 100755
--- /dev/null
+++ b/rpython/tool/jitlogparser/logparser2json.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+""" Convert logfile (from jit-log-opt and jit-backend) to json format.
+Usage:
+
+logparser2json.py <logfile.log> <outfile.json>
+"""
+
+import os
+import sys
+import json
+from rpython.tool.jitlogparser.parser import import_log, parse_log_counts
+from rpython.tool.logparser import extract_category
+from rpython.tool.jitlogparser.storage import LoopStorage
+
+def mangle_descr(descr):
+ if descr.startswith('TargetToken('):
+ return descr[len('TargetToken('):-1]
+ if descr.startswith('<Guard'):
+ return 'bridge-' + str(int(descr[len('<Guard0x'):-1], 16))
+ if descr.startswith('<Loop'):
+ return 'entry-' + descr[len('<Loop'):-1]
+ return descr.replace(" ", '-')
+
+def create_loop_dict(loops):
+ d = {}
+ for loop in loops:
+ d[mangle_descr(loop.descr)] = loop
+ return d
+
+def main(progname, logfilename, outfilename):
+ storage = LoopStorage(extrapath=os.path.dirname(progname))
+ log, loops = import_log(logfilename)
+ parse_log_counts(extract_category(log, 'jit-backend-count'), loops)
+ storage.loops = [loop for loop in loops
+ if not loop.descr.startswith('bridge')]
+ storage.loop_dict = create_loop_dict(loops)
+ json.dump([loop.force_asm().as_json() for loop in storage.loops],
+ open(outfilename, "w"))
+
+if __name__ == '__main__':
+ if len(sys.argv) != 3:
+ print __doc__
+ sys.exit(1)
+ main(sys.argv[0], sys.argv[1], sys.argv[2])
diff --git a/rpython/tool/jitlogparser/parser.py
b/rpython/tool/jitlogparser/parser.py
--- a/rpython/tool/jitlogparser/parser.py
+++ b/rpython/tool/jitlogparser/parser.py
@@ -36,6 +36,20 @@
if self._is_guard:
self.guard_no = int(self.descr[len('<Guard0x'):-1], 16)
+ def as_json(self):
+ d = {
+ 'name': self.name,
+ 'args': self.args,
+ 'res': self.res,
+ }
+ if self.descr is not None:
+ d['descr'] = self.descr
+ if self.bridge is not None:
+ d['bridge'] = self.bridge.as_json()
+ if self.asm is not None:
+ d['asm'] = self.asm
+ return d
+
def setfailargs(self, failargs):
self.failargs = failargs
diff --git a/rpython/tool/jitlogparser/test/test_storage.py
b/rpython/tool/jitlogparser/test/test_storage.py
--- a/rpython/tool/jitlogparser/test/test_storage.py
+++ b/rpython/tool/jitlogparser/test/test_storage.py
@@ -6,3 +6,4 @@
tmppath.join("x.py").write("def f(): pass") # one code
s = LoopStorage(str(tmppath))
assert s.load_code(str(tmppath.join('x.py'))) == s.load_code('x.py')
+
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit