Files
clang-p2996/lldb/test/API/python_api/disassemble-raw-data/TestDisassembleRawData.py
Jonas Devlieghere a69f78b080 [lldb] Add syntax color highlighting for disassembly
Add support for syntax color highlighting disassembly in LLDB. This
patch relies on 77d1032516, which introduces support for syntax
highlighting in MC.

Currently only AArch64 and X86 have color support, but other interested
backends can adopt WithColor in their respective MCInstPrinter.

Differential revision: https://reviews.llvm.org/D159164
2023-09-01 14:47:45 -07:00

87 lines
3.8 KiB
Python

"""
Use lldb Python API to disassemble raw machine code bytes
"""
import re
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class DisassembleRawDataTestCase(TestBase):
@no_debug_info_test
@skipIfRemote
def test_disassemble_raw_data(self):
"""Test disassembling raw bytes with the API."""
# Create a target from the debugger.
arch = self.getArchitecture()
if re.match("mips*el", arch):
target = self.dbg.CreateTargetWithFileAndTargetTriple("", "mipsel")
raw_bytes = bytearray([0x21, 0xF0, 0xA0, 0x03])
elif re.match("mips", arch):
target = self.dbg.CreateTargetWithFileAndTargetTriple("", "mips")
raw_bytes = bytearray([0x03, 0xA0, 0xF0, 0x21])
elif re.match("powerpc64le", arch):
target = self.dbg.CreateTargetWithFileAndTargetTriple("", "powerpc64le")
raw_bytes = bytearray([0x00, 0x00, 0x80, 0x38])
elif arch in ("aarch64", "arm64"):
target = self.dbg.CreateTargetWithFileAndTargetTriple("", "aarch64")
raw_bytes = bytearray([0x60, 0x0C, 0x80, 0x52])
elif arch == "arm":
target = self.dbg.CreateTargetWithFileAndTargetTriple("", "arm")
raw_bytes = bytearray([0x63, 0x30, 0xA0, 0xE3])
else:
target = self.dbg.CreateTargetWithFileAndTargetTriple("", "x86_64")
raw_bytes = bytearray([0x48, 0x89, 0xE5])
self.assertTrue(target, VALID_TARGET)
insts = target.GetInstructions(lldb.SBAddress(0, target), raw_bytes)
inst = insts.GetInstructionAtIndex(0)
if self.TraceOn():
print()
print("Raw bytes: ", [hex(x) for x in raw_bytes])
print("Disassembled%s" % str(inst))
if re.match("mips", arch):
self.assertEqual(inst.GetMnemonic(target), "move")
self.assertEqual(inst.GetOperands(target), "$" + "fp, " + "$" + "sp")
self.assertEqual(
inst.GetControlFlowKind(target), lldb.eInstructionControlFlowKindUnknown
)
elif re.match("powerpc64le", arch):
self.assertEqual(inst.GetMnemonic(target), "li")
self.assertEqual(inst.GetOperands(target), "4, 0")
self.assertEqual(
inst.GetControlFlowKind(target), lldb.eInstructionControlFlowKindUnknown
)
elif arch in ("aarch64", "arm64"):
self.assertEqual(inst.GetMnemonic(target), "mov")
self.assertEqual(inst.GetOperands(target), "w0, #0x63")
self.assertEqual(inst.GetComment(target), "=99 ")
self.assertEqual(
inst.GetControlFlowKind(target), lldb.eInstructionControlFlowKindUnknown
)
# Make sure that using colors doesn't affect the output here.
res = lldb.SBCommandReturnObject()
ci = self.dbg.GetCommandInterpreter()
ci.HandleCommand("settings set use-color true", res)
self.assertEqual(inst.GetOperands(target), "w0, #0x63")
self.assertEqual(inst.GetMnemonic(target), "mov")
self.assertEqual(inst.GetComment(target), "=99 ")
ci.HandleCommand("settings set use-color false", res)
elif arch == "arm":
self.assertEqual(inst.GetMnemonic(target), "mov")
self.assertEqual(inst.GetOperands(target), "r3, #99")
self.assertEqual(
inst.GetControlFlowKind(target), lldb.eInstructionControlFlowKindUnknown
)
else:
self.assertEqual(inst.GetMnemonic(target), "movq")
self.assertEqual(inst.GetOperands(target), "%" + "rsp, " + "%" + "rbp")
self.assertEqual(
inst.GetControlFlowKind(target), lldb.eInstructionControlFlowKindOther
)