From 088ccbb556c9eff5947af93afd6dec0d7a049253 Mon Sep 17 00:00:00 2001 From: daniel-k Date: Thu, 19 May 2016 17:36:14 +0200 Subject: [PATCH] xray: add a conversion tool to visualize reports with kCacheGrind --- hermit/usr/xray/tools/conv2kcg.py | 322 + hermit/usr/xray/tools/report.xray | 14563 ++++++++++++++++++++++++++++ 2 files changed, 14885 insertions(+) create mode 100755 hermit/usr/xray/tools/conv2kcg.py create mode 100644 hermit/usr/xray/tools/report.xray diff --git a/hermit/usr/xray/tools/conv2kcg.py b/hermit/usr/xray/tools/conv2kcg.py new file mode 100755 index 000000000..d0d4203b6 --- /dev/null +++ b/hermit/usr/xray/tools/conv2kcg.py @@ -0,0 +1,322 @@ +#!/usr/bin/env python3 + +"""Copyright (c) 2016, Daniel Krebs, RWTH Aachen University + +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""" + +import re +import logging +import pprint +import sys +import os + +if sys.hexversion < 0x03040000: + raise Exception("At least Python 3.4.x is required") +else: + from enum import Enum, unique + + +class CallTree: + def __init__(self, funcName, funcAddr, totalTicks): + self.name = funcName + self.addr = funcAddr + self.ticks = totalTicks + + self.calls = [] + + def call(self, funcName, funcAddr, totalTicks): + callee = CallTree(funcName, funcAddr, totalTicks) + self.calls.append(callee) + return callee + + def toString(self, caller, depth): + indent = ' ' * depth + out = "%s%s [%d]\n" % (indent, caller.name, caller.ticks) + for callee in caller.calls: + out += " %s%s" % (indent, self.toString(callee, depth + 1)) + return out + + def __repr__(self): + return self.toString(self, 0) + + +class Frame: + def __init__(self, name, totalTicks, captureSize): + self.name = name + self.totalTicks = totalTicks + self.captureSize = captureSize + + self.callTree = CallTree('_root_', '0x0', self.totalTicks) + + def call(self, *args, **kwargs): + return self.callTree.call(*args, **kwargs) + + def __repr__(self): + return str(self.callTree) + + +class ParsingState: + def __init__(self): + self.last_call_depth = 0 + self.callers = {} + self.call_count = {} + + # global dict that stores all frames + self.frames = {} + + +# 0x008D3240 156321813 100.0 benchmark +frameCallLineRegex = re.compile('(?P
0x[0-9A-F]+)\s+(?P\d+)\s+(?P\d+\.\d+) (?P\s*)(?P[\w\(\)]+)\s*(?P.*)') + +# label PARALLEL +frameStartRegex = re.compile('label (?P