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