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