1309124Sdim//===-- ABISysV_arm64.cpp ---------------------------------------*- C++ -*-===//
2285101Semaste//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6285101Semaste//
7285101Semaste//===----------------------------------------------------------------------===//
8285101Semaste
9285101Semaste#include "ABISysV_arm64.h"
10285101Semaste
11309124Sdim#include <vector>
12309124Sdim
13309124Sdim#include "llvm/ADT/STLExtras.h"
14309124Sdim#include "llvm/ADT/Triple.h"
15309124Sdim
16285101Semaste#include "lldb/Core/Module.h"
17285101Semaste#include "lldb/Core/PluginManager.h"
18285101Semaste#include "lldb/Core/Value.h"
19285101Semaste#include "lldb/Core/ValueObjectConstResult.h"
20285101Semaste#include "lldb/Symbol/UnwindPlan.h"
21285101Semaste#include "lldb/Target/Process.h"
22285101Semaste#include "lldb/Target/RegisterContext.h"
23285101Semaste#include "lldb/Target/Target.h"
24285101Semaste#include "lldb/Target/Thread.h"
25321369Sdim#include "lldb/Utility/ConstString.h"
26321369Sdim#include "lldb/Utility/Log.h"
27344779Sdim#include "lldb/Utility/RegisterValue.h"
28344779Sdim#include "lldb/Utility/Scalar.h"
29321369Sdim#include "lldb/Utility/Status.h"
30285101Semaste
31285101Semaste#include "Utility/ARM64_DWARF_Registers.h"
32285101Semaste
33285101Semasteusing namespace lldb;
34285101Semasteusing namespace lldb_private;
35285101Semaste
36314564Sdimstatic RegisterInfo g_register_infos[] = {
37314564Sdim    //  NAME       ALT       SZ OFF ENCODING          FORMAT
38314564Sdim    //  EH_FRAME             DWARF                  GENERIC
39314564Sdim    //  PROCESS PLUGIN          LLDB NATIVE
40314564Sdim    //  ========== =======   == === =============     ===================
41314564Sdim    //  ===================  ====================== ===========================
42314564Sdim    //  ======================= ======================
43314564Sdim    {"x0",
44314564Sdim     nullptr,
45314564Sdim     8,
46314564Sdim     0,
47314564Sdim     eEncodingUint,
48314564Sdim     eFormatHex,
49314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x0, LLDB_REGNUM_GENERIC_ARG1,
50314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
51314564Sdim     nullptr,
52314564Sdim     nullptr,
53314564Sdim     nullptr,
54314564Sdim     0},
55314564Sdim    {"x1",
56314564Sdim     nullptr,
57314564Sdim     8,
58314564Sdim     0,
59314564Sdim     eEncodingUint,
60314564Sdim     eFormatHex,
61314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x1, LLDB_REGNUM_GENERIC_ARG2,
62314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
63314564Sdim     nullptr,
64314564Sdim     nullptr,
65314564Sdim     nullptr,
66314564Sdim     0},
67314564Sdim    {"x2",
68314564Sdim     nullptr,
69314564Sdim     8,
70314564Sdim     0,
71314564Sdim     eEncodingUint,
72314564Sdim     eFormatHex,
73314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x2, LLDB_REGNUM_GENERIC_ARG3,
74314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
75314564Sdim     nullptr,
76314564Sdim     nullptr,
77314564Sdim     nullptr,
78314564Sdim     0},
79314564Sdim    {"x3",
80314564Sdim     nullptr,
81314564Sdim     8,
82314564Sdim     0,
83314564Sdim     eEncodingUint,
84314564Sdim     eFormatHex,
85314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x3, LLDB_REGNUM_GENERIC_ARG4,
86314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
87314564Sdim     nullptr,
88314564Sdim     nullptr,
89314564Sdim     nullptr,
90314564Sdim     0},
91314564Sdim    {"x4",
92314564Sdim     nullptr,
93314564Sdim     8,
94314564Sdim     0,
95314564Sdim     eEncodingUint,
96314564Sdim     eFormatHex,
97314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x4, LLDB_REGNUM_GENERIC_ARG5,
98314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
99314564Sdim     nullptr,
100314564Sdim     nullptr,
101314564Sdim     nullptr,
102314564Sdim     0},
103314564Sdim    {"x5",
104314564Sdim     nullptr,
105314564Sdim     8,
106314564Sdim     0,
107314564Sdim     eEncodingUint,
108314564Sdim     eFormatHex,
109314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x5, LLDB_REGNUM_GENERIC_ARG6,
110314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
111314564Sdim     nullptr,
112314564Sdim     nullptr,
113314564Sdim     nullptr,
114314564Sdim     0},
115314564Sdim    {"x6",
116314564Sdim     nullptr,
117314564Sdim     8,
118314564Sdim     0,
119314564Sdim     eEncodingUint,
120314564Sdim     eFormatHex,
121314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x6, LLDB_REGNUM_GENERIC_ARG7,
122314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
123314564Sdim     nullptr,
124314564Sdim     nullptr,
125314564Sdim     nullptr,
126314564Sdim     0},
127314564Sdim    {"x7",
128314564Sdim     nullptr,
129314564Sdim     8,
130314564Sdim     0,
131314564Sdim     eEncodingUint,
132314564Sdim     eFormatHex,
133314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x7, LLDB_REGNUM_GENERIC_ARG8,
134314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
135314564Sdim     nullptr,
136314564Sdim     nullptr,
137314564Sdim     nullptr,
138314564Sdim     0},
139314564Sdim    {"x8",
140314564Sdim     nullptr,
141314564Sdim     8,
142314564Sdim     0,
143314564Sdim     eEncodingUint,
144314564Sdim     eFormatHex,
145314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x8, LLDB_INVALID_REGNUM,
146314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
147314564Sdim     nullptr,
148314564Sdim     nullptr,
149314564Sdim     nullptr,
150314564Sdim     0},
151314564Sdim    {"x9",
152314564Sdim     nullptr,
153314564Sdim     8,
154314564Sdim     0,
155314564Sdim     eEncodingUint,
156314564Sdim     eFormatHex,
157314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x9, LLDB_INVALID_REGNUM,
158314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
159314564Sdim     nullptr,
160314564Sdim     nullptr,
161314564Sdim     nullptr,
162314564Sdim     0},
163314564Sdim    {"x10",
164314564Sdim     nullptr,
165314564Sdim     8,
166314564Sdim     0,
167314564Sdim     eEncodingUint,
168314564Sdim     eFormatHex,
169314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x10, LLDB_INVALID_REGNUM,
170314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
171314564Sdim     nullptr,
172314564Sdim     nullptr,
173314564Sdim     nullptr,
174314564Sdim     0},
175314564Sdim    {"x11",
176314564Sdim     nullptr,
177314564Sdim     8,
178314564Sdim     0,
179314564Sdim     eEncodingUint,
180314564Sdim     eFormatHex,
181314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x11, LLDB_INVALID_REGNUM,
182314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
183314564Sdim     nullptr,
184314564Sdim     nullptr,
185314564Sdim     nullptr,
186314564Sdim     0},
187314564Sdim    {"x12",
188314564Sdim     nullptr,
189314564Sdim     8,
190314564Sdim     0,
191314564Sdim     eEncodingUint,
192314564Sdim     eFormatHex,
193314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x12, LLDB_INVALID_REGNUM,
194314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
195314564Sdim     nullptr,
196314564Sdim     nullptr,
197314564Sdim     nullptr,
198314564Sdim     0},
199314564Sdim    {"x13",
200314564Sdim     nullptr,
201314564Sdim     8,
202314564Sdim     0,
203314564Sdim     eEncodingUint,
204314564Sdim     eFormatHex,
205314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x13, LLDB_INVALID_REGNUM,
206314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
207314564Sdim     nullptr,
208314564Sdim     nullptr,
209314564Sdim     nullptr,
210314564Sdim     0},
211314564Sdim    {"x14",
212314564Sdim     nullptr,
213314564Sdim     8,
214314564Sdim     0,
215314564Sdim     eEncodingUint,
216314564Sdim     eFormatHex,
217314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x14, LLDB_INVALID_REGNUM,
218314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
219314564Sdim     nullptr,
220314564Sdim     nullptr,
221314564Sdim     nullptr,
222314564Sdim     0},
223314564Sdim    {"x15",
224314564Sdim     nullptr,
225314564Sdim     8,
226314564Sdim     0,
227314564Sdim     eEncodingUint,
228314564Sdim     eFormatHex,
229314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x15, LLDB_INVALID_REGNUM,
230314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
231314564Sdim     nullptr,
232314564Sdim     nullptr,
233314564Sdim     nullptr,
234314564Sdim     0},
235314564Sdim    {"x16",
236314564Sdim     nullptr,
237314564Sdim     8,
238314564Sdim     0,
239314564Sdim     eEncodingUint,
240314564Sdim     eFormatHex,
241314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x16, LLDB_INVALID_REGNUM,
242314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
243314564Sdim     nullptr,
244314564Sdim     nullptr,
245314564Sdim     nullptr,
246314564Sdim     0},
247314564Sdim    {"x17",
248314564Sdim     nullptr,
249314564Sdim     8,
250314564Sdim     0,
251314564Sdim     eEncodingUint,
252314564Sdim     eFormatHex,
253314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x17, LLDB_INVALID_REGNUM,
254314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
255314564Sdim     nullptr,
256314564Sdim     nullptr,
257314564Sdim     nullptr,
258314564Sdim     0},
259314564Sdim    {"x18",
260314564Sdim     nullptr,
261314564Sdim     8,
262314564Sdim     0,
263314564Sdim     eEncodingUint,
264314564Sdim     eFormatHex,
265314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x18, LLDB_INVALID_REGNUM,
266314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
267314564Sdim     nullptr,
268314564Sdim     nullptr,
269314564Sdim     nullptr,
270314564Sdim     0},
271314564Sdim    {"x19",
272314564Sdim     nullptr,
273314564Sdim     8,
274314564Sdim     0,
275314564Sdim     eEncodingUint,
276314564Sdim     eFormatHex,
277314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x19, LLDB_INVALID_REGNUM,
278314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
279314564Sdim     nullptr,
280314564Sdim     nullptr,
281314564Sdim     nullptr,
282314564Sdim     0},
283314564Sdim    {"x20",
284314564Sdim     nullptr,
285314564Sdim     8,
286314564Sdim     0,
287314564Sdim     eEncodingUint,
288314564Sdim     eFormatHex,
289314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x20, LLDB_INVALID_REGNUM,
290314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
291314564Sdim     nullptr,
292314564Sdim     nullptr,
293314564Sdim     nullptr,
294314564Sdim     0},
295314564Sdim    {"x21",
296314564Sdim     nullptr,
297314564Sdim     8,
298314564Sdim     0,
299314564Sdim     eEncodingUint,
300314564Sdim     eFormatHex,
301314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x21, LLDB_INVALID_REGNUM,
302314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
303314564Sdim     nullptr,
304314564Sdim     nullptr,
305314564Sdim     nullptr,
306314564Sdim     0},
307314564Sdim    {"x22",
308314564Sdim     nullptr,
309314564Sdim     8,
310314564Sdim     0,
311314564Sdim     eEncodingUint,
312314564Sdim     eFormatHex,
313314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x22, LLDB_INVALID_REGNUM,
314314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
315314564Sdim     nullptr,
316314564Sdim     nullptr,
317314564Sdim     nullptr,
318314564Sdim     0},
319314564Sdim    {"x23",
320314564Sdim     nullptr,
321314564Sdim     8,
322314564Sdim     0,
323314564Sdim     eEncodingUint,
324314564Sdim     eFormatHex,
325314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x23, LLDB_INVALID_REGNUM,
326314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
327314564Sdim     nullptr,
328314564Sdim     nullptr,
329314564Sdim     nullptr,
330314564Sdim     0},
331314564Sdim    {"x24",
332314564Sdim     nullptr,
333314564Sdim     8,
334314564Sdim     0,
335314564Sdim     eEncodingUint,
336314564Sdim     eFormatHex,
337314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x24, LLDB_INVALID_REGNUM,
338314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
339314564Sdim     nullptr,
340314564Sdim     nullptr,
341314564Sdim     nullptr,
342314564Sdim     0},
343314564Sdim    {"x25",
344314564Sdim     nullptr,
345314564Sdim     8,
346314564Sdim     0,
347314564Sdim     eEncodingUint,
348314564Sdim     eFormatHex,
349314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x25, LLDB_INVALID_REGNUM,
350314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
351314564Sdim     nullptr,
352314564Sdim     nullptr,
353314564Sdim     nullptr,
354314564Sdim     0},
355314564Sdim    {"x26",
356314564Sdim     nullptr,
357314564Sdim     8,
358314564Sdim     0,
359314564Sdim     eEncodingUint,
360314564Sdim     eFormatHex,
361314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x26, LLDB_INVALID_REGNUM,
362314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
363314564Sdim     nullptr,
364314564Sdim     nullptr,
365314564Sdim     nullptr,
366314564Sdim     0},
367314564Sdim    {"x27",
368314564Sdim     nullptr,
369314564Sdim     8,
370314564Sdim     0,
371314564Sdim     eEncodingUint,
372314564Sdim     eFormatHex,
373314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x27, LLDB_INVALID_REGNUM,
374314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
375314564Sdim     nullptr,
376314564Sdim     nullptr,
377314564Sdim     nullptr,
378314564Sdim     0},
379314564Sdim    {"x28",
380314564Sdim     nullptr,
381314564Sdim     8,
382314564Sdim     0,
383314564Sdim     eEncodingUint,
384314564Sdim     eFormatHex,
385314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x28, LLDB_INVALID_REGNUM,
386314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
387314564Sdim     nullptr,
388314564Sdim     nullptr,
389314564Sdim     nullptr,
390314564Sdim     0},
391314564Sdim    {"fp",
392314564Sdim     "x29",
393314564Sdim     8,
394314564Sdim     0,
395314564Sdim     eEncodingUint,
396314564Sdim     eFormatHex,
397314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x29, LLDB_REGNUM_GENERIC_FP,
398314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
399314564Sdim     nullptr,
400314564Sdim     nullptr,
401314564Sdim     nullptr,
402314564Sdim     0},
403314564Sdim    {"lr",
404314564Sdim     "x30",
405314564Sdim     8,
406314564Sdim     0,
407314564Sdim     eEncodingUint,
408314564Sdim     eFormatHex,
409314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x30, LLDB_REGNUM_GENERIC_RA,
410314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
411314564Sdim     nullptr,
412314564Sdim     nullptr,
413314564Sdim     nullptr,
414314564Sdim     0},
415314564Sdim    {"sp",
416314564Sdim     "x31",
417314564Sdim     8,
418314564Sdim     0,
419314564Sdim     eEncodingUint,
420314564Sdim     eFormatHex,
421314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::x31, LLDB_REGNUM_GENERIC_SP,
422314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
423314564Sdim     nullptr,
424314564Sdim     nullptr,
425314564Sdim     nullptr,
426314564Sdim     0},
427314564Sdim    {"pc",
428314564Sdim     nullptr,
429314564Sdim     8,
430314564Sdim     0,
431314564Sdim     eEncodingUint,
432314564Sdim     eFormatHex,
433314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::pc, LLDB_REGNUM_GENERIC_PC,
434314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
435314564Sdim     nullptr,
436314564Sdim     nullptr,
437314564Sdim     nullptr,
438314564Sdim     0},
439314564Sdim    {"cpsr",
440314564Sdim     "psr",
441314564Sdim     4,
442314564Sdim     0,
443314564Sdim     eEncodingUint,
444314564Sdim     eFormatHex,
445314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::cpsr, LLDB_REGNUM_GENERIC_FLAGS,
446314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
447314564Sdim     nullptr,
448314564Sdim     nullptr,
449314564Sdim     nullptr,
450314564Sdim     0},
451285101Semaste
452314564Sdim    {"v0",
453314564Sdim     nullptr,
454314564Sdim     16,
455314564Sdim     0,
456314564Sdim     eEncodingVector,
457314564Sdim     eFormatVectorOfUInt8,
458314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v0, LLDB_INVALID_REGNUM,
459314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
460314564Sdim     nullptr,
461314564Sdim     nullptr,
462314564Sdim     nullptr,
463314564Sdim     0},
464314564Sdim    {"v1",
465314564Sdim     nullptr,
466314564Sdim     16,
467314564Sdim     0,
468314564Sdim     eEncodingVector,
469314564Sdim     eFormatVectorOfUInt8,
470314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v1, LLDB_INVALID_REGNUM,
471314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
472314564Sdim     nullptr,
473314564Sdim     nullptr,
474314564Sdim     nullptr,
475314564Sdim     0},
476314564Sdim    {"v2",
477314564Sdim     nullptr,
478314564Sdim     16,
479314564Sdim     0,
480314564Sdim     eEncodingVector,
481314564Sdim     eFormatVectorOfUInt8,
482314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v2, LLDB_INVALID_REGNUM,
483314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
484314564Sdim     nullptr,
485314564Sdim     nullptr,
486314564Sdim     nullptr,
487314564Sdim     0},
488314564Sdim    {"v3",
489314564Sdim     nullptr,
490314564Sdim     16,
491314564Sdim     0,
492314564Sdim     eEncodingVector,
493314564Sdim     eFormatVectorOfUInt8,
494314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v3, LLDB_INVALID_REGNUM,
495314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
496314564Sdim     nullptr,
497314564Sdim     nullptr,
498314564Sdim     nullptr,
499314564Sdim     0},
500314564Sdim    {"v4",
501314564Sdim     nullptr,
502314564Sdim     16,
503314564Sdim     0,
504314564Sdim     eEncodingVector,
505314564Sdim     eFormatVectorOfUInt8,
506314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v4, LLDB_INVALID_REGNUM,
507314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
508314564Sdim     nullptr,
509314564Sdim     nullptr,
510314564Sdim     nullptr,
511314564Sdim     0},
512314564Sdim    {"v5",
513314564Sdim     nullptr,
514314564Sdim     16,
515314564Sdim     0,
516314564Sdim     eEncodingVector,
517314564Sdim     eFormatVectorOfUInt8,
518314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v5, LLDB_INVALID_REGNUM,
519314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
520314564Sdim     nullptr,
521314564Sdim     nullptr,
522314564Sdim     nullptr,
523314564Sdim     0},
524314564Sdim    {"v6",
525314564Sdim     nullptr,
526314564Sdim     16,
527314564Sdim     0,
528314564Sdim     eEncodingVector,
529314564Sdim     eFormatVectorOfUInt8,
530314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v6, LLDB_INVALID_REGNUM,
531314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
532314564Sdim     nullptr,
533314564Sdim     nullptr,
534314564Sdim     nullptr,
535314564Sdim     0},
536314564Sdim    {"v7",
537314564Sdim     nullptr,
538314564Sdim     16,
539314564Sdim     0,
540314564Sdim     eEncodingVector,
541314564Sdim     eFormatVectorOfUInt8,
542314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v7, LLDB_INVALID_REGNUM,
543314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
544314564Sdim     nullptr,
545314564Sdim     nullptr,
546314564Sdim     nullptr,
547314564Sdim     0},
548314564Sdim    {"v8",
549314564Sdim     nullptr,
550314564Sdim     16,
551314564Sdim     0,
552314564Sdim     eEncodingVector,
553314564Sdim     eFormatVectorOfUInt8,
554314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v8, LLDB_INVALID_REGNUM,
555314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
556314564Sdim     nullptr,
557314564Sdim     nullptr,
558314564Sdim     nullptr,
559314564Sdim     0},
560314564Sdim    {"v9",
561314564Sdim     nullptr,
562314564Sdim     16,
563314564Sdim     0,
564314564Sdim     eEncodingVector,
565314564Sdim     eFormatVectorOfUInt8,
566314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v9, LLDB_INVALID_REGNUM,
567314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
568314564Sdim     nullptr,
569314564Sdim     nullptr,
570314564Sdim     nullptr,
571314564Sdim     0},
572314564Sdim    {"v10",
573314564Sdim     nullptr,
574314564Sdim     16,
575314564Sdim     0,
576314564Sdim     eEncodingVector,
577314564Sdim     eFormatVectorOfUInt8,
578314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v10, LLDB_INVALID_REGNUM,
579314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
580314564Sdim     nullptr,
581314564Sdim     nullptr,
582314564Sdim     nullptr,
583314564Sdim     0},
584314564Sdim    {"v11",
585314564Sdim     nullptr,
586314564Sdim     16,
587314564Sdim     0,
588314564Sdim     eEncodingVector,
589314564Sdim     eFormatVectorOfUInt8,
590314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v11, LLDB_INVALID_REGNUM,
591314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
592314564Sdim     nullptr,
593314564Sdim     nullptr,
594314564Sdim     nullptr,
595314564Sdim     0},
596314564Sdim    {"v12",
597314564Sdim     nullptr,
598314564Sdim     16,
599314564Sdim     0,
600314564Sdim     eEncodingVector,
601314564Sdim     eFormatVectorOfUInt8,
602314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v12, LLDB_INVALID_REGNUM,
603314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
604314564Sdim     nullptr,
605314564Sdim     nullptr,
606314564Sdim     nullptr,
607314564Sdim     0},
608314564Sdim    {"v13",
609314564Sdim     nullptr,
610314564Sdim     16,
611314564Sdim     0,
612314564Sdim     eEncodingVector,
613314564Sdim     eFormatVectorOfUInt8,
614314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v13, LLDB_INVALID_REGNUM,
615314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
616314564Sdim     nullptr,
617314564Sdim     nullptr,
618314564Sdim     nullptr,
619314564Sdim     0},
620314564Sdim    {"v14",
621314564Sdim     nullptr,
622314564Sdim     16,
623314564Sdim     0,
624314564Sdim     eEncodingVector,
625314564Sdim     eFormatVectorOfUInt8,
626314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v14, LLDB_INVALID_REGNUM,
627314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
628314564Sdim     nullptr,
629314564Sdim     nullptr,
630314564Sdim     nullptr,
631314564Sdim     0},
632314564Sdim    {"v15",
633314564Sdim     nullptr,
634314564Sdim     16,
635314564Sdim     0,
636314564Sdim     eEncodingVector,
637314564Sdim     eFormatVectorOfUInt8,
638314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v15, LLDB_INVALID_REGNUM,
639314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
640314564Sdim     nullptr,
641314564Sdim     nullptr,
642314564Sdim     nullptr,
643314564Sdim     0},
644314564Sdim    {"v16",
645314564Sdim     nullptr,
646314564Sdim     16,
647314564Sdim     0,
648314564Sdim     eEncodingVector,
649314564Sdim     eFormatVectorOfUInt8,
650314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v16, LLDB_INVALID_REGNUM,
651314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
652314564Sdim     nullptr,
653314564Sdim     nullptr,
654314564Sdim     nullptr,
655314564Sdim     0},
656314564Sdim    {"v17",
657314564Sdim     nullptr,
658314564Sdim     16,
659314564Sdim     0,
660314564Sdim     eEncodingVector,
661314564Sdim     eFormatVectorOfUInt8,
662314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v17, LLDB_INVALID_REGNUM,
663314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
664314564Sdim     nullptr,
665314564Sdim     nullptr,
666314564Sdim     nullptr,
667314564Sdim     0},
668314564Sdim    {"v18",
669314564Sdim     nullptr,
670314564Sdim     16,
671314564Sdim     0,
672314564Sdim     eEncodingVector,
673314564Sdim     eFormatVectorOfUInt8,
674314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v18, LLDB_INVALID_REGNUM,
675314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
676314564Sdim     nullptr,
677314564Sdim     nullptr,
678314564Sdim     nullptr,
679314564Sdim     0},
680314564Sdim    {"v19",
681314564Sdim     nullptr,
682314564Sdim     16,
683314564Sdim     0,
684314564Sdim     eEncodingVector,
685314564Sdim     eFormatVectorOfUInt8,
686314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v19, LLDB_INVALID_REGNUM,
687314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
688314564Sdim     nullptr,
689314564Sdim     nullptr,
690314564Sdim     nullptr,
691314564Sdim     0},
692314564Sdim    {"v20",
693314564Sdim     nullptr,
694314564Sdim     16,
695314564Sdim     0,
696314564Sdim     eEncodingVector,
697314564Sdim     eFormatVectorOfUInt8,
698314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v20, LLDB_INVALID_REGNUM,
699314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
700314564Sdim     nullptr,
701314564Sdim     nullptr,
702314564Sdim     nullptr,
703314564Sdim     0},
704314564Sdim    {"v21",
705314564Sdim     nullptr,
706314564Sdim     16,
707314564Sdim     0,
708314564Sdim     eEncodingVector,
709314564Sdim     eFormatVectorOfUInt8,
710314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v21, LLDB_INVALID_REGNUM,
711314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
712314564Sdim     nullptr,
713314564Sdim     nullptr,
714314564Sdim     nullptr,
715314564Sdim     0},
716314564Sdim    {"v22",
717314564Sdim     nullptr,
718314564Sdim     16,
719314564Sdim     0,
720314564Sdim     eEncodingVector,
721314564Sdim     eFormatVectorOfUInt8,
722314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v22, LLDB_INVALID_REGNUM,
723314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
724314564Sdim     nullptr,
725314564Sdim     nullptr,
726314564Sdim     nullptr,
727314564Sdim     0},
728314564Sdim    {"v23",
729314564Sdim     nullptr,
730314564Sdim     16,
731314564Sdim     0,
732314564Sdim     eEncodingVector,
733314564Sdim     eFormatVectorOfUInt8,
734314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v23, LLDB_INVALID_REGNUM,
735314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
736314564Sdim     nullptr,
737314564Sdim     nullptr,
738314564Sdim     nullptr,
739314564Sdim     0},
740314564Sdim    {"v24",
741314564Sdim     nullptr,
742314564Sdim     16,
743314564Sdim     0,
744314564Sdim     eEncodingVector,
745314564Sdim     eFormatVectorOfUInt8,
746314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v24, LLDB_INVALID_REGNUM,
747314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
748314564Sdim     nullptr,
749314564Sdim     nullptr,
750314564Sdim     nullptr,
751314564Sdim     0},
752314564Sdim    {"v25",
753314564Sdim     nullptr,
754314564Sdim     16,
755314564Sdim     0,
756314564Sdim     eEncodingVector,
757314564Sdim     eFormatVectorOfUInt8,
758314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v25, LLDB_INVALID_REGNUM,
759314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
760314564Sdim     nullptr,
761314564Sdim     nullptr,
762314564Sdim     nullptr,
763314564Sdim     0},
764314564Sdim    {"v26",
765314564Sdim     nullptr,
766314564Sdim     16,
767314564Sdim     0,
768314564Sdim     eEncodingVector,
769314564Sdim     eFormatVectorOfUInt8,
770314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v26, LLDB_INVALID_REGNUM,
771314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
772314564Sdim     nullptr,
773314564Sdim     nullptr,
774314564Sdim     nullptr,
775314564Sdim     0},
776314564Sdim    {"v27",
777314564Sdim     nullptr,
778314564Sdim     16,
779314564Sdim     0,
780314564Sdim     eEncodingVector,
781314564Sdim     eFormatVectorOfUInt8,
782314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v27, LLDB_INVALID_REGNUM,
783314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
784314564Sdim     nullptr,
785314564Sdim     nullptr,
786314564Sdim     nullptr,
787314564Sdim     0},
788314564Sdim    {"v28",
789314564Sdim     nullptr,
790314564Sdim     16,
791314564Sdim     0,
792314564Sdim     eEncodingVector,
793314564Sdim     eFormatVectorOfUInt8,
794314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v28, LLDB_INVALID_REGNUM,
795314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
796314564Sdim     nullptr,
797314564Sdim     nullptr,
798314564Sdim     nullptr,
799314564Sdim     0},
800314564Sdim    {"v29",
801314564Sdim     nullptr,
802314564Sdim     16,
803314564Sdim     0,
804314564Sdim     eEncodingVector,
805314564Sdim     eFormatVectorOfUInt8,
806314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v29, LLDB_INVALID_REGNUM,
807314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
808314564Sdim     nullptr,
809314564Sdim     nullptr,
810314564Sdim     nullptr,
811314564Sdim     0},
812314564Sdim    {"v30",
813314564Sdim     nullptr,
814314564Sdim     16,
815314564Sdim     0,
816314564Sdim     eEncodingVector,
817314564Sdim     eFormatVectorOfUInt8,
818314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v30, LLDB_INVALID_REGNUM,
819314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
820314564Sdim     nullptr,
821314564Sdim     nullptr,
822314564Sdim     nullptr,
823314564Sdim     0},
824314564Sdim    {"v31",
825314564Sdim     nullptr,
826314564Sdim     16,
827314564Sdim     0,
828314564Sdim     eEncodingVector,
829314564Sdim     eFormatVectorOfUInt8,
830314564Sdim     {LLDB_INVALID_REGNUM, arm64_dwarf::v31, LLDB_INVALID_REGNUM,
831314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
832314564Sdim     nullptr,
833314564Sdim     nullptr,
834314564Sdim     nullptr,
835314564Sdim     0},
836285101Semaste
837314564Sdim    {"fpsr",
838314564Sdim     nullptr,
839314564Sdim     4,
840314564Sdim     0,
841314564Sdim     eEncodingUint,
842314564Sdim     eFormatHex,
843314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
844314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
845314564Sdim     nullptr,
846314564Sdim     nullptr,
847314564Sdim     nullptr,
848314564Sdim     0},
849314564Sdim    {"fpcr",
850314564Sdim     nullptr,
851314564Sdim     4,
852314564Sdim     0,
853314564Sdim     eEncodingUint,
854314564Sdim     eFormatHex,
855314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
856314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
857314564Sdim     nullptr,
858314564Sdim     nullptr,
859314564Sdim     nullptr,
860314564Sdim     0},
861285101Semaste
862314564Sdim    {"s0",
863314564Sdim     nullptr,
864314564Sdim     4,
865314564Sdim     0,
866314564Sdim     eEncodingIEEE754,
867314564Sdim     eFormatFloat,
868314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
869314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
870314564Sdim     nullptr,
871314564Sdim     nullptr,
872314564Sdim     nullptr,
873314564Sdim     0},
874314564Sdim    {"s1",
875314564Sdim     nullptr,
876314564Sdim     4,
877314564Sdim     0,
878314564Sdim     eEncodingIEEE754,
879314564Sdim     eFormatFloat,
880314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
881314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
882314564Sdim     nullptr,
883314564Sdim     nullptr,
884314564Sdim     nullptr,
885314564Sdim     0},
886314564Sdim    {"s2",
887314564Sdim     nullptr,
888314564Sdim     4,
889314564Sdim     0,
890314564Sdim     eEncodingIEEE754,
891314564Sdim     eFormatFloat,
892314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
893314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
894314564Sdim     nullptr,
895314564Sdim     nullptr,
896314564Sdim     nullptr,
897314564Sdim     0},
898314564Sdim    {"s3",
899314564Sdim     nullptr,
900314564Sdim     4,
901314564Sdim     0,
902314564Sdim     eEncodingIEEE754,
903314564Sdim     eFormatFloat,
904314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
905314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
906314564Sdim     nullptr,
907314564Sdim     nullptr,
908314564Sdim     nullptr,
909314564Sdim     0},
910314564Sdim    {"s4",
911314564Sdim     nullptr,
912314564Sdim     4,
913314564Sdim     0,
914314564Sdim     eEncodingIEEE754,
915314564Sdim     eFormatFloat,
916314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
917314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
918314564Sdim     nullptr,
919314564Sdim     nullptr,
920314564Sdim     nullptr,
921314564Sdim     0},
922314564Sdim    {"s5",
923314564Sdim     nullptr,
924314564Sdim     4,
925314564Sdim     0,
926314564Sdim     eEncodingIEEE754,
927314564Sdim     eFormatFloat,
928314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
929314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
930314564Sdim     nullptr,
931314564Sdim     nullptr,
932314564Sdim     nullptr,
933314564Sdim     0},
934314564Sdim    {"s6",
935314564Sdim     nullptr,
936314564Sdim     4,
937314564Sdim     0,
938314564Sdim     eEncodingIEEE754,
939314564Sdim     eFormatFloat,
940314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
941314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
942314564Sdim     nullptr,
943314564Sdim     nullptr,
944314564Sdim     nullptr,
945314564Sdim     0},
946314564Sdim    {"s7",
947314564Sdim     nullptr,
948314564Sdim     4,
949314564Sdim     0,
950314564Sdim     eEncodingIEEE754,
951314564Sdim     eFormatFloat,
952314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
953314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
954314564Sdim     nullptr,
955314564Sdim     nullptr,
956314564Sdim     nullptr,
957314564Sdim     0},
958314564Sdim    {"s8",
959314564Sdim     nullptr,
960314564Sdim     4,
961314564Sdim     0,
962314564Sdim     eEncodingIEEE754,
963314564Sdim     eFormatFloat,
964314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
965314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
966314564Sdim     nullptr,
967314564Sdim     nullptr,
968314564Sdim     nullptr,
969314564Sdim     0},
970314564Sdim    {"s9",
971314564Sdim     nullptr,
972314564Sdim     4,
973314564Sdim     0,
974314564Sdim     eEncodingIEEE754,
975314564Sdim     eFormatFloat,
976314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
977314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
978314564Sdim     nullptr,
979314564Sdim     nullptr,
980314564Sdim     nullptr,
981314564Sdim     0},
982314564Sdim    {"s10",
983314564Sdim     nullptr,
984314564Sdim     4,
985314564Sdim     0,
986314564Sdim     eEncodingIEEE754,
987314564Sdim     eFormatFloat,
988314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
989314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
990314564Sdim     nullptr,
991314564Sdim     nullptr,
992314564Sdim     nullptr,
993314564Sdim     0},
994314564Sdim    {"s11",
995314564Sdim     nullptr,
996314564Sdim     4,
997314564Sdim     0,
998314564Sdim     eEncodingIEEE754,
999314564Sdim     eFormatFloat,
1000314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1001314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1002314564Sdim     nullptr,
1003314564Sdim     nullptr,
1004314564Sdim     nullptr,
1005314564Sdim     0},
1006314564Sdim    {"s12",
1007314564Sdim     nullptr,
1008314564Sdim     4,
1009314564Sdim     0,
1010314564Sdim     eEncodingIEEE754,
1011314564Sdim     eFormatFloat,
1012314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1013314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1014314564Sdim     nullptr,
1015314564Sdim     nullptr,
1016314564Sdim     nullptr,
1017314564Sdim     0},
1018314564Sdim    {"s13",
1019314564Sdim     nullptr,
1020314564Sdim     4,
1021314564Sdim     0,
1022314564Sdim     eEncodingIEEE754,
1023314564Sdim     eFormatFloat,
1024314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1025314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1026314564Sdim     nullptr,
1027314564Sdim     nullptr,
1028314564Sdim     nullptr,
1029314564Sdim     0},
1030314564Sdim    {"s14",
1031314564Sdim     nullptr,
1032314564Sdim     4,
1033314564Sdim     0,
1034314564Sdim     eEncodingIEEE754,
1035314564Sdim     eFormatFloat,
1036314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1037314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1038314564Sdim     nullptr,
1039314564Sdim     nullptr,
1040314564Sdim     nullptr,
1041314564Sdim     0},
1042314564Sdim    {"s15",
1043314564Sdim     nullptr,
1044314564Sdim     4,
1045314564Sdim     0,
1046314564Sdim     eEncodingIEEE754,
1047314564Sdim     eFormatFloat,
1048314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1049314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1050314564Sdim     nullptr,
1051314564Sdim     nullptr,
1052314564Sdim     nullptr,
1053314564Sdim     0},
1054314564Sdim    {"s16",
1055314564Sdim     nullptr,
1056314564Sdim     4,
1057314564Sdim     0,
1058314564Sdim     eEncodingIEEE754,
1059314564Sdim     eFormatFloat,
1060314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1061314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1062314564Sdim     nullptr,
1063314564Sdim     nullptr,
1064314564Sdim     nullptr,
1065314564Sdim     0},
1066314564Sdim    {"s17",
1067314564Sdim     nullptr,
1068314564Sdim     4,
1069314564Sdim     0,
1070314564Sdim     eEncodingIEEE754,
1071314564Sdim     eFormatFloat,
1072314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1073314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1074314564Sdim     nullptr,
1075314564Sdim     nullptr,
1076314564Sdim     nullptr,
1077314564Sdim     0},
1078314564Sdim    {"s18",
1079314564Sdim     nullptr,
1080314564Sdim     4,
1081314564Sdim     0,
1082314564Sdim     eEncodingIEEE754,
1083314564Sdim     eFormatFloat,
1084314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1085314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1086314564Sdim     nullptr,
1087314564Sdim     nullptr,
1088314564Sdim     nullptr,
1089314564Sdim     0},
1090314564Sdim    {"s19",
1091314564Sdim     nullptr,
1092314564Sdim     4,
1093314564Sdim     0,
1094314564Sdim     eEncodingIEEE754,
1095314564Sdim     eFormatFloat,
1096314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1097314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1098314564Sdim     nullptr,
1099314564Sdim     nullptr,
1100314564Sdim     nullptr,
1101314564Sdim     0},
1102314564Sdim    {"s20",
1103314564Sdim     nullptr,
1104314564Sdim     4,
1105314564Sdim     0,
1106314564Sdim     eEncodingIEEE754,
1107314564Sdim     eFormatFloat,
1108314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1109314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1110314564Sdim     nullptr,
1111314564Sdim     nullptr,
1112314564Sdim     nullptr,
1113314564Sdim     0},
1114314564Sdim    {"s21",
1115314564Sdim     nullptr,
1116314564Sdim     4,
1117314564Sdim     0,
1118314564Sdim     eEncodingIEEE754,
1119314564Sdim     eFormatFloat,
1120314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1121314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1122314564Sdim     nullptr,
1123314564Sdim     nullptr,
1124314564Sdim     nullptr,
1125314564Sdim     0},
1126314564Sdim    {"s22",
1127314564Sdim     nullptr,
1128314564Sdim     4,
1129314564Sdim     0,
1130314564Sdim     eEncodingIEEE754,
1131314564Sdim     eFormatFloat,
1132314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1133314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1134314564Sdim     nullptr,
1135314564Sdim     nullptr,
1136314564Sdim     nullptr,
1137314564Sdim     0},
1138314564Sdim    {"s23",
1139314564Sdim     nullptr,
1140314564Sdim     4,
1141314564Sdim     0,
1142314564Sdim     eEncodingIEEE754,
1143314564Sdim     eFormatFloat,
1144314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1145314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1146314564Sdim     nullptr,
1147314564Sdim     nullptr,
1148314564Sdim     nullptr,
1149314564Sdim     0},
1150314564Sdim    {"s24",
1151314564Sdim     nullptr,
1152314564Sdim     4,
1153314564Sdim     0,
1154314564Sdim     eEncodingIEEE754,
1155314564Sdim     eFormatFloat,
1156314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1157314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1158314564Sdim     nullptr,
1159314564Sdim     nullptr,
1160314564Sdim     nullptr,
1161314564Sdim     0},
1162314564Sdim    {"s25",
1163314564Sdim     nullptr,
1164314564Sdim     4,
1165314564Sdim     0,
1166314564Sdim     eEncodingIEEE754,
1167314564Sdim     eFormatFloat,
1168314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1169314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1170314564Sdim     nullptr,
1171314564Sdim     nullptr,
1172314564Sdim     nullptr,
1173314564Sdim     0},
1174314564Sdim    {"s26",
1175314564Sdim     nullptr,
1176314564Sdim     4,
1177314564Sdim     0,
1178314564Sdim     eEncodingIEEE754,
1179314564Sdim     eFormatFloat,
1180314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1181314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1182314564Sdim     nullptr,
1183314564Sdim     nullptr,
1184314564Sdim     nullptr,
1185314564Sdim     0},
1186314564Sdim    {"s27",
1187314564Sdim     nullptr,
1188314564Sdim     4,
1189314564Sdim     0,
1190314564Sdim     eEncodingIEEE754,
1191314564Sdim     eFormatFloat,
1192314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1193314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1194314564Sdim     nullptr,
1195314564Sdim     nullptr,
1196314564Sdim     nullptr,
1197314564Sdim     0},
1198314564Sdim    {"s28",
1199314564Sdim     nullptr,
1200314564Sdim     4,
1201314564Sdim     0,
1202314564Sdim     eEncodingIEEE754,
1203314564Sdim     eFormatFloat,
1204314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1205314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1206314564Sdim     nullptr,
1207314564Sdim     nullptr,
1208314564Sdim     nullptr,
1209314564Sdim     0},
1210314564Sdim    {"s29",
1211314564Sdim     nullptr,
1212314564Sdim     4,
1213314564Sdim     0,
1214314564Sdim     eEncodingIEEE754,
1215314564Sdim     eFormatFloat,
1216314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1217314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1218314564Sdim     nullptr,
1219314564Sdim     nullptr,
1220314564Sdim     nullptr,
1221314564Sdim     0},
1222314564Sdim    {"s30",
1223314564Sdim     nullptr,
1224314564Sdim     4,
1225314564Sdim     0,
1226314564Sdim     eEncodingIEEE754,
1227314564Sdim     eFormatFloat,
1228314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1229314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1230314564Sdim     nullptr,
1231314564Sdim     nullptr,
1232314564Sdim     nullptr,
1233314564Sdim     0},
1234314564Sdim    {"s31",
1235314564Sdim     nullptr,
1236314564Sdim     4,
1237314564Sdim     0,
1238314564Sdim     eEncodingIEEE754,
1239314564Sdim     eFormatFloat,
1240314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1241314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1242314564Sdim     nullptr,
1243314564Sdim     nullptr,
1244314564Sdim     nullptr,
1245314564Sdim     0},
1246285101Semaste
1247314564Sdim    {"d0",
1248314564Sdim     nullptr,
1249314564Sdim     8,
1250314564Sdim     0,
1251314564Sdim     eEncodingIEEE754,
1252314564Sdim     eFormatFloat,
1253314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1254314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1255314564Sdim     nullptr,
1256314564Sdim     nullptr,
1257314564Sdim     nullptr,
1258314564Sdim     0},
1259314564Sdim    {"d1",
1260314564Sdim     nullptr,
1261314564Sdim     8,
1262314564Sdim     0,
1263314564Sdim     eEncodingIEEE754,
1264314564Sdim     eFormatFloat,
1265314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1266314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1267314564Sdim     nullptr,
1268314564Sdim     nullptr,
1269314564Sdim     nullptr,
1270314564Sdim     0},
1271314564Sdim    {"d2",
1272314564Sdim     nullptr,
1273314564Sdim     8,
1274314564Sdim     0,
1275314564Sdim     eEncodingIEEE754,
1276314564Sdim     eFormatFloat,
1277314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1278314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1279314564Sdim     nullptr,
1280314564Sdim     nullptr,
1281314564Sdim     nullptr,
1282314564Sdim     0},
1283314564Sdim    {"d3",
1284314564Sdim     nullptr,
1285314564Sdim     8,
1286314564Sdim     0,
1287314564Sdim     eEncodingIEEE754,
1288314564Sdim     eFormatFloat,
1289314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1290314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1291314564Sdim     nullptr,
1292314564Sdim     nullptr,
1293314564Sdim     nullptr,
1294314564Sdim     0},
1295314564Sdim    {"d4",
1296314564Sdim     nullptr,
1297314564Sdim     8,
1298314564Sdim     0,
1299314564Sdim     eEncodingIEEE754,
1300314564Sdim     eFormatFloat,
1301314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1302314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1303314564Sdim     nullptr,
1304314564Sdim     nullptr,
1305314564Sdim     nullptr,
1306314564Sdim     0},
1307314564Sdim    {"d5",
1308314564Sdim     nullptr,
1309314564Sdim     8,
1310314564Sdim     0,
1311314564Sdim     eEncodingIEEE754,
1312314564Sdim     eFormatFloat,
1313314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1314314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1315314564Sdim     nullptr,
1316314564Sdim     nullptr,
1317314564Sdim     nullptr,
1318314564Sdim     0},
1319314564Sdim    {"d6",
1320314564Sdim     nullptr,
1321314564Sdim     8,
1322314564Sdim     0,
1323314564Sdim     eEncodingIEEE754,
1324314564Sdim     eFormatFloat,
1325314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1326314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1327314564Sdim     nullptr,
1328314564Sdim     nullptr,
1329314564Sdim     nullptr,
1330314564Sdim     0},
1331314564Sdim    {"d7",
1332314564Sdim     nullptr,
1333314564Sdim     8,
1334314564Sdim     0,
1335314564Sdim     eEncodingIEEE754,
1336314564Sdim     eFormatFloat,
1337314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1338314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1339314564Sdim     nullptr,
1340314564Sdim     nullptr,
1341314564Sdim     nullptr,
1342314564Sdim     0},
1343314564Sdim    {"d8",
1344314564Sdim     nullptr,
1345314564Sdim     8,
1346314564Sdim     0,
1347314564Sdim     eEncodingIEEE754,
1348314564Sdim     eFormatFloat,
1349314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1350314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1351314564Sdim     nullptr,
1352314564Sdim     nullptr,
1353314564Sdim     nullptr,
1354314564Sdim     0},
1355314564Sdim    {"d9",
1356314564Sdim     nullptr,
1357314564Sdim     8,
1358314564Sdim     0,
1359314564Sdim     eEncodingIEEE754,
1360314564Sdim     eFormatFloat,
1361314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1362314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1363314564Sdim     nullptr,
1364314564Sdim     nullptr,
1365314564Sdim     nullptr,
1366314564Sdim     0},
1367314564Sdim    {"d10",
1368314564Sdim     nullptr,
1369314564Sdim     8,
1370314564Sdim     0,
1371314564Sdim     eEncodingIEEE754,
1372314564Sdim     eFormatFloat,
1373314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1374314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1375314564Sdim     nullptr,
1376314564Sdim     nullptr,
1377314564Sdim     nullptr,
1378314564Sdim     0},
1379314564Sdim    {"d11",
1380314564Sdim     nullptr,
1381314564Sdim     8,
1382314564Sdim     0,
1383314564Sdim     eEncodingIEEE754,
1384314564Sdim     eFormatFloat,
1385314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1386314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1387314564Sdim     nullptr,
1388314564Sdim     nullptr,
1389314564Sdim     nullptr,
1390314564Sdim     0},
1391314564Sdim    {"d12",
1392314564Sdim     nullptr,
1393314564Sdim     8,
1394314564Sdim     0,
1395314564Sdim     eEncodingIEEE754,
1396314564Sdim     eFormatFloat,
1397314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1398314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1399314564Sdim     nullptr,
1400314564Sdim     nullptr,
1401314564Sdim     nullptr,
1402314564Sdim     0},
1403314564Sdim    {"d13",
1404314564Sdim     nullptr,
1405314564Sdim     8,
1406314564Sdim     0,
1407314564Sdim     eEncodingIEEE754,
1408314564Sdim     eFormatFloat,
1409314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1410314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1411314564Sdim     nullptr,
1412314564Sdim     nullptr,
1413314564Sdim     nullptr,
1414314564Sdim     0},
1415314564Sdim    {"d14",
1416314564Sdim     nullptr,
1417314564Sdim     8,
1418314564Sdim     0,
1419314564Sdim     eEncodingIEEE754,
1420314564Sdim     eFormatFloat,
1421314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1422314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1423314564Sdim     nullptr,
1424314564Sdim     nullptr,
1425314564Sdim     nullptr,
1426314564Sdim     0},
1427314564Sdim    {"d15",
1428314564Sdim     nullptr,
1429314564Sdim     8,
1430314564Sdim     0,
1431314564Sdim     eEncodingIEEE754,
1432314564Sdim     eFormatFloat,
1433314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1434314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1435314564Sdim     nullptr,
1436314564Sdim     nullptr,
1437314564Sdim     nullptr,
1438314564Sdim     0},
1439314564Sdim    {"d16",
1440314564Sdim     nullptr,
1441314564Sdim     8,
1442314564Sdim     0,
1443314564Sdim     eEncodingIEEE754,
1444314564Sdim     eFormatFloat,
1445314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1446314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1447314564Sdim     nullptr,
1448314564Sdim     nullptr,
1449314564Sdim     nullptr,
1450314564Sdim     0},
1451314564Sdim    {"d17",
1452314564Sdim     nullptr,
1453314564Sdim     8,
1454314564Sdim     0,
1455314564Sdim     eEncodingIEEE754,
1456314564Sdim     eFormatFloat,
1457314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1458314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1459314564Sdim     nullptr,
1460314564Sdim     nullptr,
1461314564Sdim     nullptr,
1462314564Sdim     0},
1463314564Sdim    {"d18",
1464314564Sdim     nullptr,
1465314564Sdim     8,
1466314564Sdim     0,
1467314564Sdim     eEncodingIEEE754,
1468314564Sdim     eFormatFloat,
1469314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1470314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1471314564Sdim     nullptr,
1472314564Sdim     nullptr,
1473314564Sdim     nullptr,
1474314564Sdim     0},
1475314564Sdim    {"d19",
1476314564Sdim     nullptr,
1477314564Sdim     8,
1478314564Sdim     0,
1479314564Sdim     eEncodingIEEE754,
1480314564Sdim     eFormatFloat,
1481314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1482314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1483314564Sdim     nullptr,
1484314564Sdim     nullptr,
1485314564Sdim     nullptr,
1486314564Sdim     0},
1487314564Sdim    {"d20",
1488314564Sdim     nullptr,
1489314564Sdim     8,
1490314564Sdim     0,
1491314564Sdim     eEncodingIEEE754,
1492314564Sdim     eFormatFloat,
1493314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1494314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1495314564Sdim     nullptr,
1496314564Sdim     nullptr,
1497314564Sdim     nullptr,
1498314564Sdim     0},
1499314564Sdim    {"d21",
1500314564Sdim     nullptr,
1501314564Sdim     8,
1502314564Sdim     0,
1503314564Sdim     eEncodingIEEE754,
1504314564Sdim     eFormatFloat,
1505314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1506314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1507314564Sdim     nullptr,
1508314564Sdim     nullptr,
1509314564Sdim     nullptr,
1510314564Sdim     0},
1511314564Sdim    {"d22",
1512314564Sdim     nullptr,
1513314564Sdim     8,
1514314564Sdim     0,
1515314564Sdim     eEncodingIEEE754,
1516314564Sdim     eFormatFloat,
1517314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1518314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1519314564Sdim     nullptr,
1520314564Sdim     nullptr,
1521314564Sdim     nullptr,
1522314564Sdim     0},
1523314564Sdim    {"d23",
1524314564Sdim     nullptr,
1525314564Sdim     8,
1526314564Sdim     0,
1527314564Sdim     eEncodingIEEE754,
1528314564Sdim     eFormatFloat,
1529314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1530314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1531314564Sdim     nullptr,
1532314564Sdim     nullptr,
1533314564Sdim     nullptr,
1534314564Sdim     0},
1535314564Sdim    {"d24",
1536314564Sdim     nullptr,
1537314564Sdim     8,
1538314564Sdim     0,
1539314564Sdim     eEncodingIEEE754,
1540314564Sdim     eFormatFloat,
1541314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1542314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1543314564Sdim     nullptr,
1544314564Sdim     nullptr,
1545314564Sdim     nullptr,
1546314564Sdim     0},
1547314564Sdim    {"d25",
1548314564Sdim     nullptr,
1549314564Sdim     8,
1550314564Sdim     0,
1551314564Sdim     eEncodingIEEE754,
1552314564Sdim     eFormatFloat,
1553314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1554314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1555314564Sdim     nullptr,
1556314564Sdim     nullptr,
1557314564Sdim     nullptr,
1558314564Sdim     0},
1559314564Sdim    {"d26",
1560314564Sdim     nullptr,
1561314564Sdim     8,
1562314564Sdim     0,
1563314564Sdim     eEncodingIEEE754,
1564314564Sdim     eFormatFloat,
1565314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1566314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1567314564Sdim     nullptr,
1568314564Sdim     nullptr,
1569314564Sdim     nullptr,
1570314564Sdim     0},
1571314564Sdim    {"d27",
1572314564Sdim     nullptr,
1573314564Sdim     8,
1574314564Sdim     0,
1575314564Sdim     eEncodingIEEE754,
1576314564Sdim     eFormatFloat,
1577314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1578314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1579314564Sdim     nullptr,
1580314564Sdim     nullptr,
1581314564Sdim     nullptr,
1582314564Sdim     0},
1583314564Sdim    {"d28",
1584314564Sdim     nullptr,
1585314564Sdim     8,
1586314564Sdim     0,
1587314564Sdim     eEncodingIEEE754,
1588314564Sdim     eFormatFloat,
1589314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1590314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1591314564Sdim     nullptr,
1592314564Sdim     nullptr,
1593314564Sdim     nullptr,
1594314564Sdim     0},
1595314564Sdim    {"d29",
1596314564Sdim     nullptr,
1597314564Sdim     8,
1598314564Sdim     0,
1599314564Sdim     eEncodingIEEE754,
1600314564Sdim     eFormatFloat,
1601314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1602314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1603314564Sdim     nullptr,
1604314564Sdim     nullptr,
1605314564Sdim     nullptr,
1606314564Sdim     0},
1607314564Sdim    {"d30",
1608314564Sdim     nullptr,
1609314564Sdim     8,
1610314564Sdim     0,
1611314564Sdim     eEncodingIEEE754,
1612314564Sdim     eFormatFloat,
1613314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1614314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1615314564Sdim     nullptr,
1616314564Sdim     nullptr,
1617314564Sdim     nullptr,
1618314564Sdim     0},
1619314564Sdim    {"d31",
1620314564Sdim     nullptr,
1621314564Sdim     8,
1622314564Sdim     0,
1623314564Sdim     eEncodingIEEE754,
1624314564Sdim     eFormatFloat,
1625314564Sdim     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1626314564Sdim      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1627314564Sdim     nullptr,
1628314564Sdim     nullptr,
1629314564Sdim     nullptr,
1630314564Sdim     0}};
1631285101Semaste
1632314564Sdimstatic const uint32_t k_num_register_infos =
1633314564Sdim    llvm::array_lengthof(g_register_infos);
1634285101Semastestatic bool g_register_info_names_constified = false;
1635285101Semaste
1636285101Semasteconst lldb_private::RegisterInfo *
1637314564SdimABISysV_arm64::GetRegisterInfoArray(uint32_t &count) {
1638314564Sdim  // Make the C-string names and alt_names for the register infos into const
1639314564Sdim  // C-string values by having the ConstString unique the names in the global
1640314564Sdim  // constant C-string pool.
1641314564Sdim  if (!g_register_info_names_constified) {
1642314564Sdim    g_register_info_names_constified = true;
1643314564Sdim    for (uint32_t i = 0; i < k_num_register_infos; ++i) {
1644314564Sdim      if (g_register_infos[i].name)
1645314564Sdim        g_register_infos[i].name =
1646314564Sdim            ConstString(g_register_infos[i].name).GetCString();
1647314564Sdim      if (g_register_infos[i].alt_name)
1648314564Sdim        g_register_infos[i].alt_name =
1649314564Sdim            ConstString(g_register_infos[i].alt_name).GetCString();
1650285101Semaste    }
1651314564Sdim  }
1652314564Sdim  count = k_num_register_infos;
1653314564Sdim  return g_register_infos;
1654285101Semaste}
1655285101Semaste
1656314564Sdimbool ABISysV_arm64::GetPointerReturnRegister(const char *&name) {
1657314564Sdim  name = "x0";
1658314564Sdim  return true;
1659285101Semaste}
1660285101Semaste
1661314564Sdimsize_t ABISysV_arm64::GetRedZoneSize() const { return 128; }
1662314564Sdim
1663285101Semaste// Static Functions
1664309124Sdim
1665285101SemasteABISP
1666321369SdimABISysV_arm64::CreateInstance(lldb::ProcessSP process_sp, const ArchSpec &arch) {
1667314564Sdim  const llvm::Triple::ArchType arch_type = arch.GetTriple().getArch();
1668314564Sdim  const llvm::Triple::VendorType vendor_type = arch.GetTriple().getVendor();
1669285101Semaste
1670314564Sdim  if (vendor_type != llvm::Triple::Apple) {
1671360784Sdim    if (arch_type == llvm::Triple::aarch64 ||
1672360784Sdim        arch_type == llvm::Triple::aarch64_32) {
1673360784Sdim      return ABISP(
1674360784Sdim          new ABISysV_arm64(std::move(process_sp), MakeMCRegisterInfo(arch)));
1675285101Semaste    }
1676314564Sdim  }
1677285101Semaste
1678314564Sdim  return ABISP();
1679285101Semaste}
1680285101Semaste
1681314564Sdimbool ABISysV_arm64::PrepareTrivialCall(Thread &thread, addr_t sp,
1682314564Sdim                                       addr_t func_addr, addr_t return_addr,
1683314564Sdim                                       llvm::ArrayRef<addr_t> args) const {
1684314564Sdim  RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1685314564Sdim  if (!reg_ctx)
1686314564Sdim    return false;
1687285101Semaste
1688314564Sdim  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1689285101Semaste
1690314564Sdim  if (log) {
1691314564Sdim    StreamString s;
1692321369Sdim    s.Printf("ABISysV_arm64::PrepareTrivialCall (tid = 0x%" PRIx64
1693314564Sdim             ", sp = 0x%" PRIx64 ", func_addr = 0x%" PRIx64
1694314564Sdim             ", return_addr = 0x%" PRIx64,
1695314564Sdim             thread.GetID(), (uint64_t)sp, (uint64_t)func_addr,
1696314564Sdim             (uint64_t)return_addr);
1697285101Semaste
1698314564Sdim    for (size_t i = 0; i < args.size(); ++i)
1699314564Sdim      s.Printf(", arg%d = 0x%" PRIx64, static_cast<int>(i + 1), args[i]);
1700314564Sdim    s.PutCString(")");
1701314564Sdim    log->PutString(s.GetString());
1702314564Sdim  }
1703285101Semaste
1704314564Sdim  // x0 - x7 contain first 8 simple args
1705314564Sdim  if (args.size() > 8)
1706314564Sdim    return false;
1707285101Semaste
1708314564Sdim  for (size_t i = 0; i < args.size(); ++i) {
1709314564Sdim    const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(
1710314564Sdim        eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + i);
1711360784Sdim    LLDB_LOGF(log, "About to write arg%d (0x%" PRIx64 ") into %s",
1712360784Sdim              static_cast<int>(i + 1), args[i], reg_info->name);
1713314564Sdim    if (!reg_ctx->WriteRegisterFromUnsigned(reg_info, args[i]))
1714314564Sdim      return false;
1715314564Sdim  }
1716285101Semaste
1717314564Sdim  // Set "lr" to the return address
1718314564Sdim  if (!reg_ctx->WriteRegisterFromUnsigned(
1719314564Sdim          reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
1720314564Sdim                                   LLDB_REGNUM_GENERIC_RA),
1721314564Sdim          return_addr))
1722314564Sdim    return false;
1723285101Semaste
1724314564Sdim  // Set "sp" to the requested value
1725314564Sdim  if (!reg_ctx->WriteRegisterFromUnsigned(
1726314564Sdim          reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
1727314564Sdim                                   LLDB_REGNUM_GENERIC_SP),
1728314564Sdim          sp))
1729314564Sdim    return false;
1730285101Semaste
1731314564Sdim  // Set "pc" to the address requested
1732314564Sdim  if (!reg_ctx->WriteRegisterFromUnsigned(
1733314564Sdim          reg_ctx->GetRegisterInfo(eRegisterKindGeneric,
1734314564Sdim                                   LLDB_REGNUM_GENERIC_PC),
1735314564Sdim          func_addr))
1736314564Sdim    return false;
1737285101Semaste
1738314564Sdim  return true;
1739285101Semaste}
1740285101Semaste
1741314564Sdim// TODO: We dont support fp/SIMD arguments in v0-v7
1742314564Sdimbool ABISysV_arm64::GetArgumentValues(Thread &thread, ValueList &values) const {
1743314564Sdim  uint32_t num_values = values.GetSize();
1744314564Sdim
1745314564Sdim  ExecutionContext exe_ctx(thread.shared_from_this());
1746314564Sdim
1747314564Sdim  // Extract the register context so we can read arguments from registers
1748314564Sdim
1749314564Sdim  RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1750314564Sdim
1751314564Sdim  if (!reg_ctx)
1752314564Sdim    return false;
1753314564Sdim
1754314564Sdim  addr_t sp = 0;
1755314564Sdim
1756314564Sdim  for (uint32_t value_idx = 0; value_idx < num_values; ++value_idx) {
1757341825Sdim    // We currently only support extracting values with Clang QualTypes. Do we
1758341825Sdim    // care about others?
1759314564Sdim    Value *value = values.GetValueAtIndex(value_idx);
1760314564Sdim
1761314564Sdim    if (!value)
1762314564Sdim      return false;
1763314564Sdim
1764314564Sdim    CompilerType value_type = value->GetCompilerType();
1765314564Sdim    if (value_type) {
1766314564Sdim      bool is_signed = false;
1767314564Sdim      size_t bit_width = 0;
1768344779Sdim      llvm::Optional<uint64_t> bit_size = value_type.GetBitSize(&thread);
1769344779Sdim      if (!bit_size)
1770344779Sdim        return false;
1771314564Sdim      if (value_type.IsIntegerOrEnumerationType(is_signed)) {
1772344779Sdim        bit_width = *bit_size;
1773314564Sdim      } else if (value_type.IsPointerOrReferenceType()) {
1774344779Sdim        bit_width = *bit_size;
1775314564Sdim      } else {
1776314564Sdim        // We only handle integer, pointer and reference types currently...
1777285101Semaste        return false;
1778314564Sdim      }
1779285101Semaste
1780314564Sdim      if (bit_width <= (exe_ctx.GetProcessRef().GetAddressByteSize() * 8)) {
1781314564Sdim        if (value_idx < 8) {
1782314564Sdim          // Arguments 1-8 are in x0-x7...
1783314564Sdim          const RegisterInfo *reg_info = nullptr;
1784314564Sdim          reg_info = reg_ctx->GetRegisterInfo(
1785314564Sdim              eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + value_idx);
1786285101Semaste
1787314564Sdim          if (reg_info) {
1788314564Sdim            RegisterValue reg_value;
1789314564Sdim
1790314564Sdim            if (reg_ctx->ReadRegister(reg_info, reg_value)) {
1791314564Sdim              if (is_signed)
1792314564Sdim                reg_value.SignExtend(bit_width);
1793314564Sdim              if (!reg_value.GetScalarValue(value->GetScalar()))
1794285101Semaste                return false;
1795314564Sdim              continue;
1796285101Semaste            }
1797314564Sdim          }
1798314564Sdim          return false;
1799314564Sdim        } else {
1800314564Sdim          // TODO: Verify for stack layout for SysV
1801314564Sdim          if (sp == 0) {
1802314564Sdim            // Read the stack pointer if we already haven't read it
1803314564Sdim            sp = reg_ctx->GetSP(0);
1804314564Sdim            if (sp == 0)
1805314564Sdim              return false;
1806314564Sdim          }
1807285101Semaste
1808314564Sdim          // Arguments 5 on up are on the stack
1809314564Sdim          const uint32_t arg_byte_size = (bit_width + (8 - 1)) / 8;
1810321369Sdim          Status error;
1811314564Sdim          if (!exe_ctx.GetProcessRef().ReadScalarIntegerFromMemory(
1812314564Sdim                  sp, arg_byte_size, is_signed, value->GetScalar(), error))
1813314564Sdim            return false;
1814314564Sdim
1815314564Sdim          sp += arg_byte_size;
1816314564Sdim          // Align up to the next 8 byte boundary if needed
1817314564Sdim          if (sp % 8) {
1818314564Sdim            sp >>= 3;
1819314564Sdim            sp += 1;
1820314564Sdim            sp <<= 3;
1821314564Sdim          }
1822285101Semaste        }
1823314564Sdim      }
1824285101Semaste    }
1825314564Sdim  }
1826314564Sdim  return true;
1827285101Semaste}
1828285101Semaste
1829321369SdimStatus ABISysV_arm64::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
1830321369Sdim                                           lldb::ValueObjectSP &new_value_sp) {
1831321369Sdim  Status error;
1832314564Sdim  if (!new_value_sp) {
1833314564Sdim    error.SetErrorString("Empty value object for return value.");
1834314564Sdim    return error;
1835314564Sdim  }
1836314564Sdim
1837314564Sdim  CompilerType return_value_type = new_value_sp->GetCompilerType();
1838314564Sdim  if (!return_value_type) {
1839314564Sdim    error.SetErrorString("Null clang type for return value.");
1840314564Sdim    return error;
1841314564Sdim  }
1842314564Sdim
1843314564Sdim  Thread *thread = frame_sp->GetThread().get();
1844314564Sdim
1845314564Sdim  RegisterContext *reg_ctx = thread->GetRegisterContext().get();
1846314564Sdim
1847314564Sdim  if (reg_ctx) {
1848314564Sdim    DataExtractor data;
1849321369Sdim    Status data_error;
1850314564Sdim    const uint64_t byte_size = new_value_sp->GetData(data, data_error);
1851314564Sdim    if (data_error.Fail()) {
1852314564Sdim      error.SetErrorStringWithFormat(
1853314564Sdim          "Couldn't convert return value to raw data: %s",
1854314564Sdim          data_error.AsCString());
1855314564Sdim      return error;
1856285101Semaste    }
1857285101Semaste
1858314564Sdim    const uint32_t type_flags = return_value_type.GetTypeInfo(nullptr);
1859314564Sdim    if (type_flags & eTypeIsScalar || type_flags & eTypeIsPointer) {
1860314564Sdim      if (type_flags & eTypeIsInteger || type_flags & eTypeIsPointer) {
1861314564Sdim        // Extract the register context so we can read arguments from registers
1862314564Sdim        lldb::offset_t offset = 0;
1863314564Sdim        if (byte_size <= 16) {
1864314564Sdim          const RegisterInfo *x0_info = reg_ctx->GetRegisterInfo(
1865314564Sdim              eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);
1866314564Sdim          if (byte_size <= 8) {
1867314564Sdim            uint64_t raw_value = data.GetMaxU64(&offset, byte_size);
1868285101Semaste
1869314564Sdim            if (!reg_ctx->WriteRegisterFromUnsigned(x0_info, raw_value))
1870314564Sdim              error.SetErrorString("failed to write register x0");
1871314564Sdim          } else {
1872314564Sdim            uint64_t raw_value = data.GetMaxU64(&offset, 8);
1873314564Sdim
1874314564Sdim            if (reg_ctx->WriteRegisterFromUnsigned(x0_info, raw_value)) {
1875314564Sdim              const RegisterInfo *x1_info = reg_ctx->GetRegisterInfo(
1876314564Sdim                  eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG2);
1877314564Sdim              raw_value = data.GetMaxU64(&offset, byte_size - offset);
1878314564Sdim
1879314564Sdim              if (!reg_ctx->WriteRegisterFromUnsigned(x1_info, raw_value))
1880314564Sdim                error.SetErrorString("failed to write register x1");
1881285101Semaste            }
1882314564Sdim          }
1883314564Sdim        } else {
1884314564Sdim          error.SetErrorString("We don't support returning longer than 128 bit "
1885314564Sdim                               "integer values at present.");
1886314564Sdim        }
1887314564Sdim      } else if (type_flags & eTypeIsFloat) {
1888314564Sdim        if (type_flags & eTypeIsComplex) {
1889314564Sdim          // Don't handle complex yet.
1890314564Sdim          error.SetErrorString(
1891314564Sdim              "returning complex float values are not supported");
1892314564Sdim        } else {
1893314564Sdim          const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
1894285101Semaste
1895314564Sdim          if (v0_info) {
1896314564Sdim            if (byte_size <= 16) {
1897314564Sdim              if (byte_size <= RegisterValue::GetMaxByteSize()) {
1898314564Sdim                RegisterValue reg_value;
1899314564Sdim                error = reg_value.SetValueFromData(v0_info, data, 0, true);
1900314564Sdim                if (error.Success()) {
1901314564Sdim                  if (!reg_ctx->WriteRegister(v0_info, reg_value))
1902314564Sdim                    error.SetErrorString("failed to write register v0");
1903285101Semaste                }
1904314564Sdim              } else {
1905314564Sdim                error.SetErrorStringWithFormat(
1906314564Sdim                    "returning float values with a byte size of %" PRIu64
1907314564Sdim                    " are not supported",
1908314564Sdim                    byte_size);
1909314564Sdim              }
1910314564Sdim            } else {
1911314564Sdim              error.SetErrorString("returning float values longer than 128 "
1912314564Sdim                                   "bits are not supported");
1913285101Semaste            }
1914314564Sdim          } else {
1915314564Sdim            error.SetErrorString("v0 register is not available on this target");
1916314564Sdim          }
1917285101Semaste        }
1918314564Sdim      }
1919314564Sdim    } else if (type_flags & eTypeIsVector) {
1920314564Sdim      if (byte_size > 0) {
1921314564Sdim        const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
1922314564Sdim
1923314564Sdim        if (v0_info) {
1924314564Sdim          if (byte_size <= v0_info->byte_size) {
1925314564Sdim            RegisterValue reg_value;
1926314564Sdim            error = reg_value.SetValueFromData(v0_info, data, 0, true);
1927314564Sdim            if (error.Success()) {
1928314564Sdim              if (!reg_ctx->WriteRegister(v0_info, reg_value))
1929314564Sdim                error.SetErrorString("failed to write register v0");
1930285101Semaste            }
1931314564Sdim          }
1932285101Semaste        }
1933314564Sdim      }
1934285101Semaste    }
1935314564Sdim  } else {
1936314564Sdim    error.SetErrorString("no registers are available");
1937314564Sdim  }
1938314564Sdim
1939314564Sdim  return error;
1940285101Semaste}
1941285101Semaste
1942314564Sdimbool ABISysV_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
1943314564Sdim  unwind_plan.Clear();
1944314564Sdim  unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1945285101Semaste
1946314564Sdim  uint32_t lr_reg_num = arm64_dwarf::lr;
1947314564Sdim  uint32_t sp_reg_num = arm64_dwarf::sp;
1948314564Sdim
1949314564Sdim  UnwindPlan::RowSP row(new UnwindPlan::Row);
1950314564Sdim
1951314564Sdim  // Our previous Call Frame Address is the stack pointer
1952314564Sdim  row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
1953314564Sdim
1954314564Sdim  unwind_plan.AppendRow(row);
1955321369Sdim  unwind_plan.SetReturnAddressRegister(lr_reg_num);
1956314564Sdim
1957314564Sdim  // All other registers are the same.
1958314564Sdim
1959314564Sdim  unwind_plan.SetSourceName("arm64 at-func-entry default");
1960314564Sdim  unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1961321369Sdim  unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
1962360784Sdim  unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);
1963314564Sdim
1964314564Sdim  return true;
1965285101Semaste}
1966285101Semaste
1967314564Sdimbool ABISysV_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
1968314564Sdim  unwind_plan.Clear();
1969314564Sdim  unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1970285101Semaste
1971314564Sdim  uint32_t fp_reg_num = arm64_dwarf::fp;
1972314564Sdim  uint32_t pc_reg_num = arm64_dwarf::pc;
1973285101Semaste
1974314564Sdim  UnwindPlan::RowSP row(new UnwindPlan::Row);
1975314564Sdim  const int32_t ptr_size = 8;
1976314564Sdim
1977314564Sdim  row->GetCFAValue().SetIsRegisterPlusOffset(fp_reg_num, 2 * ptr_size);
1978314564Sdim  row->SetOffset(0);
1979314564Sdim
1980314564Sdim  row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
1981314564Sdim  row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
1982314564Sdim
1983314564Sdim  unwind_plan.AppendRow(row);
1984314564Sdim  unwind_plan.SetSourceName("arm64 default unwind plan");
1985314564Sdim  unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1986314564Sdim  unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
1987360784Sdim  unwind_plan.SetUnwindPlanForSignalTrap(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
2094353358Sdim  std::unique_ptr<DataBufferHeap> heap_data_up(
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
2128353358Sdim        // Make sure we have enough room in "heap_data_up"
2129353358Sdim        if ((data_offset + *base_byte_size) <= heap_data_up->GetByteSize()) {
2130314564Sdim          const size_t bytes_copied = reg_value.GetAsMemoryData(
2131353358Sdim              reg_info, heap_data_up->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());
2142353358Sdim      data.SetData(DataBufferSP(heap_data_up.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(
2167353358Sdim          reg_info, heap_data_up->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(
2208353358Sdim            value_addr, heap_data_up->GetBytes(), heap_data_up->GetByteSize(),
2209353358Sdim            error) != heap_data_up->GetByteSize()) {
2210314564Sdim      return false;
2211285101Semaste    }
2212314564Sdim  }
2213285101Semaste
2214314564Sdim  data.SetByteOrder(byte_order);
2215314564Sdim  data.SetAddressByteSize(exe_ctx.GetProcessRef().GetAddressByteSize());
2216353358Sdim  data.SetData(DataBufferSP(heap_data_up.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) {
2270353358Sdim                  std::unique_ptr<DataBufferHeap> heap_data_up(
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(
2280353358Sdim                            x0_reg_info, heap_data_up->GetBytes() + 0, 8,
2281314564Sdim                            byte_order, error) &&
2282314564Sdim                        x1_reg_value.GetAsMemoryData(
2283353358Sdim                            x1_reg_info, heap_data_up->GetBytes() + 8, 8,
2284314564Sdim                            byte_order, error)) {
2285314564Sdim                      DataExtractor data(
2286353358Sdim                          DataBufferSP(heap_data_up.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) {
2368353358Sdim        std::unique_ptr<DataBufferHeap> heap_data_up(
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;
2374353358Sdim          if (reg_value.GetAsMemoryData(v0_info, heap_data_up->GetBytes(),
2375353358Sdim                                        heap_data_up->GetByteSize(), byte_order,
2376321369Sdim                                        error)) {
2377353358Sdim            DataExtractor data(DataBufferSP(heap_data_up.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// PluginInterface protocol
2417309124Sdim
2418314564SdimConstString ABISysV_arm64::GetPluginName() { return GetPluginNameStatic(); }
2419285101Semaste
2420314564Sdimuint32_t ABISysV_arm64::GetPluginVersion() { return 1; }
2421