# 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()