0f98eb34825cbaa525fc73c1170401237e7cef6a
[openbsd] /
1 """
2 Test lldb data formatter subsystem.
3 """
4
5
6
7 import lldb
8 from lldbsuite.test.decorators import *
9 from lldbsuite.test.lldbtest import *
10 from lldbsuite.test import lldbutil
11
12
13 class SmartArrayDataFormatterTestCase(TestBase):
14
15     mydir = TestBase.compute_mydir(__file__)
16
17     def test_with_run_command(self):
18         """Test data formatter commands."""
19         self.build()
20         self.data_formatter_commands()
21
22     def setUp(self):
23         # Call super's setUp().
24         TestBase.setUp(self)
25         # Find the line number to break at.
26         self.line = line_number('main.cpp', '// Set break point at this line.')
27
28     def data_formatter_commands(self):
29         """Test that that file and class static variables display correctly."""
30         self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
31
32         lldbutil.run_break_set_by_file_and_line(
33             self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
34
35         self.runCmd("run", RUN_SUCCEEDED)
36
37         process = self.dbg.GetSelectedTarget().GetProcess()
38
39         # The stop reason of the thread should be breakpoint.
40         self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
41                     substrs=['stopped',
42                              'stop reason = breakpoint'])
43
44         # This is the function to remove the custom formats in order to have a
45         # clean slate for the next test case.
46         def cleanup():
47             self.runCmd('type format clear', check=False)
48             self.runCmd('type summary clear', check=False)
49
50         # Execute the cleanup function during test case tear down.
51         self.addTearDownHook(cleanup)
52
53 # check that we are not looping here
54         self.runCmd("type summary add --summary-string \"${var%V}\" SomeData")
55
56         self.expect("frame variable data",
57                     substrs=['SomeData @ 0x'])
58 # ${var%s}
59         self.runCmd(
60             "type summary add --summary-string \"ptr = ${var%s}\" \"char *\"")
61
62         self.expect("frame variable strptr",
63                     substrs=['ptr = \"',
64                              'Hello world!'])
65
66         self.expect("frame variable other.strptr",
67                     substrs=['ptr = \"',
68                              'Nested Hello world!'])
69
70         self.runCmd(
71             "type summary add --summary-string \"arr = ${var%s}\" -x \"char \\[[0-9]+\\]\"")
72
73         self.expect("frame variable strarr",
74                     substrs=['arr = \"',
75                              'Hello world!'])
76
77         self.expect("frame variable other.strarr",
78                     substrs=['arr = \"',
79                              'Nested Hello world!'])
80
81         self.expect("p strarr",
82                     substrs=['arr = \"',
83                              'Hello world!'])
84
85         self.expect("p other.strarr",
86                     substrs=['arr = \"',
87                              'Nested Hello world!'])
88
89 # ${var%c}
90         self.runCmd(
91             "type summary add --summary-string \"ptr = ${var%c}\" \"char *\"")
92
93         self.expect("frame variable strptr",
94                     substrs=['ptr = \"',
95                              'Hello world!'])
96
97         self.expect("frame variable other.strptr",
98                     substrs=['ptr = \"',
99                              'Nested Hello world!'])
100
101         self.expect("p strptr",
102                     substrs=['ptr = \"',
103                              'Hello world!'])
104
105         self.expect("p other.strptr",
106                     substrs=['ptr = \"',
107                              'Nested Hello world!'])
108
109         self.runCmd(
110             "type summary add --summary-string \"arr = ${var%c}\" -x \"char \\[[0-9]+\\]\"")
111
112         self.expect("frame variable strarr",
113                     substrs=['arr = \"',
114                              'Hello world!'])
115
116         self.expect("frame variable other.strarr",
117                     substrs=['arr = \"',
118                              'Nested Hello world!'])
119
120         self.expect("p strarr",
121                     substrs=['arr = \"',
122                              'Hello world!'])
123
124         self.expect("p other.strarr",
125                     substrs=['arr = \"',
126                              'Nested Hello world!'])
127
128 # ${var%char[]}
129         self.runCmd(
130             "type summary add --summary-string \"arr = ${var%char[]}\" -x \"char \\[[0-9]+\\]\"")
131
132         self.expect("frame variable strarr",
133                     substrs=['arr = \"',
134                              'Hello world!'])
135
136         self.expect("frame variable other.strarr",
137                     substrs=['arr = ',
138                              'Nested Hello world!'])
139
140         self.expect("p strarr",
141                     substrs=['arr = \"',
142                              'Hello world!'])
143
144         self.expect("p other.strarr",
145                     substrs=['arr = ',
146                              'Nested Hello world!'])
147
148         self.runCmd(
149             "type summary add --summary-string \"ptr = ${var%char[]}\" \"char *\"")
150
151         self.expect("frame variable strptr",
152                     substrs=['ptr = \"',
153                              'Hello world!'])
154
155         self.expect("frame variable other.strptr",
156                     substrs=['ptr = \"',
157                              'Nested Hello world!'])
158
159         self.expect("p strptr",
160                     substrs=['ptr = \"',
161                              'Hello world!'])
162
163         self.expect("p other.strptr",
164                     substrs=['ptr = \"',
165                              'Nested Hello world!'])
166
167 # ${var%a}
168         self.runCmd(
169             "type summary add --summary-string \"arr = ${var%a}\" -x \"char \\[[0-9]+\\]\"")
170
171         self.expect("frame variable strarr",
172                     substrs=['arr = \"',
173                              'Hello world!'])
174
175         self.expect("frame variable other.strarr",
176                     substrs=['arr = ',
177                              'Nested Hello world!'])
178
179         self.expect("p strarr",
180                     substrs=['arr = \"',
181                              'Hello world!'])
182
183         self.expect("p other.strarr",
184                     substrs=['arr = ',
185                              'Nested Hello world!'])
186
187         self.runCmd(
188             "type summary add --summary-string \"ptr = ${var%a}\" \"char *\"")
189
190         self.expect("frame variable strptr",
191                     substrs=['ptr = \"',
192                              'Hello world!'])
193
194         self.expect("frame variable other.strptr",
195                     substrs=['ptr = \"',
196                              'Nested Hello world!'])
197
198         self.expect("p strptr",
199                     substrs=['ptr = \"',
200                              'Hello world!'])
201
202         self.expect("p other.strptr",
203                     substrs=['ptr = \"',
204                              'Nested Hello world!'])
205
206         self.runCmd(
207             "type summary add --summary-string \"ptr = ${var[]%char[]}\" \"char *\"")
208
209 # I do not know the size of the data, but you are asking for a full array slice..
210 # use the ${var%char[]} to obtain a string as result
211         self.expect("frame variable strptr", matching=False,
212                     substrs=['ptr = \"',
213                              'Hello world!'])
214
215         self.expect("frame variable other.strptr", matching=False,
216                     substrs=['ptr = \"',
217                              'Nested Hello world!'])
218
219         self.expect("p strptr", matching=False,
220                     substrs=['ptr = \"',
221                              'Hello world!'])
222
223         self.expect("p other.strptr", matching=False,
224                     substrs=['ptr = \"',
225                              'Nested Hello world!'])
226
227 # You asked an array-style printout...
228         self.runCmd(
229             "type summary add --summary-string \"ptr = ${var[0-1]%char[]}\" \"char *\"")
230
231         self.expect("frame variable strptr",
232                     substrs=['ptr = ',
233                              '[{H},{e}]'])
234
235         self.expect("frame variable other.strptr",
236                     substrs=['ptr = ',
237                              '[{N},{e}]'])
238
239         self.expect("p strptr",
240                     substrs=['ptr = ',
241                              '[{H},{e}]'])
242
243         self.expect("p other.strptr",
244                     substrs=['ptr = ',
245                              '[{N},{e}]'])
246
247 # using [] is required here
248         self.runCmd(
249             "type summary add --summary-string \"arr = ${var%x}\" \"int [5]\"")
250
251         self.expect("frame variable intarr", matching=False, substrs=[
252                     '0x00000001,0x00000001,0x00000002,0x00000003,0x00000005'])
253
254         self.expect("frame variable other.intarr", matching=False, substrs=[
255                     '0x00000009,0x00000008,0x00000007,0x00000006,0x00000005'])
256
257         self.runCmd(
258             "type summary add --summary-string \"arr = ${var[]%x}\" \"int [5]\"")
259
260         self.expect(
261             "frame variable intarr",
262             substrs=[
263                 'intarr = arr =',
264                 '0x00000001,0x00000001,0x00000002,0x00000003,0x00000005'])
265
266         self.expect(
267             "frame variable other.intarr",
268             substrs=[
269                 'intarr = arr =',
270                 '0x00000009,0x00000008,0x00000007,0x00000006,0x00000005'])
271
272 # printing each array item as an array
273         self.runCmd(
274             "type summary add --summary-string \"arr = ${var[]%uint32_t[]}\" \"int [5]\"")
275
276         self.expect(
277             "frame variable intarr",
278             substrs=[
279                 'intarr = arr =',
280                 '{0x00000001},{0x00000001},{0x00000002},{0x00000003},{0x00000005}'])
281
282         self.expect(
283             "frame variable other.intarr",
284             substrs=[
285                 'intarr = arr = ',
286                 '{0x00000009},{0x00000008},{0x00000007},{0x00000006},{0x00000005}'])
287
288 # printing full array as an array
289         self.runCmd(
290             "type summary add --summary-string \"arr = ${var%uint32_t[]}\" \"int [5]\"")
291
292         self.expect(
293             "frame variable intarr",
294             substrs=[
295                 'intarr = arr =',
296                 '0x00000001,0x00000001,0x00000002,0x00000003,0x00000005'])
297
298         self.expect(
299             "frame variable other.intarr",
300             substrs=[
301                 'intarr = arr =',
302                 '0x00000009,0x00000008,0x00000007,0x00000006,0x00000005'])
303
304 # printing each array item as an array
305         self.runCmd(
306             "type summary add --summary-string \"arr = ${var[]%float32[]}\" \"float [7]\"")
307
308         self.expect(
309             "frame variable flarr",
310             substrs=[
311                 'flarr = arr =',
312                 '{78.5},{77.25},{78},{76.125},{76.75},{76.875},{77}'])
313
314         self.expect(
315             "frame variable other.flarr",
316             substrs=[
317                 'flarr = arr = ',
318                 '{25.5},{25.25},{25.125},{26.75},{27.375},{27.5},{26.125}'])
319
320 # printing full array as an array
321         self.runCmd(
322             "type summary add --summary-string \"arr = ${var%float32[]}\" \"float [7]\"")
323
324         self.expect("frame variable flarr",
325                     substrs=['flarr = arr =',
326                              '78.5,77.25,78,76.125,76.75,76.875,77'])
327
328         self.expect("frame variable other.flarr",
329                     substrs=['flarr = arr =',
330                              '25.5,25.25,25.125,26.75,27.375,27.5,26.125'])
331
332 # using array smart summary strings for pointers should make no sense
333         self.runCmd(
334             "type summary add --summary-string \"arr = ${var%float32[]}\" \"float *\"")
335         self.runCmd(
336             "type summary add --summary-string \"arr = ${var%int32_t[]}\" \"int *\"")
337
338         self.expect("frame variable flptr", matching=False,
339                     substrs=['78.5,77.25,78,76.125,76.75,76.875,77'])
340
341         self.expect("frame variable intptr", matching=False,
342                     substrs=['1,1,2,3,5'])
343
344 # use y and Y
345         self.runCmd(
346             "type summary add --summary-string \"arr = ${var%y}\" \"float [7]\"")
347         self.runCmd(
348             "type summary add --summary-string \"arr = ${var%y}\" \"int [5]\"")
349
350         if process.GetByteOrder() == lldb.eByteOrderLittle:
351             self.expect(
352                 "frame variable flarr",
353                 substrs=[
354                     'flarr = arr =',
355                     '00 00 9d 42,00 80 9a 42,00 00 9c 42,00 40 98 42,00 80 99 42,00 c0 99 42,00 00 9a 42'])
356         else:
357             self.expect(
358                 "frame variable flarr",
359                 substrs=[
360                     'flarr = arr =',
361                     '42 9d 00 00,42 9a 80 00,42 9c 00 00,42 98 40 00,42 99 80 00,42 99 c0 00,42 9a 00 00'])
362
363         if process.GetByteOrder() == lldb.eByteOrderLittle:
364             self.expect(
365                 "frame variable other.flarr",
366                 substrs=[
367                     'flarr = arr =',
368                     '00 00 cc 41,00 00 ca 41,00 00 c9 41,00 00 d6 41,00 00 db 41,00 00 dc 41,00 00 d1 41'])
369         else:
370             self.expect(
371                 "frame variable other.flarr",
372                 substrs=[
373                     'flarr = arr =',
374                     '41 cc 00 00,41 ca 00 00,41 c9 00 00,41 d6 00 00,41 db 00 00,41 dc 00 00,41 d1 00 00'])
375
376         if process.GetByteOrder() == lldb.eByteOrderLittle:
377             self.expect(
378                 "frame variable intarr",
379                 substrs=[
380                     'intarr = arr =',
381                     '01 00 00 00,01 00 00 00,02 00 00 00,03 00 00 00,05 00 00 00'])
382         else:
383             self.expect(
384                 "frame variable intarr",
385                 substrs=[
386                     'intarr = arr =',
387                     '00 00 00 01,00 00 00 01,00 00 00 02,00 00 00 03,00 00 00 05'])
388
389         if process.GetByteOrder() == lldb.eByteOrderLittle:
390             self.expect(
391                 "frame variable other.intarr",
392                 substrs=[
393                     'intarr = arr = ',
394                     '09 00 00 00,08 00 00 00,07 00 00 00,06 00 00 00,05 00 00 00'])
395         else:
396             self.expect(
397                 "frame variable other.intarr",
398                 substrs=[
399                     'intarr = arr = ',
400                     '00 00 00 09,00 00 00 08,00 00 00 07,00 00 00 06,00 00 00 05'])
401
402         self.runCmd(
403             "type summary add --summary-string \"arr = ${var%Y}\" \"float [7]\"")
404         self.runCmd(
405             "type summary add --summary-string \"arr = ${var%Y}\" \"int [5]\"")
406
407         if process.GetByteOrder() == lldb.eByteOrderLittle:
408             self.expect(
409                 "frame variable flarr",
410                 substrs=[
411                     'flarr = arr =',
412                     '00 00 9d 42', '00 80 9a 42', '00 00 9c 42', '00 40 98 42', '00 80 99 42', '00 c0 99 42', '00 00 9a 42'])
413         else:
414             self.expect(
415                 "frame variable flarr",
416                 substrs=[
417                     'flarr = arr =',
418                     '42 9d 00 00', '42 9a 80 00', '42 9c 00 00', '42 98 40 00', '42 99 80 00', '42 99 c0 00', '42 9a 00 00'])
419
420         if process.GetByteOrder() == lldb.eByteOrderLittle:
421             self.expect(
422                 "frame variable other.flarr",
423                 substrs=[
424                     'flarr = arr =',
425                     '00 00 cc 41', '00 00 ca 41', '00 00 c9 41', '00 00 d6 41', '00 00 db 41', '00 00 dc 41', '00 00 d1 41'])
426         else:
427             self.expect(
428                 "frame variable other.flarr",
429                 substrs=[
430                     'flarr = arr =',
431                     '41 cc 00 00', '41 ca 00 00', '41 c9 00 00', '41 d6 00 00', '41 db 00 00', '41 dc 00 00', '41 d1 00 00'])
432
433         if process.GetByteOrder() == lldb.eByteOrderLittle:
434             self.expect("frame variable intarr",
435                         substrs=['intarr = arr =',
436                                  '....,01 00 00 00',
437                                  '....,05 00 00 00'])
438         else:
439             self.expect("frame variable intarr",
440                         substrs=['intarr = arr =',
441                                  '....,00 00 00 01',
442                                  '....,00 00 00 05'])
443
444         if process.GetByteOrder() == lldb.eByteOrderLittle:
445             self.expect("frame variable other.intarr",
446                         substrs=['intarr = arr = ',
447                                  '09 00 00 00',
448                                  '....,07 00 00 00'])
449         else:
450             self.expect("frame variable other.intarr",
451                         substrs=['intarr = arr = ',
452                                  '00 00 00 09',
453                                  '....,00 00 00 07'])