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

Reply via email to