199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtUse lldb Python API to disassemble raw machine code bytes
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtfrom __future__ import print_function
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtfrom io import StringIO
899451b44SJordan Rupprechtimport sys
999451b44SJordan Rupprecht
1099451b44SJordan Rupprechtimport lldb
1199451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1399451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprechtclass Disassemble_VST1_64(TestBase):
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprecht    @no_debug_info_test
1999451b44SJordan Rupprecht    @skipIfLLVMTargetMissing("ARM")
2099451b44SJordan Rupprecht    def test_disassemble_invalid_vst_1_64_raw_data(self):
2199451b44SJordan Rupprecht        """Test disassembling invalid vst1.64 raw bytes with the API."""
2299451b44SJordan Rupprecht        # Create a target from the debugger.
2399451b44SJordan Rupprecht        target = self.dbg.CreateTargetWithFileAndTargetTriple("", "thumbv7-apple-macosx")
2499451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht        raw_bytes = bytearray([0xf0, 0xb5, 0x03, 0xaf,
2799451b44SJordan Rupprecht                               0x2d, 0xe9, 0x00, 0x0d,
2899451b44SJordan Rupprecht                               0xad, 0xf1, 0x40, 0x04,
2999451b44SJordan Rupprecht                               0x24, 0xf0, 0x0f, 0x04,
3099451b44SJordan Rupprecht                               0xa5, 0x46])
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        assembly = """
3399451b44SJordan Rupprecht        push   {r4, r5, r6, r7, lr}
3499451b44SJordan Rupprecht        add    r7, sp, #0xc
3599451b44SJordan Rupprecht        push.w {r8, r10, r11}
3699451b44SJordan Rupprecht        sub.w  r4, sp, #0x40
3799451b44SJordan Rupprecht        bic    r4, r4, #0xf
3899451b44SJordan Rupprecht        mov    sp, r4
3999451b44SJordan Rupprecht        """
4099451b44SJordan Rupprecht        def split(s):
4199451b44SJordan Rupprecht            return [x.strip() for x in s.strip().splitlines()]
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        insts = target.GetInstructions(lldb.SBAddress(), raw_bytes)
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        if self.TraceOn():
4699451b44SJordan Rupprecht            print()
4799451b44SJordan Rupprecht            for i in insts:
4899451b44SJordan Rupprecht                print("Disassembled %s" % str(i))
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        sio = StringIO()
5199451b44SJordan Rupprecht        insts.Print(sio)
5299451b44SJordan Rupprecht        self.assertEqual(split(assembly), split(sio.getvalue()))
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        self.assertEqual(insts.GetSize(), len(split(assembly)))
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        for i,asm in enumerate(split(assembly)):
5799451b44SJordan Rupprecht            inst = insts.GetInstructionAtIndex(i)
5899451b44SJordan Rupprecht            sio = StringIO()
5999451b44SJordan Rupprecht            inst.Print(sio)
6099451b44SJordan Rupprecht            self.assertEqual(asm, sio.getvalue().strip())
6199451b44SJordan Rupprecht
6299451b44SJordan Rupprecht        raw_bytes = bytearray([0x04, 0xf9, 0xed, 0x82])
6399451b44SJordan Rupprecht
6499451b44SJordan Rupprecht        insts = target.GetInstructions(lldb.SBAddress(), raw_bytes)
6599451b44SJordan Rupprecht
6699451b44SJordan Rupprecht        inst = insts.GetInstructionAtIndex(0)
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        if self.TraceOn():
6999451b44SJordan Rupprecht            print()
7099451b44SJordan Rupprecht            print("Raw bytes:    ", [hex(x) for x in raw_bytes])
7199451b44SJordan Rupprecht            print("Disassembled%s" % str(inst))
7299451b44SJordan Rupprecht
73*619e2e09SDave Lee        self.assertEqual(inst.GetMnemonic(target), "vst1.64")
74