brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.0 KiB · 118f46f Raw
389 lines · python
1"""2Check that lldb falls back to default register layouts when the remote provides3no target XML or does not include registers in the target XML.4 5GPRS are passed to the responder to create register data to send back to lldb.6Registers in SUPPL are virtual registers based on those general ones. The tests7pass __file__ to FileCheck so any prefixes in this Python file will be checked.8"""9 10import lldb11from lldbsuite.test.lldbtest import *12from lldbsuite.test.decorators import *13from lldbsuite.test.gdbclientutils import *14from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase15 16import binascii17from textwrap import dedent18 19 20class MyResponder(MockGDBServerResponder):21    @staticmethod22    def filecheck_to_blob(fc):23        for l in fc.strip().splitlines():24            val = l.split("0x")[1]25            yield binascii.b2a_hex(bytes(reversed(binascii.a2b_hex(val)))).decode()26 27    def __init__(self, architecture, has_target_xml, reg_data, halt_reason):28        super().__init__()29        self.architecture = architecture30        self.has_target_xml = has_target_xml31        self.reg_data = "".join(self.filecheck_to_blob(reg_data))32        self.halt_reason = halt_reason33 34    def readRegister(self, regnum):35        return ""36 37    def readRegisters(self):38        return self.reg_data39 40    def haltReason(self):41        return self.halt_reason42 43    def qXferRead(self, obj, annex, offset, length):44        if self.has_target_xml and annex == "target.xml":45            return (46                dedent(47                    f"""\48                    <?xml version="1.0"?>49                    <target version="1.0">50                      <architecture>{self.architecture}</architecture>51                    </target>"""52                ),53                False,54            )55 56        return None, False57 58 59class TestGDBServerTargetXML(GDBRemoteTestBase):60    def check_x86_64_regs(self, has_target_xml):61        GPRS = """62CHECK-AMD64-DAG: rax = 0x080706050403020163CHECK-AMD64-DAG: rbx = 0x181716151413121164CHECK-AMD64-DAG: rcx = 0x282726252423222165CHECK-AMD64-DAG: rdx = 0x383736353433323166CHECK-AMD64-DAG: rsi = 0x484746454443424167CHECK-AMD64-DAG: rdi = 0x585756555453525168CHECK-AMD64-DAG: rbp = 0x686766656463626169CHECK-AMD64-DAG: rsp = 0x787776757473727170CHECK-AMD64-DAG: r8 = 0x888786858483828171CHECK-AMD64-DAG: r9 = 0x989796959493929172CHECK-AMD64-DAG: r10 = 0xa8a7a6a5a4a3a2a173CHECK-AMD64-DAG: r11 = 0xb8b7b6b5b4b3b2b174CHECK-AMD64-DAG: r12 = 0xc8c7c6c5c4c3c2c175CHECK-AMD64-DAG: r13 = 0xd8d7d6d5d4d3d2d176CHECK-AMD64-DAG: r14 = 0xe8e7e6e5e4e3e2e177CHECK-AMD64-DAG: r15 = 0xf8f7f6f5f4f3f2f178CHECK-AMD64-DAG: rip = 0x100f0e0d0c0b0a0979CHECK-AMD64-DAG: eflags = 0x1c1b1a1980CHECK-AMD64-DAG: cs = 0x2c2b2a2981CHECK-AMD64-DAG: ss = 0x3c3b3a3982"""83 84        SUPPL = """85CHECK-AMD64-DAG: eax = 0x0403020186CHECK-AMD64-DAG: ebx = 0x1413121187CHECK-AMD64-DAG: ecx = 0x2423222188CHECK-AMD64-DAG: edx = 0x3433323189CHECK-AMD64-DAG: esi = 0x4443424190CHECK-AMD64-DAG: edi = 0x5453525191CHECK-AMD64-DAG: ebp = 0x6463626192CHECK-AMD64-DAG: esp = 0x7473727193CHECK-AMD64-DAG: r8d = 0x8483828194CHECK-AMD64-DAG: r9d = 0x9493929195CHECK-AMD64-DAG: r10d = 0xa4a3a2a196CHECK-AMD64-DAG: r11d = 0xb4b3b2b197CHECK-AMD64-DAG: r12d = 0xc4c3c2c198CHECK-AMD64-DAG: r13d = 0xd4d3d2d199CHECK-AMD64-DAG: r14d = 0xe4e3e2e1100CHECK-AMD64-DAG: r15d = 0xf4f3f2f1101 102CHECK-AMD64-DAG: ax = 0x0201103CHECK-AMD64-DAG: bx = 0x1211104CHECK-AMD64-DAG: cx = 0x2221105CHECK-AMD64-DAG: dx = 0x3231106CHECK-AMD64-DAG: si = 0x4241107CHECK-AMD64-DAG: di = 0x5251108CHECK-AMD64-DAG: bp = 0x6261109CHECK-AMD64-DAG: sp = 0x7271110CHECK-AMD64-DAG: r8w = 0x8281111CHECK-AMD64-DAG: r9w = 0x9291112CHECK-AMD64-DAG: r10w = 0xa2a1113CHECK-AMD64-DAG: r11w = 0xb2b1114CHECK-AMD64-DAG: r12w = 0xc2c1115CHECK-AMD64-DAG: r13w = 0xd2d1116CHECK-AMD64-DAG: r14w = 0xe2e1117CHECK-AMD64-DAG: r15w = 0xf2f1118 119CHECK-AMD64-DAG: ah = 0x02120CHECK-AMD64-DAG: bh = 0x12121CHECK-AMD64-DAG: ch = 0x22122CHECK-AMD64-DAG: dh = 0x32123 124CHECK-AMD64-DAG: al = 0x01125CHECK-AMD64-DAG: bl = 0x11126CHECK-AMD64-DAG: cl = 0x21127CHECK-AMD64-DAG: dl = 0x31128CHECK-AMD64-DAG: sil = 0x41129CHECK-AMD64-DAG: dil = 0x51130CHECK-AMD64-DAG: bpl = 0x61131CHECK-AMD64-DAG: spl = 0x71132CHECK-AMD64-DAG: r8l = 0x81133CHECK-AMD64-DAG: r9l = 0x91134CHECK-AMD64-DAG: r10l = 0xa1135CHECK-AMD64-DAG: r11l = 0xb1136CHECK-AMD64-DAG: r12l = 0xc1137CHECK-AMD64-DAG: r13l = 0xd1138CHECK-AMD64-DAG: r14l = 0xe1139CHECK-AMD64-DAG: r15l = 0xf1140"""141 142        self.server.responder = MyResponder(143            "x86-64",144            has_target_xml,145            GPRS,146            "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",147        )148 149        target = self.createTarget("basic_eh_frame.yaml")150        process = self.connect(target)151        lldbutil.expect_state_changes(152            self, self.dbg.GetListener(), process, [lldb.eStateStopped]153        )154 155        # test all registers156        self.filecheck(157            "register read --all",158            __file__,159            filecheck_options="--check-prefix=CHECK-AMD64",160        )161 162        # test generic aliases163        self.match("register read arg4", ["rcx = 0x2827262524232221"])164        self.match("register read arg3", ["rdx = 0x3837363534333231"])165        self.match("register read arg2", ["rsi = 0x4847464544434241"])166        self.match("register read arg1", ["rdi = 0x5857565554535251"])167        self.match("register read fp", ["rbp = 0x6867666564636261"])168        self.match("register read sp", ["rsp = 0x7877767574737271"])169        self.match("register read arg5", ["r8 = 0x8887868584838281"])170        self.match("register read arg6", ["r9 = 0x9897969594939291"])171        self.match("register read pc", ["rip = 0x100f0e0d0c0b0a09"])172        self.match("register read flags", ["eflags = 0x1c1b1a19"])173 174    @skipIfRemote175    @skipIfLLVMTargetMissing("X86")176    def test_x86_64_regs_no_target_xml(self):177        """Test grabbing various x86_64 registers from gdbserver when there178        is no target XML."""179        self.check_x86_64_regs(False)180 181    @skipIfXmlSupportMissing182    @skipIfRemote183    @skipIfLLVMTargetMissing("X86")184    def test_x86_64_regs_no_register_info(self):185        """Test grabbing various x86_64 registers from gdbserver when there186        is target XML but it does not include register info."""187        self.check_x86_64_regs(True)188 189    def check_aarch64_regs(self, has_target_xml):190        GPRS = """191CHECK-AARCH64-DAG: x0 = 0x0001020304050607192CHECK-AARCH64-DAG: x1 = 0x0102030405060708193CHECK-AARCH64-DAG: x2 = 0x0203040506070809194CHECK-AARCH64-DAG: x3 = 0x030405060708090a195CHECK-AARCH64-DAG: x4 = 0x0405060708090a0b196CHECK-AARCH64-DAG: x5 = 0x05060708090a0b0c197CHECK-AARCH64-DAG: x6 = 0x060708090a0b0c0d198CHECK-AARCH64-DAG: x7 = 0x0708090a0b0c0d0e199CHECK-AARCH64-DAG: x8 = 0x08090a0b0c0d0e0f200CHECK-AARCH64-DAG: x9 = 0x090a0b0c0d0e0f10201CHECK-AARCH64-DAG: x10 = 0x0a0b0c0d0e0f1011202CHECK-AARCH64-DAG: x11 = 0x0b0c0d0e0f101112203CHECK-AARCH64-DAG: x12 = 0x0c0d0e0f10111213204CHECK-AARCH64-DAG: x13 = 0x0d0e0f1011121314205CHECK-AARCH64-DAG: x14 = 0x0e0f101112131415206CHECK-AARCH64-DAG: x15 = 0x0f10111213141516207CHECK-AARCH64-DAG: x16 = 0x1011121314151617208CHECK-AARCH64-DAG: x17 = 0x1112131415161718209CHECK-AARCH64-DAG: x18 = 0x1213141516171819210CHECK-AARCH64-DAG: x19 = 0x131415161718191a211CHECK-AARCH64-DAG: x20 = 0x1415161718191a1b212CHECK-AARCH64-DAG: x21 = 0x15161718191a1b1c213CHECK-AARCH64-DAG: x22 = 0x161718191a1b1c1d214CHECK-AARCH64-DAG: x23 = 0x1718191a1b1c1d1e215CHECK-AARCH64-DAG: x24 = 0x18191a1b1c1d1e1f216CHECK-AARCH64-DAG: x25 = 0x191a1b1c1d1e1f20217CHECK-AARCH64-DAG: x26 = 0x1a1b1c1d1e1f2021218CHECK-AARCH64-DAG: x27 = 0x1b1c1d1e1f202122219CHECK-AARCH64-DAG: x28 = 0x1c1d1e1f20212223220CHECK-AARCH64-DAG: x29 = 0x1d1e1f2021222324221CHECK-AARCH64-DAG: x30 = 0x1e1f202122232425222CHECK-AARCH64-DAG: sp = 0x1f20212223242526223CHECK-AARCH64-DAG: pc = 0x2021222324252627224CHECK-AARCH64-DAG: cpsr = 0x21222324225"""226 227        SUPPL = """228CHECK-AARCH64-DAG: w0 = 0x04050607229CHECK-AARCH64-DAG: w1 = 0x05060708230CHECK-AARCH64-DAG: w2 = 0x06070809231CHECK-AARCH64-DAG: w3 = 0x0708090a232CHECK-AARCH64-DAG: w4 = 0x08090a0b233CHECK-AARCH64-DAG: w5 = 0x090a0b0c234CHECK-AARCH64-DAG: w6 = 0x0a0b0c0d235CHECK-AARCH64-DAG: w7 = 0x0b0c0d0e236CHECK-AARCH64-DAG: w8 = 0x0c0d0e0f237CHECK-AARCH64-DAG: w9 = 0x0d0e0f10238CHECK-AARCH64-DAG: w10 = 0x0e0f1011239CHECK-AARCH64-DAG: w11 = 0x0f101112240CHECK-AARCH64-DAG: w12 = 0x10111213241CHECK-AARCH64-DAG: w13 = 0x11121314242CHECK-AARCH64-DAG: w14 = 0x12131415243CHECK-AARCH64-DAG: w15 = 0x13141516244CHECK-AARCH64-DAG: w16 = 0x14151617245CHECK-AARCH64-DAG: w17 = 0x15161718246CHECK-AARCH64-DAG: w18 = 0x16171819247CHECK-AARCH64-DAG: w19 = 0x1718191a248CHECK-AARCH64-DAG: w20 = 0x18191a1b249CHECK-AARCH64-DAG: w21 = 0x191a1b1c250CHECK-AARCH64-DAG: w22 = 0x1a1b1c1d251CHECK-AARCH64-DAG: w23 = 0x1b1c1d1e252CHECK-AARCH64-DAG: w24 = 0x1c1d1e1f253CHECK-AARCH64-DAG: w25 = 0x1d1e1f20254CHECK-AARCH64-DAG: w26 = 0x1e1f2021255CHECK-AARCH64-DAG: w27 = 0x1f202122256CHECK-AARCH64-DAG: w28 = 0x20212223257CHECK-AARCH64-DAG: w29 = 0x21222324258CHECK-AARCH64-DAG: w30 = 0x22232425259CHECK-AARCH64-DAG: w31 = 0x23242526260"""261 262        self.server.responder = MyResponder(263            "aarch64",264            has_target_xml,265            GPRS,266            "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",267        )268 269        target = self.createTarget("basic_eh_frame-aarch64.yaml")270        process = self.connect(target)271        lldbutil.expect_state_changes(272            self, self.dbg.GetListener(), process, [lldb.eStateStopped]273        )274 275        # test all registers276        self.filecheck(277            "register read --all",278            __file__,279            filecheck_options="--check-prefix=CHECK-AARCH64",280        )281 282        # test generic aliases283        self.match("register read arg1", ["x0 = 0x0001020304050607"])284        self.match("register read arg2", ["x1 = 0x0102030405060708"])285        self.match("register read fp", ["x29 = 0x1d1e1f2021222324"])286        self.match("register read lr", ["x30 = 0x1e1f202122232425"])287        self.match("register read ra", ["x30 = 0x1e1f202122232425"])288        self.match("register read flags", ["cpsr = 0x21222324"])289 290    @skipIfRemote291    @skipIfLLVMTargetMissing("AArch64")292    def test_aarch64_regs_no_target_xml(self):293        """Test grabbing various aarch64 registers from gdbserver when there294        is no target XML."""295        self.check_aarch64_regs(False)296 297    @skipIfXmlSupportMissing298    @skipIfRemote299    @skipIfLLVMTargetMissing("AArch64")300    def test_aarch64_regs_no_register_info(self):301        """Test grabbing various aarch64 registers from gdbserver when there302        is target XML but it does not include register info."""303        self.check_aarch64_regs(True)304 305    def check_i386_regs(self, has_target_xml):306        GPRS = """307CHECK-I386-DAG: eax = 0x04030201308CHECK-I386-DAG: ecx = 0x14131211309CHECK-I386-DAG: edx = 0x24232221310CHECK-I386-DAG: ebx = 0x34333231311CHECK-I386-DAG: esp = 0x44434241312CHECK-I386-DAG: ebp = 0x54535251313CHECK-I386-DAG: esi = 0x64636261314CHECK-I386-DAG: edi = 0x74737271315CHECK-I386-DAG: eip = 0x84838281316CHECK-I386-DAG: eflags = 0x94939291317CHECK-I386-DAG: cs = 0xa4a3a2a1318CHECK-I386-DAG: ss = 0xb4b3b2b1319CHECK-I386-DAG: ds = 0xc4c3c2c1320CHECK-I386-DAG: es = 0xd4d3d2d1321CHECK-I386-DAG: fs = 0xe4e3e2e1322CHECK-I386-DAG: gs = 0xf4f3f2f1323"""324 325        SUPPL = """326CHECK-I386-DAG: ax = 0x0201327CHECK-I386-DAG: cx = 0x1211328CHECK-I386-DAG: dx = 0x2221329CHECK-I386-DAG: bx = 0x3231330CHECK-I386-DAG: sp = 0x4241331CHECK-I386-DAG: bp = 0x5251332CHECK-I386-DAG: si = 0x6261333CHECK-I386-DAG: di = 0x7271334 335CHECK-I386-DAG: ah = 0x02336CHECK-I386-DAG: ch = 0x12337CHECK-I386-DAG: dh = 0x22338CHECK-I386-DAG: bh = 0x32339 340CHECK-I386-DAG: al = 0x01341CHECK-I386-DAG: cl = 0x11342CHECK-I386-DAG: dl = 0x21343CHECK-I386-DAG: bl = 0x31344CHECK-I386-DAG: spl = 0x41345CHECK-I386-DAG: bpl = 0x51346CHECK-I386-DAG: sil = 0x61347CHECK-I386-DAG: dil = 0x71348"""349 350        self.server.responder = MyResponder(351            "i386",352            has_target_xml,353            GPRS,354            "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",355        )356 357        target = self.createTarget("basic_eh_frame-i386.yaml")358        process = self.connect(target)359        lldbutil.expect_state_changes(360            self, self.dbg.GetListener(), process, [lldb.eStateStopped]361        )362 363        # test all registers364        self.filecheck(365            "register read --all",366            __file__,367            filecheck_options="--check-prefix=CHECK-I386",368        )369 370        # test generic aliases371        self.match("register read fp", ["ebp = 0x54535251"])372        self.match("register read sp", ["esp = 0x44434241"])373        self.match("register read pc", ["eip = 0x84838281"])374        self.match("register read flags", ["eflags = 0x94939291"])375 376    @skipIfRemote377    @skipIfLLVMTargetMissing("X86")378    def test_i386_regs_no_target_xml(self):379        """Test grabbing various i386 registers from gdbserver when there is380        no target XML."""381        self.check_i386_regs(False)382 383    @skipIfXmlSupportMissing384    @skipIfRemote385    @skipIfLLVMTargetMissing("X86")386    def test_i386_regs_no_register_info(self):387        """Test grabbing various i386 registers from gdbserver when there is388        target XML but it does not include register info."""389        self.check_i386_regs(True)