Home | History | Annotate | Download | only in ignition
      1 # Copyright 2016 the V8 project authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import StringIO
      6 import unittest
      7 import linux_perf_bytecode_annotate as bytecode_annotate
      8 
      9 
     10 PERF_SCRIPT_OUTPUT = """
     11 # This line is a comment
     12 # This should be ignored too
     13 #
     14 #    cdefab01  aRandomSymbol::Name(to, be, ignored)
     15 
     16    00000000 firstSymbol
     17    00000123 secondSymbol
     18 
     19    01234567 foo
     20    abcdef76 BytecodeHandler:bar+0x12
     21    76543210 baz
     22    abcdef76 BytecodeHandler:bar+0x16
     23    76543210 baz
     24 
     25    01234567 foo
     26    abcdef76 BytecodeHandler:foo+0x1
     27    76543210 baz
     28    abcdef76 BytecodeHandler:bar+0x2
     29    76543210 bar
     30 
     31    abcdef76 BytecodeHandler:bar+0x19
     32 
     33    abcdef76 BytecodeHandler:bar+0x12
     34 
     35    abcdef76 BytecodeHandler:bar+0x12
     36 """
     37 
     38 
     39 D8_CODEGEN_OUTPUT = """
     40 kind = BYTECODE_HANDLER
     41 name = foo
     42 compiler = turbofan
     43 Instructions (size = 3)
     44 0x3101394a3c0     0  55             push rbp
     45 0x3101394a3c1     1  ffe3           jmp rbx
     46 
     47 kind = BYTECODE_HANDLER
     48 name = bar
     49 compiler = turbofan
     50 Instructions (size = 5)
     51 0x3101394b3c0     0  55             push rbp
     52 0x3101394b3c1     1  4883c428       REX.W addq rsp,0x28
     53 # Unexpected comment
     54 0x3101394b3c5     5  ffe3           jmp rbx
     55 
     56 kind = BYTECODE_HANDLER
     57 name = baz
     58 compiler = turbofan
     59 Instructions (size = 5)
     60 0x3101394c3c0     0  55             push rbp
     61 0x3101394c3c1     1  4883c428       REX.W addq rsp,0x28
     62 0x3101394c3c5     5  ffe3           jmp rbx
     63 """
     64 
     65 
     66 class LinuxPerfBytecodeAnnotateTest(unittest.TestCase):
     67 
     68   def test_bytecode_offset_generator(self):
     69     perf_stream = StringIO.StringIO(PERF_SCRIPT_OUTPUT)
     70     offsets = list(
     71         bytecode_annotate.bytecode_offset_generator(perf_stream, "bar"))
     72     self.assertListEqual(offsets, [18, 25, 18, 18])
     73 
     74   def test_bytecode_disassembly_generator(self):
     75     codegen_stream = StringIO.StringIO(D8_CODEGEN_OUTPUT)
     76     disassembly = list(
     77         bytecode_annotate.bytecode_disassembly_generator(codegen_stream, "bar"))
     78     self.assertListEqual(disassembly, [
     79         "0x3101394b3c0     0  55             push rbp",
     80         "0x3101394b3c1     1  4883c428       REX.W addq rsp,0x28",
     81         "0x3101394b3c5     5  ffe3           jmp rbx"])
     82 
     83 
     84 if __name__ == "__main__":
     85   unittest.main()
     86