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