Author: Remi Meier <[email protected]>
Branch: stmgc-c8-gcc
Changeset: r78719:6820a6ef6d83
Date: 2015-07-30 14:00 +0200
http://bitbucket.org/pypy/pypy/changeset/6820a6ef6d83/
Log: improve information supplied to 'perf'
diff --git a/pypy/stm/make_perf_map_from_pypylog.py
b/pypy/stm/make_perf_map_from_pypylog.py
--- a/pypy/stm/make_perf_map_from_pypylog.py
+++ b/pypy/stm/make_perf_map_from_pypylog.py
@@ -1,59 +1,29 @@
#!/usr/bin/env pypy
from rpython.tool.logparser import extract_category
from rpython.tool.jitlogparser.storage import LoopStorage
-from rpython.tool.jitlogparser.parser import adjust_bridges, import_log,\
+from rpython.tool.jitlogparser.parser import import_log,\
parse_log_counts, SimpleParser
-
+from collections import OrderedDict
import argparse
import os
-loop_to_asm = {}
+loop_to_asm = OrderedDict()
+global_dumps = OrderedDict()
class SymbolMapParser(SimpleParser):
def postprocess(self, loop, backend_dump=None, backend_tp=None,
dump_start=0, symbols=None):
if backend_dump is not None:
- loop_to_asm[loop] = (dump_start+loop.operations[0].offset,
-
loop.last_offset)#len(backend_dump.decode('hex')))
-
- #import pdb;pdb.set_trace()
- # print loop.comment
- # print hex(dump_start), loop.last_offset
- # print len(backend_dump), len(backend_dump.decode('hex'))
-
- # raw_asm = self._asm_disassemble(backend_dump.decode('hex'),
- # backend_tp, dump_start)
- # start = 0
- # for elem in raw_asm:
- # if len(elem.split("\t")) < 3:
- # continue
- # e = elem.split("\t")
- # adr = e[0]
- # if not start:
- # start = int(adr.strip(":"), 16)
- # break
- # print "real start", hex(start)
- #return SimpleParser.postprocess(self, loop, backend_dump, backend_tp,
dump_start, symbols)
+ if dump_start not in global_dumps:
+ global_dumps[dump_start] = (loop, backend_dump)
+ start_offset = loop.operations[0].offset
+ loop_to_asm[loop] = (dump_start + start_offset,
+ loop.last_offset - start_offset)
return loop
-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():
@@ -80,7 +50,6 @@
log, loops = import_log(filename, SymbolMapParser)
parse_log_counts(extract_category(log, 'jit-backend-count'), loops)
storage.loops = loops
- storage.loop_dict = create_loop_dict(loops)
for loop in storage.loops:
if hasattr(loop, 'force_asm'):
@@ -88,16 +57,32 @@
comment = loop.comment
start, stop = comment.find('('), comment.rfind(')')
- loop.name = comment[start+1:stop]
+ count = loop.count if hasattr(loop, 'count') else '?'
+ loop.name = comment[start+1:stop] + " (ran %sx)" % count
with open('/tmp/perf-%s.map' % args.pid, 'w') as f:
- for loop, (start, size) in loop_to_asm.items():
- line = "%x %x %s\n" % (start, size, loop.name)
+ lines = []
+ fmt = "%x %x %s\n"
+ # fine-grained first seems to work:
+ # output last entries first
+ for loop, (start, size) in reversed(loop_to_asm.items()):
+ lines.append(fmt % (start, size,
+ "JIT: " + loop.name))
+
+ # coarse loop-pieces: they include e.g. frame-reallocation
+ # in compiled bridge (whatever jitviewer also doesn't show
+ # but is still part of a loop)
+ for start, (loop, dump) in reversed(global_dumps.items()):
+ lines.append(fmt % (start, len(dump.decode('hex')),
+ "JIT-ext: " + loop.name))
+
+ for line in lines:
os.write(1, line)
f.write(line)
+
if __name__ == '__main__':
main()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit