| # Copyright 2016 the V8 project authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # for py2/py3 compatibility |
| from __future__ import print_function |
| |
| import os |
| import sys |
| import json |
| import re |
| import argparse |
| |
| sys.path.append(os.environ['PERF_EXEC_PATH'] + \ |
| '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') |
| |
| from perf_trace_context import * |
| from Core import * |
| |
| def trace_begin(): |
| json_obj['eventCounts'] = {} |
| prog = re.compile(r'0x[0-9a-fA-F]+') |
| for phase in reversed(json_obj['phases']): |
| if phase['name'] == "disassembly": |
| for line in phase['data'].splitlines(): |
| result = re.match(prog, line) |
| if result: |
| known_addrs.add(result.group(0)) |
| |
| def trace_end(): |
| print(json.dumps(json_obj)) |
| |
| def process_event(param_dict): |
| addr = "0x%x" % int(param_dict['sample']['ip']) |
| |
| # Only count samples that belong to the function |
| if addr not in known_addrs: |
| return |
| |
| ev_name = param_dict['ev_name'] |
| if ev_name not in json_obj['eventCounts']: |
| json_obj['eventCounts'][ev_name] = {} |
| if addr not in json_obj['eventCounts'][ev_name]: |
| json_obj['eventCounts'][ev_name][addr] = 0 |
| json_obj['eventCounts'][ev_name][addr] += 1 |
| |
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser( |
| description="Perf script to merge profiling data with turbofan compiler " |
| "traces.") |
| parser.add_argument("file_name", metavar="JSON File", |
| help="turbo trace json file.") |
| |
| args = parser.parse_args() |
| |
| with open(args.file_name, 'r') as json_file: |
| json_obj = json.load(json_file) |
| |
| known_addrs = set() |