xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestNestedRegDefinitions.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
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
799451b44SJordan Rupprecht
8*2238dcc3SJonas Devlieghereclass TestNestedRegDefinitions(GDBRemoteTestBase):
999451b44SJordan Rupprecht    @skipIfXmlSupportMissing
1099451b44SJordan Rupprecht    @skipIfRemote
1199451b44SJordan Rupprecht    def test(self):
1299451b44SJordan Rupprecht        """
1399451b44SJordan Rupprecht        Test lldb's parsing of the <architecture> tag in the target.xml register
1499451b44SJordan Rupprecht        description packet.
1599451b44SJordan Rupprecht        """
1699451b44SJordan Rupprecht
17*2238dcc3SJonas Devlieghere        class MyResponder(MockGDBServerResponder):
1899451b44SJordan Rupprecht            def qXferRead(self, obj, annex, offset, length):
1999451b44SJordan Rupprecht                if annex == "target.xml":
20*2238dcc3SJonas Devlieghere                    return (
21*2238dcc3SJonas Devlieghere                        """<?xml version="1.0"?><!DOCTYPE target SYSTEM "gdb-target.dtd"><target><architecture>i386:x86-64</architecture><xi:include href="i386-64bit.xml"/></target>""",
22*2238dcc3SJonas Devlieghere                        False,
23*2238dcc3SJonas Devlieghere                    )
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht                if annex == "i386-64bit.xml":
26*2238dcc3SJonas Devlieghere                    return (
27*2238dcc3SJonas Devlieghere                        """<?xml version="1.0"?>
2899451b44SJordan Rupprecht<!-- Copyright (C) 2010-2017 Free Software Foundation, Inc.
2999451b44SJordan Rupprecht
3099451b44SJordan Rupprecht     Copying and distribution of this file, with or without modification,
3199451b44SJordan Rupprecht     are permitted in any medium without royalty provided the copyright
3299451b44SJordan Rupprecht     notice and this notice are preserved.  -->
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht<!-- I386 64bit -->
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht<!DOCTYPE target SYSTEM "gdb-target.dtd">
3799451b44SJordan Rupprecht<feature name="org.gnu.gdb.i386.64bit">
3899451b44SJordan Rupprecht  <xi:include href="i386-64bit-core.xml"/>
3999451b44SJordan Rupprecht  <xi:include href="i386-64bit-sse.xml"/>
40*2238dcc3SJonas Devlieghere</feature>""",
41*2238dcc3SJonas Devlieghere                        False,
42*2238dcc3SJonas Devlieghere                    )
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht                if annex == "i386-64bit-core.xml":
45*2238dcc3SJonas Devlieghere                    return (
46*2238dcc3SJonas Devlieghere                        """<?xml version="1.0"?>
4799451b44SJordan Rupprecht<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc.
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht     Copying and distribution of this file, with or without modification,
5099451b44SJordan Rupprecht     are permitted in any medium without royalty provided the copyright
5199451b44SJordan Rupprecht     notice and this notice are preserved.  -->
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht<!DOCTYPE feature SYSTEM "gdb-target.dtd">
5499451b44SJordan Rupprecht<feature name="org.gnu.gdb.i386.core">
5599451b44SJordan Rupprecht  <flags id="i386_eflags" size="4">
5699451b44SJordan Rupprecht    <field name="CF" start="0" end="0"/>
5799451b44SJordan Rupprecht    <field name="" start="1" end="1"/>
5899451b44SJordan Rupprecht    <field name="PF" start="2" end="2"/>
5999451b44SJordan Rupprecht    <field name="AF" start="4" end="4"/>
6099451b44SJordan Rupprecht    <field name="ZF" start="6" end="6"/>
6199451b44SJordan Rupprecht    <field name="SF" start="7" end="7"/>
6299451b44SJordan Rupprecht    <field name="TF" start="8" end="8"/>
6399451b44SJordan Rupprecht    <field name="IF" start="9" end="9"/>
6499451b44SJordan Rupprecht    <field name="DF" start="10" end="10"/>
6599451b44SJordan Rupprecht    <field name="OF" start="11" end="11"/>
6699451b44SJordan Rupprecht    <field name="NT" start="14" end="14"/>
6799451b44SJordan Rupprecht    <field name="RF" start="16" end="16"/>
6899451b44SJordan Rupprecht    <field name="VM" start="17" end="17"/>
6999451b44SJordan Rupprecht    <field name="AC" start="18" end="18"/>
7099451b44SJordan Rupprecht    <field name="VIF" start="19" end="19"/>
7199451b44SJordan Rupprecht    <field name="VIP" start="20" end="20"/>
7299451b44SJordan Rupprecht    <field name="ID" start="21" end="21"/>
7399451b44SJordan Rupprecht  </flags>
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht  <reg name="rax" bitsize="64" type="int64"/>
7699451b44SJordan Rupprecht  <reg name="rbx" bitsize="64" type="int64"/>
7799451b44SJordan Rupprecht  <reg name="rcx" bitsize="64" type="int64"/>
7899451b44SJordan Rupprecht  <reg name="rdx" bitsize="64" type="int64"/>
7999451b44SJordan Rupprecht  <reg name="rsi" bitsize="64" type="int64"/>
8099451b44SJordan Rupprecht  <reg name="rdi" bitsize="64" type="int64"/>
8199451b44SJordan Rupprecht  <reg name="rbp" bitsize="64" type="data_ptr"/>
8299451b44SJordan Rupprecht  <reg name="rsp" bitsize="64" type="data_ptr"/>
8399451b44SJordan Rupprecht  <reg name="r8" bitsize="64" type="int64"/>
8499451b44SJordan Rupprecht  <reg name="r9" bitsize="64" type="int64"/>
8599451b44SJordan Rupprecht  <reg name="r10" bitsize="64" type="int64"/>
8699451b44SJordan Rupprecht  <reg name="r11" bitsize="64" type="int64"/>
8799451b44SJordan Rupprecht  <reg name="r12" bitsize="64" type="int64"/>
8899451b44SJordan Rupprecht  <reg name="r13" bitsize="64" type="int64"/>
8999451b44SJordan Rupprecht  <reg name="r14" bitsize="64" type="int64"/>
9099451b44SJordan Rupprecht  <reg name="r15" bitsize="64" type="int64"/>
9199451b44SJordan Rupprecht
9299451b44SJordan Rupprecht  <reg name="rip" bitsize="64" type="code_ptr"/>
9399451b44SJordan Rupprecht  <reg name="eflags" bitsize="32" type="i386_eflags"/>
9499451b44SJordan Rupprecht  <reg name="cs" bitsize="32" type="int32"/>
9599451b44SJordan Rupprecht  <reg name="ss" bitsize="32" type="int32"/>
9699451b44SJordan Rupprecht  <reg name="ds" bitsize="32" type="int32"/>
9799451b44SJordan Rupprecht  <reg name="es" bitsize="32" type="int32"/>
9899451b44SJordan Rupprecht  <reg name="fs" bitsize="32" type="int32"/>
9999451b44SJordan Rupprecht  <reg name="gs" bitsize="32" type="int32"/>
10099451b44SJordan Rupprecht
10199451b44SJordan Rupprecht  <reg name="st0" bitsize="80" type="i387_ext"/>
10299451b44SJordan Rupprecht  <reg name="st1" bitsize="80" type="i387_ext"/>
10399451b44SJordan Rupprecht  <reg name="st2" bitsize="80" type="i387_ext"/>
10499451b44SJordan Rupprecht  <reg name="st3" bitsize="80" type="i387_ext"/>
10599451b44SJordan Rupprecht  <reg name="st4" bitsize="80" type="i387_ext"/>
10699451b44SJordan Rupprecht  <reg name="st5" bitsize="80" type="i387_ext"/>
10799451b44SJordan Rupprecht  <reg name="st6" bitsize="80" type="i387_ext"/>
10899451b44SJordan Rupprecht  <reg name="st7" bitsize="80" type="i387_ext"/>
10999451b44SJordan Rupprecht
11099451b44SJordan Rupprecht  <reg name="fctrl" bitsize="32" type="int" group="float"/>
11199451b44SJordan Rupprecht  <reg name="fstat" bitsize="32" type="int" group="float"/>
11299451b44SJordan Rupprecht  <reg name="ftag" bitsize="32" type="int" group="float"/>
11399451b44SJordan Rupprecht  <reg name="fiseg" bitsize="32" type="int" group="float"/>
11499451b44SJordan Rupprecht  <reg name="fioff" bitsize="32" type="int" group="float"/>
11599451b44SJordan Rupprecht  <reg name="foseg" bitsize="32" type="int" group="float"/>
11699451b44SJordan Rupprecht  <reg name="fooff" bitsize="32" type="int" group="float"/>
11799451b44SJordan Rupprecht  <reg name="fop" bitsize="32" type="int" group="float"/>
118*2238dcc3SJonas Devlieghere</feature>""",
119*2238dcc3SJonas Devlieghere                        False,
120*2238dcc3SJonas Devlieghere                    )
12199451b44SJordan Rupprecht
12299451b44SJordan Rupprecht                if annex == "i386-64bit-sse.xml":
123*2238dcc3SJonas Devlieghere                    return (
124*2238dcc3SJonas Devlieghere                        """<?xml version="1.0"?>
12599451b44SJordan Rupprecht<!-- Copyright (C) 2010-2017 Free Software Foundation, Inc.
12699451b44SJordan Rupprecht
12799451b44SJordan Rupprecht     Copying and distribution of this file, with or without modification,
12899451b44SJordan Rupprecht     are permitted in any medium without royalty provided the copyright
12999451b44SJordan Rupprecht     notice and this notice are preserved.  -->
13099451b44SJordan Rupprecht
13199451b44SJordan Rupprecht<!DOCTYPE feature SYSTEM "gdb-target.dtd">
13299451b44SJordan Rupprecht<feature name="org.gnu.gdb.i386.64bit.sse">
13399451b44SJordan Rupprecht  <vector id="v4f" type="ieee_single" count="4"/>
13499451b44SJordan Rupprecht  <vector id="v2d" type="ieee_double" count="2"/>
13599451b44SJordan Rupprecht  <vector id="v16i8" type="int8" count="16"/>
13699451b44SJordan Rupprecht  <vector id="v8i16" type="int16" count="8"/>
13799451b44SJordan Rupprecht  <vector id="v4i32" type="int32" count="4"/>
13899451b44SJordan Rupprecht  <vector id="v2i64" type="int64" count="2"/>
13999451b44SJordan Rupprecht  <union id="vec128">
14099451b44SJordan Rupprecht    <field name="v4_float" type="v4f"/>
14199451b44SJordan Rupprecht    <field name="v2_double" type="v2d"/>
14299451b44SJordan Rupprecht    <field name="v16_int8" type="v16i8"/>
14399451b44SJordan Rupprecht    <field name="v8_int16" type="v8i16"/>
14499451b44SJordan Rupprecht    <field name="v4_int32" type="v4i32"/>
14599451b44SJordan Rupprecht    <field name="v2_int64" type="v2i64"/>
14699451b44SJordan Rupprecht    <field name="uint128" type="uint128"/>
14799451b44SJordan Rupprecht  </union>
14899451b44SJordan Rupprecht  <flags id="i386_mxcsr" size="4">
14999451b44SJordan Rupprecht    <field name="IE" start="0" end="0"/>
15099451b44SJordan Rupprecht    <field name="DE" start="1" end="1"/>
15199451b44SJordan Rupprecht    <field name="ZE" start="2" end="2"/>
15299451b44SJordan Rupprecht    <field name="OE" start="3" end="3"/>
15399451b44SJordan Rupprecht    <field name="UE" start="4" end="4"/>
15499451b44SJordan Rupprecht    <field name="PE" start="5" end="5"/>
15599451b44SJordan Rupprecht    <field name="DAZ" start="6" end="6"/>
15699451b44SJordan Rupprecht    <field name="IM" start="7" end="7"/>
15799451b44SJordan Rupprecht    <field name="DM" start="8" end="8"/>
15899451b44SJordan Rupprecht    <field name="ZM" start="9" end="9"/>
15999451b44SJordan Rupprecht    <field name="OM" start="10" end="10"/>
16099451b44SJordan Rupprecht    <field name="UM" start="11" end="11"/>
16199451b44SJordan Rupprecht    <field name="PM" start="12" end="12"/>
16299451b44SJordan Rupprecht    <field name="FZ" start="15" end="15"/>
16399451b44SJordan Rupprecht  </flags>
16499451b44SJordan Rupprecht
16599451b44SJordan Rupprecht  <reg name="xmm0" bitsize="128" type="vec128" regnum="40"/>
16699451b44SJordan Rupprecht  <reg name="xmm1" bitsize="128" type="vec128"/>
16799451b44SJordan Rupprecht  <reg name="xmm2" bitsize="128" type="vec128"/>
16899451b44SJordan Rupprecht  <reg name="xmm3" bitsize="128" type="vec128"/>
16999451b44SJordan Rupprecht  <reg name="xmm4" bitsize="128" type="vec128"/>
17099451b44SJordan Rupprecht  <reg name="xmm5" bitsize="128" type="vec128"/>
17199451b44SJordan Rupprecht  <reg name="xmm6" bitsize="128" type="vec128"/>
17299451b44SJordan Rupprecht  <reg name="xmm7" bitsize="128" type="vec128"/>
17399451b44SJordan Rupprecht  <reg name="xmm8" bitsize="128" type="vec128"/>
17499451b44SJordan Rupprecht  <reg name="xmm9" bitsize="128" type="vec128"/>
17599451b44SJordan Rupprecht  <reg name="xmm10" bitsize="128" type="vec128"/>
17699451b44SJordan Rupprecht  <reg name="xmm11" bitsize="128" type="vec128"/>
17799451b44SJordan Rupprecht  <reg name="xmm12" bitsize="128" type="vec128"/>
17899451b44SJordan Rupprecht  <reg name="xmm13" bitsize="128" type="vec128"/>
17999451b44SJordan Rupprecht  <reg name="xmm14" bitsize="128" type="vec128"/>
18099451b44SJordan Rupprecht  <reg name="xmm15" bitsize="128" type="vec128"/>
18199451b44SJordan Rupprecht
18299451b44SJordan Rupprecht  <reg name="mxcsr" bitsize="32" type="i386_mxcsr" group="vector"/>
183*2238dcc3SJonas Devlieghere</feature>""",
184*2238dcc3SJonas Devlieghere                        False,
185*2238dcc3SJonas Devlieghere                    )
18699451b44SJordan Rupprecht
18799451b44SJordan Rupprecht                return None, False
18899451b44SJordan Rupprecht
18999451b44SJordan Rupprecht            def readRegister(self, regnum):
19099451b44SJordan Rupprecht                return ""
19199451b44SJordan Rupprecht
19299451b44SJordan Rupprecht            def readRegisters(self):
19399451b44SJordan Rupprecht                return "0600000000000000c0b7c00080fffffff021c60080ffffff1a00000000000000020000000000000078b7c00080ffffff203f8ca090ffffff103f8ca090ffffff3025990a80ffffff809698000000000070009f0a80ffffff020000000000000000eae10080ffffff00000000000000001822d74f1a00000078b7c00080ffffff0e12410080ffff004602000008000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000"
19499451b44SJordan Rupprecht
19599451b44SJordan Rupprecht            def haltReason(self):
19699451b44SJordan Rupprecht                return "T02thread:dead;threads:dead;"
19799451b44SJordan Rupprecht
19899451b44SJordan Rupprecht            def qfThreadInfo(self):
19999451b44SJordan Rupprecht                return "mdead"
20099451b44SJordan Rupprecht
20199451b44SJordan Rupprecht            def qC(self):
20299451b44SJordan Rupprecht                return ""
20399451b44SJordan Rupprecht
20499451b44SJordan Rupprecht            def qSupported(self, client_supported):
20599451b44SJordan Rupprecht                return "PacketSize=4000;qXfer:features:read+"
20699451b44SJordan Rupprecht
20799451b44SJordan Rupprecht            def QThreadSuffixSupported(self):
20899451b44SJordan Rupprecht                return "OK"
20999451b44SJordan Rupprecht
21099451b44SJordan Rupprecht            def QListThreadsInStopReply(self):
21199451b44SJordan Rupprecht                return "OK"
21299451b44SJordan Rupprecht
21399451b44SJordan Rupprecht        self.server.responder = MyResponder()
21499451b44SJordan Rupprecht        if self.TraceOn():
21599451b44SJordan Rupprecht            self.runCmd("log enable gdb-remote packets")
216*2238dcc3SJonas Devlieghere            self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets"))
21799451b44SJordan Rupprecht
21899451b44SJordan Rupprecht        target = self.dbg.CreateTargetWithFileAndArch(None, None)
21999451b44SJordan Rupprecht
22099451b44SJordan Rupprecht        process = self.connect(target)
22199451b44SJordan Rupprecht
22299451b44SJordan Rupprecht        if self.TraceOn():
22399451b44SJordan Rupprecht            interp = self.dbg.GetCommandInterpreter()
22499451b44SJordan Rupprecht            result = lldb.SBCommandReturnObject()
22599451b44SJordan Rupprecht            interp.HandleCommand("target list", result)
22699451b44SJordan Rupprecht            print(result.GetOutput())
22799451b44SJordan Rupprecht
22899451b44SJordan Rupprecht        rip_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("rip")
229*2238dcc3SJonas Devlieghere        self.assertEqual(rip_valobj.GetValueAsUnsigned(), 0x00FFFF800041120E)
23099451b44SJordan Rupprecht
23199451b44SJordan Rupprecht        r15_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("r15")
232*2238dcc3SJonas Devlieghere        self.assertEqual(r15_valobj.GetValueAsUnsigned(), 0xFFFFFF8000C0B778)
23399451b44SJordan Rupprecht
234*2238dcc3SJonas Devlieghere        mxcsr_valobj = (
235*2238dcc3SJonas Devlieghere            process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("mxcsr")
236*2238dcc3SJonas Devlieghere        )
237*2238dcc3SJonas Devlieghere        self.assertEqual(mxcsr_valobj.GetValueAsUnsigned(), 0x00001F80)
23899451b44SJordan Rupprecht
239*2238dcc3SJonas Devlieghere        gpr_reg_set_name = (
240*2238dcc3SJonas Devlieghere            process.GetThreadAtIndex(0)
241*2238dcc3SJonas Devlieghere            .GetFrameAtIndex(0)
242*2238dcc3SJonas Devlieghere            .GetRegisters()
243*2238dcc3SJonas Devlieghere            .GetValueAtIndex(0)
244*2238dcc3SJonas Devlieghere            .GetName()
245*2238dcc3SJonas Devlieghere        )
24699451b44SJordan Rupprecht        self.assertEqual(gpr_reg_set_name, "general")
24799451b44SJordan Rupprecht
248*2238dcc3SJonas Devlieghere        float_reg_set_name = (
249*2238dcc3SJonas Devlieghere            process.GetThreadAtIndex(0)
250*2238dcc3SJonas Devlieghere            .GetFrameAtIndex(0)
251*2238dcc3SJonas Devlieghere            .GetRegisters()
252*2238dcc3SJonas Devlieghere            .GetValueAtIndex(1)
253*2238dcc3SJonas Devlieghere            .GetName()
254*2238dcc3SJonas Devlieghere        )
25599451b44SJordan Rupprecht        self.assertEqual(float_reg_set_name, "float")
25699451b44SJordan Rupprecht
257*2238dcc3SJonas Devlieghere        vector_reg_set_name = (
258*2238dcc3SJonas Devlieghere            process.GetThreadAtIndex(0)
259*2238dcc3SJonas Devlieghere            .GetFrameAtIndex(0)
260*2238dcc3SJonas Devlieghere            .GetRegisters()
261*2238dcc3SJonas Devlieghere            .GetValueAtIndex(2)
262*2238dcc3SJonas Devlieghere            .GetName()
263*2238dcc3SJonas Devlieghere        )
26499451b44SJordan Rupprecht        self.assertEqual(vector_reg_set_name, "vector")
26599451b44SJordan Rupprecht
26699451b44SJordan Rupprecht        if self.TraceOn():
26799451b44SJordan Rupprecht            print("rip is 0x%x" % rip_valobj.GetValueAsUnsigned())
26899451b44SJordan Rupprecht            print("r15 is 0x%x" % r15_valobj.GetValueAsUnsigned())
26999451b44SJordan Rupprecht            print("mxcsr is 0x%x" % mxcsr_valobj.GetValueAsUnsigned())
270