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