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