[pypy-commit] pypy default: Write a simple parser of logs that returns loops
fijal
noreply at buildbot.pypy.org
Fri Jul 8 13:40:46 CEST 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r45417:f88554cbc218
Date: 2011-07-08 13:49 +0200
http://bitbucket.org/pypy/pypy/changeset/f88554cbc218/
Log: Write a simple parser of logs that returns loops
diff --git a/pypy/tool/jitlogparser/parser.py b/pypy/tool/jitlogparser/parser.py
--- a/pypy/tool/jitlogparser/parser.py
+++ b/pypy/tool/jitlogparser/parser.py
@@ -1,7 +1,8 @@
import re, sys
-from pypy.jit.metainterp.resoperation import rop, opname
+from pypy.jit.metainterp.resoperation import opname
from pypy.jit.tool.oparser import OpParser
+from pypy.tool.logparser import parse_log_file, extract_category
class Op(object):
bridge = None
@@ -57,7 +58,7 @@
use_mock_model = True
def postprocess(self, loop, backend_dump=None, backend_tp=None,
- loop_start=0, dump_start=0):
+ dump_start=0):
if backend_dump is not None:
raw_asm = self._asm_disassemble(backend_dump.decode('hex'),
backend_tp, dump_start)
@@ -329,3 +330,33 @@
res.append(op)
i += 1
return res
+
+
+def import_log(logname, ParserCls=SimpleParser):
+ log = parse_log_file(logname)
+ addrs = {}
+ for entry in extract_category(log, 'jit-backend-addr'):
+ m = re.search('bootstrap ([\da-f]+)', entry)
+ name = entry[:entry.find('(') - 1]
+ addrs[int(m.group(1), 16)] = name
+ dumps = {}
+ for entry in extract_category(log, 'jit-backend-dump'):
+ backend, _, dump, _ = entry.split("\n")
+ _, addr, _, data = re.split(" +", dump)
+ backend_name = backend.split(" ")[1]
+ addr = int(addr[1:], 16)
+ if addr in addrs:
+ dumps[addrs[addr]] = (backend_name, addr, data)
+ loops = []
+ for entry in extract_category(log, 'jit-log-opt'):
+ parser = ParserCls(entry, None, {}, 'lltype', None,
+ nonstrict=True)
+ loop = parser.parse()
+ comm = loop.comment
+ name = comm[2:comm.find(':')-1]
+ if name in dumps:
+ bname, start_ofs, dump = dumps[name]
+ parser.postprocess(loop, backend_tp=bname, backend_dump=dump,
+ dump_start=start_ofs)
+ loops.append(loop)
+ return loops
diff --git a/pypy/tool/jitlogparser/test/logtest.log b/pypy/tool/jitlogparser/test/logtest.log
--- a/pypy/tool/jitlogparser/test/logtest.log
+++ b/pypy/tool/jitlogparser/test/logtest.log
@@ -4,7 +4,9 @@
SYS_EXECUTABLE python
CODE_DUMP @7f3b0b2e63d5 +0 554889E5534154415541564157488DA500000000488B042590C5540148C7042590C554010000000048898570FFFFFF488B042598C5540148C7042598C554010000000048898568FFFFFF488B0425A0C5540148C70425A0C554010000000048898560FFFFFF488B0425A8C5540148C70425A8C554010000000048898558FFFFFF4C8B3C2550525B0149BB3050920D3B7F00004D8B334983C60149BB3050920D3B7F00004D89334981FF102700000F8D000000004983C7014C8B342580F76A024983EE014C89342580F76A024983FE000F8C00000000E9AEFFFFFF488B042588F76A024829E0483B042580EC3C01760D49BB05632E0B3B7F000041FFD3554889E5534154415541564157488DA550FFFFFF4889BD70FFFFFF4889B568FFFFFF48899560FFFFFF48898D58FFFFFF4D89C7E954FFFFFF49BB00602E0B3B7F000041FFD34440484C3D030300000049BB00602E0B3B7F000041FFD34440484C3D070304000000
[11f210b949b3] jit-backend-dump}
-Loop #0 (<code object f, file 'x.py', line 2> #9 LOAD_FAST) has address 7f3b0b2e645d to 7f3b0b2e64af (bootstrap 7f3b0b2e63d5)
+[11f210b949b4] {jit-backend-addr
+Loop 0 (<code object f, file 'x.py', line 2> #9 LOAD_FAST) has address 7f3b0b2e645d to 7f3b0b2e64af (bootstrap 7f3b0b2e63d5)
+[11f210bab188] jit-backend-addr}
[11f210bab189] jit-backend}
[11f210bacbb7] {jit-log-opt-loop
# Loop 0 : loop with 19 ops
diff --git a/pypy/tool/jitlogparser/test/test_parser.py b/pypy/tool/jitlogparser/test/test_parser.py
--- a/pypy/tool/jitlogparser/test/test_parser.py
+++ b/pypy/tool/jitlogparser/test/test_parser.py
@@ -204,9 +204,12 @@
+213: jump(p0, p1, p2, p3, i8, descr=<Loop0>)
+218: --end of the loop--""", backend_dump=backend_dump,
dump_start=dump_start,
- backend_tp='x86_64',
- loop_start=0x7f3b0b2e645d)
+ backend_tp='x86_64')
cmp = loop.operations[1]
assert 'jge' in cmp.asm
assert '0x2710' in cmp.asm
assert 'jmp' in loop.operations[-1].asm
+
+def test_import_log():
+ loops = import_log(str(py.path.local(__file__).join('..', 'logtest.log')))
+ assert 'jge' in loops[0].operations[3].asm
More information about the pypy-commit
mailing list