1dda28197Spatrick //===-- ABISysV_arm.cpp ---------------------------------------------------===//
2dda28197Spatrick //
3dda28197Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dda28197Spatrick // See https://llvm.org/LICENSE.txt for license information.
5dda28197Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dda28197Spatrick //
7dda28197Spatrick //===----------------------------------------------------------------------===//
8dda28197Spatrick
9dda28197Spatrick #include "ABISysV_arm.h"
10dda28197Spatrick
11*f6aab3d8Srobert #include <optional>
12dda28197Spatrick #include <vector>
13dda28197Spatrick
14dda28197Spatrick #include "llvm/ADT/STLExtras.h"
15dda28197Spatrick #include "llvm/ADT/Triple.h"
16dda28197Spatrick
17dda28197Spatrick #include "lldb/Core/Module.h"
18dda28197Spatrick #include "lldb/Core/PluginManager.h"
19dda28197Spatrick #include "lldb/Core/Value.h"
20dda28197Spatrick #include "lldb/Core/ValueObjectConstResult.h"
21dda28197Spatrick #include "lldb/Symbol/UnwindPlan.h"
22dda28197Spatrick #include "lldb/Target/Process.h"
23dda28197Spatrick #include "lldb/Target/RegisterContext.h"
24dda28197Spatrick #include "lldb/Target/Target.h"
25dda28197Spatrick #include "lldb/Target/Thread.h"
26dda28197Spatrick #include "lldb/Utility/ConstString.h"
27dda28197Spatrick #include "lldb/Utility/RegisterValue.h"
28dda28197Spatrick #include "lldb/Utility/Scalar.h"
29dda28197Spatrick #include "lldb/Utility/Status.h"
30dda28197Spatrick
31dda28197Spatrick #include "Plugins/Process/Utility/ARMDefines.h"
32dda28197Spatrick #include "Utility/ARM_DWARF_Registers.h"
33dda28197Spatrick #include "Utility/ARM_ehframe_Registers.h"
34dda28197Spatrick
35dda28197Spatrick using namespace lldb;
36dda28197Spatrick using namespace lldb_private;
37dda28197Spatrick
38dda28197Spatrick LLDB_PLUGIN_DEFINE(ABISysV_arm)
39dda28197Spatrick
40be691f3bSpatrick static const RegisterInfo g_register_infos[] = {
41dda28197Spatrick // NAME ALT SZ OFF ENCODING FORMAT EH_FRAME
42dda28197Spatrick // DWARF GENERIC PROCESS PLUGIN
43dda28197Spatrick // LLDB NATIVE VALUE REGS INVALIDATE REGS
44dda28197Spatrick // ========== ======= == === ============= ============
45dda28197Spatrick // ======================= =================== ===========================
46dda28197Spatrick // ======================= ====================== ==========
47dda28197Spatrick // ===============
48dda28197Spatrick {"r0",
49*f6aab3d8Srobert nullptr,
50dda28197Spatrick 4,
51dda28197Spatrick 0,
52dda28197Spatrick eEncodingUint,
53dda28197Spatrick eFormatHex,
54dda28197Spatrick {ehframe_r0, dwarf_r0, LLDB_REGNUM_GENERIC_ARG1, LLDB_INVALID_REGNUM,
55dda28197Spatrick LLDB_INVALID_REGNUM},
56dda28197Spatrick nullptr,
57dda28197Spatrick nullptr,
58*f6aab3d8Srobert },
59dda28197Spatrick {"r1",
60*f6aab3d8Srobert nullptr,
61dda28197Spatrick 4,
62dda28197Spatrick 0,
63dda28197Spatrick eEncodingUint,
64dda28197Spatrick eFormatHex,
65dda28197Spatrick {ehframe_r1, dwarf_r1, LLDB_REGNUM_GENERIC_ARG2, LLDB_INVALID_REGNUM,
66dda28197Spatrick LLDB_INVALID_REGNUM},
67dda28197Spatrick nullptr,
68dda28197Spatrick nullptr,
69*f6aab3d8Srobert },
70dda28197Spatrick {"r2",
71*f6aab3d8Srobert nullptr,
72dda28197Spatrick 4,
73dda28197Spatrick 0,
74dda28197Spatrick eEncodingUint,
75dda28197Spatrick eFormatHex,
76dda28197Spatrick {ehframe_r2, dwarf_r2, LLDB_REGNUM_GENERIC_ARG3, LLDB_INVALID_REGNUM,
77dda28197Spatrick LLDB_INVALID_REGNUM},
78dda28197Spatrick nullptr,
79dda28197Spatrick nullptr,
80*f6aab3d8Srobert },
81dda28197Spatrick {"r3",
82*f6aab3d8Srobert nullptr,
83dda28197Spatrick 4,
84dda28197Spatrick 0,
85dda28197Spatrick eEncodingUint,
86dda28197Spatrick eFormatHex,
87dda28197Spatrick {ehframe_r3, dwarf_r3, LLDB_REGNUM_GENERIC_ARG4, LLDB_INVALID_REGNUM,
88dda28197Spatrick LLDB_INVALID_REGNUM},
89dda28197Spatrick nullptr,
90dda28197Spatrick nullptr,
91*f6aab3d8Srobert },
92dda28197Spatrick {"r4",
93dda28197Spatrick nullptr,
94dda28197Spatrick 4,
95dda28197Spatrick 0,
96dda28197Spatrick eEncodingUint,
97dda28197Spatrick eFormatHex,
98dda28197Spatrick {ehframe_r4, dwarf_r4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
99dda28197Spatrick LLDB_INVALID_REGNUM},
100dda28197Spatrick nullptr,
101dda28197Spatrick nullptr,
102*f6aab3d8Srobert },
103dda28197Spatrick {"r5",
104dda28197Spatrick nullptr,
105dda28197Spatrick 4,
106dda28197Spatrick 0,
107dda28197Spatrick eEncodingUint,
108dda28197Spatrick eFormatHex,
109dda28197Spatrick {ehframe_r5, dwarf_r5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
110dda28197Spatrick LLDB_INVALID_REGNUM},
111dda28197Spatrick nullptr,
112dda28197Spatrick nullptr,
113*f6aab3d8Srobert },
114dda28197Spatrick {"r6",
115dda28197Spatrick nullptr,
116dda28197Spatrick 4,
117dda28197Spatrick 0,
118dda28197Spatrick eEncodingUint,
119dda28197Spatrick eFormatHex,
120dda28197Spatrick {ehframe_r6, dwarf_r6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
121dda28197Spatrick LLDB_INVALID_REGNUM},
122dda28197Spatrick nullptr,
123dda28197Spatrick nullptr,
124*f6aab3d8Srobert },
125dda28197Spatrick {"r7",
126dda28197Spatrick nullptr,
127dda28197Spatrick 4,
128dda28197Spatrick 0,
129dda28197Spatrick eEncodingUint,
130dda28197Spatrick eFormatHex,
131dda28197Spatrick {ehframe_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM,
132dda28197Spatrick LLDB_INVALID_REGNUM},
133dda28197Spatrick nullptr,
134dda28197Spatrick nullptr,
135*f6aab3d8Srobert },
136dda28197Spatrick {"r8",
137dda28197Spatrick nullptr,
138dda28197Spatrick 4,
139dda28197Spatrick 0,
140dda28197Spatrick eEncodingUint,
141dda28197Spatrick eFormatHex,
142dda28197Spatrick {ehframe_r8, dwarf_r8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
143dda28197Spatrick LLDB_INVALID_REGNUM},
144dda28197Spatrick nullptr,
145dda28197Spatrick nullptr,
146*f6aab3d8Srobert },
147dda28197Spatrick {"r9",
148dda28197Spatrick nullptr,
149dda28197Spatrick 4,
150dda28197Spatrick 0,
151dda28197Spatrick eEncodingUint,
152dda28197Spatrick eFormatHex,
153dda28197Spatrick {ehframe_r9, dwarf_r9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
154dda28197Spatrick LLDB_INVALID_REGNUM},
155dda28197Spatrick nullptr,
156dda28197Spatrick nullptr,
157*f6aab3d8Srobert },
158dda28197Spatrick {"r10",
159dda28197Spatrick nullptr,
160dda28197Spatrick 4,
161dda28197Spatrick 0,
162dda28197Spatrick eEncodingUint,
163dda28197Spatrick eFormatHex,
164dda28197Spatrick {ehframe_r10, dwarf_r10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
165dda28197Spatrick LLDB_INVALID_REGNUM},
166dda28197Spatrick nullptr,
167dda28197Spatrick nullptr,
168*f6aab3d8Srobert },
169dda28197Spatrick {"r11",
170dda28197Spatrick nullptr,
171dda28197Spatrick 4,
172dda28197Spatrick 0,
173dda28197Spatrick eEncodingUint,
174dda28197Spatrick eFormatHex,
175dda28197Spatrick {ehframe_r11, dwarf_r11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
176dda28197Spatrick LLDB_INVALID_REGNUM},
177dda28197Spatrick nullptr,
178dda28197Spatrick nullptr,
179*f6aab3d8Srobert },
180dda28197Spatrick {"r12",
181dda28197Spatrick nullptr,
182dda28197Spatrick 4,
183dda28197Spatrick 0,
184dda28197Spatrick eEncodingUint,
185dda28197Spatrick eFormatHex,
186dda28197Spatrick {ehframe_r12, dwarf_r12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
187dda28197Spatrick LLDB_INVALID_REGNUM},
188dda28197Spatrick nullptr,
189dda28197Spatrick nullptr,
190*f6aab3d8Srobert },
191dda28197Spatrick {"sp",
192dda28197Spatrick "r13",
193dda28197Spatrick 4,
194dda28197Spatrick 0,
195dda28197Spatrick eEncodingUint,
196dda28197Spatrick eFormatHex,
197dda28197Spatrick {ehframe_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM,
198dda28197Spatrick LLDB_INVALID_REGNUM},
199dda28197Spatrick nullptr,
200dda28197Spatrick nullptr,
201*f6aab3d8Srobert },
202dda28197Spatrick {"lr",
203dda28197Spatrick "r14",
204dda28197Spatrick 4,
205dda28197Spatrick 0,
206dda28197Spatrick eEncodingUint,
207dda28197Spatrick eFormatHex,
208dda28197Spatrick {ehframe_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM,
209dda28197Spatrick LLDB_INVALID_REGNUM},
210dda28197Spatrick nullptr,
211dda28197Spatrick nullptr,
212*f6aab3d8Srobert },
213dda28197Spatrick {"pc",
214dda28197Spatrick "r15",
215dda28197Spatrick 4,
216dda28197Spatrick 0,
217dda28197Spatrick eEncodingUint,
218dda28197Spatrick eFormatHex,
219dda28197Spatrick {ehframe_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM,
220dda28197Spatrick LLDB_INVALID_REGNUM},
221dda28197Spatrick nullptr,
222dda28197Spatrick nullptr,
223*f6aab3d8Srobert },
224dda28197Spatrick {"cpsr",
225dda28197Spatrick "psr",
226dda28197Spatrick 4,
227dda28197Spatrick 0,
228dda28197Spatrick eEncodingUint,
229dda28197Spatrick eFormatHex,
230dda28197Spatrick {ehframe_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM,
231dda28197Spatrick LLDB_INVALID_REGNUM},
232dda28197Spatrick nullptr,
233dda28197Spatrick nullptr,
234*f6aab3d8Srobert },
235dda28197Spatrick {"s0",
236dda28197Spatrick nullptr,
237dda28197Spatrick 4,
238dda28197Spatrick 0,
239dda28197Spatrick eEncodingIEEE754,
240dda28197Spatrick eFormatFloat,
241dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
242dda28197Spatrick LLDB_INVALID_REGNUM},
243dda28197Spatrick nullptr,
244dda28197Spatrick nullptr,
245*f6aab3d8Srobert },
246dda28197Spatrick {"s1",
247dda28197Spatrick nullptr,
248dda28197Spatrick 4,
249dda28197Spatrick 0,
250dda28197Spatrick eEncodingIEEE754,
251dda28197Spatrick eFormatFloat,
252dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
253dda28197Spatrick LLDB_INVALID_REGNUM},
254dda28197Spatrick nullptr,
255dda28197Spatrick nullptr,
256*f6aab3d8Srobert },
257dda28197Spatrick {"s2",
258dda28197Spatrick nullptr,
259dda28197Spatrick 4,
260dda28197Spatrick 0,
261dda28197Spatrick eEncodingIEEE754,
262dda28197Spatrick eFormatFloat,
263dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
264dda28197Spatrick LLDB_INVALID_REGNUM},
265dda28197Spatrick nullptr,
266dda28197Spatrick nullptr,
267*f6aab3d8Srobert },
268dda28197Spatrick {"s3",
269dda28197Spatrick nullptr,
270dda28197Spatrick 4,
271dda28197Spatrick 0,
272dda28197Spatrick eEncodingIEEE754,
273dda28197Spatrick eFormatFloat,
274dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
275dda28197Spatrick LLDB_INVALID_REGNUM},
276dda28197Spatrick nullptr,
277dda28197Spatrick nullptr,
278*f6aab3d8Srobert },
279dda28197Spatrick {"s4",
280dda28197Spatrick nullptr,
281dda28197Spatrick 4,
282dda28197Spatrick 0,
283dda28197Spatrick eEncodingIEEE754,
284dda28197Spatrick eFormatFloat,
285dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
286dda28197Spatrick LLDB_INVALID_REGNUM},
287dda28197Spatrick nullptr,
288dda28197Spatrick nullptr,
289*f6aab3d8Srobert },
290dda28197Spatrick {"s5",
291dda28197Spatrick nullptr,
292dda28197Spatrick 4,
293dda28197Spatrick 0,
294dda28197Spatrick eEncodingIEEE754,
295dda28197Spatrick eFormatFloat,
296dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
297dda28197Spatrick LLDB_INVALID_REGNUM},
298dda28197Spatrick nullptr,
299dda28197Spatrick nullptr,
300*f6aab3d8Srobert },
301dda28197Spatrick {"s6",
302dda28197Spatrick nullptr,
303dda28197Spatrick 4,
304dda28197Spatrick 0,
305dda28197Spatrick eEncodingIEEE754,
306dda28197Spatrick eFormatFloat,
307dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
308dda28197Spatrick LLDB_INVALID_REGNUM},
309dda28197Spatrick nullptr,
310dda28197Spatrick nullptr,
311*f6aab3d8Srobert },
312dda28197Spatrick {"s7",
313dda28197Spatrick nullptr,
314dda28197Spatrick 4,
315dda28197Spatrick 0,
316dda28197Spatrick eEncodingIEEE754,
317dda28197Spatrick eFormatFloat,
318dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
319dda28197Spatrick LLDB_INVALID_REGNUM},
320dda28197Spatrick nullptr,
321dda28197Spatrick nullptr,
322*f6aab3d8Srobert },
323dda28197Spatrick {"s8",
324dda28197Spatrick nullptr,
325dda28197Spatrick 4,
326dda28197Spatrick 0,
327dda28197Spatrick eEncodingIEEE754,
328dda28197Spatrick eFormatFloat,
329dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
330dda28197Spatrick LLDB_INVALID_REGNUM},
331dda28197Spatrick nullptr,
332dda28197Spatrick nullptr,
333*f6aab3d8Srobert },
334dda28197Spatrick {"s9",
335dda28197Spatrick nullptr,
336dda28197Spatrick 4,
337dda28197Spatrick 0,
338dda28197Spatrick eEncodingIEEE754,
339dda28197Spatrick eFormatFloat,
340dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
341dda28197Spatrick LLDB_INVALID_REGNUM},
342dda28197Spatrick nullptr,
343dda28197Spatrick nullptr,
344*f6aab3d8Srobert },
345dda28197Spatrick {"s10",
346dda28197Spatrick nullptr,
347dda28197Spatrick 4,
348dda28197Spatrick 0,
349dda28197Spatrick eEncodingIEEE754,
350dda28197Spatrick eFormatFloat,
351dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
352dda28197Spatrick LLDB_INVALID_REGNUM},
353dda28197Spatrick nullptr,
354dda28197Spatrick nullptr,
355*f6aab3d8Srobert },
356dda28197Spatrick {"s11",
357dda28197Spatrick nullptr,
358dda28197Spatrick 4,
359dda28197Spatrick 0,
360dda28197Spatrick eEncodingIEEE754,
361dda28197Spatrick eFormatFloat,
362dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
363dda28197Spatrick LLDB_INVALID_REGNUM},
364dda28197Spatrick nullptr,
365dda28197Spatrick nullptr,
366*f6aab3d8Srobert },
367dda28197Spatrick {"s12",
368dda28197Spatrick nullptr,
369dda28197Spatrick 4,
370dda28197Spatrick 0,
371dda28197Spatrick eEncodingIEEE754,
372dda28197Spatrick eFormatFloat,
373dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
374dda28197Spatrick LLDB_INVALID_REGNUM},
375dda28197Spatrick nullptr,
376dda28197Spatrick nullptr,
377*f6aab3d8Srobert },
378dda28197Spatrick {"s13",
379dda28197Spatrick nullptr,
380dda28197Spatrick 4,
381dda28197Spatrick 0,
382dda28197Spatrick eEncodingIEEE754,
383dda28197Spatrick eFormatFloat,
384dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
385dda28197Spatrick LLDB_INVALID_REGNUM},
386dda28197Spatrick nullptr,
387dda28197Spatrick nullptr,
388*f6aab3d8Srobert },
389dda28197Spatrick {"s14",
390dda28197Spatrick nullptr,
391dda28197Spatrick 4,
392dda28197Spatrick 0,
393dda28197Spatrick eEncodingIEEE754,
394dda28197Spatrick eFormatFloat,
395dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
396dda28197Spatrick LLDB_INVALID_REGNUM},
397dda28197Spatrick nullptr,
398dda28197Spatrick nullptr,
399*f6aab3d8Srobert },
400dda28197Spatrick {"s15",
401dda28197Spatrick nullptr,
402dda28197Spatrick 4,
403dda28197Spatrick 0,
404dda28197Spatrick eEncodingIEEE754,
405dda28197Spatrick eFormatFloat,
406dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
407dda28197Spatrick LLDB_INVALID_REGNUM},
408dda28197Spatrick nullptr,
409dda28197Spatrick nullptr,
410*f6aab3d8Srobert },
411dda28197Spatrick {"s16",
412dda28197Spatrick nullptr,
413dda28197Spatrick 4,
414dda28197Spatrick 0,
415dda28197Spatrick eEncodingIEEE754,
416dda28197Spatrick eFormatFloat,
417dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
418dda28197Spatrick LLDB_INVALID_REGNUM},
419dda28197Spatrick nullptr,
420dda28197Spatrick nullptr,
421*f6aab3d8Srobert },
422dda28197Spatrick {"s17",
423dda28197Spatrick nullptr,
424dda28197Spatrick 4,
425dda28197Spatrick 0,
426dda28197Spatrick eEncodingIEEE754,
427dda28197Spatrick eFormatFloat,
428dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
429dda28197Spatrick LLDB_INVALID_REGNUM},
430dda28197Spatrick nullptr,
431dda28197Spatrick nullptr,
432*f6aab3d8Srobert },
433dda28197Spatrick {"s18",
434dda28197Spatrick nullptr,
435dda28197Spatrick 4,
436dda28197Spatrick 0,
437dda28197Spatrick eEncodingIEEE754,
438dda28197Spatrick eFormatFloat,
439dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
440dda28197Spatrick LLDB_INVALID_REGNUM},
441dda28197Spatrick nullptr,
442dda28197Spatrick nullptr,
443*f6aab3d8Srobert },
444dda28197Spatrick {"s19",
445dda28197Spatrick nullptr,
446dda28197Spatrick 4,
447dda28197Spatrick 0,
448dda28197Spatrick eEncodingIEEE754,
449dda28197Spatrick eFormatFloat,
450dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
451dda28197Spatrick LLDB_INVALID_REGNUM},
452dda28197Spatrick nullptr,
453dda28197Spatrick nullptr,
454*f6aab3d8Srobert },
455dda28197Spatrick {"s20",
456dda28197Spatrick nullptr,
457dda28197Spatrick 4,
458dda28197Spatrick 0,
459dda28197Spatrick eEncodingIEEE754,
460dda28197Spatrick eFormatFloat,
461dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
462dda28197Spatrick LLDB_INVALID_REGNUM},
463dda28197Spatrick nullptr,
464dda28197Spatrick nullptr,
465*f6aab3d8Srobert },
466dda28197Spatrick {"s21",
467dda28197Spatrick nullptr,
468dda28197Spatrick 4,
469dda28197Spatrick 0,
470dda28197Spatrick eEncodingIEEE754,
471dda28197Spatrick eFormatFloat,
472dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
473dda28197Spatrick LLDB_INVALID_REGNUM},
474dda28197Spatrick nullptr,
475dda28197Spatrick nullptr,
476*f6aab3d8Srobert },
477dda28197Spatrick {"s22",
478dda28197Spatrick nullptr,
479dda28197Spatrick 4,
480dda28197Spatrick 0,
481dda28197Spatrick eEncodingIEEE754,
482dda28197Spatrick eFormatFloat,
483dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
484dda28197Spatrick LLDB_INVALID_REGNUM},
485dda28197Spatrick nullptr,
486dda28197Spatrick nullptr,
487*f6aab3d8Srobert },
488dda28197Spatrick {"s23",
489dda28197Spatrick nullptr,
490dda28197Spatrick 4,
491dda28197Spatrick 0,
492dda28197Spatrick eEncodingIEEE754,
493dda28197Spatrick eFormatFloat,
494dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
495dda28197Spatrick LLDB_INVALID_REGNUM},
496dda28197Spatrick nullptr,
497dda28197Spatrick nullptr,
498*f6aab3d8Srobert },
499dda28197Spatrick {"s24",
500dda28197Spatrick nullptr,
501dda28197Spatrick 4,
502dda28197Spatrick 0,
503dda28197Spatrick eEncodingIEEE754,
504dda28197Spatrick eFormatFloat,
505dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
506dda28197Spatrick LLDB_INVALID_REGNUM},
507dda28197Spatrick nullptr,
508dda28197Spatrick nullptr,
509*f6aab3d8Srobert },
510dda28197Spatrick {"s25",
511dda28197Spatrick nullptr,
512dda28197Spatrick 4,
513dda28197Spatrick 0,
514dda28197Spatrick eEncodingIEEE754,
515dda28197Spatrick eFormatFloat,
516dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
517dda28197Spatrick LLDB_INVALID_REGNUM},
518dda28197Spatrick nullptr,
519dda28197Spatrick nullptr,
520*f6aab3d8Srobert },
521dda28197Spatrick {"s26",
522dda28197Spatrick nullptr,
523dda28197Spatrick 4,
524dda28197Spatrick 0,
525dda28197Spatrick eEncodingIEEE754,
526dda28197Spatrick eFormatFloat,
527dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
528dda28197Spatrick LLDB_INVALID_REGNUM},
529dda28197Spatrick nullptr,
530dda28197Spatrick nullptr,
531*f6aab3d8Srobert },
532dda28197Spatrick {"s27",
533dda28197Spatrick nullptr,
534dda28197Spatrick 4,
535dda28197Spatrick 0,
536dda28197Spatrick eEncodingIEEE754,
537dda28197Spatrick eFormatFloat,
538dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
539dda28197Spatrick LLDB_INVALID_REGNUM},
540dda28197Spatrick nullptr,
541dda28197Spatrick nullptr,
542*f6aab3d8Srobert },
543dda28197Spatrick {"s28",
544dda28197Spatrick nullptr,
545dda28197Spatrick 4,
546dda28197Spatrick 0,
547dda28197Spatrick eEncodingIEEE754,
548dda28197Spatrick eFormatFloat,
549dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
550dda28197Spatrick LLDB_INVALID_REGNUM},
551dda28197Spatrick nullptr,
552dda28197Spatrick nullptr,
553*f6aab3d8Srobert },
554dda28197Spatrick {"s29",
555dda28197Spatrick nullptr,
556dda28197Spatrick 4,
557dda28197Spatrick 0,
558dda28197Spatrick eEncodingIEEE754,
559dda28197Spatrick eFormatFloat,
560dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
561dda28197Spatrick LLDB_INVALID_REGNUM},
562dda28197Spatrick nullptr,
563dda28197Spatrick nullptr,
564*f6aab3d8Srobert },
565dda28197Spatrick {"s30",
566dda28197Spatrick nullptr,
567dda28197Spatrick 4,
568dda28197Spatrick 0,
569dda28197Spatrick eEncodingIEEE754,
570dda28197Spatrick eFormatFloat,
571dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
572dda28197Spatrick LLDB_INVALID_REGNUM},
573dda28197Spatrick nullptr,
574dda28197Spatrick nullptr,
575*f6aab3d8Srobert },
576dda28197Spatrick {"s31",
577dda28197Spatrick nullptr,
578dda28197Spatrick 4,
579dda28197Spatrick 0,
580dda28197Spatrick eEncodingIEEE754,
581dda28197Spatrick eFormatFloat,
582dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
583dda28197Spatrick LLDB_INVALID_REGNUM},
584dda28197Spatrick nullptr,
585dda28197Spatrick nullptr,
586*f6aab3d8Srobert },
587dda28197Spatrick {"fpscr",
588dda28197Spatrick nullptr,
589dda28197Spatrick 4,
590dda28197Spatrick 0,
591dda28197Spatrick eEncodingUint,
592dda28197Spatrick eFormatHex,
593dda28197Spatrick {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
594dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
595dda28197Spatrick nullptr,
596dda28197Spatrick nullptr,
597*f6aab3d8Srobert },
598dda28197Spatrick {"d0",
599dda28197Spatrick nullptr,
600dda28197Spatrick 8,
601dda28197Spatrick 0,
602dda28197Spatrick eEncodingIEEE754,
603dda28197Spatrick eFormatFloat,
604dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
605dda28197Spatrick LLDB_INVALID_REGNUM},
606dda28197Spatrick nullptr,
607dda28197Spatrick nullptr,
608*f6aab3d8Srobert },
609dda28197Spatrick {"d1",
610dda28197Spatrick nullptr,
611dda28197Spatrick 8,
612dda28197Spatrick 0,
613dda28197Spatrick eEncodingIEEE754,
614dda28197Spatrick eFormatFloat,
615dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
616dda28197Spatrick LLDB_INVALID_REGNUM},
617dda28197Spatrick nullptr,
618dda28197Spatrick nullptr,
619*f6aab3d8Srobert },
620dda28197Spatrick {"d2",
621dda28197Spatrick nullptr,
622dda28197Spatrick 8,
623dda28197Spatrick 0,
624dda28197Spatrick eEncodingIEEE754,
625dda28197Spatrick eFormatFloat,
626dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
627dda28197Spatrick LLDB_INVALID_REGNUM},
628dda28197Spatrick nullptr,
629dda28197Spatrick nullptr,
630*f6aab3d8Srobert },
631dda28197Spatrick {"d3",
632dda28197Spatrick nullptr,
633dda28197Spatrick 8,
634dda28197Spatrick 0,
635dda28197Spatrick eEncodingIEEE754,
636dda28197Spatrick eFormatFloat,
637dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
638dda28197Spatrick LLDB_INVALID_REGNUM},
639dda28197Spatrick nullptr,
640dda28197Spatrick nullptr,
641*f6aab3d8Srobert },
642dda28197Spatrick {"d4",
643dda28197Spatrick nullptr,
644dda28197Spatrick 8,
645dda28197Spatrick 0,
646dda28197Spatrick eEncodingIEEE754,
647dda28197Spatrick eFormatFloat,
648dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
649dda28197Spatrick LLDB_INVALID_REGNUM},
650dda28197Spatrick nullptr,
651dda28197Spatrick nullptr,
652*f6aab3d8Srobert },
653dda28197Spatrick {"d5",
654dda28197Spatrick nullptr,
655dda28197Spatrick 8,
656dda28197Spatrick 0,
657dda28197Spatrick eEncodingIEEE754,
658dda28197Spatrick eFormatFloat,
659dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
660dda28197Spatrick LLDB_INVALID_REGNUM},
661dda28197Spatrick nullptr,
662dda28197Spatrick nullptr,
663*f6aab3d8Srobert },
664dda28197Spatrick {"d6",
665dda28197Spatrick nullptr,
666dda28197Spatrick 8,
667dda28197Spatrick 0,
668dda28197Spatrick eEncodingIEEE754,
669dda28197Spatrick eFormatFloat,
670dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
671dda28197Spatrick LLDB_INVALID_REGNUM},
672dda28197Spatrick nullptr,
673dda28197Spatrick nullptr,
674*f6aab3d8Srobert },
675dda28197Spatrick {"d7",
676dda28197Spatrick nullptr,
677dda28197Spatrick 8,
678dda28197Spatrick 0,
679dda28197Spatrick eEncodingIEEE754,
680dda28197Spatrick eFormatFloat,
681dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
682dda28197Spatrick LLDB_INVALID_REGNUM},
683dda28197Spatrick nullptr,
684dda28197Spatrick nullptr,
685*f6aab3d8Srobert },
686dda28197Spatrick {"d8",
687dda28197Spatrick nullptr,
688dda28197Spatrick 8,
689dda28197Spatrick 0,
690dda28197Spatrick eEncodingIEEE754,
691dda28197Spatrick eFormatFloat,
692dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
693dda28197Spatrick LLDB_INVALID_REGNUM},
694dda28197Spatrick nullptr,
695dda28197Spatrick nullptr,
696*f6aab3d8Srobert },
697dda28197Spatrick {"d9",
698dda28197Spatrick nullptr,
699dda28197Spatrick 8,
700dda28197Spatrick 0,
701dda28197Spatrick eEncodingIEEE754,
702dda28197Spatrick eFormatFloat,
703dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
704dda28197Spatrick LLDB_INVALID_REGNUM},
705dda28197Spatrick nullptr,
706dda28197Spatrick nullptr,
707*f6aab3d8Srobert },
708dda28197Spatrick {"d10",
709dda28197Spatrick nullptr,
710dda28197Spatrick 8,
711dda28197Spatrick 0,
712dda28197Spatrick eEncodingIEEE754,
713dda28197Spatrick eFormatFloat,
714dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
715dda28197Spatrick LLDB_INVALID_REGNUM},
716dda28197Spatrick nullptr,
717dda28197Spatrick nullptr,
718*f6aab3d8Srobert },
719dda28197Spatrick {"d11",
720dda28197Spatrick nullptr,
721dda28197Spatrick 8,
722dda28197Spatrick 0,
723dda28197Spatrick eEncodingIEEE754,
724dda28197Spatrick eFormatFloat,
725dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
726dda28197Spatrick LLDB_INVALID_REGNUM},
727dda28197Spatrick nullptr,
728dda28197Spatrick nullptr,
729*f6aab3d8Srobert },
730dda28197Spatrick {"d12",
731dda28197Spatrick nullptr,
732dda28197Spatrick 8,
733dda28197Spatrick 0,
734dda28197Spatrick eEncodingIEEE754,
735dda28197Spatrick eFormatFloat,
736dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
737dda28197Spatrick LLDB_INVALID_REGNUM},
738dda28197Spatrick nullptr,
739dda28197Spatrick nullptr,
740*f6aab3d8Srobert },
741dda28197Spatrick {"d13",
742dda28197Spatrick nullptr,
743dda28197Spatrick 8,
744dda28197Spatrick 0,
745dda28197Spatrick eEncodingIEEE754,
746dda28197Spatrick eFormatFloat,
747dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
748dda28197Spatrick LLDB_INVALID_REGNUM},
749dda28197Spatrick nullptr,
750dda28197Spatrick nullptr,
751*f6aab3d8Srobert },
752dda28197Spatrick {"d14",
753dda28197Spatrick nullptr,
754dda28197Spatrick 8,
755dda28197Spatrick 0,
756dda28197Spatrick eEncodingIEEE754,
757dda28197Spatrick eFormatFloat,
758dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
759dda28197Spatrick LLDB_INVALID_REGNUM},
760dda28197Spatrick nullptr,
761dda28197Spatrick nullptr,
762*f6aab3d8Srobert },
763dda28197Spatrick {"d15",
764dda28197Spatrick nullptr,
765dda28197Spatrick 8,
766dda28197Spatrick 0,
767dda28197Spatrick eEncodingIEEE754,
768dda28197Spatrick eFormatFloat,
769dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
770dda28197Spatrick LLDB_INVALID_REGNUM},
771dda28197Spatrick nullptr,
772dda28197Spatrick nullptr,
773*f6aab3d8Srobert },
774dda28197Spatrick {"d16",
775dda28197Spatrick nullptr,
776dda28197Spatrick 8,
777dda28197Spatrick 0,
778dda28197Spatrick eEncodingIEEE754,
779dda28197Spatrick eFormatFloat,
780dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
781dda28197Spatrick LLDB_INVALID_REGNUM},
782dda28197Spatrick nullptr,
783dda28197Spatrick nullptr,
784*f6aab3d8Srobert },
785dda28197Spatrick {"d17",
786dda28197Spatrick nullptr,
787dda28197Spatrick 8,
788dda28197Spatrick 0,
789dda28197Spatrick eEncodingIEEE754,
790dda28197Spatrick eFormatFloat,
791dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
792dda28197Spatrick LLDB_INVALID_REGNUM},
793dda28197Spatrick nullptr,
794dda28197Spatrick nullptr,
795*f6aab3d8Srobert },
796dda28197Spatrick {"d18",
797dda28197Spatrick nullptr,
798dda28197Spatrick 8,
799dda28197Spatrick 0,
800dda28197Spatrick eEncodingIEEE754,
801dda28197Spatrick eFormatFloat,
802dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
803dda28197Spatrick LLDB_INVALID_REGNUM},
804dda28197Spatrick nullptr,
805dda28197Spatrick nullptr,
806*f6aab3d8Srobert },
807dda28197Spatrick {"d19",
808dda28197Spatrick nullptr,
809dda28197Spatrick 8,
810dda28197Spatrick 0,
811dda28197Spatrick eEncodingIEEE754,
812dda28197Spatrick eFormatFloat,
813dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
814dda28197Spatrick LLDB_INVALID_REGNUM},
815dda28197Spatrick nullptr,
816dda28197Spatrick nullptr,
817*f6aab3d8Srobert },
818dda28197Spatrick {"d20",
819dda28197Spatrick nullptr,
820dda28197Spatrick 8,
821dda28197Spatrick 0,
822dda28197Spatrick eEncodingIEEE754,
823dda28197Spatrick eFormatFloat,
824dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
825dda28197Spatrick LLDB_INVALID_REGNUM},
826dda28197Spatrick nullptr,
827dda28197Spatrick nullptr,
828*f6aab3d8Srobert },
829dda28197Spatrick {"d21",
830dda28197Spatrick nullptr,
831dda28197Spatrick 8,
832dda28197Spatrick 0,
833dda28197Spatrick eEncodingIEEE754,
834dda28197Spatrick eFormatFloat,
835dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
836dda28197Spatrick LLDB_INVALID_REGNUM},
837dda28197Spatrick nullptr,
838dda28197Spatrick nullptr,
839*f6aab3d8Srobert },
840dda28197Spatrick {"d22",
841dda28197Spatrick nullptr,
842dda28197Spatrick 8,
843dda28197Spatrick 0,
844dda28197Spatrick eEncodingIEEE754,
845dda28197Spatrick eFormatFloat,
846dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
847dda28197Spatrick LLDB_INVALID_REGNUM},
848dda28197Spatrick nullptr,
849dda28197Spatrick nullptr,
850*f6aab3d8Srobert },
851dda28197Spatrick {"d23",
852dda28197Spatrick nullptr,
853dda28197Spatrick 8,
854dda28197Spatrick 0,
855dda28197Spatrick eEncodingIEEE754,
856dda28197Spatrick eFormatFloat,
857dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
858dda28197Spatrick LLDB_INVALID_REGNUM},
859dda28197Spatrick nullptr,
860dda28197Spatrick nullptr,
861*f6aab3d8Srobert },
862dda28197Spatrick {"d24",
863dda28197Spatrick nullptr,
864dda28197Spatrick 8,
865dda28197Spatrick 0,
866dda28197Spatrick eEncodingIEEE754,
867dda28197Spatrick eFormatFloat,
868dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
869dda28197Spatrick LLDB_INVALID_REGNUM},
870dda28197Spatrick nullptr,
871dda28197Spatrick nullptr,
872*f6aab3d8Srobert },
873dda28197Spatrick {"d25",
874dda28197Spatrick nullptr,
875dda28197Spatrick 8,
876dda28197Spatrick 0,
877dda28197Spatrick eEncodingIEEE754,
878dda28197Spatrick eFormatFloat,
879dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
880dda28197Spatrick LLDB_INVALID_REGNUM},
881dda28197Spatrick nullptr,
882dda28197Spatrick nullptr,
883*f6aab3d8Srobert },
884dda28197Spatrick {"d26",
885dda28197Spatrick nullptr,
886dda28197Spatrick 8,
887dda28197Spatrick 0,
888dda28197Spatrick eEncodingIEEE754,
889dda28197Spatrick eFormatFloat,
890dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
891dda28197Spatrick LLDB_INVALID_REGNUM},
892dda28197Spatrick nullptr,
893dda28197Spatrick nullptr,
894*f6aab3d8Srobert },
895dda28197Spatrick {"d27",
896dda28197Spatrick nullptr,
897dda28197Spatrick 8,
898dda28197Spatrick 0,
899dda28197Spatrick eEncodingIEEE754,
900dda28197Spatrick eFormatFloat,
901dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
902dda28197Spatrick LLDB_INVALID_REGNUM},
903dda28197Spatrick nullptr,
904dda28197Spatrick nullptr,
905*f6aab3d8Srobert },
906dda28197Spatrick {"d28",
907dda28197Spatrick nullptr,
908dda28197Spatrick 8,
909dda28197Spatrick 0,
910dda28197Spatrick eEncodingIEEE754,
911dda28197Spatrick eFormatFloat,
912dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
913dda28197Spatrick LLDB_INVALID_REGNUM},
914dda28197Spatrick nullptr,
915dda28197Spatrick nullptr,
916*f6aab3d8Srobert },
917dda28197Spatrick {"d29",
918dda28197Spatrick nullptr,
919dda28197Spatrick 8,
920dda28197Spatrick 0,
921dda28197Spatrick eEncodingIEEE754,
922dda28197Spatrick eFormatFloat,
923dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
924dda28197Spatrick LLDB_INVALID_REGNUM},
925dda28197Spatrick nullptr,
926dda28197Spatrick nullptr,
927*f6aab3d8Srobert },
928dda28197Spatrick {"d30",
929dda28197Spatrick nullptr,
930dda28197Spatrick 8,
931dda28197Spatrick 0,
932dda28197Spatrick eEncodingIEEE754,
933dda28197Spatrick eFormatFloat,
934dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
935dda28197Spatrick LLDB_INVALID_REGNUM},
936dda28197Spatrick nullptr,
937dda28197Spatrick nullptr,
938*f6aab3d8Srobert },
939dda28197Spatrick {"d31",
940dda28197Spatrick nullptr,
941dda28197Spatrick 8,
942dda28197Spatrick 0,
943dda28197Spatrick eEncodingIEEE754,
944dda28197Spatrick eFormatFloat,
945dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
946dda28197Spatrick LLDB_INVALID_REGNUM},
947dda28197Spatrick nullptr,
948dda28197Spatrick nullptr,
949*f6aab3d8Srobert },
950dda28197Spatrick {"r8_usr",
951dda28197Spatrick nullptr,
952dda28197Spatrick 4,
953dda28197Spatrick 0,
954dda28197Spatrick eEncodingUint,
955dda28197Spatrick eFormatHex,
956dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r8_usr, LLDB_INVALID_REGNUM,
957dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
958dda28197Spatrick nullptr,
959dda28197Spatrick nullptr,
960*f6aab3d8Srobert },
961dda28197Spatrick {"r9_usr",
962dda28197Spatrick nullptr,
963dda28197Spatrick 4,
964dda28197Spatrick 0,
965dda28197Spatrick eEncodingUint,
966dda28197Spatrick eFormatHex,
967dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r9_usr, LLDB_INVALID_REGNUM,
968dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
969dda28197Spatrick nullptr,
970dda28197Spatrick nullptr,
971*f6aab3d8Srobert },
972dda28197Spatrick {"r10_usr",
973dda28197Spatrick nullptr,
974dda28197Spatrick 4,
975dda28197Spatrick 0,
976dda28197Spatrick eEncodingUint,
977dda28197Spatrick eFormatHex,
978dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r10_usr, LLDB_INVALID_REGNUM,
979dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
980dda28197Spatrick nullptr,
981dda28197Spatrick nullptr,
982*f6aab3d8Srobert },
983dda28197Spatrick {"r11_usr",
984dda28197Spatrick nullptr,
985dda28197Spatrick 4,
986dda28197Spatrick 0,
987dda28197Spatrick eEncodingUint,
988dda28197Spatrick eFormatHex,
989dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r11_usr, LLDB_INVALID_REGNUM,
990dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
991dda28197Spatrick nullptr,
992dda28197Spatrick nullptr,
993*f6aab3d8Srobert },
994dda28197Spatrick {"r12_usr",
995dda28197Spatrick nullptr,
996dda28197Spatrick 4,
997dda28197Spatrick 0,
998dda28197Spatrick eEncodingUint,
999dda28197Spatrick eFormatHex,
1000dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r12_usr, LLDB_INVALID_REGNUM,
1001dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1002dda28197Spatrick nullptr,
1003dda28197Spatrick nullptr,
1004*f6aab3d8Srobert },
1005dda28197Spatrick {"r13_usr",
1006dda28197Spatrick "sp_usr",
1007dda28197Spatrick 4,
1008dda28197Spatrick 0,
1009dda28197Spatrick eEncodingUint,
1010dda28197Spatrick eFormatHex,
1011dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r13_usr, LLDB_INVALID_REGNUM,
1012dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1013dda28197Spatrick nullptr,
1014dda28197Spatrick nullptr,
1015*f6aab3d8Srobert },
1016dda28197Spatrick {"r14_usr",
1017dda28197Spatrick "lr_usr",
1018dda28197Spatrick 4,
1019dda28197Spatrick 0,
1020dda28197Spatrick eEncodingUint,
1021dda28197Spatrick eFormatHex,
1022dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r14_usr, LLDB_INVALID_REGNUM,
1023dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1024dda28197Spatrick nullptr,
1025dda28197Spatrick nullptr,
1026*f6aab3d8Srobert },
1027dda28197Spatrick {"r8_fiq",
1028dda28197Spatrick nullptr,
1029dda28197Spatrick 4,
1030dda28197Spatrick 0,
1031dda28197Spatrick eEncodingUint,
1032dda28197Spatrick eFormatHex,
1033dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r8_fiq, LLDB_INVALID_REGNUM,
1034dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1035dda28197Spatrick nullptr,
1036dda28197Spatrick nullptr,
1037*f6aab3d8Srobert },
1038dda28197Spatrick {"r9_fiq",
1039dda28197Spatrick nullptr,
1040dda28197Spatrick 4,
1041dda28197Spatrick 0,
1042dda28197Spatrick eEncodingUint,
1043dda28197Spatrick eFormatHex,
1044dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r9_fiq, LLDB_INVALID_REGNUM,
1045dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1046dda28197Spatrick nullptr,
1047dda28197Spatrick nullptr,
1048*f6aab3d8Srobert },
1049dda28197Spatrick {"r10_fiq",
1050dda28197Spatrick nullptr,
1051dda28197Spatrick 4,
1052dda28197Spatrick 0,
1053dda28197Spatrick eEncodingUint,
1054dda28197Spatrick eFormatHex,
1055dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r10_fiq, LLDB_INVALID_REGNUM,
1056dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1057dda28197Spatrick nullptr,
1058dda28197Spatrick nullptr,
1059*f6aab3d8Srobert },
1060dda28197Spatrick {"r11_fiq",
1061dda28197Spatrick nullptr,
1062dda28197Spatrick 4,
1063dda28197Spatrick 0,
1064dda28197Spatrick eEncodingUint,
1065dda28197Spatrick eFormatHex,
1066dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r11_fiq, LLDB_INVALID_REGNUM,
1067dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1068dda28197Spatrick nullptr,
1069dda28197Spatrick nullptr,
1070*f6aab3d8Srobert },
1071dda28197Spatrick {"r12_fiq",
1072dda28197Spatrick nullptr,
1073dda28197Spatrick 4,
1074dda28197Spatrick 0,
1075dda28197Spatrick eEncodingUint,
1076dda28197Spatrick eFormatHex,
1077dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r12_fiq, LLDB_INVALID_REGNUM,
1078dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1079dda28197Spatrick nullptr,
1080dda28197Spatrick nullptr,
1081*f6aab3d8Srobert },
1082dda28197Spatrick {"r13_fiq",
1083dda28197Spatrick "sp_fiq",
1084dda28197Spatrick 4,
1085dda28197Spatrick 0,
1086dda28197Spatrick eEncodingUint,
1087dda28197Spatrick eFormatHex,
1088dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r13_fiq, LLDB_INVALID_REGNUM,
1089dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1090dda28197Spatrick nullptr,
1091dda28197Spatrick nullptr,
1092*f6aab3d8Srobert },
1093dda28197Spatrick {"r14_fiq",
1094dda28197Spatrick "lr_fiq",
1095dda28197Spatrick 4,
1096dda28197Spatrick 0,
1097dda28197Spatrick eEncodingUint,
1098dda28197Spatrick eFormatHex,
1099dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r14_fiq, LLDB_INVALID_REGNUM,
1100dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1101dda28197Spatrick nullptr,
1102dda28197Spatrick nullptr,
1103*f6aab3d8Srobert },
1104dda28197Spatrick {"r13_irq",
1105dda28197Spatrick "sp_irq",
1106dda28197Spatrick 4,
1107dda28197Spatrick 0,
1108dda28197Spatrick eEncodingUint,
1109dda28197Spatrick eFormatHex,
1110dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r13_irq, LLDB_INVALID_REGNUM,
1111dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1112dda28197Spatrick nullptr,
1113dda28197Spatrick nullptr,
1114*f6aab3d8Srobert },
1115dda28197Spatrick {"r14_irq",
1116dda28197Spatrick "lr_irq",
1117dda28197Spatrick 4,
1118dda28197Spatrick 0,
1119dda28197Spatrick eEncodingUint,
1120dda28197Spatrick eFormatHex,
1121dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r14_irq, LLDB_INVALID_REGNUM,
1122dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1123dda28197Spatrick nullptr,
1124dda28197Spatrick nullptr,
1125*f6aab3d8Srobert },
1126dda28197Spatrick {"r13_abt",
1127dda28197Spatrick "sp_abt",
1128dda28197Spatrick 4,
1129dda28197Spatrick 0,
1130dda28197Spatrick eEncodingUint,
1131dda28197Spatrick eFormatHex,
1132dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r13_abt, LLDB_INVALID_REGNUM,
1133dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1134dda28197Spatrick nullptr,
1135dda28197Spatrick nullptr,
1136*f6aab3d8Srobert },
1137dda28197Spatrick {"r14_abt",
1138dda28197Spatrick "lr_abt",
1139dda28197Spatrick 4,
1140dda28197Spatrick 0,
1141dda28197Spatrick eEncodingUint,
1142dda28197Spatrick eFormatHex,
1143dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r14_abt, LLDB_INVALID_REGNUM,
1144dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1145dda28197Spatrick nullptr,
1146dda28197Spatrick nullptr,
1147*f6aab3d8Srobert },
1148dda28197Spatrick {"r13_und",
1149dda28197Spatrick "sp_und",
1150dda28197Spatrick 4,
1151dda28197Spatrick 0,
1152dda28197Spatrick eEncodingUint,
1153dda28197Spatrick eFormatHex,
1154dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r13_und, LLDB_INVALID_REGNUM,
1155dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1156dda28197Spatrick nullptr,
1157dda28197Spatrick nullptr,
1158*f6aab3d8Srobert },
1159dda28197Spatrick {"r14_und",
1160dda28197Spatrick "lr_und",
1161dda28197Spatrick 4,
1162dda28197Spatrick 0,
1163dda28197Spatrick eEncodingUint,
1164dda28197Spatrick eFormatHex,
1165dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r14_und, LLDB_INVALID_REGNUM,
1166dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1167dda28197Spatrick nullptr,
1168dda28197Spatrick nullptr,
1169*f6aab3d8Srobert },
1170dda28197Spatrick {"r13_svc",
1171dda28197Spatrick "sp_svc",
1172dda28197Spatrick 4,
1173dda28197Spatrick 0,
1174dda28197Spatrick eEncodingUint,
1175dda28197Spatrick eFormatHex,
1176dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r13_svc, LLDB_INVALID_REGNUM,
1177dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1178dda28197Spatrick nullptr,
1179dda28197Spatrick nullptr,
1180*f6aab3d8Srobert },
1181dda28197Spatrick {"r14_svc",
1182dda28197Spatrick "lr_svc",
1183dda28197Spatrick 4,
1184dda28197Spatrick 0,
1185dda28197Spatrick eEncodingUint,
1186dda28197Spatrick eFormatHex,
1187dda28197Spatrick {LLDB_INVALID_REGNUM, dwarf_r14_svc, LLDB_INVALID_REGNUM,
1188dda28197Spatrick LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1189dda28197Spatrick nullptr,
1190dda28197Spatrick nullptr,
1191*f6aab3d8Srobert }};
1192dda28197Spatrick
1193*f6aab3d8Srobert static const uint32_t k_num_register_infos = std::size(g_register_infos);
1194dda28197Spatrick
1195dda28197Spatrick const lldb_private::RegisterInfo *
GetRegisterInfoArray(uint32_t & count)1196dda28197Spatrick ABISysV_arm::GetRegisterInfoArray(uint32_t &count) {
1197dda28197Spatrick count = k_num_register_infos;
1198dda28197Spatrick return g_register_infos;
1199dda28197Spatrick }
1200dda28197Spatrick
GetRedZoneSize() const1201dda28197Spatrick size_t ABISysV_arm::GetRedZoneSize() const { return 0; }
1202dda28197Spatrick
1203dda28197Spatrick // Static Functions
1204dda28197Spatrick
1205dda28197Spatrick ABISP
CreateInstance(lldb::ProcessSP process_sp,const ArchSpec & arch)1206dda28197Spatrick ABISysV_arm::CreateInstance(lldb::ProcessSP process_sp, const ArchSpec &arch) {
1207dda28197Spatrick const llvm::Triple::ArchType arch_type = arch.GetTriple().getArch();
1208dda28197Spatrick const llvm::Triple::VendorType vendor_type = arch.GetTriple().getVendor();
1209dda28197Spatrick
1210dda28197Spatrick if (vendor_type != llvm::Triple::Apple) {
1211dda28197Spatrick if ((arch_type == llvm::Triple::arm) ||
1212dda28197Spatrick (arch_type == llvm::Triple::thumb)) {
1213dda28197Spatrick return ABISP(
1214dda28197Spatrick new ABISysV_arm(std::move(process_sp), MakeMCRegisterInfo(arch)));
1215dda28197Spatrick }
1216dda28197Spatrick }
1217dda28197Spatrick
1218dda28197Spatrick return ABISP();
1219dda28197Spatrick }
1220dda28197Spatrick
PrepareTrivialCall(Thread & thread,addr_t sp,addr_t function_addr,addr_t return_addr,llvm::ArrayRef<addr_t> args) const1221dda28197Spatrick bool ABISysV_arm::PrepareTrivialCall(Thread &thread, addr_t sp,
1222dda28197Spatrick addr_t function_addr, addr_t return_addr,
1223dda28197Spatrick llvm::ArrayRef<addr_t> args) const {
1224dda28197Spatrick RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1225dda28197Spatrick if (!reg_ctx)
1226dda28197Spatrick return false;
1227dda28197Spatrick
1228dda28197Spatrick const uint32_t pc_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
1229dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
1230dda28197Spatrick const uint32_t sp_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
1231dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
1232dda28197Spatrick const uint32_t ra_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
1233dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA);
1234dda28197Spatrick
1235dda28197Spatrick RegisterValue reg_value;
1236dda28197Spatrick
1237dda28197Spatrick const uint8_t reg_names[] = {
1238dda28197Spatrick LLDB_REGNUM_GENERIC_ARG1, LLDB_REGNUM_GENERIC_ARG2,
1239dda28197Spatrick LLDB_REGNUM_GENERIC_ARG3, LLDB_REGNUM_GENERIC_ARG4};
1240dda28197Spatrick
1241dda28197Spatrick llvm::ArrayRef<addr_t>::iterator ai = args.begin(), ae = args.end();
1242dda28197Spatrick
1243*f6aab3d8Srobert for (size_t i = 0; i < std::size(reg_names); ++i) {
1244dda28197Spatrick if (ai == ae)
1245dda28197Spatrick break;
1246dda28197Spatrick
1247dda28197Spatrick reg_value.SetUInt32(*ai);
1248dda28197Spatrick if (!reg_ctx->WriteRegister(
1249dda28197Spatrick reg_ctx->GetRegisterInfo(eRegisterKindGeneric, reg_names[i]),
1250dda28197Spatrick reg_value))
1251dda28197Spatrick return false;
1252dda28197Spatrick
1253dda28197Spatrick ++ai;
1254dda28197Spatrick }
1255dda28197Spatrick
1256dda28197Spatrick if (ai != ae) {
1257dda28197Spatrick // Spill onto the stack
1258dda28197Spatrick size_t num_stack_regs = ae - ai;
1259dda28197Spatrick
1260dda28197Spatrick sp -= (num_stack_regs * 4);
1261dda28197Spatrick // Keep the stack 8 byte aligned, not that we need to
1262dda28197Spatrick sp &= ~(8ull - 1ull);
1263dda28197Spatrick
1264dda28197Spatrick // just using arg1 to get the right size
1265dda28197Spatrick const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(
1266dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);
1267dda28197Spatrick
1268dda28197Spatrick addr_t arg_pos = sp;
1269dda28197Spatrick
1270dda28197Spatrick for (; ai != ae; ++ai) {
1271dda28197Spatrick reg_value.SetUInt32(*ai);
1272dda28197Spatrick if (reg_ctx
1273dda28197Spatrick ->WriteRegisterValueToMemory(reg_info, arg_pos,
1274dda28197Spatrick reg_info->byte_size, reg_value)
1275dda28197Spatrick .Fail())
1276dda28197Spatrick return false;
1277dda28197Spatrick arg_pos += reg_info->byte_size;
1278dda28197Spatrick }
1279dda28197Spatrick }
1280dda28197Spatrick
1281dda28197Spatrick TargetSP target_sp(thread.CalculateTarget());
1282dda28197Spatrick Address so_addr;
1283dda28197Spatrick
1284dda28197Spatrick // Figure out if our return address is ARM or Thumb by using the
1285dda28197Spatrick // Address::GetCallableLoadAddress(Target*) which will figure out the ARM
1286dda28197Spatrick // thumb-ness and set the correct address bits for us.
1287dda28197Spatrick so_addr.SetLoadAddress(return_addr, target_sp.get());
1288dda28197Spatrick return_addr = so_addr.GetCallableLoadAddress(target_sp.get());
1289dda28197Spatrick
1290dda28197Spatrick // Set "lr" to the return address
1291dda28197Spatrick if (!reg_ctx->WriteRegisterFromUnsigned(ra_reg_num, return_addr))
1292dda28197Spatrick return false;
1293dda28197Spatrick
1294dda28197Spatrick // Set "sp" to the requested value
1295dda28197Spatrick if (!reg_ctx->WriteRegisterFromUnsigned(sp_reg_num, sp))
1296dda28197Spatrick return false;
1297dda28197Spatrick
1298dda28197Spatrick // If bit zero or 1 is set, this must be a thumb function, no need to figure
1299dda28197Spatrick // this out from the symbols.
1300dda28197Spatrick so_addr.SetLoadAddress(function_addr, target_sp.get());
1301dda28197Spatrick function_addr = so_addr.GetCallableLoadAddress(target_sp.get());
1302dda28197Spatrick
1303dda28197Spatrick const RegisterInfo *cpsr_reg_info =
1304dda28197Spatrick reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1305dda28197Spatrick const uint32_t curr_cpsr = reg_ctx->ReadRegisterAsUnsigned(cpsr_reg_info, 0);
1306dda28197Spatrick
1307dda28197Spatrick // Make a new CPSR and mask out any Thumb IT (if/then) bits
1308dda28197Spatrick uint32_t new_cpsr = curr_cpsr & ~MASK_CPSR_IT_MASK;
1309dda28197Spatrick // If bit zero or 1 is set, this must be thumb...
1310dda28197Spatrick if (function_addr & 1ull)
1311dda28197Spatrick new_cpsr |= MASK_CPSR_T; // Set T bit in CPSR
1312dda28197Spatrick else
1313dda28197Spatrick new_cpsr &= ~MASK_CPSR_T; // Clear T bit in CPSR
1314dda28197Spatrick
1315dda28197Spatrick if (new_cpsr != curr_cpsr) {
1316dda28197Spatrick if (!reg_ctx->WriteRegisterFromUnsigned(cpsr_reg_info, new_cpsr))
1317dda28197Spatrick return false;
1318dda28197Spatrick }
1319dda28197Spatrick
1320dda28197Spatrick function_addr &=
1321dda28197Spatrick ~1ull; // clear bit zero since the CPSR will take care of the mode for us
1322dda28197Spatrick
1323dda28197Spatrick // Set "pc" to the address requested
1324dda28197Spatrick return reg_ctx->WriteRegisterFromUnsigned(pc_reg_num, function_addr);
1325dda28197Spatrick }
1326dda28197Spatrick
GetArgumentValues(Thread & thread,ValueList & values) const1327dda28197Spatrick bool ABISysV_arm::GetArgumentValues(Thread &thread, ValueList &values) const {
1328dda28197Spatrick uint32_t num_values = values.GetSize();
1329dda28197Spatrick
1330dda28197Spatrick ExecutionContext exe_ctx(thread.shared_from_this());
1331dda28197Spatrick // For now, assume that the types in the AST values come from the Target's
1332dda28197Spatrick // scratch AST.
1333dda28197Spatrick
1334dda28197Spatrick // Extract the register context so we can read arguments from registers
1335dda28197Spatrick
1336dda28197Spatrick RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1337dda28197Spatrick
1338dda28197Spatrick if (!reg_ctx)
1339dda28197Spatrick return false;
1340dda28197Spatrick
1341dda28197Spatrick addr_t sp = 0;
1342dda28197Spatrick
1343dda28197Spatrick for (uint32_t value_idx = 0; value_idx < num_values; ++value_idx) {
1344dda28197Spatrick // We currently only support extracting values with Clang QualTypes. Do we
1345dda28197Spatrick // care about others?
1346dda28197Spatrick Value *value = values.GetValueAtIndex(value_idx);
1347dda28197Spatrick
1348dda28197Spatrick if (!value)
1349dda28197Spatrick return false;
1350dda28197Spatrick
1351dda28197Spatrick CompilerType compiler_type = value->GetCompilerType();
1352dda28197Spatrick if (compiler_type) {
1353dda28197Spatrick bool is_signed = false;
1354dda28197Spatrick size_t bit_width = 0;
1355dda28197Spatrick if (compiler_type.IsIntegerOrEnumerationType(is_signed) ||
1356dda28197Spatrick compiler_type.IsPointerOrReferenceType()) {
1357*f6aab3d8Srobert if (std::optional<uint64_t> size = compiler_type.GetBitSize(&thread))
1358dda28197Spatrick bit_width = *size;
1359dda28197Spatrick } else {
1360dda28197Spatrick // We only handle integer, pointer and reference types currently...
1361dda28197Spatrick return false;
1362dda28197Spatrick }
1363dda28197Spatrick
1364dda28197Spatrick if (bit_width <= (exe_ctx.GetProcessRef().GetAddressByteSize() * 8)) {
1365dda28197Spatrick if (value_idx < 4) {
1366dda28197Spatrick // Arguments 1-4 are in r0-r3...
1367dda28197Spatrick const RegisterInfo *arg_reg_info = nullptr;
1368dda28197Spatrick arg_reg_info = reg_ctx->GetRegisterInfo(
1369dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + value_idx);
1370dda28197Spatrick if (arg_reg_info) {
1371dda28197Spatrick RegisterValue reg_value;
1372dda28197Spatrick
1373dda28197Spatrick if (reg_ctx->ReadRegister(arg_reg_info, reg_value)) {
1374dda28197Spatrick if (is_signed)
1375dda28197Spatrick reg_value.SignExtend(bit_width);
1376dda28197Spatrick if (!reg_value.GetScalarValue(value->GetScalar()))
1377dda28197Spatrick return false;
1378dda28197Spatrick continue;
1379dda28197Spatrick }
1380dda28197Spatrick }
1381dda28197Spatrick return false;
1382dda28197Spatrick } else {
1383dda28197Spatrick if (sp == 0) {
1384dda28197Spatrick // Read the stack pointer if it already hasn't been read
1385dda28197Spatrick sp = reg_ctx->GetSP(0);
1386dda28197Spatrick if (sp == 0)
1387dda28197Spatrick return false;
1388dda28197Spatrick }
1389dda28197Spatrick
1390dda28197Spatrick // Arguments 5 on up are on the stack
1391dda28197Spatrick const uint32_t arg_byte_size = (bit_width + (8 - 1)) / 8;
1392dda28197Spatrick Status error;
1393dda28197Spatrick if (!exe_ctx.GetProcessRef().ReadScalarIntegerFromMemory(
1394dda28197Spatrick sp, arg_byte_size, is_signed, value->GetScalar(), error))
1395dda28197Spatrick return false;
1396dda28197Spatrick
1397dda28197Spatrick sp += arg_byte_size;
1398dda28197Spatrick }
1399dda28197Spatrick }
1400dda28197Spatrick }
1401dda28197Spatrick }
1402dda28197Spatrick return true;
1403dda28197Spatrick }
1404dda28197Spatrick
GetReturnValuePassedInMemory(Thread & thread,RegisterContext * reg_ctx,size_t byte_size,Value & value)1405dda28197Spatrick static bool GetReturnValuePassedInMemory(Thread &thread,
1406dda28197Spatrick RegisterContext *reg_ctx,
1407dda28197Spatrick size_t byte_size, Value &value) {
1408dda28197Spatrick Status error;
1409dda28197Spatrick DataBufferHeap buffer(byte_size, 0);
1410dda28197Spatrick
1411dda28197Spatrick const RegisterInfo *r0_reg_info =
1412dda28197Spatrick reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);
1413dda28197Spatrick uint32_t address =
1414dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
1415dda28197Spatrick thread.GetProcess()->ReadMemory(address, buffer.GetBytes(),
1416dda28197Spatrick buffer.GetByteSize(), error);
1417dda28197Spatrick
1418dda28197Spatrick if (error.Fail())
1419dda28197Spatrick return false;
1420dda28197Spatrick
1421dda28197Spatrick value.SetBytes(buffer.GetBytes(), buffer.GetByteSize());
1422dda28197Spatrick return true;
1423dda28197Spatrick }
1424dda28197Spatrick
IsArmHardFloat(Thread & thread) const1425dda28197Spatrick bool ABISysV_arm::IsArmHardFloat(Thread &thread) const {
1426dda28197Spatrick ProcessSP process_sp(thread.GetProcess());
1427dda28197Spatrick if (process_sp) {
1428dda28197Spatrick const ArchSpec &arch(process_sp->GetTarget().GetArchitecture());
1429dda28197Spatrick
1430dda28197Spatrick return (arch.GetFlags() & ArchSpec::eARM_abi_hard_float) != 0;
1431dda28197Spatrick }
1432dda28197Spatrick
1433dda28197Spatrick return false;
1434dda28197Spatrick }
1435dda28197Spatrick
GetReturnValueObjectImpl(Thread & thread,lldb_private::CompilerType & compiler_type) const1436dda28197Spatrick ValueObjectSP ABISysV_arm::GetReturnValueObjectImpl(
1437dda28197Spatrick Thread &thread, lldb_private::CompilerType &compiler_type) const {
1438dda28197Spatrick Value value;
1439dda28197Spatrick ValueObjectSP return_valobj_sp;
1440dda28197Spatrick
1441dda28197Spatrick if (!compiler_type)
1442dda28197Spatrick return return_valobj_sp;
1443dda28197Spatrick
1444dda28197Spatrick // value.SetContext (Value::eContextTypeClangType,
1445dda28197Spatrick // compiler_type.GetOpaqueQualType());
1446dda28197Spatrick value.SetCompilerType(compiler_type);
1447dda28197Spatrick
1448dda28197Spatrick RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1449dda28197Spatrick if (!reg_ctx)
1450dda28197Spatrick return return_valobj_sp;
1451dda28197Spatrick
1452dda28197Spatrick bool is_signed;
1453dda28197Spatrick bool is_complex;
1454dda28197Spatrick uint32_t float_count;
1455dda28197Spatrick bool is_vfp_candidate = false;
1456dda28197Spatrick uint8_t vfp_count = 0;
1457dda28197Spatrick uint8_t vfp_byte_size = 0;
1458dda28197Spatrick
1459dda28197Spatrick // Get the pointer to the first stack argument so we have a place to start
1460dda28197Spatrick // when reading data
1461dda28197Spatrick
1462dda28197Spatrick const RegisterInfo *r0_reg_info =
1463dda28197Spatrick reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);
1464*f6aab3d8Srobert std::optional<uint64_t> bit_width = compiler_type.GetBitSize(&thread);
1465*f6aab3d8Srobert std::optional<uint64_t> byte_size = compiler_type.GetByteSize(&thread);
1466dda28197Spatrick if (!bit_width || !byte_size)
1467dda28197Spatrick return return_valobj_sp;
1468dda28197Spatrick
1469dda28197Spatrick if (compiler_type.IsIntegerOrEnumerationType(is_signed)) {
1470dda28197Spatrick switch (*bit_width) {
1471dda28197Spatrick default:
1472dda28197Spatrick return return_valobj_sp;
1473dda28197Spatrick case 64: {
1474dda28197Spatrick const RegisterInfo *r1_reg_info = reg_ctx->GetRegisterInfo(
1475dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG2);
1476dda28197Spatrick uint64_t raw_value;
1477dda28197Spatrick raw_value = reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
1478dda28197Spatrick raw_value |= ((uint64_t)(reg_ctx->ReadRegisterAsUnsigned(r1_reg_info, 0) &
1479dda28197Spatrick UINT32_MAX))
1480dda28197Spatrick << 32;
1481dda28197Spatrick if (is_signed)
1482dda28197Spatrick value.GetScalar() = (int64_t)raw_value;
1483dda28197Spatrick else
1484dda28197Spatrick value.GetScalar() = (uint64_t)raw_value;
1485dda28197Spatrick } break;
1486dda28197Spatrick case 32:
1487dda28197Spatrick if (is_signed)
1488dda28197Spatrick value.GetScalar() = (int32_t)(
1489dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX);
1490dda28197Spatrick else
1491dda28197Spatrick value.GetScalar() = (uint32_t)(
1492dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX);
1493dda28197Spatrick break;
1494dda28197Spatrick case 16:
1495dda28197Spatrick if (is_signed)
1496dda28197Spatrick value.GetScalar() = (int16_t)(
1497dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX);
1498dda28197Spatrick else
1499dda28197Spatrick value.GetScalar() = (uint16_t)(
1500dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX);
1501dda28197Spatrick break;
1502dda28197Spatrick case 8:
1503dda28197Spatrick if (is_signed)
1504dda28197Spatrick value.GetScalar() = (int8_t)(
1505dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX);
1506dda28197Spatrick else
1507dda28197Spatrick value.GetScalar() = (uint8_t)(
1508dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX);
1509dda28197Spatrick break;
1510dda28197Spatrick }
1511dda28197Spatrick } else if (compiler_type.IsPointerType()) {
1512dda28197Spatrick uint32_t ptr =
1513dda28197Spatrick thread.GetRegisterContext()->ReadRegisterAsUnsigned(r0_reg_info, 0) &
1514dda28197Spatrick UINT32_MAX;
1515dda28197Spatrick value.GetScalar() = ptr;
1516be691f3bSpatrick } else if (compiler_type.IsVectorType()) {
1517dda28197Spatrick if (IsArmHardFloat(thread) && (*byte_size == 8 || *byte_size == 16)) {
1518dda28197Spatrick is_vfp_candidate = true;
1519dda28197Spatrick vfp_byte_size = 8;
1520dda28197Spatrick vfp_count = (*byte_size == 8 ? 1 : 2);
1521dda28197Spatrick } else if (*byte_size <= 16) {
1522dda28197Spatrick DataBufferHeap buffer(16, 0);
1523dda28197Spatrick uint32_t *buffer_ptr = (uint32_t *)buffer.GetBytes();
1524dda28197Spatrick
1525dda28197Spatrick for (uint32_t i = 0; 4 * i < *byte_size; ++i) {
1526dda28197Spatrick const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(
1527dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + i);
1528dda28197Spatrick buffer_ptr[i] =
1529dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(reg_info, 0) & UINT32_MAX;
1530dda28197Spatrick }
1531dda28197Spatrick value.SetBytes(buffer.GetBytes(), *byte_size);
1532dda28197Spatrick } else {
1533dda28197Spatrick if (!GetReturnValuePassedInMemory(thread, reg_ctx, *byte_size, value))
1534dda28197Spatrick return return_valobj_sp;
1535dda28197Spatrick }
1536dda28197Spatrick } else if (compiler_type.IsFloatingPointType(float_count, is_complex)) {
1537dda28197Spatrick if (float_count == 1 && !is_complex) {
1538dda28197Spatrick switch (*bit_width) {
1539dda28197Spatrick default:
1540dda28197Spatrick return return_valobj_sp;
1541dda28197Spatrick case 64: {
1542*f6aab3d8Srobert static_assert(sizeof(double) == sizeof(uint64_t));
1543dda28197Spatrick
1544dda28197Spatrick if (IsArmHardFloat(thread)) {
1545dda28197Spatrick RegisterValue reg_value;
1546dda28197Spatrick const RegisterInfo *d0_reg_info =
1547dda28197Spatrick reg_ctx->GetRegisterInfoByName("d0", 0);
1548dda28197Spatrick reg_ctx->ReadRegister(d0_reg_info, reg_value);
1549dda28197Spatrick value.GetScalar() = reg_value.GetAsDouble();
1550dda28197Spatrick } else {
1551dda28197Spatrick uint64_t raw_value;
1552dda28197Spatrick const RegisterInfo *r1_reg_info = reg_ctx->GetRegisterInfo(
1553dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG2);
1554dda28197Spatrick raw_value =
1555dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
1556dda28197Spatrick raw_value |=
1557dda28197Spatrick ((uint64_t)(reg_ctx->ReadRegisterAsUnsigned(r1_reg_info, 0) &
1558dda28197Spatrick UINT32_MAX))
1559dda28197Spatrick << 32;
1560dda28197Spatrick value.GetScalar() = *reinterpret_cast<double *>(&raw_value);
1561dda28197Spatrick }
1562dda28197Spatrick break;
1563dda28197Spatrick }
1564dda28197Spatrick case 16: // Half precision returned after a conversion to single precision
1565dda28197Spatrick case 32: {
1566*f6aab3d8Srobert static_assert(sizeof(float) == sizeof(uint32_t));
1567dda28197Spatrick
1568dda28197Spatrick if (IsArmHardFloat(thread)) {
1569dda28197Spatrick RegisterValue reg_value;
1570dda28197Spatrick const RegisterInfo *s0_reg_info =
1571dda28197Spatrick reg_ctx->GetRegisterInfoByName("s0", 0);
1572dda28197Spatrick reg_ctx->ReadRegister(s0_reg_info, reg_value);
1573dda28197Spatrick value.GetScalar() = reg_value.GetAsFloat();
1574dda28197Spatrick } else {
1575dda28197Spatrick uint32_t raw_value;
1576dda28197Spatrick raw_value =
1577dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
1578dda28197Spatrick value.GetScalar() = *reinterpret_cast<float *>(&raw_value);
1579dda28197Spatrick }
1580dda28197Spatrick break;
1581dda28197Spatrick }
1582dda28197Spatrick }
1583dda28197Spatrick } else if (is_complex && float_count == 2) {
1584dda28197Spatrick if (IsArmHardFloat(thread)) {
1585dda28197Spatrick is_vfp_candidate = true;
1586dda28197Spatrick vfp_byte_size = *byte_size / 2;
1587dda28197Spatrick vfp_count = 2;
1588dda28197Spatrick } else if (!GetReturnValuePassedInMemory(thread, reg_ctx, *bit_width / 8,
1589dda28197Spatrick value))
1590dda28197Spatrick return return_valobj_sp;
1591dda28197Spatrick } else
1592dda28197Spatrick // not handled yet
1593dda28197Spatrick return return_valobj_sp;
1594dda28197Spatrick } else if (compiler_type.IsAggregateType()) {
1595dda28197Spatrick if (IsArmHardFloat(thread)) {
1596dda28197Spatrick CompilerType base_type;
1597dda28197Spatrick const uint32_t homogeneous_count =
1598dda28197Spatrick compiler_type.IsHomogeneousAggregate(&base_type);
1599dda28197Spatrick
1600dda28197Spatrick if (homogeneous_count > 0 && homogeneous_count <= 4) {
1601*f6aab3d8Srobert std::optional<uint64_t> base_byte_size = base_type.GetByteSize(&thread);
1602be691f3bSpatrick if (base_type.IsVectorType()) {
1603dda28197Spatrick if (base_byte_size &&
1604dda28197Spatrick (*base_byte_size == 8 || *base_byte_size == 16)) {
1605dda28197Spatrick is_vfp_candidate = true;
1606dda28197Spatrick vfp_byte_size = 8;
1607dda28197Spatrick vfp_count = (*base_byte_size == 8 ? homogeneous_count
1608dda28197Spatrick : homogeneous_count * 2);
1609dda28197Spatrick }
1610dda28197Spatrick } else if (base_type.IsFloatingPointType(float_count, is_complex)) {
1611dda28197Spatrick if (float_count == 1 && !is_complex) {
1612dda28197Spatrick is_vfp_candidate = true;
1613dda28197Spatrick if (base_byte_size)
1614dda28197Spatrick vfp_byte_size = *base_byte_size;
1615dda28197Spatrick vfp_count = homogeneous_count;
1616dda28197Spatrick }
1617dda28197Spatrick }
1618dda28197Spatrick } else if (homogeneous_count == 0) {
1619dda28197Spatrick const uint32_t num_children = compiler_type.GetNumFields();
1620dda28197Spatrick
1621dda28197Spatrick if (num_children > 0 && num_children <= 2) {
1622dda28197Spatrick uint32_t index = 0;
1623dda28197Spatrick for (index = 0; index < num_children; index++) {
1624dda28197Spatrick std::string name;
1625dda28197Spatrick base_type = compiler_type.GetFieldAtIndex(index, name, nullptr,
1626dda28197Spatrick nullptr, nullptr);
1627dda28197Spatrick
1628dda28197Spatrick if (base_type.IsFloatingPointType(float_count, is_complex)) {
1629*f6aab3d8Srobert std::optional<uint64_t> base_byte_size =
1630be691f3bSpatrick base_type.GetByteSize(&thread);
1631dda28197Spatrick if (float_count == 2 && is_complex) {
1632dda28197Spatrick if (index != 0 && base_byte_size &&
1633dda28197Spatrick vfp_byte_size != *base_byte_size)
1634dda28197Spatrick break;
1635dda28197Spatrick else if (base_byte_size)
1636dda28197Spatrick vfp_byte_size = *base_byte_size;
1637dda28197Spatrick } else
1638dda28197Spatrick break;
1639dda28197Spatrick } else
1640dda28197Spatrick break;
1641dda28197Spatrick }
1642dda28197Spatrick
1643dda28197Spatrick if (index == num_children) {
1644dda28197Spatrick is_vfp_candidate = true;
1645dda28197Spatrick vfp_byte_size = (vfp_byte_size >> 1);
1646dda28197Spatrick vfp_count = (num_children << 1);
1647dda28197Spatrick }
1648dda28197Spatrick }
1649dda28197Spatrick }
1650dda28197Spatrick }
1651dda28197Spatrick
1652dda28197Spatrick if (*byte_size <= 4) {
1653dda28197Spatrick RegisterValue r0_reg_value;
1654dda28197Spatrick uint32_t raw_value =
1655dda28197Spatrick reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
1656dda28197Spatrick value.SetBytes(&raw_value, *byte_size);
1657dda28197Spatrick } else if (!is_vfp_candidate) {
1658dda28197Spatrick if (!GetReturnValuePassedInMemory(thread, reg_ctx, *byte_size, value))
1659dda28197Spatrick return return_valobj_sp;
1660dda28197Spatrick }
1661dda28197Spatrick } else {
1662dda28197Spatrick // not handled yet
1663dda28197Spatrick return return_valobj_sp;
1664dda28197Spatrick }
1665dda28197Spatrick
1666dda28197Spatrick if (is_vfp_candidate) {
1667dda28197Spatrick ProcessSP process_sp(thread.GetProcess());
1668dda28197Spatrick ByteOrder byte_order = process_sp->GetByteOrder();
1669dda28197Spatrick
1670*f6aab3d8Srobert WritableDataBufferSP data_sp(new DataBufferHeap(*byte_size, 0));
1671dda28197Spatrick uint32_t data_offset = 0;
1672dda28197Spatrick
1673dda28197Spatrick for (uint32_t reg_index = 0; reg_index < vfp_count; reg_index++) {
1674dda28197Spatrick uint32_t regnum = 0;
1675dda28197Spatrick
1676dda28197Spatrick if (vfp_byte_size == 4)
1677dda28197Spatrick regnum = dwarf_s0 + reg_index;
1678dda28197Spatrick else if (vfp_byte_size == 8)
1679dda28197Spatrick regnum = dwarf_d0 + reg_index;
1680dda28197Spatrick else
1681dda28197Spatrick break;
1682dda28197Spatrick
1683dda28197Spatrick const RegisterInfo *reg_info =
1684dda28197Spatrick reg_ctx->GetRegisterInfo(eRegisterKindDWARF, regnum);
1685dda28197Spatrick if (reg_info == nullptr)
1686dda28197Spatrick break;
1687dda28197Spatrick
1688dda28197Spatrick RegisterValue reg_value;
1689dda28197Spatrick if (!reg_ctx->ReadRegister(reg_info, reg_value))
1690dda28197Spatrick break;
1691dda28197Spatrick
1692dda28197Spatrick // Make sure we have enough room in "data_sp"
1693dda28197Spatrick if ((data_offset + vfp_byte_size) <= data_sp->GetByteSize()) {
1694dda28197Spatrick Status error;
1695dda28197Spatrick const size_t bytes_copied = reg_value.GetAsMemoryData(
1696*f6aab3d8Srobert *reg_info, data_sp->GetBytes() + data_offset, vfp_byte_size,
1697dda28197Spatrick byte_order, error);
1698dda28197Spatrick if (bytes_copied != vfp_byte_size)
1699dda28197Spatrick break;
1700dda28197Spatrick
1701dda28197Spatrick data_offset += bytes_copied;
1702dda28197Spatrick }
1703dda28197Spatrick }
1704dda28197Spatrick
1705dda28197Spatrick if (data_offset == *byte_size) {
1706dda28197Spatrick DataExtractor data;
1707dda28197Spatrick data.SetByteOrder(byte_order);
1708dda28197Spatrick data.SetAddressByteSize(process_sp->GetAddressByteSize());
1709dda28197Spatrick data.SetData(data_sp);
1710dda28197Spatrick
1711dda28197Spatrick return ValueObjectConstResult::Create(&thread, compiler_type,
1712dda28197Spatrick ConstString(""), data);
1713dda28197Spatrick } else { // Some error occurred while getting values from registers
1714dda28197Spatrick return return_valobj_sp;
1715dda28197Spatrick }
1716dda28197Spatrick }
1717dda28197Spatrick
1718dda28197Spatrick // If we get here, we have a valid Value, so make our ValueObject out of it:
1719dda28197Spatrick
1720dda28197Spatrick return_valobj_sp = ValueObjectConstResult::Create(
1721dda28197Spatrick thread.GetStackFrameAtIndex(0).get(), value, ConstString(""));
1722dda28197Spatrick return return_valobj_sp;
1723dda28197Spatrick }
1724dda28197Spatrick
SetReturnValueObject(lldb::StackFrameSP & frame_sp,lldb::ValueObjectSP & new_value_sp)1725dda28197Spatrick Status ABISysV_arm::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
1726dda28197Spatrick lldb::ValueObjectSP &new_value_sp) {
1727dda28197Spatrick Status error;
1728dda28197Spatrick if (!new_value_sp) {
1729dda28197Spatrick error.SetErrorString("Empty value object for return value.");
1730dda28197Spatrick return error;
1731dda28197Spatrick }
1732dda28197Spatrick
1733dda28197Spatrick CompilerType compiler_type = new_value_sp->GetCompilerType();
1734dda28197Spatrick if (!compiler_type) {
1735dda28197Spatrick error.SetErrorString("Null clang type for return value.");
1736dda28197Spatrick return error;
1737dda28197Spatrick }
1738dda28197Spatrick
1739dda28197Spatrick Thread *thread = frame_sp->GetThread().get();
1740dda28197Spatrick
1741dda28197Spatrick bool is_signed;
1742dda28197Spatrick uint32_t count;
1743dda28197Spatrick bool is_complex;
1744dda28197Spatrick
1745dda28197Spatrick RegisterContext *reg_ctx = thread->GetRegisterContext().get();
1746dda28197Spatrick
1747dda28197Spatrick bool set_it_simple = false;
1748dda28197Spatrick if (compiler_type.IsIntegerOrEnumerationType(is_signed) ||
1749dda28197Spatrick compiler_type.IsPointerType()) {
1750dda28197Spatrick DataExtractor data;
1751dda28197Spatrick Status data_error;
1752dda28197Spatrick size_t num_bytes = new_value_sp->GetData(data, data_error);
1753dda28197Spatrick if (data_error.Fail()) {
1754dda28197Spatrick error.SetErrorStringWithFormat(
1755dda28197Spatrick "Couldn't convert return value to raw data: %s",
1756dda28197Spatrick data_error.AsCString());
1757dda28197Spatrick return error;
1758dda28197Spatrick }
1759dda28197Spatrick lldb::offset_t offset = 0;
1760dda28197Spatrick if (num_bytes <= 8) {
1761dda28197Spatrick const RegisterInfo *r0_info = reg_ctx->GetRegisterInfo(
1762dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);
1763dda28197Spatrick if (num_bytes <= 4) {
1764dda28197Spatrick uint32_t raw_value = data.GetMaxU32(&offset, num_bytes);
1765dda28197Spatrick
1766dda28197Spatrick if (reg_ctx->WriteRegisterFromUnsigned(r0_info, raw_value))
1767dda28197Spatrick set_it_simple = true;
1768dda28197Spatrick } else {
1769dda28197Spatrick uint32_t raw_value = data.GetMaxU32(&offset, 4);
1770dda28197Spatrick
1771dda28197Spatrick if (reg_ctx->WriteRegisterFromUnsigned(r0_info, raw_value)) {
1772dda28197Spatrick const RegisterInfo *r1_info = reg_ctx->GetRegisterInfo(
1773dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG2);
1774dda28197Spatrick uint32_t raw_value = data.GetMaxU32(&offset, num_bytes - offset);
1775dda28197Spatrick
1776dda28197Spatrick if (reg_ctx->WriteRegisterFromUnsigned(r1_info, raw_value))
1777dda28197Spatrick set_it_simple = true;
1778dda28197Spatrick }
1779dda28197Spatrick }
1780dda28197Spatrick } else {
1781dda28197Spatrick error.SetErrorString("We don't support returning longer than 64 bit "
1782dda28197Spatrick "integer values at present.");
1783dda28197Spatrick }
1784dda28197Spatrick } else if (compiler_type.IsFloatingPointType(count, is_complex)) {
1785dda28197Spatrick if (is_complex)
1786dda28197Spatrick error.SetErrorString(
1787dda28197Spatrick "We don't support returning complex values at present");
1788dda28197Spatrick else
1789dda28197Spatrick error.SetErrorString(
1790dda28197Spatrick "We don't support returning float values at present");
1791dda28197Spatrick }
1792dda28197Spatrick
1793dda28197Spatrick if (!set_it_simple)
1794dda28197Spatrick error.SetErrorString(
1795dda28197Spatrick "We only support setting simple integer return types at present.");
1796dda28197Spatrick
1797dda28197Spatrick return error;
1798dda28197Spatrick }
1799dda28197Spatrick
CreateFunctionEntryUnwindPlan(UnwindPlan & unwind_plan)1800dda28197Spatrick bool ABISysV_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
1801dda28197Spatrick unwind_plan.Clear();
1802dda28197Spatrick unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1803dda28197Spatrick
1804dda28197Spatrick uint32_t lr_reg_num = dwarf_lr;
1805dda28197Spatrick uint32_t sp_reg_num = dwarf_sp;
1806dda28197Spatrick uint32_t pc_reg_num = dwarf_pc;
1807dda28197Spatrick
1808dda28197Spatrick UnwindPlan::RowSP row(new UnwindPlan::Row);
1809dda28197Spatrick
1810dda28197Spatrick // Our Call Frame Address is the stack pointer value
1811dda28197Spatrick row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
1812dda28197Spatrick
1813dda28197Spatrick // The previous PC is in the LR
1814dda28197Spatrick row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true);
1815dda28197Spatrick unwind_plan.AppendRow(row);
1816dda28197Spatrick
1817dda28197Spatrick // All other registers are the same.
1818dda28197Spatrick
1819dda28197Spatrick unwind_plan.SetSourceName("arm at-func-entry default");
1820dda28197Spatrick unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1821dda28197Spatrick
1822dda28197Spatrick return true;
1823dda28197Spatrick }
1824dda28197Spatrick
CreateDefaultUnwindPlan(UnwindPlan & unwind_plan)1825dda28197Spatrick bool ABISysV_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
1826dda28197Spatrick unwind_plan.Clear();
1827dda28197Spatrick unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1828dda28197Spatrick
1829dda28197Spatrick // TODO: Handle thumb
1830dda28197Spatrick uint32_t fp_reg_num = dwarf_r11;
1831dda28197Spatrick uint32_t pc_reg_num = dwarf_pc;
1832dda28197Spatrick
1833dda28197Spatrick UnwindPlan::RowSP row(new UnwindPlan::Row);
1834dda28197Spatrick const int32_t ptr_size = 4;
1835dda28197Spatrick
1836dda28197Spatrick row->GetCFAValue().SetIsRegisterPlusOffset(fp_reg_num, 2 * ptr_size);
1837dda28197Spatrick row->SetOffset(0);
1838be691f3bSpatrick row->SetUnspecifiedRegistersAreUndefined(true);
1839dda28197Spatrick
1840dda28197Spatrick row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
1841dda28197Spatrick row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
1842dda28197Spatrick
1843dda28197Spatrick unwind_plan.AppendRow(row);
1844dda28197Spatrick unwind_plan.SetSourceName("arm default unwind plan");
1845dda28197Spatrick unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1846dda28197Spatrick unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
1847dda28197Spatrick unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);
1848dda28197Spatrick
1849dda28197Spatrick return true;
1850dda28197Spatrick }
1851dda28197Spatrick
1852dda28197Spatrick // cf. "ARMv6 Function Calling Conventions"
1853dda28197Spatrick
1854dda28197Spatrick // ARMv7 on GNU/Linux general purpose reg rules:
1855dda28197Spatrick // r0-r3 not preserved (used for argument passing)
1856dda28197Spatrick // r4-r11 preserved (v1-v8)
1857dda28197Spatrick // r12 not presrved
1858dda28197Spatrick // r13 preserved (stack pointer)
1859dda28197Spatrick // r14 preserved (link register)
1860dda28197Spatrick // r15 preserved (pc)
1861dda28197Spatrick // cpsr not preserved (different rules for different bits)
1862dda28197Spatrick
1863dda28197Spatrick // ARMv7 VFP register rules:
1864dda28197Spatrick // d0-d7 not preserved (aka s0-s15, q0-q3)
1865dda28197Spatrick // d8-d15 preserved (aka s16-s31, q4-q7)
1866dda28197Spatrick // d16-d31 not preserved (aka q8-q15)
1867dda28197Spatrick
RegisterIsVolatile(const RegisterInfo * reg_info)1868dda28197Spatrick bool ABISysV_arm::RegisterIsVolatile(const RegisterInfo *reg_info) {
1869dda28197Spatrick if (reg_info) {
1870dda28197Spatrick // Volatile registers are: r0, r1, r2, r3, r9, r12, r13 (aka sp)
1871dda28197Spatrick const char *name = reg_info->name;
1872dda28197Spatrick if (name[0] == 'r') {
1873dda28197Spatrick switch (name[1]) {
1874dda28197Spatrick case '0':
1875dda28197Spatrick return name[2] == '\0'; // r0
1876dda28197Spatrick case '1':
1877dda28197Spatrick switch (name[2]) {
1878dda28197Spatrick case '\0':
1879dda28197Spatrick return true; // r1
1880dda28197Spatrick case '2':
1881dda28197Spatrick return name[3] == '\0'; // r12
1882dda28197Spatrick default:
1883dda28197Spatrick break;
1884dda28197Spatrick }
1885dda28197Spatrick break;
1886dda28197Spatrick
1887dda28197Spatrick case '2':
1888dda28197Spatrick return name[2] == '\0'; // r2
1889dda28197Spatrick case '3':
1890dda28197Spatrick return name[2] == '\0'; // r3
1891dda28197Spatrick default:
1892dda28197Spatrick break;
1893dda28197Spatrick }
1894dda28197Spatrick } else if (name[0] == 'd') {
1895dda28197Spatrick switch (name[1]) {
1896dda28197Spatrick case '0':
1897dda28197Spatrick return name[2] == '\0'; // d0 is volatile
1898dda28197Spatrick
1899dda28197Spatrick case '1':
1900dda28197Spatrick switch (name[2]) {
1901dda28197Spatrick case '\0':
1902dda28197Spatrick return true; // d1 is volatile
1903dda28197Spatrick case '6':
1904dda28197Spatrick case '7':
1905dda28197Spatrick case '8':
1906dda28197Spatrick case '9':
1907dda28197Spatrick return name[3] == '\0'; // d16 - d19 are volatile
1908dda28197Spatrick default:
1909dda28197Spatrick break;
1910dda28197Spatrick }
1911dda28197Spatrick break;
1912dda28197Spatrick
1913dda28197Spatrick case '2':
1914dda28197Spatrick switch (name[2]) {
1915dda28197Spatrick case '\0':
1916dda28197Spatrick return true; // d2 is volatile
1917dda28197Spatrick case '0':
1918dda28197Spatrick case '1':
1919dda28197Spatrick case '2':
1920dda28197Spatrick case '3':
1921dda28197Spatrick case '4':
1922dda28197Spatrick case '5':
1923dda28197Spatrick case '6':
1924dda28197Spatrick case '7':
1925dda28197Spatrick case '8':
1926dda28197Spatrick case '9':
1927dda28197Spatrick return name[3] == '\0'; // d20 - d29 are volatile
1928dda28197Spatrick default:
1929dda28197Spatrick break;
1930dda28197Spatrick }
1931dda28197Spatrick break;
1932dda28197Spatrick
1933dda28197Spatrick case '3':
1934dda28197Spatrick switch (name[2]) {
1935dda28197Spatrick case '\0':
1936dda28197Spatrick return true; // d3 is volatile
1937dda28197Spatrick case '0':
1938dda28197Spatrick case '1':
1939dda28197Spatrick return name[3] == '\0'; // d30 - d31 are volatile
1940dda28197Spatrick default:
1941dda28197Spatrick break;
1942dda28197Spatrick }
1943dda28197Spatrick break;
1944dda28197Spatrick case '4':
1945dda28197Spatrick case '5':
1946dda28197Spatrick case '6':
1947dda28197Spatrick case '7':
1948dda28197Spatrick return name[2] == '\0'; // d4 - d7 are volatile
1949dda28197Spatrick
1950dda28197Spatrick default:
1951dda28197Spatrick break;
1952dda28197Spatrick }
1953dda28197Spatrick } else if (name[0] == 's') {
1954dda28197Spatrick switch (name[1]) {
1955dda28197Spatrick case '0':
1956dda28197Spatrick return name[2] == '\0'; // s0 is volatile
1957dda28197Spatrick
1958dda28197Spatrick case '1':
1959dda28197Spatrick switch (name[2]) {
1960dda28197Spatrick case '\0':
1961dda28197Spatrick return true; // s1 is volatile
1962dda28197Spatrick case '0':
1963dda28197Spatrick case '1':
1964dda28197Spatrick case '2':
1965dda28197Spatrick case '3':
1966dda28197Spatrick case '4':
1967dda28197Spatrick case '5':
1968dda28197Spatrick return name[3] == '\0'; // s10 - s15 are volatile
1969dda28197Spatrick default:
1970dda28197Spatrick break;
1971dda28197Spatrick }
1972dda28197Spatrick break;
1973dda28197Spatrick
1974dda28197Spatrick case '2':
1975dda28197Spatrick case '3':
1976dda28197Spatrick case '4':
1977dda28197Spatrick case '5':
1978dda28197Spatrick case '6':
1979dda28197Spatrick case '7':
1980dda28197Spatrick case '8':
1981dda28197Spatrick case '9':
1982dda28197Spatrick return name[2] == '\0'; // s2 - s9 are volatile
1983dda28197Spatrick
1984dda28197Spatrick default:
1985dda28197Spatrick break;
1986dda28197Spatrick }
1987dda28197Spatrick } else if (name[0] == 'q') {
1988dda28197Spatrick switch (name[1]) {
1989dda28197Spatrick case '1':
1990dda28197Spatrick switch (name[2]) {
1991dda28197Spatrick case '\0':
1992dda28197Spatrick return true; // q1 is volatile
1993dda28197Spatrick case '0':
1994dda28197Spatrick case '1':
1995dda28197Spatrick case '2':
1996dda28197Spatrick case '3':
1997dda28197Spatrick case '4':
1998dda28197Spatrick case '5':
1999dda28197Spatrick return true; // q10-q15 are volatile
2000dda28197Spatrick default:
2001dda28197Spatrick return false;
2002dda28197Spatrick }
2003dda28197Spatrick break;
2004dda28197Spatrick
2005dda28197Spatrick case '0':
2006dda28197Spatrick case '2':
2007dda28197Spatrick case '3':
2008dda28197Spatrick return name[2] == '\0'; // q0-q3 are volatile
2009dda28197Spatrick case '8':
2010dda28197Spatrick case '9':
2011dda28197Spatrick return name[2] == '\0'; // q8-q9 are volatile
2012dda28197Spatrick default:
2013dda28197Spatrick break;
2014dda28197Spatrick }
2015dda28197Spatrick } else if (name[0] == 's' && name[1] == 'p' && name[2] == '\0')
2016dda28197Spatrick return true;
2017dda28197Spatrick }
2018dda28197Spatrick return false;
2019dda28197Spatrick }
2020dda28197Spatrick
Initialize()2021dda28197Spatrick void ABISysV_arm::Initialize() {
2022dda28197Spatrick PluginManager::RegisterPlugin(GetPluginNameStatic(),
2023dda28197Spatrick "SysV ABI for arm targets", CreateInstance);
2024dda28197Spatrick }
2025dda28197Spatrick
Terminate()2026dda28197Spatrick void ABISysV_arm::Terminate() {
2027dda28197Spatrick PluginManager::UnregisterPlugin(CreateInstance);
2028dda28197Spatrick }
2029