199451b44SJordan Rupprechtfrom __future__ import print_function 299451b44SJordan Rupprechtimport lldb 399451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 533c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import * 633c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtclass MyResponder(MockGDBServerResponder): 999451b44SJordan Rupprecht def qXferRead(self, obj, annex, offset, length): 1099451b44SJordan Rupprecht if annex == "target.xml": 1199451b44SJordan Rupprecht return """<?xml version="1.0"?> 1299451b44SJordan Rupprecht <target version="1.0"> 1399451b44SJordan Rupprecht <architecture>i386:x86-64</architecture> 1499451b44SJordan Rupprecht <feature name="org.gnu.gdb.i386.core"> 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht <flags id="i386_eflags" size="4"> 1799451b44SJordan Rupprecht <field name="CF" start="0" end="0"/> 1899451b44SJordan Rupprecht <field name="" start="1" end="1"/> 1999451b44SJordan Rupprecht <field name="PF" start="2" end="2"/> 2099451b44SJordan Rupprecht <field name="AF" start="4" end="4"/> 2199451b44SJordan Rupprecht <field name="ZF" start="6" end="6"/> 2299451b44SJordan Rupprecht <field name="SF" start="7" end="7"/> 2399451b44SJordan Rupprecht <field name="TF" start="8" end="8"/> 2499451b44SJordan Rupprecht <field name="IF" start="9" end="9"/> 2599451b44SJordan Rupprecht <field name="DF" start="10" end="10"/> 2699451b44SJordan Rupprecht <field name="OF" start="11" end="11"/> 2799451b44SJordan Rupprecht <field name="NT" start="14" end="14"/> 2899451b44SJordan Rupprecht <field name="RF" start="16" end="16"/> 2999451b44SJordan Rupprecht <field name="VM" start="17" end="17"/> 3099451b44SJordan Rupprecht <field name="AC" start="18" end="18"/> 3199451b44SJordan Rupprecht <field name="VIF" start="19" end="19"/> 3299451b44SJordan Rupprecht <field name="VIP" start="20" end="20"/> 3399451b44SJordan Rupprecht <field name="ID" start="21" end="21"/> 3499451b44SJordan Rupprecht </flags> 3599451b44SJordan Rupprecht 3699451b44SJordan Rupprecht <reg name="rax" bitsize="64" regnum="0" type="int" group="general"/> 3799451b44SJordan Rupprecht <reg name="rbx" bitsize="64" regnum="1" type="int" group="general"/> 3899451b44SJordan Rupprecht <reg name="rcx" bitsize="64" regnum="2" type="int" group="general"/> 3999451b44SJordan Rupprecht <reg name="rdx" bitsize="64" regnum="3" type="int" group="general"/> 4099451b44SJordan Rupprecht <reg name="rsi" bitsize="64" regnum="4" type="int" group="general"/> 4199451b44SJordan Rupprecht <reg name="rdi" bitsize="64" regnum="5" type="int" group="general"/> 4299451b44SJordan Rupprecht <reg name="rbp" bitsize="64" regnum="6" type="data_ptr" group="general"/> 4399451b44SJordan Rupprecht <reg name="rsp" bitsize="64" regnum="7" type="data_ptr" group="general"/> 4499451b44SJordan Rupprecht <reg name="r8" bitsize="64" regnum="8" type="int" group="general"/> 4599451b44SJordan Rupprecht <reg name="r9" bitsize="64" regnum="9" type="int" group="general"/> 4699451b44SJordan Rupprecht <reg name="r10" bitsize="64" regnum="10" type="int" group="general"/> 4799451b44SJordan Rupprecht <reg name="r11" bitsize="64" regnum="11" type="int" group="general"/> 4899451b44SJordan Rupprecht <reg name="r12" bitsize="64" regnum="12" type="int" group="general"/> 4999451b44SJordan Rupprecht <reg name="r13" bitsize="64" regnum="13" type="int" group="general"/> 5099451b44SJordan Rupprecht <reg name="r14" bitsize="64" regnum="14" type="int" group="general"/> 5199451b44SJordan Rupprecht <reg name="r15" bitsize="64" regnum="15" type="int" group="general"/> 5299451b44SJordan Rupprecht <reg name="rip" bitsize="64" regnum="16" type="code_ptr" group="general"/> 5399451b44SJordan Rupprecht <reg name="eflags" bitsize="32" regnum="17" type="i386_eflags" group="general"/> 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht <reg name="cs" bitsize="32" regnum="18" type="int" group="general"/> 5699451b44SJordan Rupprecht <reg name="ss" bitsize="32" regnum="19" type="int" group="general"/> 5799451b44SJordan Rupprecht <reg name="ds" bitsize="32" regnum="20" type="int" group="general"/> 5899451b44SJordan Rupprecht <reg name="es" bitsize="32" regnum="21" type="int" group="general"/> 5999451b44SJordan Rupprecht <reg name="fs" bitsize="32" regnum="22" type="int" group="general"/> 6099451b44SJordan Rupprecht <reg name="gs" bitsize="32" regnum="23" type="int" group="general"/> 6199451b44SJordan Rupprecht 6299451b44SJordan Rupprecht <reg name="st0" bitsize="80" regnum="24" type="i387_ext" group="float"/> 6399451b44SJordan Rupprecht <reg name="st1" bitsize="80" regnum="25" type="i387_ext" group="float"/> 6499451b44SJordan Rupprecht <reg name="st2" bitsize="80" regnum="26" type="i387_ext" group="float"/> 6599451b44SJordan Rupprecht <reg name="st3" bitsize="80" regnum="27" type="i387_ext" group="float"/> 6699451b44SJordan Rupprecht <reg name="st4" bitsize="80" regnum="28" type="i387_ext" group="float"/> 6799451b44SJordan Rupprecht <reg name="st5" bitsize="80" regnum="29" type="i387_ext" group="float"/> 6899451b44SJordan Rupprecht <reg name="st6" bitsize="80" regnum="30" type="i387_ext" group="float"/> 6999451b44SJordan Rupprecht <reg name="st7" bitsize="80" regnum="31" type="i387_ext" group="float"/> 7099451b44SJordan Rupprecht 7199451b44SJordan Rupprecht <reg name="fctrl" bitsize="32" regnum="32" type="int" group="float"/> 7299451b44SJordan Rupprecht <reg name="fstat" bitsize="32" regnum="33" type="int" group="float"/> 7399451b44SJordan Rupprecht <reg name="ftag" bitsize="32" regnum="34" type="int" group="float"/> 7499451b44SJordan Rupprecht <reg name="fiseg" bitsize="32" regnum="35" type="int" group="float"/> 7599451b44SJordan Rupprecht <reg name="fioff" bitsize="32" regnum="36" type="int" group="float"/> 7699451b44SJordan Rupprecht <reg name="foseg" bitsize="32" regnum="37" type="int" group="float"/> 7799451b44SJordan Rupprecht <reg name="fooff" bitsize="32" regnum="38" type="int" group="float"/> 7899451b44SJordan Rupprecht <reg name="fop" bitsize="32" regnum="39" type="int" group="float"/> 7999451b44SJordan Rupprecht </feature> 8099451b44SJordan Rupprecht </target>""", False 8199451b44SJordan Rupprecht else: 8299451b44SJordan Rupprecht return None, False 8399451b44SJordan Rupprecht 8499451b44SJordan Rupprecht def qC(self): 8599451b44SJordan Rupprecht return "QC1" 8699451b44SJordan Rupprecht 8799451b44SJordan Rupprecht def haltReason(self): 8899451b44SJordan Rupprecht return "T05thread:00000001;06:9038d60f00700000;07:98b4062680ffffff;10:c0d7bf1b80ffffff;" 8999451b44SJordan Rupprecht 9099451b44SJordan Rupprecht def readRegister(self, register): 9199451b44SJordan Rupprecht regs = {0x0: "00b0060000610000", 9299451b44SJordan Rupprecht 0xa: "68fe471c80ffffff", 9399451b44SJordan Rupprecht 0xc: "60574a1c80ffffff", 9499451b44SJordan Rupprecht 0xd: "18f3042680ffffff", 9599451b44SJordan Rupprecht 0xe: "be8a4d7142000000", 9699451b44SJordan Rupprecht 0xf: "50df471c80ffffff", 9799451b44SJordan Rupprecht 0x10: "c0d7bf1b80ffffff" } 9899451b44SJordan Rupprecht if register in regs: 9999451b44SJordan Rupprecht return regs[register] 10099451b44SJordan Rupprecht else: 10199451b44SJordan Rupprecht return "0000000000000000" 10299451b44SJordan Rupprecht 10399451b44SJordan Rupprechtclass TestTargetXMLArch(GDBRemoteTestBase): 10499451b44SJordan Rupprecht 10599451b44SJordan Rupprecht @skipIfXmlSupportMissing 10699451b44SJordan Rupprecht @expectedFailureAll(archs=["i386"]) 10799451b44SJordan Rupprecht @skipIfRemote 10899451b44SJordan Rupprecht def test(self): 10999451b44SJordan Rupprecht """ 11099451b44SJordan Rupprecht Test lldb's parsing of the <architecture> tag in the target.xml register 11199451b44SJordan Rupprecht description packet. 11299451b44SJordan Rupprecht """ 11399451b44SJordan Rupprecht self.server.responder = MyResponder() 11499451b44SJordan Rupprecht interp = self.dbg.GetCommandInterpreter() 11599451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 11699451b44SJordan Rupprecht if self.TraceOn(): 11799451b44SJordan Rupprecht self.runCmd("log enable gdb-remote packets") 11899451b44SJordan Rupprecht self.addTearDownHook( 11999451b44SJordan Rupprecht lambda: self.runCmd("log disable gdb-remote packets")) 12099451b44SJordan Rupprecht 12199451b44SJordan Rupprecht target = self.dbg.CreateTarget('') 12299451b44SJordan Rupprecht self.assertEqual('', target.GetTriple()) 12399451b44SJordan Rupprecht process = self.connect(target) 12499451b44SJordan Rupprecht if self.TraceOn(): 12599451b44SJordan Rupprecht interp.HandleCommand("target list", result) 12699451b44SJordan Rupprecht print(result.GetOutput()) 12799451b44SJordan Rupprecht self.assertTrue(target.GetTriple().startswith('x86_64-unknown-unknown')) 12899451b44SJordan Rupprecht 12999451b44SJordan Rupprecht @skipIfXmlSupportMissing 13099451b44SJordan Rupprecht @skipIfRemote 131*c4cdf865SDave Lee @skipIfLLVMTargetMissing("X86") 13299451b44SJordan Rupprecht def test_register_augmentation(self): 13399451b44SJordan Rupprecht """ 13499451b44SJordan Rupprecht Test that we correctly associate the register info with the eh_frame 13599451b44SJordan Rupprecht register numbers. 13699451b44SJordan Rupprecht """ 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht target = self.createTarget("basic_eh_frame.yaml") 13999451b44SJordan Rupprecht self.server.responder = MyResponder() 14099451b44SJordan Rupprecht 14199451b44SJordan Rupprecht process = self.connect(target) 14299451b44SJordan Rupprecht lldbutil.expect_state_changes(self, self.dbg.GetListener(), process, 14399451b44SJordan Rupprecht [lldb.eStateStopped]) 14499451b44SJordan Rupprecht self.filecheck("image show-unwind -n foo", __file__, 14599451b44SJordan Rupprecht "--check-prefix=UNWIND") 14699451b44SJordan Rupprecht# UNWIND: eh_frame UnwindPlan: 14799451b44SJordan Rupprecht# UNWIND: row[0]: 0: CFA=rsp+128 => rip=[CFA-8] 148