Skip to content

Commit 5ee3a4c

Browse files
committed
Split out qRegisterInfo tests
1 parent 1bf1a11 commit 5ee3a4c

File tree

2 files changed

+151
-138
lines changed

2 files changed

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

lldb/test/API/tools/lldb-server/TestLldbGdbServer.py

Lines changed: 0 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -130,144 +130,6 @@ def test_attach_commandline_continue_app_exits(self):
130130
lldbgdbserverutils.process_is_running(procs["inferior"].pid, False)
131131
)
132132

133-
def test_qRegisterInfo_returns_one_valid_result(self):
134-
self.build()
135-
self.prep_debug_monitor_and_inferior()
136-
self.test_sequence.add_log_lines(
137-
[
138-
"read packet: $qRegisterInfo0#00",
139-
{
140-
"direction": "send",
141-
"regex": r"^\$(.+);#[0-9A-Fa-f]{2}",
142-
"capture": {1: "reginfo_0"},
143-
},
144-
],
145-
True,
146-
)
147-
148-
# Run the stream
149-
context = self.expect_gdbremote_sequence()
150-
self.assertIsNotNone(context)
151-
152-
reg_info_packet = context.get("reginfo_0")
153-
self.assertIsNotNone(reg_info_packet)
154-
self.assert_valid_reg_info(
155-
lldbgdbserverutils.parse_reg_info_response(reg_info_packet)
156-
)
157-
158-
def test_qRegisterInfo_returns_all_valid_results(self):
159-
self.build()
160-
self.prep_debug_monitor_and_inferior()
161-
self.add_register_info_collection_packets()
162-
163-
# Run the stream.
164-
context = self.expect_gdbremote_sequence()
165-
self.assertIsNotNone(context)
166-
167-
# Validate that each register info returned validates.
168-
for reg_info in self.parse_register_info_packets(context):
169-
self.assert_valid_reg_info(reg_info)
170-
171-
def test_qRegisterInfo_contains_required_generics_debugserver(self):
172-
self.build()
173-
self.prep_debug_monitor_and_inferior()
174-
self.add_register_info_collection_packets()
175-
176-
# Run the packet stream.
177-
context = self.expect_gdbremote_sequence()
178-
self.assertIsNotNone(context)
179-
180-
# Gather register info entries.
181-
reg_infos = self.parse_register_info_packets(context)
182-
183-
# Collect all generic registers found.
184-
generic_regs = {
185-
reg_info["generic"]: 1 for reg_info in reg_infos if "generic" in reg_info
186-
}
187-
188-
# Ensure we have a program counter register.
189-
self.assertIn("pc", generic_regs)
190-
191-
# Ensure we have a frame pointer register. PPC64le's FP is the same as SP
192-
if self.getArchitecture() != "powerpc64le":
193-
self.assertIn("fp", generic_regs)
194-
195-
# Ensure we have a stack pointer register.
196-
self.assertIn("sp", generic_regs)
197-
198-
# Ensure we have a flags register. RISC-V doesn't have a flags register
199-
if not self.isRISCV():
200-
self.assertIn("flags", generic_regs)
201-
202-
if self.isRISCV() or self.isAArch64() or self.isARM():
203-
# Specific register for a return address
204-
self.assertIn("ra", generic_regs)
205-
206-
# Function arguments registers
207-
for i in range(1, 5 if self.isARM() else 9):
208-
self.assertIn(f"arg{i}", generic_regs)
209-
210-
def test_qRegisterInfo_contains_at_least_one_register_set(self):
211-
self.build()
212-
self.prep_debug_monitor_and_inferior()
213-
self.add_register_info_collection_packets()
214-
215-
# Run the packet stream.
216-
context = self.expect_gdbremote_sequence()
217-
self.assertIsNotNone(context)
218-
219-
# Gather register info entries.
220-
reg_infos = self.parse_register_info_packets(context)
221-
222-
# Collect all register sets found.
223-
register_sets = {
224-
reg_info["set"]: 1 for reg_info in reg_infos if "set" in reg_info
225-
}
226-
self.assertGreaterEqual(len(register_sets), 1)
227-
228-
def targetHasAVX(self):
229-
triple = self.dbg.GetSelectedPlatform().GetTriple()
230-
231-
# TODO other platforms, please implement this function
232-
if not re.match(".*-.*-linux", triple):
233-
return True
234-
235-
# Need to do something different for non-Linux/Android targets
236-
if lldb.remote_platform:
237-
self.runCmd('platform get-file "/proc/cpuinfo" "cpuinfo"')
238-
cpuinfo_path = "cpuinfo"
239-
self.addTearDownHook(lambda: os.unlink("cpuinfo"))
240-
else:
241-
cpuinfo_path = "/proc/cpuinfo"
242-
243-
f = open(cpuinfo_path, "r")
244-
cpuinfo = f.read()
245-
f.close()
246-
return " avx " in cpuinfo
247-
248-
@expectedFailureAll(oslist=["windows"]) # no avx for now.
249-
@skipIf(archs=no_match(["amd64", "i386", "x86_64"]))
250-
@add_test_categories(["llgs"])
251-
def test_qRegisterInfo_contains_avx_registers(self):
252-
self.build()
253-
self.prep_debug_monitor_and_inferior()
254-
self.add_register_info_collection_packets()
255-
256-
# Run the packet stream.
257-
context = self.expect_gdbremote_sequence()
258-
self.assertIsNotNone(context)
259-
260-
# Gather register info entries.
261-
reg_infos = self.parse_register_info_packets(context)
262-
263-
# Collect all generics found.
264-
register_sets = {
265-
reg_info["set"]: 1 for reg_info in reg_infos if "set" in reg_info
266-
}
267-
self.assertEqual(
268-
self.targetHasAVX(), "Advanced Vector Extensions" in register_sets
269-
)
270-
271133
def qThreadInfo_contains_thread(self):
272134
procs = self.prep_debug_monitor_and_inferior()
273135
self.add_threadinfo_collection_packets()

0 commit comments

Comments
 (0)