1
1
"""
2
2
Check that lldb falls back to default register layouts when the remote provides
3
- no target XML.
3
+ no target XML or does not include registers in the target XML .
4
4
5
5
GPRS are passed to the responder to create register data to send back to lldb.
6
6
Registers in SUPPL are virtual registers based on those general ones. The tests
14
14
from lldbsuite .test .lldbgdbclient import GDBRemoteTestBase
15
15
16
16
import binascii
17
+ from textwrap import dedent
18
+
17
19
18
20
class MyResponder (MockGDBServerResponder ):
19
21
@staticmethod
@@ -22,8 +24,10 @@ def filecheck_to_blob(fc):
22
24
val = l .split ("0x" )[1 ]
23
25
yield binascii .b2a_hex (bytes (reversed (binascii .a2b_hex (val )))).decode ()
24
26
25
- def __init__ (self , reg_data , halt_reason ):
27
+ def __init__ (self , architecture , has_target_xml , reg_data , halt_reason ):
26
28
super ().__init__ ()
29
+ self .architecture = architecture
30
+ self .has_target_xml = has_target_xml
27
31
self .reg_data = "" .join (self .filecheck_to_blob (reg_data ))
28
32
self .halt_reason = halt_reason
29
33
@@ -36,13 +40,24 @@ def readRegisters(self):
36
40
def haltReason (self ):
37
41
return self .halt_reason
38
42
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 , False
39
57
40
- class TestGDBServerTargetXML (GDBRemoteTestBase ):
41
- @skipIfRemote
42
- @skipIfLLVMTargetMissing ("X86" )
43
- def test_x86_64_regs (self ):
44
- """Test grabbing various x86_64 registers from gdbserver."""
45
58
59
+ class TestGDBServerTargetXML (GDBRemoteTestBase ):
60
+ def check_x86_64_regs (self , has_target_xml ):
46
61
GPRS = """
47
62
CHECK-AMD64-DAG: rax = 0x0807060504030201
48
63
CHECK-AMD64-DAG: rbx = 0x1817161514131211
@@ -125,6 +140,8 @@ def test_x86_64_regs(self):
125
140
"""
126
141
127
142
self .server .responder = MyResponder (
143
+ "x86-64" ,
144
+ has_target_xml ,
128
145
GPRS ,
129
146
"T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;" ,
130
147
)
@@ -155,10 +172,21 @@ def test_x86_64_regs(self):
155
172
self .match ("register read flags" , ["eflags = 0x1c1b1a19" ])
156
173
157
174
@skipIfRemote
158
- @skipIfLLVMTargetMissing ("AArch64" )
159
- def test_aarch64_regs (self ):
160
- """Test grabbing various aarch64 registers from gdbserver."""
175
+ @skipIfLLVMTargetMissing ("X86" )
176
+ def test_x86_64_regs_no_target_xml (self ):
177
+ """Test grabbing various x86_64 registers from gdbserver when there
178
+ is no target XML."""
179
+ self .check_x86_64_regs (False )
180
+
181
+ @skipIfXmlSupportMissing
182
+ @skipIfRemote
183
+ @skipIfLLVMTargetMissing ("X86" )
184
+ def test_x86_64_regs_no_register_info (self ):
185
+ """Test grabbing various x86_64 registers from gdbserver when there
186
+ is target XML but it does not include register info."""
187
+ self .check_x86_64_regs (True )
161
188
189
+ def check_aarch64_regs (self , has_target_xml ):
162
190
GPRS = """
163
191
CHECK-AARCH64-DAG: x0 = 0x0001020304050607
164
192
CHECK-AARCH64-DAG: x1 = 0x0102030405060708
@@ -232,6 +260,8 @@ def test_aarch64_regs(self):
232
260
"""
233
261
234
262
self .server .responder = MyResponder (
263
+ "aarch64" ,
264
+ has_target_xml ,
235
265
GPRS ,
236
266
"T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;" ,
237
267
)
@@ -258,10 +288,21 @@ def test_aarch64_regs(self):
258
288
self .match ("register read flags" , ["cpsr = 0x21222324" ])
259
289
260
290
@skipIfRemote
261
- @skipIfLLVMTargetMissing ("X86" )
262
- def test_i386_regs (self ):
263
- """Test grabbing various i386 registers from gdbserver."""
291
+ @skipIfLLVMTargetMissing ("AArch64" )
292
+ def test_aarch64_regs_no_target_xml (self ):
293
+ """Test grabbing various aarch64 registers from gdbserver when there
294
+ is no target XML."""
295
+ self .check_aarch64_regs (False )
296
+
297
+ @skipIfXmlSupportMissing
298
+ @skipIfRemote
299
+ @skipIfLLVMTargetMissing ("AArch64" )
300
+ def test_aarch64_regs_no_register_info (self ):
301
+ """Test grabbing various aarch64 registers from gdbserver when there
302
+ is target XML but it does not include register info."""
303
+ self .check_aarch64_regs (True )
264
304
305
+ def check_i386_regs (self , has_target_xml ):
265
306
GPRS = """
266
307
CHECK-I386-DAG: eax = 0x04030201
267
308
CHECK-I386-DAG: ecx = 0x14131211
@@ -307,6 +348,8 @@ def test_i386_regs(self):
307
348
"""
308
349
309
350
self .server .responder = MyResponder (
351
+ "i386" ,
352
+ has_target_xml ,
310
353
GPRS ,
311
354
"T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;" ,
312
355
)
@@ -329,3 +372,18 @@ def test_i386_regs(self):
329
372
self .match ("register read sp" , ["esp = 0x44434241" ])
330
373
self .match ("register read pc" , ["eip = 0x84838281" ])
331
374
self .match ("register read flags" , ["eflags = 0x94939291" ])
375
+
376
+ @skipIfRemote
377
+ @skipIfLLVMTargetMissing ("X86" )
378
+ def test_i386_regs_no_target_xml (self ):
379
+ """Test grabbing various i386 registers from gdbserver when there is
380
+ no target XML."""
381
+ self .check_i386_regs (False )
382
+
383
+ @skipIfXmlSupportMissing
384
+ @skipIfRemote
385
+ @skipIfLLVMTargetMissing ("X86" )
386
+ def test_i386_regs_no_register_info (self ):
387
+ """Test grabbing various i386 registers from gdbserver when there is
388
+ target XML but it does not include register info."""
389
+ self .check_i386_regs (True )
0 commit comments