24709a62ce
Adds a tool which enables annotation of the disassembly of bytecode handlers based on perf output. BUG=4899 LOG=N Review-Url: https://codereview.chromium.org/1945673002 Cr-Commit-Position: refs/heads/master@{#36145}
86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
# 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.
|
|
|
|
import StringIO
|
|
import unittest
|
|
import linux_perf_bytecode_annotate as bytecode_annotate
|
|
|
|
|
|
PERF_SCRIPT_OUTPUT = """
|
|
# This line is a comment
|
|
# This should be ignored too
|
|
#
|
|
# cdefab01 aRandomSymbol::Name(to, be, ignored)
|
|
|
|
00000000 firstSymbol
|
|
00000123 secondSymbol
|
|
|
|
01234567 foo
|
|
abcdef76 BytecodeHandler:bar+0x12
|
|
76543210 baz
|
|
abcdef76 BytecodeHandler:bar+0x16
|
|
76543210 baz
|
|
|
|
01234567 foo
|
|
abcdef76 BytecodeHandler:foo+0x1
|
|
76543210 baz
|
|
abcdef76 BytecodeHandler:bar+0x2
|
|
76543210 bar
|
|
|
|
abcdef76 BytecodeHandler:bar+0x19
|
|
|
|
abcdef76 BytecodeHandler:bar+0x12
|
|
|
|
abcdef76 BytecodeHandler:bar+0x12
|
|
"""
|
|
|
|
|
|
D8_CODEGEN_OUTPUT = """
|
|
kind = BYTECODE_HANDLER
|
|
name = foo
|
|
compiler = turbofan
|
|
Instructions (size = 3)
|
|
0x3101394a3c0 0 55 push rbp
|
|
0x3101394a3c1 1 ffe3 jmp rbx
|
|
|
|
kind = BYTECODE_HANDLER
|
|
name = bar
|
|
compiler = turbofan
|
|
Instructions (size = 5)
|
|
0x3101394b3c0 0 55 push rbp
|
|
0x3101394b3c1 1 4883c428 REX.W addq rsp,0x28
|
|
# Unexpected comment
|
|
0x3101394b3c5 5 ffe3 jmp rbx
|
|
|
|
kind = BYTECODE_HANDLER
|
|
name = baz
|
|
compiler = turbofan
|
|
Instructions (size = 5)
|
|
0x3101394c3c0 0 55 push rbp
|
|
0x3101394c3c1 1 4883c428 REX.W addq rsp,0x28
|
|
0x3101394c3c5 5 ffe3 jmp rbx
|
|
"""
|
|
|
|
|
|
class LinuxPerfBytecodeAnnotateTest(unittest.TestCase):
|
|
|
|
def test_bytecode_offset_generator(self):
|
|
perf_stream = StringIO.StringIO(PERF_SCRIPT_OUTPUT)
|
|
offsets = list(
|
|
bytecode_annotate.bytecode_offset_generator(perf_stream, "bar"))
|
|
self.assertListEqual(offsets, [18, 25, 18, 18])
|
|
|
|
def test_bytecode_disassembly_generator(self):
|
|
codegen_stream = StringIO.StringIO(D8_CODEGEN_OUTPUT)
|
|
disassembly = list(
|
|
bytecode_annotate.bytecode_disassembly_generator(codegen_stream, "bar"))
|
|
self.assertListEqual(disassembly, [
|
|
"0x3101394b3c0 0 55 push rbp",
|
|
"0x3101394b3c1 1 4883c428 REX.W addq rsp,0x28",
|
|
"0x3101394b3c5 5 ffe3 jmp rbx"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|