from __future__ import print_function import lldb from lldbsuite.test.lldbtest import * from lldbsuite.test.decorators import * from gdbclientutils import * class TestNestedRegDefinitions(GDBRemoteTestBase): @skipIfXmlSupportMissing @skipIfRemote def test(self): """ Test lldb's parsing of the tag in the target.xml register description packet. """ class MyResponder(MockGDBServerResponder): def qXferRead(self, obj, annex, offset, length): if annex == "target.xml": return """i386:x86-64""", False if annex == "i386-64bit.xml": return """ """, False if annex == "i386-64bit-core.xml": return """ """, False if annex == "i386-64bit-sse.xml": return """ """, False return None, False def readRegister(self, regnum): return "" def readRegisters(self): return "0600000000000000c0b7c00080fffffff021c60080ffffff1a00000000000000020000000000000078b7c00080ffffff203f8ca090ffffff103f8ca090ffffff3025990a80ffffff809698000000000070009f0a80ffffff020000000000000000eae10080ffffff00000000000000001822d74f1a00000078b7c00080ffffff0e12410080ffff004602000008000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000" def haltReason(self): return "T02thread:dead;threads:dead;" def qfThreadInfo(self): return "mdead" def qC(self): return "" def qSupported(self, client_supported): return "PacketSize=4000;qXfer:features:read+" def QThreadSuffixSupported(self): return "OK" def QListThreadsInStopReply(self): return "OK" self.server.responder = MyResponder() if self.TraceOn(): self.runCmd("log enable gdb-remote packets") self.addTearDownHook( lambda: self.runCmd("log disable gdb-remote packets")) target = self.dbg.CreateTargetWithFileAndArch(None, None) process = self.connect(target) if self.TraceOn(): interp = self.dbg.GetCommandInterpreter() result = lldb.SBCommandReturnObject() interp.HandleCommand("target list", result) print(result.GetOutput()) rip_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("rip") self.assertEqual(rip_valobj.GetValueAsUnsigned(), 0x00ffff800041120e) r15_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("r15") self.assertEqual(r15_valobj.GetValueAsUnsigned(), 0xffffff8000c0b778) mxcsr_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("mxcsr") self.assertEqual(mxcsr_valobj.GetValueAsUnsigned(), 0x00001f80) gpr_reg_set_name = process.GetThreadAtIndex(0).GetFrameAtIndex(0).GetRegisters().GetValueAtIndex(0).GetName() self.assertEqual(gpr_reg_set_name, "general") float_reg_set_name = process.GetThreadAtIndex(0).GetFrameAtIndex(0).GetRegisters().GetValueAtIndex(1).GetName() self.assertEqual(float_reg_set_name, "float") vector_reg_set_name = process.GetThreadAtIndex(0).GetFrameAtIndex(0).GetRegisters().GetValueAtIndex(2).GetName() self.assertEqual(vector_reg_set_name, "vector") if self.TraceOn(): print("rip is 0x%x" % rip_valobj.GetValueAsUnsigned()) print("r15 is 0x%x" % r15_valobj.GetValueAsUnsigned()) print("mxcsr is 0x%x" % mxcsr_valobj.GetValueAsUnsigned())