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
87 lines
3.8 KiB
Python
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
|
|
)
|