blob: 59ef3d379294d624fa0659f4a86a6b6c684a0d2f [file] [log] [blame] [edit]
import gdbremote_testcase
import lldbgdbserverutils
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test.lldbdwarf import *
class TestGdbRemote_qMemoryRegion(gdbremote_testcase.GdbRemoteTestCaseBase):
def test_qRegisterInfo_returns_one_valid_result(self):
self.build()
self.prep_debug_monitor_and_inferior()
self.test_sequence.add_log_lines(
[
"read packet: $qRegisterInfo0#00",
{
"direction": "send",
"regex": r"^\$(.+);#[0-9A-Fa-f]{2}",
"capture": {1: "reginfo_0"},
},
],
True,
)
# Run the stream
context = self.expect_gdbremote_sequence()
self.assertIsNotNone(context)
reg_info_packet = context.get("reginfo_0")
self.assertIsNotNone(reg_info_packet)
self.assert_valid_reg_info(
lldbgdbserverutils.parse_reg_info_response(reg_info_packet)
)
def test_qRegisterInfo_returns_all_valid_results(self):
self.build()
self.prep_debug_monitor_and_inferior()
self.add_register_info_collection_packets()
# Run the stream.
context = self.expect_gdbremote_sequence()
self.assertIsNotNone(context)
# Validate that each register info returned validates.
for reg_info in self.parse_register_info_packets(context):
self.assert_valid_reg_info(reg_info)
def test_qRegisterInfo_contains_required_generics_debugserver(self):
self.build()
self.prep_debug_monitor_and_inferior()
self.add_register_info_collection_packets()
# Run the packet stream.
context = self.expect_gdbremote_sequence()
self.assertIsNotNone(context)
# Gather register info entries.
reg_infos = self.parse_register_info_packets(context)
# Collect all generic registers found.
generic_regs = {
reg_info["generic"]: 1 for reg_info in reg_infos if "generic" in reg_info
}
# Ensure we have a program counter register.
self.assertIn("pc", generic_regs)
# Ensure we have a frame pointer register. PPC64le's FP is the same as SP
if self.getArchitecture() != "powerpc64le":
self.assertIn("fp", generic_regs)
# Ensure we have a stack pointer register.
self.assertIn("sp", generic_regs)
# Ensure we have a flags register. RISC-V doesn't have a flags register
if not self.isRISCV():
self.assertIn("flags", generic_regs)
if self.isRISCV() or self.isAArch64() or self.isARM():
# Specific register for a return address
self.assertIn("ra", generic_regs)
# Function arguments registers
for i in range(1, 5 if self.isARM() else 9):
self.assertIn(f"arg{i}", generic_regs)
def test_qRegisterInfo_contains_at_least_one_register_set(self):
self.build()
self.prep_debug_monitor_and_inferior()
self.add_register_info_collection_packets()
# Run the packet stream.
context = self.expect_gdbremote_sequence()
self.assertIsNotNone(context)
# Gather register info entries.
reg_infos = self.parse_register_info_packets(context)
# Collect all register sets found.
register_sets = {
reg_info["set"]: 1 for reg_info in reg_infos if "set" in reg_info
}
self.assertGreaterEqual(len(register_sets), 1)
def targetHasAVX(self):
triple = self.dbg.GetSelectedPlatform().GetTriple()
# TODO other platforms, please implement this function
if not re.match(".*-.*-linux", triple):
return True
# Need to do something different for non-Linux/Android targets
if lldb.remote_platform:
self.runCmd('platform get-file "/proc/cpuinfo" "cpuinfo"')
cpuinfo_path = "cpuinfo"
self.addTearDownHook(lambda: os.unlink("cpuinfo"))
else:
cpuinfo_path = "/proc/cpuinfo"
f = open(cpuinfo_path, "r")
cpuinfo = f.read()
f.close()
return " avx " in cpuinfo
@expectedFailureAll(oslist=["windows"]) # no avx for now.
@skipIf(archs=no_match(["amd64", "i386", "x86_64"]))
@add_test_categories(["llgs"])
def test_qRegisterInfo_contains_avx_registers(self):
self.build()
self.prep_debug_monitor_and_inferior()
self.add_register_info_collection_packets()
# Run the packet stream.
context = self.expect_gdbremote_sequence()
self.assertIsNotNone(context)
# Gather register info entries.
reg_infos = self.parse_register_info_packets(context)
# Collect all generics found.
register_sets = {
reg_info["set"]: 1 for reg_info in reg_infos if "set" in reg_info
}
self.assertEqual(
self.targetHasAVX(), "Advanced Vector Extensions" in register_sets
)