brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 59ef3d3 Raw
146 lines · python
1import gdbremote_testcase2import lldbgdbserverutils3from lldbsuite.test.decorators import *4from lldbsuite.test.lldbtest import *5from lldbsuite.test.lldbdwarf import *6 7 8class TestGdbRemote_qMemoryRegion(gdbremote_testcase.GdbRemoteTestCaseBase):9    def test_qRegisterInfo_returns_one_valid_result(self):10        self.build()11        self.prep_debug_monitor_and_inferior()12        self.test_sequence.add_log_lines(13            [14                "read packet: $qRegisterInfo0#00",15                {16                    "direction": "send",17                    "regex": r"^\$(.+);#[0-9A-Fa-f]{2}",18                    "capture": {1: "reginfo_0"},19                },20            ],21            True,22        )23 24        # Run the stream25        context = self.expect_gdbremote_sequence()26        self.assertIsNotNone(context)27 28        reg_info_packet = context.get("reginfo_0")29        self.assertIsNotNone(reg_info_packet)30        self.assert_valid_reg_info(31            lldbgdbserverutils.parse_reg_info_response(reg_info_packet)32        )33 34    def test_qRegisterInfo_returns_all_valid_results(self):35        self.build()36        self.prep_debug_monitor_and_inferior()37        self.add_register_info_collection_packets()38 39        # Run the stream.40        context = self.expect_gdbremote_sequence()41        self.assertIsNotNone(context)42 43        # Validate that each register info returned validates.44        for reg_info in self.parse_register_info_packets(context):45            self.assert_valid_reg_info(reg_info)46 47    def test_qRegisterInfo_contains_required_generics_debugserver(self):48        self.build()49        self.prep_debug_monitor_and_inferior()50        self.add_register_info_collection_packets()51 52        # Run the packet stream.53        context = self.expect_gdbremote_sequence()54        self.assertIsNotNone(context)55 56        # Gather register info entries.57        reg_infos = self.parse_register_info_packets(context)58 59        # Collect all generic registers found.60        generic_regs = {61            reg_info["generic"]: 1 for reg_info in reg_infos if "generic" in reg_info62        }63 64        # Ensure we have a program counter register.65        self.assertIn("pc", generic_regs)66 67        # Ensure we have a frame pointer register. PPC64le's FP is the same as SP68        if self.getArchitecture() != "powerpc64le":69            self.assertIn("fp", generic_regs)70 71        # Ensure we have a stack pointer register.72        self.assertIn("sp", generic_regs)73 74        # Ensure we have a flags register. RISC-V doesn't have a flags register75        if not self.isRISCV():76            self.assertIn("flags", generic_regs)77 78        if self.isRISCV() or self.isAArch64() or self.isARM():79            # Specific register for a return address80            self.assertIn("ra", generic_regs)81 82            # Function arguments registers83            for i in range(1, 5 if self.isARM() else 9):84                self.assertIn(f"arg{i}", generic_regs)85 86    def test_qRegisterInfo_contains_at_least_one_register_set(self):87        self.build()88        self.prep_debug_monitor_and_inferior()89        self.add_register_info_collection_packets()90 91        # Run the packet stream.92        context = self.expect_gdbremote_sequence()93        self.assertIsNotNone(context)94 95        # Gather register info entries.96        reg_infos = self.parse_register_info_packets(context)97 98        # Collect all register sets found.99        register_sets = {100            reg_info["set"]: 1 for reg_info in reg_infos if "set" in reg_info101        }102        self.assertGreaterEqual(len(register_sets), 1)103 104    def targetHasAVX(self):105        triple = self.dbg.GetSelectedPlatform().GetTriple()106 107        # TODO other platforms, please implement this function108        if not re.match(".*-.*-linux", triple):109            return True110 111        # Need to do something different for non-Linux/Android targets112        if lldb.remote_platform:113            self.runCmd('platform get-file "/proc/cpuinfo" "cpuinfo"')114            cpuinfo_path = "cpuinfo"115            self.addTearDownHook(lambda: os.unlink("cpuinfo"))116        else:117            cpuinfo_path = "/proc/cpuinfo"118 119        f = open(cpuinfo_path, "r")120        cpuinfo = f.read()121        f.close()122        return " avx " in cpuinfo123 124    @expectedFailureAll(oslist=["windows"])  # no avx for now.125    @skipIf(archs=no_match(["amd64", "i386", "x86_64"]))126    @add_test_categories(["llgs"])127    def test_qRegisterInfo_contains_avx_registers(self):128        self.build()129        self.prep_debug_monitor_and_inferior()130        self.add_register_info_collection_packets()131 132        # Run the packet stream.133        context = self.expect_gdbremote_sequence()134        self.assertIsNotNone(context)135 136        # Gather register info entries.137        reg_infos = self.parse_register_info_packets(context)138 139        # Collect all generics found.140        register_sets = {141            reg_info["set"]: 1 for reg_info in reg_infos if "set" in reg_info142        }143        self.assertEqual(144            self.targetHasAVX(), "Advanced Vector Extensions" in register_sets145        )146