ABISysV_arm64.cpp revision 344779
1309124Sdim//===-- ABISysV_arm64.cpp ---------------------------------------*- C++ -*-===//
2285101Semaste//
3285101Semaste//                     The LLVM Compiler Infrastructure
4285101Semaste//
5285101Semaste// This file is distributed under the University of Illinois Open Source
6285101Semaste// License. See LICENSE.TXT for details.
7285101Semaste//
8285101Semaste//===----------------------------------------------------------------------===//
9285101Semaste
10285101Semaste#include "ABISysV_arm64.h"
11285101Semaste
12309124Sdim#include <vector>
13309124Sdim
14309124Sdim#include "llvm/ADT/STLExtras.h"
15309124Sdim#include "llvm/ADT/Triple.h"
16309124Sdim
17285101Semaste#include "lldb/Core/Module.h"
18285101Semaste#include "lldb/Core/PluginManager.h"
19285101Semaste#include "lldb/Core/Value.h"
20285101Semaste#include "lldb/Core/ValueObjectConstResult.h"
21285101Semaste#include "lldb/Symbol/UnwindPlan.h"
22285101Semaste#include "lldb/Target/Process.h"
23285101Semaste#include "lldb/Target/RegisterContext.h"
24285101Semaste#include "lldb/Target/Target.h"
25285101Semaste#include "lldb/Target/Thread.h"
26321369Sdim#include "lldb/Utility/ConstString.h"
27321369Sdim#include "lldb/Utility/Log.h"
28344779Sdim#include "lldb/Utility/RegisterValue.h"
29344779Sdim#include "lldb/Utility/Scalar.h"
30321369Sdim#include "lldb/Utility/Status.h"
31285101Semaste
32285101Semaste#include "Utility/ARM64_DWARF_Registers.h"
33285101Semaste
34285101Semasteusing namespace lldb;
35285101Semasteusing namespace lldb_private;
36285101Semaste
37314564Sdimstatic RegisterInfo g_register_infos[] = {
38314564Sdim    //  NAME       ALT       SZ OFF ENCODING          FORMAT
39314564Sdim    //  EH_FRAME             DWARF                  GENERIC
40314564Sdim    //  PROCESS PLUGIN          LLDB NATIVE
41314564Sdim    //  ========== =======   == === =============     ===================
42314564Sdim    //  ===================  ====================== ===========================
43314564Sdim    //  ======================= ======================
44314564Sdim    {"x0",
45314564Sdim     nullptr,
46314564Sdim     8,
47314564Sdim     0,
48314564Sdim     eEncodingUint,
49314564Sdim     eFormatHex,
50314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x0, LLDB_REGNUM_GENERIC_ARG1,
51314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
52314564Sdim     nullptr,
53314564Sdim     nullptr,
54314564Sdim     nullptr,
55314564Sdim     0},
56314564Sdim    {"x1",
57314564Sdim     nullptr,
58314564Sdim     8,
59314564Sdim     0,
60314564Sdim     eEncodingUint,
61314564Sdim     eFormatHex,
62314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x1, LLDB_REGNUM_GENERIC_ARG2,
63314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
64314564Sdim     nullptr,
65314564Sdim     nullptr,
66314564Sdim     nullptr,
67314564Sdim     0},
68314564Sdim    {"x2",
69314564Sdim     nullptr,
70314564Sdim     8,
71314564Sdim     0,
72314564Sdim     eEncodingUint,
73314564Sdim     eFormatHex,
74314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x2, LLDB_REGNUM_GENERIC_ARG3,
75314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
76314564Sdim     nullptr,
77314564Sdim     nullptr,
78314564Sdim     nullptr,
79314564Sdim     0},
80314564Sdim    {"x3",
81314564Sdim     nullptr,
82314564Sdim     8,
83314564Sdim     0,
84314564Sdim     eEncodingUint,
85314564Sdim     eFormatHex,
86314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x3, LLDB_REGNUM_GENERIC_ARG4,
87314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
88314564Sdim     nullptr,
89314564Sdim     nullptr,
90314564Sdim     nullptr,
91314564Sdim     0},
92314564Sdim    {"x4",
93314564Sdim     nullptr,
94314564Sdim     8,
95314564Sdim     0,
96314564Sdim     eEncodingUint,
97314564Sdim     eFormatHex,
98314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x4, LLDB_REGNUM_GENERIC_ARG5,
99314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
100314564Sdim     nullptr,
101314564Sdim     nullptr,
102314564Sdim     nullptr,
103314564Sdim     0},
104314564Sdim    {"x5",
105314564Sdim     nullptr,
106314564Sdim     8,
107314564Sdim     0,
108314564Sdim     eEncodingUint,
109314564Sdim     eFormatHex,
110314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x5, LLDB_REGNUM_GENERIC_ARG6,
111314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
112314564Sdim     nullptr,
113314564Sdim     nullptr,
114314564Sdim     nullptr,
115314564Sdim     0},
116314564Sdim    {"x6",
117314564Sdim     nullptr,
118314564Sdim     8,
119314564Sdim     0,
120314564Sdim     eEncodingUint,
121314564Sdim     eFormatHex,
122314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x6, LLDB_REGNUM_GENERIC_ARG7,
123314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
124314564Sdim     nullptr,
125314564Sdim     nullptr,
126314564Sdim     nullptr,
127314564Sdim     0},
128314564Sdim    {"x7",
129314564Sdim     nullptr,
130314564Sdim     8,
131314564Sdim     0,
132314564Sdim     eEncodingUint,
133314564Sdim     eFormatHex,
134314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x7, LLDB_REGNUM_GENERIC_ARG8,
135314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
136314564Sdim     nullptr,
137314564Sdim     nullptr,
138314564Sdim     nullptr,
139314564Sdim     0},
140314564Sdim    {"x8",
141314564Sdim     nullptr,
142314564Sdim     8,
143314564Sdim     0,
144314564Sdim     eEncodingUint,
145314564Sdim     eFormatHex,
146314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x8, LLDB_INVALID_REGNUM,
147314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
148314564Sdim     nullptr,
149314564Sdim     nullptr,
150314564Sdim     nullptr,
151314564Sdim     0},
152314564Sdim    {"x9",
153314564Sdim     nullptr,
154314564Sdim     8,
155314564Sdim     0,
156314564Sdim     eEncodingUint,
157314564Sdim     eFormatHex,
158314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x9, LLDB_INVALID_REGNUM,
159314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
160314564Sdim     nullptr,
161314564Sdim     nullptr,
162314564Sdim     nullptr,
163314564Sdim     0},
164314564Sdim    {"x10",
165314564Sdim     nullptr,
166314564Sdim     8,
167314564Sdim     0,
168314564Sdim     eEncodingUint,
169314564Sdim     eFormatHex,
170314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x10, LLDB_INVALID_REGNUM,
171314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
172314564Sdim     nullptr,
173314564Sdim     nullptr,
174314564Sdim     nullptr,
175314564Sdim     0},
176314564Sdim    {"x11",
177314564Sdim     nullptr,
178314564Sdim     8,
179314564Sdim     0,
180314564Sdim     eEncodingUint,
181314564Sdim     eFormatHex,
182314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x11, LLDB_INVALID_REGNUM,
183314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
184314564Sdim     nullptr,
185314564Sdim     nullptr,
186314564Sdim     nullptr,
187314564Sdim     0},
188314564Sdim    {"x12",
189314564Sdim     nullptr,
190314564Sdim     8,
191314564Sdim     0,
192314564Sdim     eEncodingUint,
193314564Sdim     eFormatHex,
194314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x12, LLDB_INVALID_REGNUM,
195314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
196314564Sdim     nullptr,
197314564Sdim     nullptr,
198314564Sdim     nullptr,
199314564Sdim     0},
200314564Sdim    {"x13",
201314564Sdim     nullptr,
202314564Sdim     8,
203314564Sdim     0,
204314564Sdim     eEncodingUint,
205314564Sdim     eFormatHex,
206314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x13, LLDB_INVALID_REGNUM,
207314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
208314564Sdim     nullptr,
209314564Sdim     nullptr,
210314564Sdim     nullptr,
211314564Sdim     0},
212314564Sdim    {"x14",
213314564Sdim     nullptr,
214314564Sdim     8,
215314564Sdim     0,
216314564Sdim     eEncodingUint,
217314564Sdim     eFormatHex,
218314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x14, LLDB_INVALID_REGNUM,
219314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
220314564Sdim     nullptr,
221314564Sdim     nullptr,
222314564Sdim     nullptr,
223314564Sdim     0},
224314564Sdim    {"x15",
225314564Sdim     nullptr,
226314564Sdim     8,
227314564Sdim     0,
228314564Sdim     eEncodingUint,
229314564Sdim     eFormatHex,
230314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x15, LLDB_INVALID_REGNUM,
231314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
232314564Sdim     nullptr,
233314564Sdim     nullptr,
234314564Sdim     nullptr,
235314564Sdim     0},
236314564Sdim    {"x16",
237314564Sdim     nullptr,
238314564Sdim     8,
239314564Sdim     0,
240314564Sdim     eEncodingUint,
241314564Sdim     eFormatHex,
242314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x16, LLDB_INVALID_REGNUM,
243314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
244314564Sdim     nullptr,
245314564Sdim     nullptr,
246314564Sdim     nullptr,
247314564Sdim     0},
248314564Sdim    {"x17",
249314564Sdim     nullptr,
250314564Sdim     8,
251314564Sdim     0,
252314564Sdim     eEncodingUint,
253314564Sdim     eFormatHex,
254314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x17, LLDB_INVALID_REGNUM,
255314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
256314564Sdim     nullptr,
257314564Sdim     nullptr,
258314564Sdim     nullptr,
259314564Sdim     0},
260314564Sdim    {"x18",
261314564Sdim     nullptr,
262314564Sdim     8,
263314564Sdim     0,
264314564Sdim     eEncodingUint,
265314564Sdim     eFormatHex,
266314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x18, LLDB_INVALID_REGNUM,
267314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
268314564Sdim     nullptr,
269314564Sdim     nullptr,
270314564Sdim     nullptr,
271314564Sdim     0},
272314564Sdim    {"x19",
273314564Sdim     nullptr,
274314564Sdim     8,
275314564Sdim     0,
276314564Sdim     eEncodingUint,
277314564Sdim     eFormatHex,
278314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x19, LLDB_INVALID_REGNUM,
279314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
280314564Sdim     nullptr,
281314564Sdim     nullptr,
282314564Sdim     nullptr,
283314564Sdim     0},
284314564Sdim    {"x20",
285314564Sdim     nullptr,
286314564Sdim     8,
287314564Sdim     0,
288314564Sdim     eEncodingUint,
289314564Sdim     eFormatHex,
290314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x20, LLDB_INVALID_REGNUM,
291314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
292314564Sdim     nullptr,
293314564Sdim     nullptr,
294314564Sdim     nullptr,
295314564Sdim     0},
296314564Sdim    {"x21",
297314564Sdim     nullptr,
298314564Sdim     8,
299314564Sdim     0,
300314564Sdim     eEncodingUint,
301314564Sdim     eFormatHex,
302314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x21, LLDB_INVALID_REGNUM,
303314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
304314564Sdim     nullptr,
305314564Sdim     nullptr,
306314564Sdim     nullptr,
307314564Sdim     0},
308314564Sdim    {"x22",
309314564Sdim     nullptr,
310314564Sdim     8,
311314564Sdim     0,
312314564Sdim     eEncodingUint,
313314564Sdim     eFormatHex,
314314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x22, LLDB_INVALID_REGNUM,
315314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
316314564Sdim     nullptr,
317314564Sdim     nullptr,
318314564Sdim     nullptr,
319314564Sdim     0},
320314564Sdim    {"x23",
321314564Sdim     nullptr,
322314564Sdim     8,
323314564Sdim     0,
324314564Sdim     eEncodingUint,
325314564Sdim     eFormatHex,
326314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x23, LLDB_INVALID_REGNUM,
327314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
328314564Sdim     nullptr,
329314564Sdim     nullptr,
330314564Sdim     nullptr,
331314564Sdim     0},
332314564Sdim    {"x24",
333314564Sdim     nullptr,
334314564Sdim     8,
335314564Sdim     0,
336314564Sdim     eEncodingUint,
337314564Sdim     eFormatHex,
338314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x24, LLDB_INVALID_REGNUM,
339314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
340314564Sdim     nullptr,
341314564Sdim     nullptr,
342314564Sdim     nullptr,
343314564Sdim     0},
344314564Sdim    {"x25",
345314564Sdim     nullptr,
346314564Sdim     8,
347314564Sdim     0,
348314564Sdim     eEncodingUint,
349314564Sdim     eFormatHex,
350314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x25, LLDB_INVALID_REGNUM,
351314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
352314564Sdim     nullptr,
353314564Sdim     nullptr,
354314564Sdim     nullptr,
355314564Sdim     0},
356314564Sdim    {"x26",
357314564Sdim     nullptr,
358314564Sdim     8,
359314564Sdim     0,
360314564Sdim     eEncodingUint,
361314564Sdim     eFormatHex,
362314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x26, LLDB_INVALID_REGNUM,
363314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
364314564Sdim     nullptr,
365314564Sdim     nullptr,
366314564Sdim     nullptr,
367314564Sdim     0},
368314564Sdim    {"x27",
369314564Sdim     nullptr,
370314564Sdim     8,
371314564Sdim     0,
372314564Sdim     eEncodingUint,
373314564Sdim     eFormatHex,
374314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x27, LLDB_INVALID_REGNUM,
375314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
376314564Sdim     nullptr,
377314564Sdim     nullptr,
378314564Sdim     nullptr,
379314564Sdim     0},
380314564Sdim    {"x28",
381314564Sdim     nullptr,
382314564Sdim     8,
383314564Sdim     0,
384314564Sdim     eEncodingUint,
385314564Sdim     eFormatHex,
386314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x28, LLDB_INVALID_REGNUM,
387314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
388314564Sdim     nullptr,
389314564Sdim     nullptr,
390314564Sdim     nullptr,
391314564Sdim     0},
392314564Sdim    {"fp",
393314564Sdim     "x29",
394314564Sdim     8,
395314564Sdim     0,
396314564Sdim     eEncodingUint,
397314564Sdim     eFormatHex,
398314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x29, LLDB_REGNUM_GENERIC_FP,
399314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
400314564Sdim     nullptr,
401314564Sdim     nullptr,
402314564Sdim     nullptr,
403314564Sdim     0},
404314564Sdim    {"lr",
405314564Sdim     "x30",
406314564Sdim     8,
407314564Sdim     0,
408314564Sdim     eEncodingUint,
409314564Sdim     eFormatHex,
410314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x30, LLDB_REGNUM_GENERIC_RA,
411314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
412314564Sdim     nullptr,
413314564Sdim     nullptr,
414314564Sdim     nullptr,
415314564Sdim     0},
416314564Sdim    {"sp",
417314564Sdim     "x31",
418314564Sdim     8,
419314564Sdim     0,
420314564Sdim     eEncodingUint,
421314564Sdim     eFormatHex,
422314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x31, LLDB_REGNUM_GENERIC_SP,
423314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
424314564Sdim     nullptr,
425314564Sdim     nullptr,
426314564Sdim     nullptr,
427314564Sdim     0},
428314564Sdim    {"pc",
429314564Sdim     nullptr,
430314564Sdim     8,
431314564Sdim     0,
432314564Sdim     eEncodingUint,
433314564Sdim     eFormatHex,
434314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::pc, LLDB_REGNUM_GENERIC_PC,
435314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
436314564Sdim     nullptr,
437314564Sdim     nullptr,
438314564Sdim     nullptr,
439314564Sdim     0},
440314564Sdim    {"cpsr",
441314564Sdim     "psr",
442314564Sdim     4,
443314564Sdim     0,
444314564Sdim     eEncodingUint,
445314564Sdim     eFormatHex,
446314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::cpsr, LLDB_REGNUM_GENERIC_FLAGS,
447314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
448314564Sdim     nullptr,
449314564Sdim     nullptr,
450314564Sdim     nullptr,
451314564Sdim     0},
452285101Semaste
453314564Sdim    {"v0",
454314564Sdim     nullptr,
455314564Sdim     16,
456314564Sdim     0,
457314564Sdim     eEncodingVector,
458314564Sdim     eFormatVectorOfUInt8,
459314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v0, LLDB_INVALID_REGNUM,
460314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
461314564Sdim     nullptr,
462314564Sdim     nullptr,
463314564Sdim     nullptr,
464314564Sdim     0},
465314564Sdim    {"v1",
466314564Sdim     nullptr,
467314564Sdim     16,
468314564Sdim     0,
469314564Sdim     eEncodingVector,
470314564Sdim     eFormatVectorOfUInt8,
471314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v1, LLDB_INVALID_REGNUM,
472314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
473314564Sdim     nullptr,
474314564Sdim     nullptr,
475314564Sdim     nullptr,
476314564Sdim     0},
477314564Sdim    {"v2",
478314564Sdim     nullptr,
479314564Sdim     16,
480314564Sdim     0,
481314564Sdim     eEncodingVector,
482314564Sdim     eFormatVectorOfUInt8,
483314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v2, LLDB_INVALID_REGNUM,
484314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
485314564Sdim     nullptr,
486314564Sdim     nullptr,
487314564Sdim     nullptr,
488314564Sdim     0},
489314564Sdim    {"v3",
490314564Sdim     nullptr,
491314564Sdim     16,
492314564Sdim     0,
493314564Sdim     eEncodingVector,
494314564Sdim     eFormatVectorOfUInt8,
495314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v3, LLDB_INVALID_REGNUM,
496314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
497314564Sdim     nullptr,
498314564Sdim     nullptr,
499314564Sdim     nullptr,
500314564Sdim     0},
501314564Sdim    {"v4",
502314564Sdim     nullptr,
503314564Sdim     16,
504314564Sdim     0,
505314564Sdim     eEncodingVector,
506314564Sdim     eFormatVectorOfUInt8,
507314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v4, LLDB_INVALID_REGNUM,
508314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
509314564Sdim     nullptr,
510314564Sdim     nullptr,
511314564Sdim     nullptr,
512314564Sdim     0},
513314564Sdim    {"v5",
514314564Sdim     nullptr,
515314564Sdim     16,
516314564Sdim     0,
517314564Sdim     eEncodingVector,
518314564Sdim     eFormatVectorOfUInt8,
519314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v5, LLDB_INVALID_REGNUM,
520314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
521314564Sdim     nullptr,
522314564Sdim     nullptr,
523314564Sdim     nullptr,
524314564Sdim     0},
525314564Sdim    {"v6",
526314564Sdim     nullptr,
527314564Sdim     16,
528314564Sdim     0,
529314564Sdim     eEncodingVector,
530314564Sdim     eFormatVectorOfUInt8,
531314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v6, LLDB_INVALID_REGNUM,
532314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
533314564Sdim     nullptr,
534314564Sdim     nullptr,
535314564Sdim     nullptr,
536314564Sdim     0},
537314564Sdim    {"v7",
538314564Sdim     nullptr,
539314564Sdim     16,
540314564Sdim     0,
541314564Sdim     eEncodingVector,
542314564Sdim     eFormatVectorOfUInt8,
543314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v7, LLDB_INVALID_REGNUM,
544314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
545314564Sdim     nullptr,
546314564Sdim     nullptr,
547314564Sdim     nullptr,
548314564Sdim     0},
549314564Sdim    {"v8",
550314564Sdim     nullptr,
551314564Sdim     16,
552314564Sdim     0,
553314564Sdim     eEncodingVector,
554314564Sdim     eFormatVectorOfUInt8,
555314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v8, LLDB_INVALID_REGNUM,
556314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
557314564Sdim     nullptr,
558314564Sdim     nullptr,
559314564Sdim     nullptr,
560314564Sdim     0},
561314564Sdim    {"v9",
562314564Sdim     nullptr,
563314564Sdim     16,
564314564Sdim     0,
565314564Sdim     eEncodingVector,
566314564Sdim     eFormatVectorOfUInt8,
567314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v9, LLDB_INVALID_REGNUM,
568314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
569314564Sdim     nullptr,
570314564Sdim     nullptr,
571314564Sdim     nullptr,
572314564Sdim     0},
573314564Sdim    {"v10",
574314564Sdim     nullptr,
575314564Sdim     16,
576314564Sdim     0,
577314564Sdim     eEncodingVector,
578314564Sdim     eFormatVectorOfUInt8,
579314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v10, LLDB_INVALID_REGNUM,
580314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
581314564Sdim     nullptr,
582314564Sdim     nullptr,
583314564Sdim     nullptr,
584314564Sdim     0},
585314564Sdim    {"v11",
586314564Sdim     nullptr,
587314564Sdim     16,
588314564Sdim     0,
589314564Sdim     eEncodingVector,
590314564Sdim     eFormatVectorOfUInt8,
591314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v11, LLDB_INVALID_REGNUM,
592314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
593314564Sdim     nullptr,
594314564Sdim     nullptr,
595314564Sdim     nullptr,
596314564Sdim     0},
597314564Sdim    {"v12",
598314564Sdim     nullptr,
599314564Sdim     16,
600314564Sdim     0,
601314564Sdim     eEncodingVector,
602314564Sdim     eFormatVectorOfUInt8,
603314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v12, LLDB_INVALID_REGNUM,
604314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
605314564Sdim     nullptr,
606314564Sdim     nullptr,
607314564Sdim     nullptr,
608314564Sdim     0},
609314564Sdim    {"v13",
610314564Sdim     nullptr,
611314564Sdim     16,
612314564Sdim     0,
613314564Sdim     eEncodingVector,
614314564Sdim     eFormatVectorOfUInt8,
615314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v13, LLDB_INVALID_REGNUM,
616314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
617314564Sdim     nullptr,
618314564Sdim     nullptr,
619314564Sdim     nullptr,
620314564Sdim     0},
621314564Sdim    {"v14",
622314564Sdim     nullptr,
623314564Sdim     16,
624314564Sdim     0,
625314564Sdim     eEncodingVector,
626314564Sdim     eFormatVectorOfUInt8,
627314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v14, LLDB_INVALID_REGNUM,
628314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
629314564Sdim     nullptr,
630314564Sdim     nullptr,
631314564Sdim     nullptr,
632314564Sdim     0},
633314564Sdim    {"v15",
634314564Sdim     nullptr,
635314564Sdim     16,
636314564Sdim     0,
637314564Sdim     eEncodingVector,
638314564Sdim     eFormatVectorOfUInt8,
639314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v15, LLDB_INVALID_REGNUM,
640314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
641314564Sdim     nullptr,
642314564Sdim     nullptr,
643314564Sdim     nullptr,
644314564Sdim     0},
645314564Sdim    {"v16",
646314564Sdim     nullptr,
647314564Sdim     16,
648314564Sdim     0,
649314564Sdim     eEncodingVector,
650314564Sdim     eFormatVectorOfUInt8,
651314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v16, LLDB_INVALID_REGNUM,
652314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
653314564Sdim     nullptr,
654314564Sdim     nullptr,
655314564Sdim     nullptr,
656314564Sdim     0},
657314564Sdim    {"v17",
658314564Sdim     nullptr,
659314564Sdim     16,
660314564Sdim     0,
661314564Sdim     eEncodingVector,
662314564Sdim     eFormatVectorOfUInt8,
663314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v17, LLDB_INVALID_REGNUM,
664314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
665314564Sdim     nullptr,
666314564Sdim     nullptr,
667314564Sdim     nullptr,
668314564Sdim     0},
669314564Sdim    {"v18",
670314564Sdim     nullptr,
671314564Sdim     16,
672314564Sdim     0,
673314564Sdim     eEncodingVector,
674314564Sdim     eFormatVectorOfUInt8,
675314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v18, LLDB_INVALID_REGNUM,
676314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
677314564Sdim     nullptr,
678314564Sdim     nullptr,
679314564Sdim     nullptr,
680314564Sdim     0},
681314564Sdim    {"v19",
682314564Sdim     nullptr,
683314564Sdim     16,
684314564Sdim     0,
685314564Sdim     eEncodingVector,
686314564Sdim     eFormatVectorOfUInt8,
687314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v19, LLDB_INVALID_REGNUM,
688314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
689314564Sdim     nullptr,
690314564Sdim     nullptr,
691314564Sdim     nullptr,
692314564Sdim     0},
693314564Sdim    {"v20",
694314564Sdim     nullptr,
695314564Sdim     16,
696314564Sdim     0,
697314564Sdim     eEncodingVector,
698314564Sdim     eFormatVectorOfUInt8,
699314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v20, LLDB_INVALID_REGNUM,
700314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
701314564Sdim     nullptr,
702314564Sdim     nullptr,
703314564Sdim     nullptr,
704314564Sdim     0},
705314564Sdim    {"v21",
706314564Sdim     nullptr,
707314564Sdim     16,
708314564Sdim     0,
709314564Sdim     eEncodingVector,
710314564Sdim     eFormatVectorOfUInt8,
711314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v21, LLDB_INVALID_REGNUM,
712314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
713314564Sdim     nullptr,
714314564Sdim     nullptr,
715314564Sdim     nullptr,
716314564Sdim     0},
717314564Sdim    {"v22",
718314564Sdim     nullptr,
719314564Sdim     16,
720314564Sdim     0,
721314564Sdim     eEncodingVector,
722314564Sdim     eFormatVectorOfUInt8,
723314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v22, LLDB_INVALID_REGNUM,
724314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
725314564Sdim     nullptr,
726314564Sdim     nullptr,
727314564Sdim     nullptr,
728314564Sdim     0},
729314564Sdim    {"v23",
730314564Sdim     nullptr,
731314564Sdim     16,
732314564Sdim     0,
733314564Sdim     eEncodingVector,
734314564Sdim     eFormatVectorOfUInt8,
735314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v23, LLDB_INVALID_REGNUM,
736314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
737314564Sdim     nullptr,
738314564Sdim     nullptr,
739314564Sdim     nullptr,
740314564Sdim     0},
741314564Sdim    {"v24",
742314564Sdim     nullptr,
743314564Sdim     16,
744314564Sdim     0,
745314564Sdim     eEncodingVector,
746314564Sdim     eFormatVectorOfUInt8,
747314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v24, LLDB_INVALID_REGNUM,
748314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
749314564Sdim     nullptr,
750314564Sdim     nullptr,
751314564Sdim     nullptr,
752314564Sdim     0},
753314564Sdim    {"v25",
754314564Sdim     nullptr,
755314564Sdim     16,
756314564Sdim     0,
757314564Sdim     eEncodingVector,
758314564Sdim     eFormatVectorOfUInt8,
759314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v25, LLDB_INVALID_REGNUM,
760314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
761314564Sdim     nullptr,
762314564Sdim     nullptr,
763314564Sdim     nullptr,
764314564Sdim     0},
765314564Sdim    {"v26",
766314564Sdim     nullptr,
767314564Sdim     16,
768314564Sdim     0,
769314564Sdim     eEncodingVector,
770314564Sdim     eFormatVectorOfUInt8,
771314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v26, LLDB_INVALID_REGNUM,
772314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
773314564Sdim     nullptr,
774314564Sdim     nullptr,
775314564Sdim     nullptr,
776314564Sdim     0},
777314564Sdim    {"v27",
778314564Sdim     nullptr,
779314564Sdim     16,
780314564Sdim     0,
781314564Sdim     eEncodingVector,
782314564Sdim     eFormatVectorOfUInt8,
783314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v27, LLDB_INVALID_REGNUM,
784314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
785314564Sdim     nullptr,
786314564Sdim     nullptr,
787314564Sdim     nullptr,
788314564Sdim     0},
789314564Sdim    {"v28",
790314564Sdim     nullptr,
791314564Sdim     16,
792314564Sdim     0,
793314564Sdim     eEncodingVector,
794314564Sdim     eFormatVectorOfUInt8,
795314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v28, LLDB_INVALID_REGNUM,
796314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
797314564Sdim     nullptr,
798314564Sdim     nullptr,
799314564Sdim     nullptr,
800314564Sdim     0},
801314564Sdim    {"v29",
802314564Sdim     nullptr,
803314564Sdim     16,
804314564Sdim     0,
805314564Sdim     eEncodingVector,
806314564Sdim     eFormatVectorOfUInt8,
807314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v29, LLDB_INVALID_REGNUM,
808314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
809314564Sdim     nullptr,
810314564Sdim     nullptr,
811314564Sdim     nullptr,
812314564Sdim     0},
813314564Sdim    {"v30",
814314564Sdim     nullptr,
815314564Sdim     16,
816314564Sdim     0,
817314564Sdim     eEncodingVector,
818314564Sdim     eFormatVectorOfUInt8,
819314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v30, LLDB_INVALID_REGNUM,
820314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
821314564Sdim     nullptr,
822314564Sdim     nullptr,
823314564Sdim     nullptr,
824314564Sdim     0},
825314564Sdim    {"v31",
826314564Sdim     nullptr,
827314564Sdim     16,
828314564Sdim     0,
829314564Sdim     eEncodingVector,
830314564Sdim     eFormatVectorOfUInt8,
831314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v31, LLDB_INVALID_REGNUM,
832314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
833314564Sdim     nullptr,
834314564Sdim     nullptr,
835314564Sdim     nullptr,
836314564Sdim     0},
837285101Semaste
838314564Sdim    {"fpsr",
839314564Sdim     nullptr,
840314564Sdim     4,
841314564Sdim     0,
842314564Sdim     eEncodingUint,
843314564Sdim     eFormatHex,
844314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
845314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
846314564Sdim     nullptr,
847314564Sdim     nullptr,
848314564Sdim     nullptr,
849314564Sdim     0},
850314564Sdim    {"fpcr",
851314564Sdim     nullptr,
852314564Sdim     4,
853314564Sdim     0,
854314564Sdim     eEncodingUint,
855314564Sdim     eFormatHex,
856314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
857314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
858314564Sdim     nullptr,
859314564Sdim     nullptr,
860314564Sdim     nullptr,
861314564Sdim     0},
862285101Semaste
863314564Sdim    {"s0",
864314564Sdim     nullptr,
865314564Sdim     4,
866314564Sdim     0,
867314564Sdim     eEncodingIEEE754,
868314564Sdim     eFormatFloat,
869314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
870314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
871314564Sdim     nullptr,
872314564Sdim     nullptr,
873314564Sdim     nullptr,
874314564Sdim     0},
875314564Sdim    {"s1",
876314564Sdim     nullptr,
877314564Sdim     4,
878314564Sdim     0,
879314564Sdim     eEncodingIEEE754,
880314564Sdim     eFormatFloat,
881314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
882314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
883314564Sdim     nullptr,
884314564Sdim     nullptr,
885314564Sdim     nullptr,
886314564Sdim     0},
887314564Sdim    {"s2",
888314564Sdim     nullptr,
889314564Sdim     4,
890314564Sdim     0,
891314564Sdim     eEncodingIEEE754,
892314564Sdim     eFormatFloat,
893314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
894314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
895314564Sdim     nullptr,
896314564Sdim     nullptr,
897314564Sdim     nullptr,
898314564Sdim     0},
899314564Sdim    {"s3",
900314564Sdim     nullptr,
901314564Sdim     4,
902314564Sdim     0,
903314564Sdim     eEncodingIEEE754,
904314564Sdim     eFormatFloat,
905314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
906314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
907314564Sdim     nullptr,
908314564Sdim     nullptr,
909314564Sdim     nullptr,
910314564Sdim     0},
911314564Sdim    {"s4",
912314564Sdim     nullptr,
913314564Sdim     4,
914314564Sdim     0,
915314564Sdim     eEncodingIEEE754,
916314564Sdim     eFormatFloat,
917314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
918314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
919314564Sdim     nullptr,
920314564Sdim     nullptr,
921314564Sdim     nullptr,
922314564Sdim     0},
923314564Sdim    {"s5",
924314564Sdim     nullptr,
925314564Sdim     4,
926314564Sdim     0,
927314564Sdim     eEncodingIEEE754,
928314564Sdim     eFormatFloat,
929314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
930314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
931314564Sdim     nullptr,
932314564Sdim     nullptr,
933314564Sdim     nullptr,
934314564Sdim     0},
935314564Sdim    {"s6",
936314564Sdim     nullptr,
937314564Sdim     4,
938314564Sdim     0,
939314564Sdim     eEncodingIEEE754,
940314564Sdim     eFormatFloat,
941314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
942314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
943314564Sdim     nullptr,
944314564Sdim     nullptr,
945314564Sdim     nullptr,
946314564Sdim     0},
947314564Sdim    {"s7",
948314564Sdim     nullptr,
949314564Sdim     4,
950314564Sdim     0,
951314564Sdim     eEncodingIEEE754,
952314564Sdim     eFormatFloat,
953314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
954314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
955314564Sdim     nullptr,
956314564Sdim     nullptr,
957314564Sdim     nullptr,
958314564Sdim     0},
959314564Sdim    {"s8",
960314564Sdim     nullptr,
961314564Sdim     4,
962314564Sdim     0,
963314564Sdim     eEncodingIEEE754,
964314564Sdim     eFormatFloat,
965314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
966314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
967314564Sdim     nullptr,
968314564Sdim     nullptr,
969314564Sdim     nullptr,
970314564Sdim     0},
971314564Sdim    {"s9",
972314564Sdim     nullptr,
973314564Sdim     4,
974314564Sdim     0,
975314564Sdim     eEncodingIEEE754,
976314564Sdim     eFormatFloat,
977314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
978314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
979314564Sdim     nullptr,
980314564Sdim     nullptr,
981314564Sdim     nullptr,
982314564Sdim     0},
983314564Sdim    {"s10",
984314564Sdim     nullptr,
985314564Sdim     4,
986314564Sdim     0,
987314564Sdim     eEncodingIEEE754,
988314564Sdim     eFormatFloat,
989314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
990314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
991314564Sdim     nullptr,
992314564Sdim     nullptr,
993314564Sdim     nullptr,
994314564Sdim     0},
995314564Sdim    {"s11",
996314564Sdim     nullptr,
997314564Sdim     4,
998314564Sdim     0,
999314564Sdim     eEncodingIEEE754,
1000314564Sdim     eFormatFloat,
1001314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1002314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1003314564Sdim     nullptr,
1004314564Sdim     nullptr,
1005314564Sdim     nullptr,
1006314564Sdim     0},
1007314564Sdim    {"s12",
1008314564Sdim     nullptr,
1009314564Sdim     4,
1010314564Sdim     0,
1011314564Sdim     eEncodingIEEE754,
1012314564Sdim     eFormatFloat,
1013314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1014314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1015314564Sdim     nullptr,
1016314564Sdim     nullptr,
1017314564Sdim     nullptr,
1018314564Sdim     0},
1019314564Sdim    {"s13",
1020314564Sdim     nullptr,
1021314564Sdim     4,
1022314564Sdim     0,
1023314564Sdim     eEncodingIEEE754,
1024314564Sdim     eFormatFloat,
1025314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1026314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1027314564Sdim     nullptr,
1028314564Sdim     nullptr,
1029314564Sdim     nullptr,
1030314564Sdim     0},
1031314564Sdim    {"s14",
1032314564Sdim     nullptr,
1033314564Sdim     4,
1034314564Sdim     0,
1035314564Sdim     eEncodingIEEE754,
1036314564Sdim     eFormatFloat,
1037314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1038314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1039314564Sdim     nullptr,
1040314564Sdim     nullptr,
1041314564Sdim     nullptr,
1042314564Sdim     0},
1043314564Sdim    {"s15",
1044314564Sdim     nullptr,
1045314564Sdim     4,
1046314564Sdim     0,
1047314564Sdim     eEncodingIEEE754,
1048314564Sdim     eFormatFloat,
1049314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1050314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1051314564Sdim     nullptr,
1052314564Sdim     nullptr,
1053314564Sdim     nullptr,
1054314564Sdim     0},
1055314564Sdim    {"s16",
1056314564Sdim     nullptr,
1057314564Sdim     4,
1058314564Sdim     0,
1059314564Sdim     eEncodingIEEE754,
1060314564Sdim     eFormatFloat,
1061314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1062314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1063314564Sdim     nullptr,
1064314564Sdim     nullptr,
1065314564Sdim     nullptr,
1066314564Sdim     0},
1067314564Sdim    {"s17",
1068314564Sdim     nullptr,
1069314564Sdim     4,
1070314564Sdim     0,
1071314564Sdim     eEncodingIEEE754,
1072314564Sdim     eFormatFloat,
1073314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1074314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1075314564Sdim     nullptr,
1076314564Sdim     nullptr,
1077314564Sdim     nullptr,
1078314564Sdim     0},
1079314564Sdim    {"s18",
1080314564Sdim     nullptr,
1081314564Sdim     4,
1082314564Sdim     0,
1083314564Sdim     eEncodingIEEE754,
1084314564Sdim     eFormatFloat,
1085314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1086314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1087314564Sdim     nullptr,
1088314564Sdim     nullptr,
1089314564Sdim     nullptr,
1090314564Sdim     0},
1091314564Sdim    {"s19",
1092314564Sdim     nullptr,
1093314564Sdim     4,
1094314564Sdim     0,
1095314564Sdim     eEncodingIEEE754,
1096314564Sdim     eFormatFloat,
1097314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1098314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1099314564Sdim     nullptr,
1100314564Sdim     nullptr,
1101314564Sdim     nullptr,
1102314564Sdim     0},
1103314564Sdim    {"s20",
1104314564Sdim     nullptr,
1105314564Sdim     4,
1106314564Sdim     0,
1107314564Sdim     eEncodingIEEE754,
1108314564Sdim     eFormatFloat,
1109314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1110314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1111314564Sdim     nullptr,
1112314564Sdim     nullptr,
1113314564Sdim     nullptr,
1114314564Sdim     0},
1115314564Sdim    {"s21",
1116314564Sdim     nullptr,
1117314564Sdim     4,
1118314564Sdim     0,
1119314564Sdim     eEncodingIEEE754,
1120314564Sdim     eFormatFloat,
1121314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1122314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1123314564Sdim     nullptr,
1124314564Sdim     nullptr,
1125314564Sdim     nullptr,
1126314564Sdim     0},
1127314564Sdim    {"s22",
1128314564Sdim     nullptr,
1129314564Sdim     4,
1130314564Sdim     0,
1131314564Sdim     eEncodingIEEE754,
1132314564Sdim     eFormatFloat,
1133314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1134314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1135314564Sdim     nullptr,
1136314564Sdim     nullptr,
1137314564Sdim     nullptr,
1138314564Sdim     0},
1139314564Sdim    {"s23",
1140314564Sdim     nullptr,
1141314564Sdim     4,
1142314564Sdim     0,
1143314564Sdim     eEncodingIEEE754,
1144314564Sdim     eFormatFloat,
1145314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1146314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1147314564Sdim     nullptr,
1148314564Sdim     nullptr,
1149314564Sdim     nullptr,
1150314564Sdim     0},
1151314564Sdim    {"s24",
1152314564Sdim     nullptr,
1153314564Sdim     4,
1154314564Sdim     0,
1155314564Sdim     eEncodingIEEE754,
1156314564Sdim     eFormatFloat,
1157314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1158314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1159314564Sdim     nullptr,
1160314564Sdim     nullptr,
1161314564Sdim     nullptr,
1162314564Sdim     0},
1163314564Sdim    {"s25",
1164314564Sdim     nullptr,
1165314564Sdim     4,
1166314564Sdim     0,
1167314564Sdim     eEncodingIEEE754,
1168314564Sdim     eFormatFloat,
1169314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1170314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1171314564Sdim     nullptr,
1172314564Sdim     nullptr,
1173314564Sdim     nullptr,
1174314564Sdim     0},
1175314564Sdim    {"s26",
1176314564Sdim     nullptr,
1177314564Sdim     4,
1178314564Sdim     0,
1179314564Sdim     eEncodingIEEE754,
1180314564Sdim     eFormatFloat,
1181314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1182314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1183314564Sdim     nullptr,
1184314564Sdim     nullptr,
1185314564Sdim     nullptr,
1186314564Sdim     0},
1187314564Sdim    {"s27",
1188314564Sdim     nullptr,
1189314564Sdim     4,
1190314564Sdim     0,
1191314564Sdim     eEncodingIEEE754,
1192314564Sdim     eFormatFloat,
1193314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1194314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1195314564Sdim     nullptr,
1196314564Sdim     nullptr,
1197314564Sdim     nullptr,
1198314564Sdim     0},
1199314564Sdim    {"s28",
1200314564Sdim     nullptr,
1201314564Sdim     4,
1202314564Sdim     0,
1203314564Sdim     eEncodingIEEE754,
1204314564Sdim     eFormatFloat,
1205314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1206314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1207314564Sdim     nullptr,
1208314564Sdim     nullptr,
1209314564Sdim     nullptr,
1210314564Sdim     0},
1211314564Sdim    {"s29",
1212314564Sdim     nullptr,
1213314564Sdim     4,
1214314564Sdim     0,
1215314564Sdim     eEncodingIEEE754,
1216314564Sdim     eFormatFloat,
1217314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1218314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1219314564Sdim     nullptr,
1220314564Sdim     nullptr,
1221314564Sdim     nullptr,
1222314564Sdim     0},
1223314564Sdim    {"s30",
1224314564Sdim     nullptr,
1225314564Sdim     4,
1226314564Sdim     0,
1227314564Sdim     eEncodingIEEE754,
1228314564Sdim     eFormatFloat,
1229314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1230314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1231314564Sdim     nullptr,
1232314564Sdim     nullptr,
1233314564Sdim     nullptr,
1234314564Sdim     0},
1235314564Sdim    {"s31",
1236314564Sdim     nullptr,
1237314564Sdim     4,
1238314564Sdim     0,
1239314564Sdim     eEncodingIEEE754,
1240314564Sdim     eFormatFloat,
1241314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1242314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1243314564Sdim     nullptr,
1244314564Sdim     nullptr,
1245314564Sdim     nullptr,
1246314564Sdim     0},
1247285101Semaste
1248314564Sdim    {"d0",
1249314564Sdim     nullptr,
1250314564Sdim     8,
1251314564Sdim     0,
1252314564Sdim     eEncodingIEEE754,
1253314564Sdim     eFormatFloat,
1254314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1255314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1256314564Sdim     nullptr,
1257314564Sdim     nullptr,
1258314564Sdim     nullptr,
1259314564Sdim     0},
1260314564Sdim    {"d1",
1261314564Sdim     nullptr,
1262314564Sdim     8,
1263314564Sdim     0,
1264314564Sdim     eEncodingIEEE754,
1265314564Sdim     eFormatFloat,
1266314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1267314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1268314564Sdim     nullptr,
1269314564Sdim     nullptr,
1270314564Sdim     nullptr,
1271314564Sdim     0},
1272314564Sdim    {"d2",
1273314564Sdim     nullptr,
1274314564Sdim     8,
1275314564Sdim     0,
1276314564Sdim     eEncodingIEEE754,
1277314564Sdim     eFormatFloat,
1278314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1279314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1280314564Sdim     nullptr,
1281314564Sdim     nullptr,
1282314564Sdim     nullptr,
1283314564Sdim     0},
1284314564Sdim    {"d3",
1285314564Sdim     nullptr,
1286314564Sdim     8,
1287314564Sdim     0,
1288314564Sdim     eEncodingIEEE754,
1289314564Sdim     eFormatFloat,
1290314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1291314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1292314564Sdim     nullptr,
1293314564Sdim     nullptr,
1294314564Sdim     nullptr,
1295314564Sdim     0},
1296314564Sdim    {"d4",
1297314564Sdim     nullptr,
1298314564Sdim     8,
1299314564Sdim     0,
1300314564Sdim     eEncodingIEEE754,
1301314564Sdim     eFormatFloat,
1302314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1303314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1304314564Sdim     nullptr,
1305314564Sdim     nullptr,
1306314564Sdim     nullptr,
1307314564Sdim     0},
1308314564Sdim    {"d5",
1309314564Sdim     nullptr,
1310314564Sdim     8,
1311314564Sdim     0,
1312314564Sdim     eEncodingIEEE754,
1313314564Sdim     eFormatFloat,
1314314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1315314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1316314564Sdim     nullptr,
1317314564Sdim     nullptr,
1318314564Sdim     nullptr,
1319314564Sdim     0},
1320314564Sdim    {"d6",
1321314564Sdim     nullptr,
1322314564Sdim     8,
1323314564Sdim     0,
1324314564Sdim     eEncodingIEEE754,
1325314564Sdim     eFormatFloat,
1326314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1327314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1328314564Sdim     nullptr,
1329314564Sdim     nullptr,
1330314564Sdim     nullptr,
1331314564Sdim     0},
1332314564Sdim    {"d7",
1333314564Sdim     nullptr,
1334314564Sdim     8,
1335314564Sdim     0,
1336314564Sdim     eEncodingIEEE754,
1337314564Sdim     eFormatFloat,
1338314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1339314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1340314564Sdim     nullptr,
1341314564Sdim     nullptr,
1342314564Sdim     nullptr,
1343314564Sdim     0},
1344314564Sdim    {"d8",
1345314564Sdim     nullptr,
1346314564Sdim     8,
1347314564Sdim     0,
1348314564Sdim     eEncodingIEEE754,
1349314564Sdim     eFormatFloat,
1350314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1351314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1352314564Sdim     nullptr,
1353314564Sdim     nullptr,
1354314564Sdim     nullptr,
1355314564Sdim     0},
1356314564Sdim    {"d9",
1357314564Sdim     nullptr,
1358314564Sdim     8,
1359314564Sdim     0,
1360314564Sdim     eEncodingIEEE754,
1361314564Sdim     eFormatFloat,
1362314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1363314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1364314564Sdim     nullptr,
1365314564Sdim     nullptr,
1366314564Sdim     nullptr,
1367314564Sdim     0},
1368314564Sdim    {"d10",
1369314564Sdim     nullptr,
1370314564Sdim     8,
1371314564Sdim     0,
1372314564Sdim     eEncodingIEEE754,
1373314564Sdim     eFormatFloat,
1374314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1375314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1376314564Sdim     nullptr,
1377314564Sdim     nullptr,
1378314564Sdim     nullptr,
1379314564Sdim     0},
1380314564Sdim    {"d11",
1381314564Sdim     nullptr,
1382314564Sdim     8,
1383314564Sdim     0,
1384314564Sdim     eEncodingIEEE754,
1385314564Sdim     eFormatFloat,
1386314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1387314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1388314564Sdim     nullptr,
1389314564Sdim     nullptr,
1390314564Sdim     nullptr,
1391314564Sdim     0},
1392314564Sdim    {"d12",
1393314564Sdim     nullptr,
1394314564Sdim     8,
1395314564Sdim     0,
1396314564Sdim     eEncodingIEEE754,
1397314564Sdim     eFormatFloat,
1398314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1399314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1400314564Sdim     nullptr,
1401314564Sdim     nullptr,
1402314564Sdim     nullptr,
1403314564Sdim     0},
1404314564Sdim    {"d13",
1405314564Sdim     nullptr,
1406314564Sdim     8,
1407314564Sdim     0,
1408314564Sdim     eEncodingIEEE754,
1409314564Sdim     eFormatFloat,
1410314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1411314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1412314564Sdim     nullptr,
1413314564Sdim     nullptr,
1414314564Sdim     nullptr,
1415314564Sdim     0},
1416314564Sdim    {"d14",
1417314564Sdim     nullptr,
1418314564Sdim     8,
1419314564Sdim     0,
1420314564Sdim     eEncodingIEEE754,
1421314564Sdim     eFormatFloat,
1422314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1423314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1424314564Sdim     nullptr,
1425314564Sdim     nullptr,
1426314564Sdim     nullptr,
1427314564Sdim     0},
1428314564Sdim    {"d15",
1429314564Sdim     nullptr,
1430314564Sdim     8,
1431314564Sdim     0,
1432314564Sdim     eEncodingIEEE754,
1433314564Sdim     eFormatFloat,
1434314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1435314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1436314564Sdim     nullptr,
1437314564Sdim     nullptr,
1438314564Sdim     nullptr,
1439314564Sdim     0},
1440314564Sdim    {"d16",
1441314564Sdim     nullptr,
1442314564Sdim     8,
1443314564Sdim     0,
1444314564Sdim     eEncodingIEEE754,
1445314564Sdim     eFormatFloat,
1446314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1447314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1448314564Sdim     nullptr,
1449314564Sdim     nullptr,
1450314564Sdim     nullptr,
1451314564Sdim     0},
1452314564Sdim    {"d17",
1453314564Sdim     nullptr,
1454314564Sdim     8,
1455314564Sdim     0,
1456314564Sdim     eEncodingIEEE754,
1457314564Sdim     eFormatFloat,
1458314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1459314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1460314564Sdim     nullptr,
1461314564Sdim     nullptr,
1462314564Sdim     nullptr,
1463314564Sdim     0},
1464314564Sdim    {"d18",
1465314564Sdim     nullptr,
1466314564Sdim     8,
1467314564Sdim     0,
1468314564Sdim     eEncodingIEEE754,
1469314564Sdim     eFormatFloat,
1470314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1471314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1472314564Sdim     nullptr,
1473314564Sdim     nullptr,
1474314564Sdim     nullptr,
1475314564Sdim     0},
1476314564Sdim    {"d19",
1477314564Sdim     nullptr,
1478314564Sdim     8,
1479314564Sdim     0,
1480314564Sdim     eEncodingIEEE754,
1481314564Sdim     eFormatFloat,
1482314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1483314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1484314564Sdim     nullptr,
1485314564Sdim     nullptr,
1486314564Sdim     nullptr,
1487314564Sdim     0},
1488314564Sdim    {"d20",
1489314564Sdim     nullptr,
1490314564Sdim     8,
1491314564Sdim     0,
1492314564Sdim     eEncodingIEEE754,
1493314564Sdim     eFormatFloat,
1494314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1495314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1496314564Sdim     nullptr,
1497314564Sdim     nullptr,
1498314564Sdim     nullptr,
1499314564Sdim     0},
1500314564Sdim    {"d21",
1501314564Sdim     nullptr,
1502314564Sdim     8,
1503314564Sdim     0,
1504314564Sdim     eEncodingIEEE754,
1505314564Sdim     eFormatFloat,
1506314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1507314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1508314564Sdim     nullptr,
1509314564Sdim     nullptr,
1510314564Sdim     nullptr,
1511314564Sdim     0},
1512314564Sdim    {"d22",
1513314564Sdim     nullptr,
1514314564Sdim     8,
1515314564Sdim     0,
1516314564Sdim     eEncodingIEEE754,
1517314564Sdim     eFormatFloat,
1518314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1519314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1520314564Sdim     nullptr,
1521314564Sdim     nullptr,
1522314564Sdim     nullptr,
1523314564Sdim     0},
1524314564Sdim    {"d23",
1525314564Sdim     nullptr,
1526314564Sdim     8,
1527314564Sdim     0,
1528314564Sdim     eEncodingIEEE754,
1529314564Sdim     eFormatFloat,
1530314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1531314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1532314564Sdim     nullptr,
1533314564Sdim     nullptr,
1534314564Sdim     nullptr,
1535314564Sdim     0},
1536314564Sdim    {"d24",
1537314564Sdim     nullptr,
1538314564Sdim     8,
1539314564Sdim     0,
1540314564Sdim     eEncodingIEEE754,
1541314564Sdim     eFormatFloat,
1542314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1543314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1544314564Sdim     nullptr,
1545314564Sdim     nullptr,
1546314564Sdim     nullptr,
1547314564Sdim     0},
1548314564Sdim    {"d25",
1549314564Sdim     nullptr,
1550314564Sdim     8,
1551314564Sdim     0,
1552314564Sdim     eEncodingIEEE754,
1553314564Sdim     eFormatFloat,
1554314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1555314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1556314564Sdim     nullptr,
1557314564Sdim     nullptr,
1558314564Sdim     nullptr,
1559314564Sdim     0},
1560314564Sdim    {"d26",
1561314564Sdim     nullptr,
1562314564Sdim     8,
1563314564Sdim     0,
1564314564Sdim     eEncodingIEEE754,
1565314564Sdim     eFormatFloat,
1566314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1567314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1568314564Sdim     nullptr,
1569314564Sdim     nullptr,
1570314564Sdim     nullptr,
1571314564Sdim     0},
1572314564Sdim    {"d27",
1573314564Sdim     nullptr,
1574314564Sdim     8,
1575314564Sdim     0,
1576314564Sdim     eEncodingIEEE754,
1577314564Sdim     eFormatFloat,
1578314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1579314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1580314564Sdim     nullptr,
1581314564Sdim     nullptr,
1582314564Sdim     nullptr,
1583314564Sdim     0},
1584314564Sdim    {"d28",
1585314564Sdim     nullptr,
1586314564Sdim     8,
1587314564Sdim     0,
1588314564Sdim     eEncodingIEEE754,
1589314564Sdim     eFormatFloat,
1590314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1591314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1592314564Sdim     nullptr,
1593314564Sdim     nullptr,
1594314564Sdim     nullptr,
1595314564Sdim     0},
1596314564Sdim    {"d29",
1597314564Sdim     nullptr,
1598314564Sdim     8,
1599314564Sdim     0,
1600314564Sdim     eEncodingIEEE754,
1601314564Sdim     eFormatFloat,
1602314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1603314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1604314564Sdim     nullptr,
1605314564Sdim     nullptr,
1606314564Sdim     nullptr,
1607314564Sdim     0},
1608314564Sdim    {"d30",
1609314564Sdim     nullptr,
1610314564Sdim     8,
1611314564Sdim     0,
1612314564Sdim     eEncodingIEEE754,
1613314564Sdim     eFormatFloat,
1614314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1615314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1616314564Sdim     nullptr,
1617314564Sdim     nullptr,
1618314564Sdim     nullptr,
1619314564Sdim     0},
1620314564Sdim    {"d31",
1621314564Sdim     nullptr,
1622314564Sdim     8,
1623314564Sdim     0,
1624314564Sdim     eEncodingIEEE754,
1625314564Sdim     eFormatFloat,
1626314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1627314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1628314564Sdim     nullptr,
1629314564Sdim     nullptr,
1630314564Sdim     nullptr,
1631314564Sdim     0}};
1632285101Semaste
1633314564Sdimstatic const uint32_t k_num_register_infos =
1634314564Sdim    llvm::array_lengthof(g_register_infos);
1635285101Semastestatic bool g_register_info_names_constified = false;
1636285101Semaste
1637285101Semasteconst lldb_private::RegisterInfo *
1638314564SdimABISysV_arm64::GetRegisterInfoArray(uint32_t &count) {
1639314564Sdim  // Make the C-string names and alt_names for the register infos into const
1640314564Sdim  // C-string values by having the ConstString unique the names in the global
1641314564Sdim  // constant C-string pool.
1642314564Sdim  if (!g_register_info_names_constified) {
1643314564Sdim    g_register_info_names_constified = true;
1644314564Sdim    for (uint32_t i = 0; i < k_num_register_infos; ++i) {
1645314564Sdim      if (g_register_infos[i].name)
1646314564Sdim        g_register_infos[i].name =
1647314564Sdim            ConstString(g_register_infos[i].name).GetCString();
1648314564Sdim      if (g_register_infos[i].alt_name)
1649314564Sdim        g_register_infos[i].alt_name =
1650314564Sdim            ConstString(g_register_infos[i].alt_name).GetCString();
1651285101Semaste    }
1652314564Sdim  }
1653314564Sdim  count = k_num_register_infos;
1654314564Sdim  return g_register_infos;
1655285101Semaste}
1656285101Semaste
1657314564Sdimbool ABISysV_arm64::GetPointerReturnRegister(const char *&name) {
1658314564Sdim  name = "x0";
1659314564Sdim  return true;
1660285101Semaste}
1661285101Semaste
1662314564Sdimsize_t ABISysV_arm64::GetRedZoneSize() const { return 128; }
1663314564Sdim
1664285101Semaste//------------------------------------------------------------------
1665285101Semaste// Static Functions
1666285101Semaste//------------------------------------------------------------------
1667309124Sdim
1668285101SemasteABISP
1669321369SdimABISysV_arm64::CreateInstance(lldb::ProcessSP process_sp, const ArchSpec &arch) {
1670314564Sdim  const llvm::Triple::ArchType arch_type = arch.GetTriple().getArch();
1671314564Sdim  const llvm::Triple::VendorType vendor_type = arch.GetTriple().getVendor();
1672285101Semaste
1673314564Sdim  if (vendor_type != llvm::Triple::Apple) {
1674314564Sdim    if (arch_type == llvm::Triple::aarch64) {
1675344779Sdim      return ABISP(new ABISysV_arm64(process_sp));
1676285101Semaste    }
1677314564Sdim  }
1678285101Semaste
1679314564Sdim  return ABISP();
1680285101Semaste}
1681285101Semaste
1682314564Sdimbool ABISysV_arm64::PrepareTrivialCall(Thread &thread, addr_t sp,
1683314564Sdim                                       addr_t func_addr, addr_t return_addr,
1684314564Sdim                                       llvm::ArrayRef<addr_t> args) const {
1685314564Sdim  RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1686314564Sdim  if (!reg_ctx)
1687314564Sdim    return false;
1688285101Semaste
1689314564Sdim  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1690285101Semaste
1691314564Sdim  if (log) {
1692314564Sdim    StreamString s;
1693321369Sdim    s.Printf("ABISysV_arm64::PrepareTrivialCall (tid = 0x%" PRIx64
1694314564Sdim             ", sp = 0x%" PRIx64 ", func_addr = 0x%" PRIx64
1695314564Sdim             ", return_addr = 0x%" PRIx64,
1696314564Sdim             thread.GetID(), (uint64_t)sp, (uint64_t)func_addr,
1697314564Sdim             (uint64_t)return_addr);
1698285101Semaste
1699314564Sdim    for (size_t i = 0; i < args.size(); ++i)
1700314564Sdim      s.Printf(", arg%d = 0x%" PRIx64, static_cast<int>(i + 1), args[i]);
1701314564Sdim    s.PutCString(")");
1702314564Sdim    log->PutString(s.GetString());
1703314564Sdim  }
1704285101Semaste
1705314564Sdim  // x0 - x7 contain first 8 simple args
1706314564Sdim  if (args.size() > 8)
1707314564Sdim    return false;
1708285101Semaste
1709314564Sdim  for (size_t i = 0; i < args.size(); ++i) {
1710314564Sdim    const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(
1711314564Sdim        eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + i);
1712314564Sdim    if (log)
1713314564Sdim      log->Printf("About to write arg%d (0x%" PRIx64 ") into %s",
1714314564Sdim                  static_cast<int>(i + 1), args[i], reg_info->name);
1715314564Sdim    if (!reg_ctx->WriteRegisterFromUnsigned(reg_info, args[i]))
1716314564Sdim      return false;
1717314564Sdim  }
1718285101Semaste
1719314564Sdim  // Set "lr" to the return address
1720314564Sdim  if (!reg_ctx->WriteRegisterFromUnsigned(
1721314564Sdim          reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
1722314564Sdim                                   LLDB_REGNUM_GENERIC_RA),
1723314564Sdim          return_addr))
1724314564Sdim    return false;
1725285101Semaste
1726314564Sdim  // Set "sp" to the requested value
1727314564Sdim  if (!reg_ctx->WriteRegisterFromUnsigned(
1728314564Sdim          reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
1729314564Sdim                                   LLDB_REGNUM_GENERIC_SP),
1730314564Sdim          sp))
1731314564Sdim    return false;
1732285101Semaste
1733314564Sdim  // Set "pc" to the address requested
1734314564Sdim  if (!reg_ctx->WriteRegisterFromUnsigned(
1735314564Sdim          reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
1736314564Sdim                                   LLDB_REGNUM_GENERIC_PC),
1737314564Sdim          func_addr))
1738314564Sdim    return false;
1739285101Semaste
1740314564Sdim  return true;
1741285101Semaste}
1742285101Semaste
1743314564Sdim// TODO: We dont support fp/SIMD arguments in v0-v7
1744314564Sdimbool ABISysV_arm64::GetArgumentValues(Thread &thread, ValueList &values) const {
1745314564Sdim  uint32_t num_values = values.GetSize();
1746314564Sdim
1747314564Sdim  ExecutionContext exe_ctx(thread.shared_from_this());
1748314564Sdim
1749314564Sdim  // Extract the register context so we can read arguments from registers
1750314564Sdim
1751314564Sdim  RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1752314564Sdim
1753314564Sdim  if (!reg_ctx)
1754314564Sdim    return false;
1755314564Sdim
1756314564Sdim  addr_t sp = 0;
1757314564Sdim
1758314564Sdim  for (uint32_t value_idx = 0; value_idx < num_values; ++value_idx) {
1759341825Sdim    // We currently only support extracting values with Clang QualTypes. Do we
1760341825Sdim    // care about others?
1761314564Sdim    Value *value = values.GetValueAtIndex(value_idx);
1762314564Sdim
1763314564Sdim    if (!value)
1764314564Sdim      return false;
1765314564Sdim
1766314564Sdim    CompilerType value_type = value->GetCompilerType();
1767314564Sdim    if (value_type) {
1768314564Sdim      bool is_signed = false;
1769314564Sdim      size_t bit_width = 0;
1770344779Sdim      llvm::Optional<uint64_t> bit_size = value_type.GetBitSize(&thread);
1771344779Sdim      if (!bit_size)
1772344779Sdim        return false;
1773314564Sdim      if (value_type.IsIntegerOrEnumerationType(is_signed)) {
1774344779Sdim        bit_width = *bit_size;
1775314564Sdim      } else if (value_type.IsPointerOrReferenceType()) {
1776344779Sdim        bit_width = *bit_size;
1777314564Sdim      } else {
1778314564Sdim        // We only handle integer, pointer and reference types currently...
1779285101Semaste        return false;
1780314564Sdim      }
1781285101Semaste
1782314564Sdim      if (bit_width <= (exe_ctx.GetProcessRef().GetAddressByteSize() * 8)) {
1783314564Sdim        if (value_idx < 8) {
1784314564Sdim          // Arguments 1-8 are in x0-x7...
1785314564Sdim          const RegisterInfo *reg_info = nullptr;
1786314564Sdim          reg_info = reg_ctx->GetRegisterInfo(
1787314564Sdim              eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + value_idx);
1788285101Semaste
1789314564Sdim          if (reg_info) {
1790314564Sdim            RegisterValue reg_value;
1791314564Sdim
1792314564Sdim            if (reg_ctx->ReadRegister(reg_info, reg_value)) {
1793314564Sdim              if (is_signed)
1794314564Sdim                reg_value.SignExtend(bit_width);
1795314564Sdim              if (!reg_value.GetScalarValue(value->GetScalar()))
1796285101Semaste                return false;
1797314564Sdim              continue;
1798285101Semaste            }
1799314564Sdim          }
1800314564Sdim          return false;
1801314564Sdim        } else {
1802314564Sdim          // TODO: Verify for stack layout for SysV
1803314564Sdim          if (sp == 0) {
1804314564Sdim            // Read the stack pointer if we already haven't read it
1805314564Sdim            sp = reg_ctx->GetSP(0);
1806314564Sdim            if (sp == 0)
1807314564Sdim              return false;
1808314564Sdim          }
1809285101Semaste
1810314564Sdim          // Arguments 5 on up are on the stack
1811314564Sdim          const uint32_t arg_byte_size = (bit_width + (8 - 1)) / 8;
1812321369Sdim          Status error;
1813314564Sdim          if (!exe_ctx.GetProcessRef().ReadScalarIntegerFromMemory(
1814314564Sdim                  sp, arg_byte_size, is_signed, value->GetScalar(), error))
1815314564Sdim            return false;
1816314564Sdim
1817314564Sdim          sp += arg_byte_size;
1818314564Sdim          // Align up to the next 8 byte boundary if needed
1819314564Sdim          if (sp % 8) {
1820314564Sdim            sp >>= 3;
1821314564Sdim            sp += 1;
1822314564Sdim            sp <<= 3;
1823314564Sdim          }
1824285101Semaste        }
1825314564Sdim      }
1826285101Semaste    }
1827314564Sdim  }
1828314564Sdim  return true;
1829285101Semaste}
1830285101Semaste
1831321369SdimStatus ABISysV_arm64::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
1832321369Sdim                                           lldb::ValueObjectSP &new_value_sp) {
1833321369Sdim  Status error;
1834314564Sdim  if (!new_value_sp) {
1835314564Sdim    error.SetErrorString("Empty value object for return value.");
1836314564Sdim    return error;
1837314564Sdim  }
1838314564Sdim
1839314564Sdim  CompilerType return_value_type = new_value_sp->GetCompilerType();
1840314564Sdim  if (!return_value_type) {
1841314564Sdim    error.SetErrorString("Null clang type for return value.");
1842314564Sdim    return error;
1843314564Sdim  }
1844314564Sdim
1845314564Sdim  Thread *thread = frame_sp->GetThread().get();
1846314564Sdim
1847314564Sdim  RegisterContext *reg_ctx = thread->GetRegisterContext().get();
1848314564Sdim
1849314564Sdim  if (reg_ctx) {
1850314564Sdim    DataExtractor data;
1851321369Sdim    Status data_error;
1852314564Sdim    const uint64_t byte_size = new_value_sp->GetData(data, data_error);
1853314564Sdim    if (data_error.Fail()) {
1854314564Sdim      error.SetErrorStringWithFormat(
1855314564Sdim          "Couldn't convert return value to raw data: %s",
1856314564Sdim          data_error.AsCString());
1857314564Sdim      return error;
1858285101Semaste    }
1859285101Semaste
1860314564Sdim    const uint32_t type_flags = return_value_type.GetTypeInfo(nullptr);
1861314564Sdim    if (type_flags & eTypeIsScalar || type_flags & eTypeIsPointer) {
1862314564Sdim      if (type_flags & eTypeIsInteger || type_flags & eTypeIsPointer) {
1863314564Sdim        // Extract the register context so we can read arguments from registers
1864314564Sdim        lldb::offset_t offset = 0;
1865314564Sdim        if (byte_size <= 16) {
1866314564Sdim          const RegisterInfo *x0_info = reg_ctx->GetRegisterInfo(
1867314564Sdim              eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);
1868314564Sdim          if (byte_size <= 8) {
1869314564Sdim            uint64_t raw_value = data.GetMaxU64(&offset, byte_size);
1870285101Semaste
1871314564Sdim            if (!reg_ctx->WriteRegisterFromUnsigned(x0_info, raw_value))
1872314564Sdim              error.SetErrorString("failed to write register x0");
1873314564Sdim          } else {
1874314564Sdim            uint64_t raw_value = data.GetMaxU64(&offset, 8);
1875314564Sdim
1876314564Sdim            if (reg_ctx->WriteRegisterFromUnsigned(x0_info, raw_value)) {
1877314564Sdim              const RegisterInfo *x1_info = reg_ctx->GetRegisterInfo(
1878314564Sdim                  eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG2);
1879314564Sdim              raw_value = data.GetMaxU64(&offset, byte_size - offset);
1880314564Sdim
1881314564Sdim              if (!reg_ctx->WriteRegisterFromUnsigned(x1_info, raw_value))
1882314564Sdim                error.SetErrorString("failed to write register x1");
1883285101Semaste            }
1884314564Sdim          }
1885314564Sdim        } else {
1886314564Sdim          error.SetErrorString("We don't support returning longer than 128 bit "
1887314564Sdim                               "integer values at present.");
1888314564Sdim        }
1889314564Sdim      } else if (type_flags & eTypeIsFloat) {
1890314564Sdim        if (type_flags & eTypeIsComplex) {
1891314564Sdim          // Don't handle complex yet.
1892314564Sdim          error.SetErrorString(
1893314564Sdim              "returning complex float values are not supported");
1894314564Sdim        } else {
1895314564Sdim          const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
1896285101Semaste
1897314564Sdim          if (v0_info) {
1898314564Sdim            if (byte_size <= 16) {
1899314564Sdim              if (byte_size <= RegisterValue::GetMaxByteSize()) {
1900314564Sdim                RegisterValue reg_value;
1901314564Sdim                error = reg_value.SetValueFromData(v0_info, data, 0, true);
1902314564Sdim                if (error.Success()) {
1903314564Sdim                  if (!reg_ctx->WriteRegister(v0_info, reg_value))
1904314564Sdim                    error.SetErrorString("failed to write register v0");
1905285101Semaste                }
1906314564Sdim              } else {
1907314564Sdim                error.SetErrorStringWithFormat(
1908314564Sdim                    "returning float values with a byte size of %" PRIu64
1909314564Sdim                    " are not supported",
1910314564Sdim                    byte_size);
1911314564Sdim              }
1912314564Sdim            } else {
1913314564Sdim              error.SetErrorString("returning float values longer than 128 "
1914314564Sdim                                   "bits are not supported");
1915285101Semaste            }
1916314564Sdim          } else {
1917314564Sdim            error.SetErrorString("v0 register is not available on this target");
1918314564Sdim          }
1919285101Semaste        }
1920314564Sdim      }
1921314564Sdim    } else if (type_flags & eTypeIsVector) {
1922314564Sdim      if (byte_size > 0) {
1923314564Sdim        const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
1924314564Sdim
1925314564Sdim        if (v0_info) {
1926314564Sdim          if (byte_size <= v0_info->byte_size) {
1927314564Sdim            RegisterValue reg_value;
1928314564Sdim            error = reg_value.SetValueFromData(v0_info, data, 0, true);
1929314564Sdim            if (error.Success()) {
1930314564Sdim              if (!reg_ctx->WriteRegister(v0_info, reg_value))
1931314564Sdim                error.SetErrorString("failed to write register v0");
1932285101Semaste            }
1933314564Sdim          }
1934285101Semaste        }
1935314564Sdim      }
1936285101Semaste    }
1937314564Sdim  } else {
1938314564Sdim    error.SetErrorString("no registers are available");
1939314564Sdim  }
1940314564Sdim
1941314564Sdim  return error;
1942285101Semaste}
1943285101Semaste
1944314564Sdimbool ABISysV_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
1945314564Sdim  unwind_plan.Clear();
1946314564Sdim  unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1947285101Semaste
1948314564Sdim  uint32_t lr_reg_num = arm64_dwarf::lr;
1949314564Sdim  uint32_t sp_reg_num = arm64_dwarf::sp;
1950314564Sdim
1951314564Sdim  UnwindPlan::RowSP row(new UnwindPlan::Row);
1952314564Sdim
1953314564Sdim  // Our previous Call Frame Address is the stack pointer
1954314564Sdim  row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
1955314564Sdim
1956314564Sdim  unwind_plan.AppendRow(row);
1957321369Sdim  unwind_plan.SetReturnAddressRegister(lr_reg_num);
1958314564Sdim
1959314564Sdim  // All other registers are the same.
1960314564Sdim
1961314564Sdim  unwind_plan.SetSourceName("arm64 at-func-entry default");
1962314564Sdim  unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1963321369Sdim  unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
1964314564Sdim
1965314564Sdim  return true;
1966285101Semaste}
1967285101Semaste
1968314564Sdimbool ABISysV_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
1969314564Sdim  unwind_plan.Clear();
1970314564Sdim  unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1971285101Semaste
1972314564Sdim  uint32_t fp_reg_num = arm64_dwarf::fp;
1973314564Sdim  uint32_t pc_reg_num = arm64_dwarf::pc;
1974285101Semaste
1975314564Sdim  UnwindPlan::RowSP row(new UnwindPlan::Row);
1976314564Sdim  const int32_t ptr_size = 8;
1977314564Sdim
1978314564Sdim  row->GetCFAValue().SetIsRegisterPlusOffset(fp_reg_num, 2 * ptr_size);
1979314564Sdim  row->SetOffset(0);
1980314564Sdim
1981314564Sdim  row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
1982314564Sdim  row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
1983314564Sdim
1984314564Sdim  unwind_plan.AppendRow(row);
1985314564Sdim  unwind_plan.SetSourceName("arm64 default unwind plan");
1986314564Sdim  unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1987314564Sdim  unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
1988314564Sdim
1989314564Sdim  return true;
1990285101Semaste}
1991285101Semaste
1992314564Sdim// AAPCS64 (Procedure Call Standard for the ARM 64-bit Architecture) says
1993341825Sdim// registers x19 through x28 and sp are callee preserved. v8-v15 are non-
1994341825Sdim// volatile (and specifically only the lower 8 bytes of these regs), the rest
1995341825Sdim// of the fp/SIMD registers are volatile.
1996285101Semaste
1997285101Semaste// We treat x29 as callee preserved also, else the unwinder won't try to
1998285101Semaste// retrieve fp saves.
1999285101Semaste
2000314564Sdimbool ABISysV_arm64::RegisterIsVolatile(const RegisterInfo *reg_info) {
2001314564Sdim  if (reg_info) {
2002314564Sdim    const char *name = reg_info->name;
2003285101Semaste
2004314564Sdim    // Sometimes we'll be called with the "alternate" name for these registers;
2005314564Sdim    // recognize them as non-volatile.
2006285101Semaste
2007314564Sdim    if (name[0] == 'p' && name[1] == 'c') // pc
2008314564Sdim      return false;
2009314564Sdim    if (name[0] == 'f' && name[1] == 'p') // fp
2010314564Sdim      return false;
2011314564Sdim    if (name[0] == 's' && name[1] == 'p') // sp
2012314564Sdim      return false;
2013314564Sdim    if (name[0] == 'l' && name[1] == 'r') // lr
2014314564Sdim      return false;
2015285101Semaste
2016327952Sdim    if (name[0] == 'x' || name[0] == 'r') {
2017314564Sdim      // Volatile registers: x0-x18
2018341825Sdim      // Although documentation says only x19-28 + sp are callee saved We ll
2019341825Sdim      // also have to treat x30 as non-volatile. Each dwarf frame has its own
2020341825Sdim      // value of lr. Return false for the non-volatile gpr regs, true for
2021341825Sdim      // everything else
2022314564Sdim      switch (name[1]) {
2023314564Sdim      case '1':
2024314564Sdim        switch (name[2]) {
2025314564Sdim        case '9':
2026314564Sdim          return false; // x19 is non-volatile
2027314564Sdim        default:
2028314564Sdim          return true;
2029285101Semaste        }
2030314564Sdim        break;
2031314564Sdim      case '2':
2032314564Sdim        switch (name[2]) {
2033314564Sdim        case '0':
2034314564Sdim        case '1':
2035314564Sdim        case '2':
2036314564Sdim        case '3':
2037314564Sdim        case '4':
2038314564Sdim        case '5':
2039314564Sdim        case '6':
2040314564Sdim        case '7':
2041314564Sdim        case '8':
2042314564Sdim          return false; // x20 - 28 are non-volatile
2043314564Sdim        case '9':
2044314564Sdim          return false; // x29 aka fp treat as non-volatile
2045314564Sdim        default:
2046314564Sdim          return true;
2047285101Semaste        }
2048314564Sdim      case '3': // x30 (lr) and x31 (sp) treat as non-volatile
2049314564Sdim        if (name[2] == '0' || name[2] == '1')
2050314564Sdim          return false;
2051314564Sdim        break;
2052314564Sdim      default:
2053314564Sdim        return true; // all volatile cases not handled above fall here.
2054314564Sdim      }
2055314564Sdim    } else if (name[0] == 'v' || name[0] == 's' || name[0] == 'd') {
2056314564Sdim      // Volatile registers: v0-7, v16-v31
2057314564Sdim      // Return false for non-volatile fp/SIMD regs, true for everything else
2058314564Sdim      switch (name[1]) {
2059314564Sdim      case '8':
2060314564Sdim      case '9':
2061314564Sdim        return false; // v8-v9 are non-volatile
2062314564Sdim      case '1':
2063314564Sdim        switch (name[2]) {
2064314564Sdim        case '0':
2065314564Sdim        case '1':
2066314564Sdim        case '2':
2067314564Sdim        case '3':
2068314564Sdim        case '4':
2069314564Sdim        case '5':
2070314564Sdim          return false; // v10-v15 are non-volatile
2071314564Sdim        default:
2072314564Sdim          return true;
2073314564Sdim        }
2074314564Sdim      default:
2075314564Sdim        return true;
2076314564Sdim      }
2077285101Semaste    }
2078314564Sdim  }
2079314564Sdim  return true;
2080285101Semaste}
2081285101Semaste
2082314564Sdimstatic bool LoadValueFromConsecutiveGPRRegisters(
2083314564Sdim    ExecutionContext &exe_ctx, RegisterContext *reg_ctx,
2084314564Sdim    const CompilerType &value_type,
2085314564Sdim    bool is_return_value, // false => parameter, true => return value
2086314564Sdim    uint32_t &NGRN,       // NGRN (see ABI documentation)
2087314564Sdim    uint32_t &NSRN,       // NSRN (see ABI documentation)
2088314564Sdim    DataExtractor &data) {
2089344779Sdim  llvm::Optional<uint64_t> byte_size = value_type.GetByteSize(nullptr);
2090314564Sdim
2091344779Sdim  if (byte_size || *byte_size == 0)
2092314564Sdim    return false;
2093314564Sdim
2094314564Sdim  std::unique_ptr<DataBufferHeap> heap_data_ap(
2095344779Sdim      new DataBufferHeap(*byte_size, 0));
2096314564Sdim  const ByteOrder byte_order = exe_ctx.GetProcessRef().GetByteOrder();
2097321369Sdim  Status error;
2098314564Sdim
2099314564Sdim  CompilerType base_type;
2100314564Sdim  const uint32_t homogeneous_count =
2101314564Sdim      value_type.IsHomogeneousAggregate(&base_type);
2102314564Sdim  if (homogeneous_count > 0 && homogeneous_count <= 8) {
2103314564Sdim    // Make sure we have enough registers
2104314564Sdim    if (NSRN < 8 && (8 - NSRN) >= homogeneous_count) {
2105314564Sdim      if (!base_type)
2106285101Semaste        return false;
2107344779Sdim      llvm::Optional<uint64_t> base_byte_size = base_type.GetByteSize(nullptr);
2108344779Sdim      if (!base_byte_size)
2109344779Sdim        return false;
2110314564Sdim      uint32_t data_offset = 0;
2111285101Semaste
2112314564Sdim      for (uint32_t i = 0; i < homogeneous_count; ++i) {
2113314564Sdim        char v_name[8];
2114314564Sdim        ::snprintf(v_name, sizeof(v_name), "v%u", NSRN);
2115314564Sdim        const RegisterInfo *reg_info =
2116314564Sdim            reg_ctx->GetRegisterInfoByName(v_name, 0);
2117314564Sdim        if (reg_info == nullptr)
2118314564Sdim          return false;
2119285101Semaste
2120344779Sdim        if (*base_byte_size > reg_info->byte_size)
2121314564Sdim          return false;
2122285101Semaste
2123314564Sdim        RegisterValue reg_value;
2124314564Sdim
2125314564Sdim        if (!reg_ctx->ReadRegister(reg_info, reg_value))
2126314564Sdim          return false;
2127314564Sdim
2128314564Sdim        // Make sure we have enough room in "heap_data_ap"
2129344779Sdim        if ((data_offset + *base_byte_size) <= heap_data_ap->GetByteSize()) {
2130314564Sdim          const size_t bytes_copied = reg_value.GetAsMemoryData(
2131344779Sdim              reg_info, heap_data_ap->GetBytes() + data_offset, *base_byte_size,
2132314564Sdim              byte_order, error);
2133344779Sdim          if (bytes_copied != *base_byte_size)
2134314564Sdim            return false;
2135314564Sdim          data_offset += bytes_copied;
2136314564Sdim          ++NSRN;
2137314564Sdim        } else
2138314564Sdim          return false;
2139314564Sdim      }
2140314564Sdim      data.SetByteOrder(byte_order);
2141314564Sdim      data.SetAddressByteSize(exe_ctx.GetProcessRef().GetAddressByteSize());
2142314564Sdim      data.SetData(DataBufferSP(heap_data_ap.release()));
2143314564Sdim      return true;
2144285101Semaste    }
2145314564Sdim  }
2146285101Semaste
2147314564Sdim  const size_t max_reg_byte_size = 16;
2148344779Sdim  if (*byte_size <= max_reg_byte_size) {
2149344779Sdim    size_t bytes_left = *byte_size;
2150314564Sdim    uint32_t data_offset = 0;
2151344779Sdim    while (data_offset < *byte_size) {
2152314564Sdim      if (NGRN >= 8)
2153314564Sdim        return false;
2154285101Semaste
2155314564Sdim      const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(
2156314564Sdim          eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + NGRN);
2157314564Sdim      if (reg_info == nullptr)
2158314564Sdim        return false;
2159285101Semaste
2160314564Sdim      RegisterValue reg_value;
2161314564Sdim
2162314564Sdim      if (!reg_ctx->ReadRegister(reg_info, reg_value))
2163314564Sdim        return false;
2164314564Sdim
2165314564Sdim      const size_t curr_byte_size = std::min<size_t>(8, bytes_left);
2166314564Sdim      const size_t bytes_copied = reg_value.GetAsMemoryData(
2167314564Sdim          reg_info, heap_data_ap->GetBytes() + data_offset, curr_byte_size,
2168314564Sdim          byte_order, error);
2169314564Sdim      if (bytes_copied == 0)
2170314564Sdim        return false;
2171314564Sdim      if (bytes_copied >= bytes_left)
2172314564Sdim        break;
2173314564Sdim      data_offset += bytes_copied;
2174314564Sdim      bytes_left -= bytes_copied;
2175314564Sdim      ++NGRN;
2176285101Semaste    }
2177314564Sdim  } else {
2178314564Sdim    const RegisterInfo *reg_info = nullptr;
2179314564Sdim    if (is_return_value) {
2180341825Sdim      // We are assuming we are decoding this immediately after returning from
2181341825Sdim      // a function call and that the address of the structure is in x8
2182314564Sdim      reg_info = reg_ctx->GetRegisterInfoByName("x8", 0);
2183314564Sdim    } else {
2184314564Sdim      // We are assuming we are stopped at the first instruction in a function
2185341825Sdim      // and that the ABI is being respected so all parameters appear where
2186341825Sdim      // they should be (functions with no external linkage can legally violate
2187341825Sdim      // the ABI).
2188314564Sdim      if (NGRN >= 8)
2189314564Sdim        return false;
2190285101Semaste
2191314564Sdim      reg_info = reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
2192314564Sdim                                          LLDB_REGNUM_GENERIC_ARG1 + NGRN);
2193314564Sdim      if (reg_info == nullptr)
2194314564Sdim        return false;
2195314564Sdim      ++NGRN;
2196314564Sdim    }
2197285101Semaste
2198314564Sdim    if (reg_info == nullptr)
2199314564Sdim      return false;
2200285101Semaste
2201314564Sdim    const lldb::addr_t value_addr =
2202314564Sdim        reg_ctx->ReadRegisterAsUnsigned(reg_info, LLDB_INVALID_ADDRESS);
2203285101Semaste
2204314564Sdim    if (value_addr == LLDB_INVALID_ADDRESS)
2205314564Sdim      return false;
2206314564Sdim
2207314564Sdim    if (exe_ctx.GetProcessRef().ReadMemory(
2208314564Sdim            value_addr, heap_data_ap->GetBytes(), heap_data_ap->GetByteSize(),
2209314564Sdim            error) != heap_data_ap->GetByteSize()) {
2210314564Sdim      return false;
2211285101Semaste    }
2212314564Sdim  }
2213285101Semaste
2214314564Sdim  data.SetByteOrder(byte_order);
2215314564Sdim  data.SetAddressByteSize(exe_ctx.GetProcessRef().GetAddressByteSize());
2216314564Sdim  data.SetData(DataBufferSP(heap_data_ap.release()));
2217314564Sdim  return true;
2218285101Semaste}
2219285101Semaste
2220314564SdimValueObjectSP ABISysV_arm64::GetReturnValueObjectImpl(
2221314564Sdim    Thread &thread, CompilerType &return_compiler_type) const {
2222314564Sdim  ValueObjectSP return_valobj_sp;
2223314564Sdim  Value value;
2224285101Semaste
2225314564Sdim  ExecutionContext exe_ctx(thread.shared_from_this());
2226314564Sdim  if (exe_ctx.GetTargetPtr() == nullptr || exe_ctx.GetProcessPtr() == nullptr)
2227314564Sdim    return return_valobj_sp;
2228285101Semaste
2229314564Sdim  // value.SetContext (Value::eContextTypeClangType, return_compiler_type);
2230314564Sdim  value.SetCompilerType(return_compiler_type);
2231314564Sdim
2232314564Sdim  RegisterContext *reg_ctx = thread.GetRegisterContext().get();
2233314564Sdim  if (!reg_ctx)
2234314564Sdim    return return_valobj_sp;
2235314564Sdim
2236344779Sdim  llvm::Optional<uint64_t> byte_size =
2237344779Sdim      return_compiler_type.GetByteSize(nullptr);
2238344779Sdim  if (!byte_size)
2239344779Sdim    return return_valobj_sp;
2240314564Sdim
2241314564Sdim  const uint32_t type_flags = return_compiler_type.GetTypeInfo(nullptr);
2242314564Sdim  if (type_flags & eTypeIsScalar || type_flags & eTypeIsPointer) {
2243314564Sdim    value.SetValueType(Value::eValueTypeScalar);
2244314564Sdim
2245314564Sdim    bool success = false;
2246314564Sdim    if (type_flags & eTypeIsInteger || type_flags & eTypeIsPointer) {
2247314564Sdim      // Extract the register context so we can read arguments from registers
2248344779Sdim      if (*byte_size <= 8) {
2249314564Sdim        const RegisterInfo *x0_reg_info = nullptr;
2250314564Sdim        x0_reg_info = reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
2251314564Sdim                                               LLDB_REGNUM_GENERIC_ARG1);
2252314564Sdim        if (x0_reg_info) {
2253314564Sdim          uint64_t raw_value =
2254314564Sdim              thread.GetRegisterContext()->ReadRegisterAsUnsigned(x0_reg_info,
2255314564Sdim                                                                  0);
2256314564Sdim          const bool is_signed = (type_flags & eTypeIsSigned) != 0;
2257344779Sdim          switch (*byte_size) {
2258314564Sdim          default:
2259314564Sdim            break;
2260314564Sdim          case 16: // uint128_t
2261314564Sdim            // In register x0 and x1
2262285101Semaste            {
2263314564Sdim              const RegisterInfo *x1_reg_info = nullptr;
2264314564Sdim              x1_reg_info = reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
2265314564Sdim                                                     LLDB_REGNUM_GENERIC_ARG2);
2266285101Semaste
2267314564Sdim              if (x1_reg_info) {
2268344779Sdim                if (*byte_size <=
2269314564Sdim                    x0_reg_info->byte_size + x1_reg_info->byte_size) {
2270314564Sdim                  std::unique_ptr<DataBufferHeap> heap_data_ap(
2271344779Sdim                      new DataBufferHeap(*byte_size, 0));
2272314564Sdim                  const ByteOrder byte_order =
2273314564Sdim                      exe_ctx.GetProcessRef().GetByteOrder();
2274314564Sdim                  RegisterValue x0_reg_value;
2275314564Sdim                  RegisterValue x1_reg_value;
2276314564Sdim                  if (reg_ctx->ReadRegister(x0_reg_info, x0_reg_value) &&
2277314564Sdim                      reg_ctx->ReadRegister(x1_reg_info, x1_reg_value)) {
2278321369Sdim                    Status error;
2279314564Sdim                    if (x0_reg_value.GetAsMemoryData(
2280314564Sdim                            x0_reg_info, heap_data_ap->GetBytes() + 0, 8,
2281314564Sdim                            byte_order, error) &&
2282314564Sdim                        x1_reg_value.GetAsMemoryData(
2283314564Sdim                            x1_reg_info, heap_data_ap->GetBytes() + 8, 8,
2284314564Sdim                            byte_order, error)) {
2285314564Sdim                      DataExtractor data(
2286314564Sdim                          DataBufferSP(heap_data_ap.release()), byte_order,
2287314564Sdim                          exe_ctx.GetProcessRef().GetAddressByteSize());
2288314564Sdim
2289314564Sdim                      return_valobj_sp = ValueObjectConstResult::Create(
2290314564Sdim                          &thread, return_compiler_type, ConstString(""), data);
2291314564Sdim                      return return_valobj_sp;
2292285101Semaste                    }
2293314564Sdim                  }
2294285101Semaste                }
2295314564Sdim              }
2296285101Semaste            }
2297314564Sdim            break;
2298314564Sdim          case sizeof(uint64_t):
2299314564Sdim            if (is_signed)
2300314564Sdim              value.GetScalar() = (int64_t)(raw_value);
2301314564Sdim            else
2302314564Sdim              value.GetScalar() = (uint64_t)(raw_value);
2303314564Sdim            success = true;
2304314564Sdim            break;
2305314564Sdim
2306314564Sdim          case sizeof(uint32_t):
2307314564Sdim            if (is_signed)
2308314564Sdim              value.GetScalar() = (int32_t)(raw_value & UINT32_MAX);
2309314564Sdim            else
2310314564Sdim              value.GetScalar() = (uint32_t)(raw_value & UINT32_MAX);
2311314564Sdim            success = true;
2312314564Sdim            break;
2313314564Sdim
2314314564Sdim          case sizeof(uint16_t):
2315314564Sdim            if (is_signed)
2316314564Sdim              value.GetScalar() = (int16_t)(raw_value & UINT16_MAX);
2317314564Sdim            else
2318314564Sdim              value.GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
2319314564Sdim            success = true;
2320314564Sdim            break;
2321314564Sdim
2322314564Sdim          case sizeof(uint8_t):
2323314564Sdim            if (is_signed)
2324314564Sdim              value.GetScalar() = (int8_t)(raw_value & UINT8_MAX);
2325314564Sdim            else
2326314564Sdim              value.GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
2327314564Sdim            success = true;
2328314564Sdim            break;
2329314564Sdim          }
2330285101Semaste        }
2331314564Sdim      }
2332314564Sdim    } else if (type_flags & eTypeIsFloat) {
2333314564Sdim      if (type_flags & eTypeIsComplex) {
2334314564Sdim        // Don't handle complex yet.
2335314564Sdim      } else {
2336344779Sdim        if (*byte_size <= sizeof(long double)) {
2337314564Sdim          const RegisterInfo *v0_reg_info =
2338314564Sdim              reg_ctx->GetRegisterInfoByName("v0", 0);
2339314564Sdim          RegisterValue v0_value;
2340314564Sdim          if (reg_ctx->ReadRegister(v0_reg_info, v0_value)) {
2341314564Sdim            DataExtractor data;
2342314564Sdim            if (v0_value.GetData(data)) {
2343314564Sdim              lldb::offset_t offset = 0;
2344344779Sdim              if (*byte_size == sizeof(float)) {
2345314564Sdim                value.GetScalar() = data.GetFloat(&offset);
2346314564Sdim                success = true;
2347344779Sdim              } else if (*byte_size == sizeof(double)) {
2348314564Sdim                value.GetScalar() = data.GetDouble(&offset);
2349314564Sdim                success = true;
2350344779Sdim              } else if (*byte_size == sizeof(long double)) {
2351314564Sdim                value.GetScalar() = data.GetLongDouble(&offset);
2352314564Sdim                success = true;
2353314564Sdim              }
2354285101Semaste            }
2355314564Sdim          }
2356285101Semaste        }
2357314564Sdim      }
2358285101Semaste    }
2359314564Sdim
2360314564Sdim    if (success)
2361314564Sdim      return_valobj_sp = ValueObjectConstResult::Create(
2362314564Sdim          thread.GetStackFrameAtIndex(0).get(), value, ConstString(""));
2363344779Sdim  } else if (type_flags & eTypeIsVector && *byte_size <= 16) {
2364344779Sdim    if (*byte_size > 0) {
2365314564Sdim      const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
2366314564Sdim
2367314564Sdim      if (v0_info) {
2368321369Sdim        std::unique_ptr<DataBufferHeap> heap_data_ap(
2369344779Sdim            new DataBufferHeap(*byte_size, 0));
2370321369Sdim        const ByteOrder byte_order = exe_ctx.GetProcessRef().GetByteOrder();
2371321369Sdim        RegisterValue reg_value;
2372321369Sdim        if (reg_ctx->ReadRegister(v0_info, reg_value)) {
2373321369Sdim          Status error;
2374321369Sdim          if (reg_value.GetAsMemoryData(v0_info, heap_data_ap->GetBytes(),
2375321369Sdim                                        heap_data_ap->GetByteSize(), byte_order,
2376321369Sdim                                        error)) {
2377321369Sdim            DataExtractor data(DataBufferSP(heap_data_ap.release()), byte_order,
2378321369Sdim                               exe_ctx.GetProcessRef().GetAddressByteSize());
2379321369Sdim            return_valobj_sp = ValueObjectConstResult::Create(
2380321369Sdim                &thread, return_compiler_type, ConstString(""), data);
2381314564Sdim          }
2382285101Semaste        }
2383314564Sdim      }
2384285101Semaste    }
2385321369Sdim  } else if (type_flags & eTypeIsStructUnion || type_flags & eTypeIsClass ||
2386344779Sdim             (type_flags & eTypeIsVector && *byte_size > 16)) {
2387314564Sdim    DataExtractor data;
2388314564Sdim
2389314564Sdim    uint32_t NGRN = 0; // Search ABI docs for NGRN
2390314564Sdim    uint32_t NSRN = 0; // Search ABI docs for NSRN
2391314564Sdim    const bool is_return_value = true;
2392314564Sdim    if (LoadValueFromConsecutiveGPRRegisters(
2393314564Sdim            exe_ctx, reg_ctx, return_compiler_type, is_return_value, NGRN, NSRN,
2394314564Sdim            data)) {
2395314564Sdim      return_valobj_sp = ValueObjectConstResult::Create(
2396314564Sdim          &thread, return_compiler_type, ConstString(""), data);
2397285101Semaste    }
2398314564Sdim  }
2399314564Sdim  return return_valobj_sp;
2400285101Semaste}
2401285101Semaste
2402314564Sdimvoid ABISysV_arm64::Initialize() {
2403314564Sdim  PluginManager::RegisterPlugin(GetPluginNameStatic(),
2404314564Sdim                                "SysV ABI for AArch64 targets", CreateInstance);
2405285101Semaste}
2406285101Semaste
2407314564Sdimvoid ABISysV_arm64::Terminate() {
2408314564Sdim  PluginManager::UnregisterPlugin(CreateInstance);
2409285101Semaste}
2410285101Semaste
2411314564Sdimlldb_private::ConstString ABISysV_arm64::GetPluginNameStatic() {
2412314564Sdim  static ConstString g_name("SysV-arm64");
2413314564Sdim  return g_name;
2414285101Semaste}
2415285101Semaste
2416285101Semaste//------------------------------------------------------------------
2417285101Semaste// PluginInterface protocol
2418285101Semaste//------------------------------------------------------------------
2419309124Sdim
2420314564SdimConstString ABISysV_arm64::GetPluginName() { return GetPluginNameStatic(); }
2421285101Semaste
2422314564Sdimuint32_t ABISysV_arm64::GetPluginVersion() { return 1; }
2423