ABIMacOSX_arm64.cpp revision 344779
1//===-- ABIMacOSX_arm64.cpp -------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ABIMacOSX_arm64.h"
11
12#include <vector>
13
14#include "llvm/ADT/STLExtras.h"
15#include "llvm/ADT/Triple.h"
16
17#include "lldb/Core/Module.h"
18#include "lldb/Core/PluginManager.h"
19#include "lldb/Core/Value.h"
20#include "lldb/Core/ValueObjectConstResult.h"
21#include "lldb/Symbol/UnwindPlan.h"
22#include "lldb/Target/Process.h"
23#include "lldb/Target/RegisterContext.h"
24#include "lldb/Target/Target.h"
25#include "lldb/Target/Thread.h"
26#include "lldb/Utility/ConstString.h"
27#include "lldb/Utility/Log.h"
28#include "lldb/Utility/RegisterValue.h"
29#include "lldb/Utility/Scalar.h"
30#include "lldb/Utility/Status.h"
31
32#include "Utility/ARM64_DWARF_Registers.h"
33
34using namespace lldb;
35using namespace lldb_private;
36
37static const char *pluginDesc = "Mac OS X ABI for arm64 targets";
38
39static RegisterInfo g_register_infos[] = {
40    //  NAME       ALT       SZ OFF ENCODING          FORMAT
41    //  EH_FRAME             DWARF                  GENERIC
42    //  PROCESS PLUGIN          LLDB NATIVE
43    //  ========== =======   == === =============     ===================
44    //  ===================  ====================== ===========================
45    //  ======================= ======================
46    {"x0",
47     nullptr,
48     8,
49     0,
50     eEncodingUint,
51     eFormatHex,
52     {LLDB_INVALID_REGNUM, arm64_dwarf::x0, LLDB_REGNUM_GENERIC_ARG1,
53      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
54     nullptr,
55     nullptr,
56     nullptr,
57     0},
58    {"x1",
59     nullptr,
60     8,
61     0,
62     eEncodingUint,
63     eFormatHex,
64     {LLDB_INVALID_REGNUM, arm64_dwarf::x1, LLDB_REGNUM_GENERIC_ARG2,
65      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
66     nullptr,
67     nullptr,
68     nullptr,
69     0},
70    {"x2",
71     nullptr,
72     8,
73     0,
74     eEncodingUint,
75     eFormatHex,
76     {LLDB_INVALID_REGNUM, arm64_dwarf::x2, LLDB_REGNUM_GENERIC_ARG3,
77      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
78     nullptr,
79     nullptr,
80     nullptr,
81     0},
82    {"x3",
83     nullptr,
84     8,
85     0,
86     eEncodingUint,
87     eFormatHex,
88     {LLDB_INVALID_REGNUM, arm64_dwarf::x3, LLDB_REGNUM_GENERIC_ARG4,
89      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
90     nullptr,
91     nullptr,
92     nullptr,
93     0},
94    {"x4",
95     nullptr,
96     8,
97     0,
98     eEncodingUint,
99     eFormatHex,
100     {LLDB_INVALID_REGNUM, arm64_dwarf::x4, LLDB_REGNUM_GENERIC_ARG5,
101      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
102     nullptr,
103     nullptr,
104     nullptr,
105     0},
106    {"x5",
107     nullptr,
108     8,
109     0,
110     eEncodingUint,
111     eFormatHex,
112     {LLDB_INVALID_REGNUM, arm64_dwarf::x5, LLDB_REGNUM_GENERIC_ARG6,
113      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
114     nullptr,
115     nullptr,
116     nullptr,
117     0},
118    {"x6",
119     nullptr,
120     8,
121     0,
122     eEncodingUint,
123     eFormatHex,
124     {LLDB_INVALID_REGNUM, arm64_dwarf::x6, LLDB_REGNUM_GENERIC_ARG7,
125      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
126     nullptr,
127     nullptr,
128     nullptr,
129     0},
130    {"x7",
131     nullptr,
132     8,
133     0,
134     eEncodingUint,
135     eFormatHex,
136     {LLDB_INVALID_REGNUM, arm64_dwarf::x7, LLDB_REGNUM_GENERIC_ARG8,
137      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
138     nullptr,
139     nullptr,
140     nullptr,
141     0},
142    {"x8",
143     nullptr,
144     8,
145     0,
146     eEncodingUint,
147     eFormatHex,
148     {LLDB_INVALID_REGNUM, arm64_dwarf::x8, LLDB_INVALID_REGNUM,
149      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
150     nullptr,
151     nullptr,
152     nullptr,
153     0},
154    {"x9",
155     nullptr,
156     8,
157     0,
158     eEncodingUint,
159     eFormatHex,
160     {LLDB_INVALID_REGNUM, arm64_dwarf::x9, LLDB_INVALID_REGNUM,
161      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
162     nullptr,
163     nullptr,
164     nullptr,
165     0},
166    {"x10",
167     nullptr,
168     8,
169     0,
170     eEncodingUint,
171     eFormatHex,
172     {LLDB_INVALID_REGNUM, arm64_dwarf::x10, LLDB_INVALID_REGNUM,
173      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
174     nullptr,
175     nullptr,
176     nullptr,
177     0},
178    {"x11",
179     nullptr,
180     8,
181     0,
182     eEncodingUint,
183     eFormatHex,
184     {LLDB_INVALID_REGNUM, arm64_dwarf::x11, LLDB_INVALID_REGNUM,
185      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
186     nullptr,
187     nullptr,
188     nullptr,
189     0},
190    {"x12",
191     nullptr,
192     8,
193     0,
194     eEncodingUint,
195     eFormatHex,
196     {LLDB_INVALID_REGNUM, arm64_dwarf::x12, LLDB_INVALID_REGNUM,
197      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
198     nullptr,
199     nullptr,
200     nullptr,
201     0},
202    {"x13",
203     nullptr,
204     8,
205     0,
206     eEncodingUint,
207     eFormatHex,
208     {LLDB_INVALID_REGNUM, arm64_dwarf::x13, LLDB_INVALID_REGNUM,
209      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
210     nullptr,
211     nullptr,
212     nullptr,
213     0},
214    {"x14",
215     nullptr,
216     8,
217     0,
218     eEncodingUint,
219     eFormatHex,
220     {LLDB_INVALID_REGNUM, arm64_dwarf::x14, LLDB_INVALID_REGNUM,
221      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
222     nullptr,
223     nullptr,
224     nullptr,
225     0},
226    {"x15",
227     nullptr,
228     8,
229     0,
230     eEncodingUint,
231     eFormatHex,
232     {LLDB_INVALID_REGNUM, arm64_dwarf::x15, LLDB_INVALID_REGNUM,
233      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
234     nullptr,
235     nullptr,
236     nullptr,
237     0},
238    {"x16",
239     nullptr,
240     8,
241     0,
242     eEncodingUint,
243     eFormatHex,
244     {LLDB_INVALID_REGNUM, arm64_dwarf::x16, LLDB_INVALID_REGNUM,
245      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
246     nullptr,
247     nullptr,
248     nullptr,
249     0},
250    {"x17",
251     nullptr,
252     8,
253     0,
254     eEncodingUint,
255     eFormatHex,
256     {LLDB_INVALID_REGNUM, arm64_dwarf::x17, LLDB_INVALID_REGNUM,
257      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
258     nullptr,
259     nullptr,
260     nullptr,
261     0},
262    {"x18",
263     nullptr,
264     8,
265     0,
266     eEncodingUint,
267     eFormatHex,
268     {LLDB_INVALID_REGNUM, arm64_dwarf::x18, LLDB_INVALID_REGNUM,
269      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
270     nullptr,
271     nullptr,
272     nullptr,
273     0},
274    {"x19",
275     nullptr,
276     8,
277     0,
278     eEncodingUint,
279     eFormatHex,
280     {LLDB_INVALID_REGNUM, arm64_dwarf::x19, LLDB_INVALID_REGNUM,
281      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
282     nullptr,
283     nullptr,
284     nullptr,
285     0},
286    {"x20",
287     nullptr,
288     8,
289     0,
290     eEncodingUint,
291     eFormatHex,
292     {LLDB_INVALID_REGNUM, arm64_dwarf::x20, LLDB_INVALID_REGNUM,
293      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
294     nullptr,
295     nullptr,
296     nullptr,
297     0},
298    {"x21",
299     nullptr,
300     8,
301     0,
302     eEncodingUint,
303     eFormatHex,
304     {LLDB_INVALID_REGNUM, arm64_dwarf::x21, LLDB_INVALID_REGNUM,
305      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
306     nullptr,
307     nullptr,
308     nullptr,
309     0},
310    {"x22",
311     nullptr,
312     8,
313     0,
314     eEncodingUint,
315     eFormatHex,
316     {LLDB_INVALID_REGNUM, arm64_dwarf::x22, LLDB_INVALID_REGNUM,
317      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
318     nullptr,
319     nullptr,
320     nullptr,
321     0},
322    {"x23",
323     nullptr,
324     8,
325     0,
326     eEncodingUint,
327     eFormatHex,
328     {LLDB_INVALID_REGNUM, arm64_dwarf::x23, LLDB_INVALID_REGNUM,
329      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
330     nullptr,
331     nullptr,
332     nullptr,
333     0},
334    {"x24",
335     nullptr,
336     8,
337     0,
338     eEncodingUint,
339     eFormatHex,
340     {LLDB_INVALID_REGNUM, arm64_dwarf::x24, LLDB_INVALID_REGNUM,
341      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
342     nullptr,
343     nullptr,
344     nullptr,
345     0},
346    {"x25",
347     nullptr,
348     8,
349     0,
350     eEncodingUint,
351     eFormatHex,
352     {LLDB_INVALID_REGNUM, arm64_dwarf::x25, LLDB_INVALID_REGNUM,
353      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
354     nullptr,
355     nullptr,
356     nullptr,
357     0},
358    {"x26",
359     nullptr,
360     8,
361     0,
362     eEncodingUint,
363     eFormatHex,
364     {LLDB_INVALID_REGNUM, arm64_dwarf::x26, LLDB_INVALID_REGNUM,
365      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
366     nullptr,
367     nullptr,
368     nullptr,
369     0},
370    {"x27",
371     nullptr,
372     8,
373     0,
374     eEncodingUint,
375     eFormatHex,
376     {LLDB_INVALID_REGNUM, arm64_dwarf::x27, LLDB_INVALID_REGNUM,
377      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
378     nullptr,
379     nullptr,
380     nullptr,
381     0},
382    {"x28",
383     nullptr,
384     8,
385     0,
386     eEncodingUint,
387     eFormatHex,
388     {LLDB_INVALID_REGNUM, arm64_dwarf::x28, LLDB_INVALID_REGNUM,
389      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
390     nullptr,
391     nullptr,
392     nullptr,
393     0},
394    {"fp",
395     "x29",
396     8,
397     0,
398     eEncodingUint,
399     eFormatHex,
400     {LLDB_INVALID_REGNUM, arm64_dwarf::x29, LLDB_REGNUM_GENERIC_FP,
401      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
402     nullptr,
403     nullptr,
404     nullptr,
405     0},
406    {"lr",
407     "x30",
408     8,
409     0,
410     eEncodingUint,
411     eFormatHex,
412     {LLDB_INVALID_REGNUM, arm64_dwarf::x30, LLDB_REGNUM_GENERIC_RA,
413      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
414     nullptr,
415     nullptr,
416     nullptr,
417     0},
418    {"sp",
419     "x31",
420     8,
421     0,
422     eEncodingUint,
423     eFormatHex,
424     {LLDB_INVALID_REGNUM, arm64_dwarf::x31, LLDB_REGNUM_GENERIC_SP,
425      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
426     nullptr,
427     nullptr,
428     nullptr,
429     0},
430    {"pc",
431     nullptr,
432     8,
433     0,
434     eEncodingUint,
435     eFormatHex,
436     {LLDB_INVALID_REGNUM, arm64_dwarf::pc, LLDB_REGNUM_GENERIC_PC,
437      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
438     nullptr,
439     nullptr,
440     nullptr,
441     0},
442    {"cpsr",
443     "psr",
444     4,
445     0,
446     eEncodingUint,
447     eFormatHex,
448     {LLDB_INVALID_REGNUM, arm64_dwarf::cpsr, LLDB_REGNUM_GENERIC_FLAGS,
449      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
450     nullptr,
451     nullptr,
452     nullptr,
453     0},
454
455    {"v0",
456     nullptr,
457     16,
458     0,
459     eEncodingVector,
460     eFormatVectorOfUInt8,
461     {LLDB_INVALID_REGNUM, arm64_dwarf::v0, LLDB_INVALID_REGNUM,
462      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
463     nullptr,
464     nullptr,
465     nullptr,
466     0},
467    {"v1",
468     nullptr,
469     16,
470     0,
471     eEncodingVector,
472     eFormatVectorOfUInt8,
473     {LLDB_INVALID_REGNUM, arm64_dwarf::v1, LLDB_INVALID_REGNUM,
474      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
475     nullptr,
476     nullptr,
477     nullptr,
478     0},
479    {"v2",
480     nullptr,
481     16,
482     0,
483     eEncodingVector,
484     eFormatVectorOfUInt8,
485     {LLDB_INVALID_REGNUM, arm64_dwarf::v2, LLDB_INVALID_REGNUM,
486      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
487     nullptr,
488     nullptr,
489     nullptr,
490     0},
491    {"v3",
492     nullptr,
493     16,
494     0,
495     eEncodingVector,
496     eFormatVectorOfUInt8,
497     {LLDB_INVALID_REGNUM, arm64_dwarf::v3, LLDB_INVALID_REGNUM,
498      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
499     nullptr,
500     nullptr,
501     nullptr,
502     0},
503    {"v4",
504     nullptr,
505     16,
506     0,
507     eEncodingVector,
508     eFormatVectorOfUInt8,
509     {LLDB_INVALID_REGNUM, arm64_dwarf::v4, LLDB_INVALID_REGNUM,
510      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
511     nullptr,
512     nullptr,
513     nullptr,
514     0},
515    {"v5",
516     nullptr,
517     16,
518     0,
519     eEncodingVector,
520     eFormatVectorOfUInt8,
521     {LLDB_INVALID_REGNUM, arm64_dwarf::v5, LLDB_INVALID_REGNUM,
522      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
523     nullptr,
524     nullptr,
525     nullptr,
526     0},
527    {"v6",
528     nullptr,
529     16,
530     0,
531     eEncodingVector,
532     eFormatVectorOfUInt8,
533     {LLDB_INVALID_REGNUM, arm64_dwarf::v6, LLDB_INVALID_REGNUM,
534      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
535     nullptr,
536     nullptr,
537     nullptr,
538     0},
539    {"v7",
540     nullptr,
541     16,
542     0,
543     eEncodingVector,
544     eFormatVectorOfUInt8,
545     {LLDB_INVALID_REGNUM, arm64_dwarf::v7, LLDB_INVALID_REGNUM,
546      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
547     nullptr,
548     nullptr,
549     nullptr,
550     0},
551    {"v8",
552     nullptr,
553     16,
554     0,
555     eEncodingVector,
556     eFormatVectorOfUInt8,
557     {LLDB_INVALID_REGNUM, arm64_dwarf::v8, LLDB_INVALID_REGNUM,
558      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
559     nullptr,
560     nullptr,
561     nullptr,
562     0},
563    {"v9",
564     nullptr,
565     16,
566     0,
567     eEncodingVector,
568     eFormatVectorOfUInt8,
569     {LLDB_INVALID_REGNUM, arm64_dwarf::v9, LLDB_INVALID_REGNUM,
570      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
571     nullptr,
572     nullptr,
573     nullptr,
574     0},
575    {"v10",
576     nullptr,
577     16,
578     0,
579     eEncodingVector,
580     eFormatVectorOfUInt8,
581     {LLDB_INVALID_REGNUM, arm64_dwarf::v10, LLDB_INVALID_REGNUM,
582      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
583     nullptr,
584     nullptr,
585     nullptr,
586     0},
587    {"v11",
588     nullptr,
589     16,
590     0,
591     eEncodingVector,
592     eFormatVectorOfUInt8,
593     {LLDB_INVALID_REGNUM, arm64_dwarf::v11, LLDB_INVALID_REGNUM,
594      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
595     nullptr,
596     nullptr,
597     nullptr,
598     0},
599    {"v12",
600     nullptr,
601     16,
602     0,
603     eEncodingVector,
604     eFormatVectorOfUInt8,
605     {LLDB_INVALID_REGNUM, arm64_dwarf::v12, LLDB_INVALID_REGNUM,
606      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
607     nullptr,
608     nullptr,
609     nullptr,
610     0},
611    {"v13",
612     nullptr,
613     16,
614     0,
615     eEncodingVector,
616     eFormatVectorOfUInt8,
617     {LLDB_INVALID_REGNUM, arm64_dwarf::v13, LLDB_INVALID_REGNUM,
618      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
619     nullptr,
620     nullptr,
621     nullptr,
622     0},
623    {"v14",
624     nullptr,
625     16,
626     0,
627     eEncodingVector,
628     eFormatVectorOfUInt8,
629     {LLDB_INVALID_REGNUM, arm64_dwarf::v14, LLDB_INVALID_REGNUM,
630      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
631     nullptr,
632     nullptr,
633     nullptr,
634     0},
635    {"v15",
636     nullptr,
637     16,
638     0,
639     eEncodingVector,
640     eFormatVectorOfUInt8,
641     {LLDB_INVALID_REGNUM, arm64_dwarf::v15, LLDB_INVALID_REGNUM,
642      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
643     nullptr,
644     nullptr,
645     nullptr,
646     0},
647    {"v16",
648     nullptr,
649     16,
650     0,
651     eEncodingVector,
652     eFormatVectorOfUInt8,
653     {LLDB_INVALID_REGNUM, arm64_dwarf::v16, LLDB_INVALID_REGNUM,
654      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
655     nullptr,
656     nullptr,
657     nullptr,
658     0},
659    {"v17",
660     nullptr,
661     16,
662     0,
663     eEncodingVector,
664     eFormatVectorOfUInt8,
665     {LLDB_INVALID_REGNUM, arm64_dwarf::v17, LLDB_INVALID_REGNUM,
666      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
667     nullptr,
668     nullptr,
669     nullptr,
670     0},
671    {"v18",
672     nullptr,
673     16,
674     0,
675     eEncodingVector,
676     eFormatVectorOfUInt8,
677     {LLDB_INVALID_REGNUM, arm64_dwarf::v18, LLDB_INVALID_REGNUM,
678      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
679     nullptr,
680     nullptr,
681     nullptr,
682     0},
683    {"v19",
684     nullptr,
685     16,
686     0,
687     eEncodingVector,
688     eFormatVectorOfUInt8,
689     {LLDB_INVALID_REGNUM, arm64_dwarf::v19, LLDB_INVALID_REGNUM,
690      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
691     nullptr,
692     nullptr,
693     nullptr,
694     0},
695    {"v20",
696     nullptr,
697     16,
698     0,
699     eEncodingVector,
700     eFormatVectorOfUInt8,
701     {LLDB_INVALID_REGNUM, arm64_dwarf::v20, LLDB_INVALID_REGNUM,
702      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
703     nullptr,
704     nullptr,
705     nullptr,
706     0},
707    {"v21",
708     nullptr,
709     16,
710     0,
711     eEncodingVector,
712     eFormatVectorOfUInt8,
713     {LLDB_INVALID_REGNUM, arm64_dwarf::v21, LLDB_INVALID_REGNUM,
714      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
715     nullptr,
716     nullptr,
717     nullptr,
718     0},
719    {"v22",
720     nullptr,
721     16,
722     0,
723     eEncodingVector,
724     eFormatVectorOfUInt8,
725     {LLDB_INVALID_REGNUM, arm64_dwarf::v22, LLDB_INVALID_REGNUM,
726      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
727     nullptr,
728     nullptr,
729     nullptr,
730     0},
731    {"v23",
732     nullptr,
733     16,
734     0,
735     eEncodingVector,
736     eFormatVectorOfUInt8,
737     {LLDB_INVALID_REGNUM, arm64_dwarf::v23, LLDB_INVALID_REGNUM,
738      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
739     nullptr,
740     nullptr,
741     nullptr,
742     0},
743    {"v24",
744     nullptr,
745     16,
746     0,
747     eEncodingVector,
748     eFormatVectorOfUInt8,
749     {LLDB_INVALID_REGNUM, arm64_dwarf::v24, LLDB_INVALID_REGNUM,
750      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
751     nullptr,
752     nullptr,
753     nullptr,
754     0},
755    {"v25",
756     nullptr,
757     16,
758     0,
759     eEncodingVector,
760     eFormatVectorOfUInt8,
761     {LLDB_INVALID_REGNUM, arm64_dwarf::v25, LLDB_INVALID_REGNUM,
762      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
763     nullptr,
764     nullptr,
765     nullptr,
766     0},
767    {"v26",
768     nullptr,
769     16,
770     0,
771     eEncodingVector,
772     eFormatVectorOfUInt8,
773     {LLDB_INVALID_REGNUM, arm64_dwarf::v26, LLDB_INVALID_REGNUM,
774      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
775     nullptr,
776     nullptr,
777     nullptr,
778     0},
779    {"v27",
780     nullptr,
781     16,
782     0,
783     eEncodingVector,
784     eFormatVectorOfUInt8,
785     {LLDB_INVALID_REGNUM, arm64_dwarf::v27, LLDB_INVALID_REGNUM,
786      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
787     nullptr,
788     nullptr,
789     nullptr,
790     0},
791    {"v28",
792     nullptr,
793     16,
794     0,
795     eEncodingVector,
796     eFormatVectorOfUInt8,
797     {LLDB_INVALID_REGNUM, arm64_dwarf::v28, LLDB_INVALID_REGNUM,
798      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
799     nullptr,
800     nullptr,
801     nullptr,
802     0},
803    {"v29",
804     nullptr,
805     16,
806     0,
807     eEncodingVector,
808     eFormatVectorOfUInt8,
809     {LLDB_INVALID_REGNUM, arm64_dwarf::v29, LLDB_INVALID_REGNUM,
810      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
811     nullptr,
812     nullptr,
813     nullptr,
814     0},
815    {"v30",
816     nullptr,
817     16,
818     0,
819     eEncodingVector,
820     eFormatVectorOfUInt8,
821     {LLDB_INVALID_REGNUM, arm64_dwarf::v30, LLDB_INVALID_REGNUM,
822      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
823     nullptr,
824     nullptr,
825     nullptr,
826     0},
827    {"v31",
828     nullptr,
829     16,
830     0,
831     eEncodingVector,
832     eFormatVectorOfUInt8,
833     {LLDB_INVALID_REGNUM, arm64_dwarf::v31, LLDB_INVALID_REGNUM,
834      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
835     nullptr,
836     nullptr,
837     nullptr,
838     0},
839
840    {"fpsr",
841     nullptr,
842     4,
843     0,
844     eEncodingUint,
845     eFormatHex,
846     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
847      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
848     nullptr,
849     nullptr,
850     nullptr,
851     0},
852    {"fpcr",
853     nullptr,
854     4,
855     0,
856     eEncodingUint,
857     eFormatHex,
858     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
859      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
860     nullptr,
861     nullptr,
862     nullptr,
863     0},
864
865    {"s0",
866     nullptr,
867     4,
868     0,
869     eEncodingIEEE754,
870     eFormatFloat,
871     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
872      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
873     nullptr,
874     nullptr,
875     nullptr,
876     0},
877    {"s1",
878     nullptr,
879     4,
880     0,
881     eEncodingIEEE754,
882     eFormatFloat,
883     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
884      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
885     nullptr,
886     nullptr,
887     nullptr,
888     0},
889    {"s2",
890     nullptr,
891     4,
892     0,
893     eEncodingIEEE754,
894     eFormatFloat,
895     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
896      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
897     nullptr,
898     nullptr,
899     nullptr,
900     0},
901    {"s3",
902     nullptr,
903     4,
904     0,
905     eEncodingIEEE754,
906     eFormatFloat,
907     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
908      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
909     nullptr,
910     nullptr,
911     nullptr,
912     0},
913    {"s4",
914     nullptr,
915     4,
916     0,
917     eEncodingIEEE754,
918     eFormatFloat,
919     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
920      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
921     nullptr,
922     nullptr,
923     nullptr,
924     0},
925    {"s5",
926     nullptr,
927     4,
928     0,
929     eEncodingIEEE754,
930     eFormatFloat,
931     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
932      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
933     nullptr,
934     nullptr,
935     nullptr,
936     0},
937    {"s6",
938     nullptr,
939     4,
940     0,
941     eEncodingIEEE754,
942     eFormatFloat,
943     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
944      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
945     nullptr,
946     nullptr,
947     nullptr,
948     0},
949    {"s7",
950     nullptr,
951     4,
952     0,
953     eEncodingIEEE754,
954     eFormatFloat,
955     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
956      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
957     nullptr,
958     nullptr,
959     nullptr,
960     0},
961    {"s8",
962     nullptr,
963     4,
964     0,
965     eEncodingIEEE754,
966     eFormatFloat,
967     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
968      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
969     nullptr,
970     nullptr,
971     nullptr,
972     0},
973    {"s9",
974     nullptr,
975     4,
976     0,
977     eEncodingIEEE754,
978     eFormatFloat,
979     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
980      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
981     nullptr,
982     nullptr,
983     nullptr,
984     0},
985    {"s10",
986     nullptr,
987     4,
988     0,
989     eEncodingIEEE754,
990     eFormatFloat,
991     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
992      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
993     nullptr,
994     nullptr,
995     nullptr,
996     0},
997    {"s11",
998     nullptr,
999     4,
1000     0,
1001     eEncodingIEEE754,
1002     eFormatFloat,
1003     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1004      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1005     nullptr,
1006     nullptr,
1007     nullptr,
1008     0},
1009    {"s12",
1010     nullptr,
1011     4,
1012     0,
1013     eEncodingIEEE754,
1014     eFormatFloat,
1015     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1016      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1017     nullptr,
1018     nullptr,
1019     nullptr,
1020     0},
1021    {"s13",
1022     nullptr,
1023     4,
1024     0,
1025     eEncodingIEEE754,
1026     eFormatFloat,
1027     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1028      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1029     nullptr,
1030     nullptr,
1031     nullptr,
1032     0},
1033    {"s14",
1034     nullptr,
1035     4,
1036     0,
1037     eEncodingIEEE754,
1038     eFormatFloat,
1039     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1040      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1041     nullptr,
1042     nullptr,
1043     nullptr,
1044     0},
1045    {"s15",
1046     nullptr,
1047     4,
1048     0,
1049     eEncodingIEEE754,
1050     eFormatFloat,
1051     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1052      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1053     nullptr,
1054     nullptr,
1055     nullptr,
1056     0},
1057    {"s16",
1058     nullptr,
1059     4,
1060     0,
1061     eEncodingIEEE754,
1062     eFormatFloat,
1063     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1064      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1065     nullptr,
1066     nullptr,
1067     nullptr,
1068     0},
1069    {"s17",
1070     nullptr,
1071     4,
1072     0,
1073     eEncodingIEEE754,
1074     eFormatFloat,
1075     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1076      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1077     nullptr,
1078     nullptr,
1079     nullptr,
1080     0},
1081    {"s18",
1082     nullptr,
1083     4,
1084     0,
1085     eEncodingIEEE754,
1086     eFormatFloat,
1087     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1088      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1089     nullptr,
1090     nullptr,
1091     nullptr,
1092     0},
1093    {"s19",
1094     nullptr,
1095     4,
1096     0,
1097     eEncodingIEEE754,
1098     eFormatFloat,
1099     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1100      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1101     nullptr,
1102     nullptr,
1103     nullptr,
1104     0},
1105    {"s20",
1106     nullptr,
1107     4,
1108     0,
1109     eEncodingIEEE754,
1110     eFormatFloat,
1111     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1112      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1113     nullptr,
1114     nullptr,
1115     nullptr,
1116     0},
1117    {"s21",
1118     nullptr,
1119     4,
1120     0,
1121     eEncodingIEEE754,
1122     eFormatFloat,
1123     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1124      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1125     nullptr,
1126     nullptr,
1127     nullptr,
1128     0},
1129    {"s22",
1130     nullptr,
1131     4,
1132     0,
1133     eEncodingIEEE754,
1134     eFormatFloat,
1135     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1136      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1137     nullptr,
1138     nullptr,
1139     nullptr,
1140     0},
1141    {"s23",
1142     nullptr,
1143     4,
1144     0,
1145     eEncodingIEEE754,
1146     eFormatFloat,
1147     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1148      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1149     nullptr,
1150     nullptr,
1151     nullptr,
1152     0},
1153    {"s24",
1154     nullptr,
1155     4,
1156     0,
1157     eEncodingIEEE754,
1158     eFormatFloat,
1159     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1160      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1161     nullptr,
1162     nullptr,
1163     nullptr,
1164     0},
1165    {"s25",
1166     nullptr,
1167     4,
1168     0,
1169     eEncodingIEEE754,
1170     eFormatFloat,
1171     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1172      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1173     nullptr,
1174     nullptr,
1175     nullptr,
1176     0},
1177    {"s26",
1178     nullptr,
1179     4,
1180     0,
1181     eEncodingIEEE754,
1182     eFormatFloat,
1183     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1184      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1185     nullptr,
1186     nullptr,
1187     nullptr,
1188     0},
1189    {"s27",
1190     nullptr,
1191     4,
1192     0,
1193     eEncodingIEEE754,
1194     eFormatFloat,
1195     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1196      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1197     nullptr,
1198     nullptr,
1199     nullptr,
1200     0},
1201    {"s28",
1202     nullptr,
1203     4,
1204     0,
1205     eEncodingIEEE754,
1206     eFormatFloat,
1207     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1208      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1209     nullptr,
1210     nullptr,
1211     nullptr,
1212     0},
1213    {"s29",
1214     nullptr,
1215     4,
1216     0,
1217     eEncodingIEEE754,
1218     eFormatFloat,
1219     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1220      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1221     nullptr,
1222     nullptr,
1223     nullptr,
1224     0},
1225    {"s30",
1226     nullptr,
1227     4,
1228     0,
1229     eEncodingIEEE754,
1230     eFormatFloat,
1231     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1232      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1233     nullptr,
1234     nullptr,
1235     nullptr,
1236     0},
1237    {"s31",
1238     nullptr,
1239     4,
1240     0,
1241     eEncodingIEEE754,
1242     eFormatFloat,
1243     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1244      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1245     nullptr,
1246     nullptr,
1247     nullptr,
1248     0},
1249
1250    {"d0",
1251     nullptr,
1252     8,
1253     0,
1254     eEncodingIEEE754,
1255     eFormatFloat,
1256     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1257      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1258     nullptr,
1259     nullptr,
1260     nullptr,
1261     0},
1262    {"d1",
1263     nullptr,
1264     8,
1265     0,
1266     eEncodingIEEE754,
1267     eFormatFloat,
1268     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1269      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1270     nullptr,
1271     nullptr,
1272     nullptr,
1273     0},
1274    {"d2",
1275     nullptr,
1276     8,
1277     0,
1278     eEncodingIEEE754,
1279     eFormatFloat,
1280     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1281      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1282     nullptr,
1283     nullptr,
1284     nullptr,
1285     0},
1286    {"d3",
1287     nullptr,
1288     8,
1289     0,
1290     eEncodingIEEE754,
1291     eFormatFloat,
1292     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1293      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1294     nullptr,
1295     nullptr,
1296     nullptr,
1297     0},
1298    {"d4",
1299     nullptr,
1300     8,
1301     0,
1302     eEncodingIEEE754,
1303     eFormatFloat,
1304     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1305      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1306     nullptr,
1307     nullptr,
1308     nullptr,
1309     0},
1310    {"d5",
1311     nullptr,
1312     8,
1313     0,
1314     eEncodingIEEE754,
1315     eFormatFloat,
1316     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1317      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1318     nullptr,
1319     nullptr,
1320     nullptr,
1321     0},
1322    {"d6",
1323     nullptr,
1324     8,
1325     0,
1326     eEncodingIEEE754,
1327     eFormatFloat,
1328     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1329      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1330     nullptr,
1331     nullptr,
1332     nullptr,
1333     0},
1334    {"d7",
1335     nullptr,
1336     8,
1337     0,
1338     eEncodingIEEE754,
1339     eFormatFloat,
1340     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1341      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1342     nullptr,
1343     nullptr,
1344     nullptr,
1345     0},
1346    {"d8",
1347     nullptr,
1348     8,
1349     0,
1350     eEncodingIEEE754,
1351     eFormatFloat,
1352     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1353      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1354     nullptr,
1355     nullptr,
1356     nullptr,
1357     0},
1358    {"d9",
1359     nullptr,
1360     8,
1361     0,
1362     eEncodingIEEE754,
1363     eFormatFloat,
1364     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1365      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1366     nullptr,
1367     nullptr,
1368     nullptr,
1369     0},
1370    {"d10",
1371     nullptr,
1372     8,
1373     0,
1374     eEncodingIEEE754,
1375     eFormatFloat,
1376     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1377      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1378     nullptr,
1379     nullptr,
1380     nullptr,
1381     0},
1382    {"d11",
1383     nullptr,
1384     8,
1385     0,
1386     eEncodingIEEE754,
1387     eFormatFloat,
1388     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1389      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1390     nullptr,
1391     nullptr,
1392     nullptr,
1393     0},
1394    {"d12",
1395     nullptr,
1396     8,
1397     0,
1398     eEncodingIEEE754,
1399     eFormatFloat,
1400     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1401      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1402     nullptr,
1403     nullptr,
1404     nullptr,
1405     0},
1406    {"d13",
1407     nullptr,
1408     8,
1409     0,
1410     eEncodingIEEE754,
1411     eFormatFloat,
1412     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1413      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1414     nullptr,
1415     nullptr,
1416     nullptr,
1417     0},
1418    {"d14",
1419     nullptr,
1420     8,
1421     0,
1422     eEncodingIEEE754,
1423     eFormatFloat,
1424     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1425      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1426     nullptr,
1427     nullptr,
1428     nullptr,
1429     0},
1430    {"d15",
1431     nullptr,
1432     8,
1433     0,
1434     eEncodingIEEE754,
1435     eFormatFloat,
1436     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1437      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1438     nullptr,
1439     nullptr,
1440     nullptr,
1441     0},
1442    {"d16",
1443     nullptr,
1444     8,
1445     0,
1446     eEncodingIEEE754,
1447     eFormatFloat,
1448     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1449      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1450     nullptr,
1451     nullptr,
1452     nullptr,
1453     0},
1454    {"d17",
1455     nullptr,
1456     8,
1457     0,
1458     eEncodingIEEE754,
1459     eFormatFloat,
1460     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1461      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1462     nullptr,
1463     nullptr,
1464     nullptr,
1465     0},
1466    {"d18",
1467     nullptr,
1468     8,
1469     0,
1470     eEncodingIEEE754,
1471     eFormatFloat,
1472     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1473      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1474     nullptr,
1475     nullptr,
1476     nullptr,
1477     0},
1478    {"d19",
1479     nullptr,
1480     8,
1481     0,
1482     eEncodingIEEE754,
1483     eFormatFloat,
1484     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1485      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1486     nullptr,
1487     nullptr,
1488     nullptr,
1489     0},
1490    {"d20",
1491     nullptr,
1492     8,
1493     0,
1494     eEncodingIEEE754,
1495     eFormatFloat,
1496     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1497      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1498     nullptr,
1499     nullptr,
1500     nullptr,
1501     0},
1502    {"d21",
1503     nullptr,
1504     8,
1505     0,
1506     eEncodingIEEE754,
1507     eFormatFloat,
1508     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1509      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1510     nullptr,
1511     nullptr,
1512     nullptr,
1513     0},
1514    {"d22",
1515     nullptr,
1516     8,
1517     0,
1518     eEncodingIEEE754,
1519     eFormatFloat,
1520     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1521      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1522     nullptr,
1523     nullptr,
1524     nullptr,
1525     0},
1526    {"d23",
1527     nullptr,
1528     8,
1529     0,
1530     eEncodingIEEE754,
1531     eFormatFloat,
1532     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1533      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1534     nullptr,
1535     nullptr,
1536     nullptr,
1537     0},
1538    {"d24",
1539     nullptr,
1540     8,
1541     0,
1542     eEncodingIEEE754,
1543     eFormatFloat,
1544     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1545      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1546     nullptr,
1547     nullptr,
1548     nullptr,
1549     0},
1550    {"d25",
1551     nullptr,
1552     8,
1553     0,
1554     eEncodingIEEE754,
1555     eFormatFloat,
1556     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1557      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1558     nullptr,
1559     nullptr,
1560     nullptr,
1561     0},
1562    {"d26",
1563     nullptr,
1564     8,
1565     0,
1566     eEncodingIEEE754,
1567     eFormatFloat,
1568     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1569      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1570     nullptr,
1571     nullptr,
1572     nullptr,
1573     0},
1574    {"d27",
1575     nullptr,
1576     8,
1577     0,
1578     eEncodingIEEE754,
1579     eFormatFloat,
1580     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1581      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1582     nullptr,
1583     nullptr,
1584     nullptr,
1585     0},
1586    {"d28",
1587     nullptr,
1588     8,
1589     0,
1590     eEncodingIEEE754,
1591     eFormatFloat,
1592     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1593      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1594     nullptr,
1595     nullptr,
1596     nullptr,
1597     0},
1598    {"d29",
1599     nullptr,
1600     8,
1601     0,
1602     eEncodingIEEE754,
1603     eFormatFloat,
1604     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1605      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1606     nullptr,
1607     nullptr,
1608     nullptr,
1609     0},
1610    {"d30",
1611     nullptr,
1612     8,
1613     0,
1614     eEncodingIEEE754,
1615     eFormatFloat,
1616     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1617      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1618     nullptr,
1619     nullptr,
1620     nullptr,
1621     0},
1622    {"d31",
1623     nullptr,
1624     8,
1625     0,
1626     eEncodingIEEE754,
1627     eFormatFloat,
1628     {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1629      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1630     nullptr,
1631     nullptr,
1632     nullptr,
1633     0}};
1634
1635static const uint32_t k_num_register_infos =
1636    llvm::array_lengthof(g_register_infos);
1637static bool g_register_info_names_constified = false;
1638
1639const lldb_private::RegisterInfo *
1640ABIMacOSX_arm64::GetRegisterInfoArray(uint32_t &count) {
1641  // Make the C-string names and alt_names for the register infos into const
1642  // C-string values by having the ConstString unique the names in the global
1643  // constant C-string pool.
1644  if (!g_register_info_names_constified) {
1645    g_register_info_names_constified = true;
1646    for (uint32_t i = 0; i < k_num_register_infos; ++i) {
1647      if (g_register_infos[i].name)
1648        g_register_infos[i].name =
1649            ConstString(g_register_infos[i].name).GetCString();
1650      if (g_register_infos[i].alt_name)
1651        g_register_infos[i].alt_name =
1652            ConstString(g_register_infos[i].alt_name).GetCString();
1653    }
1654  }
1655  count = k_num_register_infos;
1656  return g_register_infos;
1657}
1658
1659size_t ABIMacOSX_arm64::GetRedZoneSize() const { return 128; }
1660
1661//------------------------------------------------------------------
1662// Static Functions
1663//------------------------------------------------------------------
1664
1665ABISP
1666ABIMacOSX_arm64::CreateInstance(ProcessSP process_sp, const ArchSpec &arch) {
1667  const llvm::Triple::ArchType arch_type = arch.GetTriple().getArch();
1668  const llvm::Triple::VendorType vendor_type = arch.GetTriple().getVendor();
1669
1670  if (vendor_type == llvm::Triple::Apple) {
1671    if (arch_type == llvm::Triple::aarch64) {
1672      return ABISP(new ABIMacOSX_arm64(process_sp));
1673    }
1674  }
1675
1676  return ABISP();
1677}
1678
1679bool ABIMacOSX_arm64::PrepareTrivialCall(
1680    Thread &thread, lldb::addr_t sp, lldb::addr_t func_addr,
1681    lldb::addr_t return_addr, llvm::ArrayRef<lldb::addr_t> args) const {
1682  RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1683  if (!reg_ctx)
1684    return false;
1685
1686  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1687
1688  if (log) {
1689    StreamString s;
1690    s.Printf("ABISysV_x86_64::PrepareTrivialCall (tid = 0x%" PRIx64
1691             ", sp = 0x%" PRIx64 ", func_addr = 0x%" PRIx64
1692             ", return_addr = 0x%" PRIx64,
1693             thread.GetID(), (uint64_t)sp, (uint64_t)func_addr,
1694             (uint64_t)return_addr);
1695
1696    for (size_t i = 0; i < args.size(); ++i)
1697      s.Printf(", arg%d = 0x%" PRIx64, static_cast<int>(i + 1), args[i]);
1698    s.PutCString(")");
1699    log->PutString(s.GetString());
1700  }
1701
1702  const uint32_t pc_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
1703      eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
1704  const uint32_t sp_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
1705      eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
1706  const uint32_t ra_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
1707      eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA);
1708
1709  // x0 - x7 contain first 8 simple args
1710  if (args.size() > 8) // TODO handle more than 6 arguments
1711    return false;
1712
1713  for (size_t i = 0; i < args.size(); ++i) {
1714    const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(
1715        eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + i);
1716    if (log)
1717      log->Printf("About to write arg%d (0x%" PRIx64 ") into %s",
1718                  static_cast<int>(i + 1), args[i], reg_info->name);
1719    if (!reg_ctx->WriteRegisterFromUnsigned(reg_info, args[i]))
1720      return false;
1721  }
1722
1723  // Set "lr" to the return address
1724  if (!reg_ctx->WriteRegisterFromUnsigned(
1725          reg_ctx->GetRegisterInfoAtIndex(ra_reg_num), return_addr))
1726    return false;
1727
1728  // Set "sp" to the requested value
1729  if (!reg_ctx->WriteRegisterFromUnsigned(
1730          reg_ctx->GetRegisterInfoAtIndex(sp_reg_num), sp))
1731    return false;
1732
1733  // Set "pc" to the address requested
1734  if (!reg_ctx->WriteRegisterFromUnsigned(
1735          reg_ctx->GetRegisterInfoAtIndex(pc_reg_num), func_addr))
1736    return false;
1737
1738  return true;
1739}
1740
1741bool ABIMacOSX_arm64::GetArgumentValues(Thread &thread,
1742                                        ValueList &values) const {
1743  uint32_t num_values = values.GetSize();
1744
1745  ExecutionContext exe_ctx(thread.shared_from_this());
1746
1747  // Extract the register context so we can read arguments from registers
1748
1749  RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1750
1751  if (!reg_ctx)
1752    return false;
1753
1754  addr_t sp = 0;
1755
1756  for (uint32_t value_idx = 0; value_idx < num_values; ++value_idx) {
1757    // We currently only support extracting values with Clang QualTypes. Do we
1758    // care about others?
1759    Value *value = values.GetValueAtIndex(value_idx);
1760
1761    if (!value)
1762      return false;
1763
1764    CompilerType value_type = value->GetCompilerType();
1765    llvm::Optional<uint64_t> bit_size = value_type.GetBitSize(&thread);
1766    if (!bit_size)
1767      return false;
1768
1769    bool is_signed = false;
1770    size_t bit_width = 0;
1771    if (value_type.IsIntegerOrEnumerationType(is_signed)) {
1772      bit_width = *bit_size;
1773    } else if (value_type.IsPointerOrReferenceType()) {
1774      bit_width = *bit_size;
1775    } else {
1776      // We only handle integer, pointer and reference types currently...
1777      return false;
1778    }
1779
1780    if (bit_width <= (exe_ctx.GetProcessRef().GetAddressByteSize() * 8)) {
1781      if (value_idx < 8) {
1782        // Arguments 1-6 are in x0-x5...
1783        const RegisterInfo *reg_info = nullptr;
1784        // Search by generic ID first, then fall back to by name
1785        uint32_t arg_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
1786            eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + value_idx);
1787        if (arg_reg_num != LLDB_INVALID_REGNUM) {
1788          reg_info = reg_ctx->GetRegisterInfoAtIndex(arg_reg_num);
1789        } else {
1790          switch (value_idx) {
1791          case 0:
1792            reg_info = reg_ctx->GetRegisterInfoByName("x0");
1793            break;
1794          case 1:
1795            reg_info = reg_ctx->GetRegisterInfoByName("x1");
1796            break;
1797          case 2:
1798            reg_info = reg_ctx->GetRegisterInfoByName("x2");
1799            break;
1800          case 3:
1801            reg_info = reg_ctx->GetRegisterInfoByName("x3");
1802            break;
1803          case 4:
1804            reg_info = reg_ctx->GetRegisterInfoByName("x4");
1805            break;
1806          case 5:
1807            reg_info = reg_ctx->GetRegisterInfoByName("x5");
1808            break;
1809          case 6:
1810            reg_info = reg_ctx->GetRegisterInfoByName("x6");
1811            break;
1812          case 7:
1813            reg_info = reg_ctx->GetRegisterInfoByName("x7");
1814            break;
1815          }
1816        }
1817
1818        if (reg_info) {
1819          RegisterValue reg_value;
1820
1821          if (reg_ctx->ReadRegister(reg_info, reg_value)) {
1822            if (is_signed)
1823              reg_value.SignExtend(bit_width);
1824            if (!reg_value.GetScalarValue(value->GetScalar()))
1825              return false;
1826            continue;
1827          }
1828        }
1829        return false;
1830      } else {
1831        if (sp == 0) {
1832          // Read the stack pointer if we already haven't read it
1833          sp = reg_ctx->GetSP(0);
1834          if (sp == 0)
1835            return false;
1836        }
1837
1838        // Arguments 5 on up are on the stack
1839        const uint32_t arg_byte_size = (bit_width + (8 - 1)) / 8;
1840        Status error;
1841        if (!exe_ctx.GetProcessRef().ReadScalarIntegerFromMemory(
1842                sp, arg_byte_size, is_signed, value->GetScalar(), error))
1843          return false;
1844
1845        sp += arg_byte_size;
1846        // Align up to the next 8 byte boundary if needed
1847        if (sp % 8) {
1848          sp >>= 3;
1849          sp += 1;
1850          sp <<= 3;
1851        }
1852      }
1853    }
1854  }
1855  return true;
1856}
1857
1858Status
1859ABIMacOSX_arm64::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
1860                                      lldb::ValueObjectSP &new_value_sp) {
1861  Status error;
1862  if (!new_value_sp) {
1863    error.SetErrorString("Empty value object for return value.");
1864    return error;
1865  }
1866
1867  CompilerType return_value_type = new_value_sp->GetCompilerType();
1868  if (!return_value_type) {
1869    error.SetErrorString("Null clang type for return value.");
1870    return error;
1871  }
1872
1873  Thread *thread = frame_sp->GetThread().get();
1874
1875  RegisterContext *reg_ctx = thread->GetRegisterContext().get();
1876
1877  if (reg_ctx) {
1878    DataExtractor data;
1879    Status data_error;
1880    const uint64_t byte_size = new_value_sp->GetData(data, data_error);
1881    if (data_error.Fail()) {
1882      error.SetErrorStringWithFormat(
1883          "Couldn't convert return value to raw data: %s",
1884          data_error.AsCString());
1885      return error;
1886    }
1887
1888    const uint32_t type_flags = return_value_type.GetTypeInfo(nullptr);
1889    if (type_flags & eTypeIsScalar || type_flags & eTypeIsPointer) {
1890      if (type_flags & eTypeIsInteger || type_flags & eTypeIsPointer) {
1891        // Extract the register context so we can read arguments from registers
1892        lldb::offset_t offset = 0;
1893        if (byte_size <= 16) {
1894          const RegisterInfo *x0_info = reg_ctx->GetRegisterInfoByName("x0", 0);
1895          if (byte_size <= 8) {
1896            uint64_t raw_value = data.GetMaxU64(&offset, byte_size);
1897
1898            if (!reg_ctx->WriteRegisterFromUnsigned(x0_info, raw_value))
1899              error.SetErrorString("failed to write register x0");
1900          } else {
1901            uint64_t raw_value = data.GetMaxU64(&offset, 8);
1902
1903            if (reg_ctx->WriteRegisterFromUnsigned(x0_info, raw_value)) {
1904              const RegisterInfo *x1_info =
1905                  reg_ctx->GetRegisterInfoByName("x1", 0);
1906              raw_value = data.GetMaxU64(&offset, byte_size - offset);
1907
1908              if (!reg_ctx->WriteRegisterFromUnsigned(x1_info, raw_value))
1909                error.SetErrorString("failed to write register x1");
1910            }
1911          }
1912        } else {
1913          error.SetErrorString("We don't support returning longer than 128 bit "
1914                               "integer values at present.");
1915        }
1916      } else if (type_flags & eTypeIsFloat) {
1917        if (type_flags & eTypeIsComplex) {
1918          // Don't handle complex yet.
1919          error.SetErrorString(
1920              "returning complex float values are not supported");
1921        } else {
1922          const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
1923
1924          if (v0_info) {
1925            if (byte_size <= 16) {
1926              if (byte_size <= RegisterValue::GetMaxByteSize()) {
1927                RegisterValue reg_value;
1928                error = reg_value.SetValueFromData(v0_info, data, 0, true);
1929                if (error.Success()) {
1930                  if (!reg_ctx->WriteRegister(v0_info, reg_value))
1931                    error.SetErrorString("failed to write register v0");
1932                }
1933              } else {
1934                error.SetErrorStringWithFormat(
1935                    "returning float values with a byte size of %" PRIu64
1936                    " are not supported",
1937                    byte_size);
1938              }
1939            } else {
1940              error.SetErrorString("returning float values longer than 128 "
1941                                   "bits are not supported");
1942            }
1943          } else {
1944            error.SetErrorString("v0 register is not available on this target");
1945          }
1946        }
1947      }
1948    } else if (type_flags & eTypeIsVector) {
1949      if (byte_size > 0) {
1950        const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
1951
1952        if (v0_info) {
1953          if (byte_size <= v0_info->byte_size) {
1954            RegisterValue reg_value;
1955            error = reg_value.SetValueFromData(v0_info, data, 0, true);
1956            if (error.Success()) {
1957              if (!reg_ctx->WriteRegister(v0_info, reg_value))
1958                error.SetErrorString("failed to write register v0");
1959            }
1960          }
1961        }
1962      }
1963    }
1964  } else {
1965    error.SetErrorString("no registers are available");
1966  }
1967
1968  return error;
1969}
1970
1971bool ABIMacOSX_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
1972  unwind_plan.Clear();
1973  unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1974
1975  uint32_t lr_reg_num = arm64_dwarf::lr;
1976  uint32_t sp_reg_num = arm64_dwarf::sp;
1977  uint32_t pc_reg_num = arm64_dwarf::pc;
1978
1979  UnwindPlan::RowSP row(new UnwindPlan::Row);
1980
1981  // Our previous Call Frame Address is the stack pointer
1982  row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
1983
1984  // Our previous PC is in the LR
1985  row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true);
1986
1987  unwind_plan.AppendRow(row);
1988
1989  // All other registers are the same.
1990
1991  unwind_plan.SetSourceName("arm64 at-func-entry default");
1992  unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1993
1994  return true;
1995}
1996
1997bool ABIMacOSX_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
1998  unwind_plan.Clear();
1999  unwind_plan.SetRegisterKind(eRegisterKindDWARF);
2000
2001  uint32_t fp_reg_num = arm64_dwarf::fp;
2002  uint32_t pc_reg_num = arm64_dwarf::pc;
2003
2004  UnwindPlan::RowSP row(new UnwindPlan::Row);
2005  const int32_t ptr_size = 8;
2006
2007  row->GetCFAValue().SetIsRegisterPlusOffset(fp_reg_num, 2 * ptr_size);
2008  row->SetOffset(0);
2009
2010  row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
2011  row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
2012
2013  unwind_plan.AppendRow(row);
2014  unwind_plan.SetSourceName("arm64-apple-darwin default unwind plan");
2015  unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
2016  unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
2017  return true;
2018}
2019
2020// AAPCS64 (Procedure Call Standard for the ARM 64-bit Architecture) says
2021// registers x19 through x28 and sp are callee preserved. v8-v15 are non-
2022// volatile (and specifically only the lower 8 bytes of these regs), the rest
2023// of the fp/SIMD registers are volatile.
2024
2025// We treat x29 as callee preserved also, else the unwinder won't try to
2026// retrieve fp saves.
2027
2028bool ABIMacOSX_arm64::RegisterIsVolatile(const RegisterInfo *reg_info) {
2029  if (reg_info) {
2030    const char *name = reg_info->name;
2031
2032    // Sometimes we'll be called with the "alternate" name for these registers;
2033    // recognize them as non-volatile.
2034
2035    if (name[0] == 'p' && name[1] == 'c') // pc
2036      return false;
2037    if (name[0] == 'f' && name[1] == 'p') // fp
2038      return false;
2039    if (name[0] == 's' && name[1] == 'p') // sp
2040      return false;
2041    if (name[0] == 'l' && name[1] == 'r') // lr
2042      return false;
2043
2044    if (name[0] == 'x') {
2045      // Volatile registers: x0-x18, x30 (lr)
2046      // Return false for the non-volatile gpr regs, true for everything else
2047      switch (name[1]) {
2048      case '1':
2049        switch (name[2]) {
2050        case '9':
2051          return false; // x19 is non-volatile
2052        default:
2053          return true;
2054        }
2055        break;
2056      case '2':
2057        switch (name[2]) {
2058        case '0':
2059        case '1':
2060        case '2':
2061        case '3':
2062        case '4':
2063        case '5':
2064        case '6':
2065        case '7':
2066        case '8':
2067          return false; // x20 - 28 are non-volatile
2068        case '9':
2069          return false; // x29 aka fp treat as non-volatile on Darwin
2070        default:
2071          return true;
2072        }
2073      case '3': // x30 aka lr treat as non-volatile
2074        if (name[2] == '0')
2075          return false;
2076        break;
2077      default:
2078        return true;
2079      }
2080    } else if (name[0] == 'v' || name[0] == 's' || name[0] == 'd') {
2081      // Volatile registers: v0-7, v16-v31
2082      // Return false for non-volatile fp/SIMD regs, true for everything else
2083      switch (name[1]) {
2084      case '8':
2085      case '9':
2086        return false; // v8-v9 are non-volatile
2087      case '1':
2088        switch (name[2]) {
2089        case '0':
2090        case '1':
2091        case '2':
2092        case '3':
2093        case '4':
2094        case '5':
2095          return false; // v10-v15 are non-volatile
2096        default:
2097          return true;
2098        }
2099      default:
2100        return true;
2101      }
2102    }
2103  }
2104  return true;
2105}
2106
2107static bool LoadValueFromConsecutiveGPRRegisters(
2108    ExecutionContext &exe_ctx, RegisterContext *reg_ctx,
2109    const CompilerType &value_type,
2110    bool is_return_value, // false => parameter, true => return value
2111    uint32_t &NGRN,       // NGRN (see ABI documentation)
2112    uint32_t &NSRN,       // NSRN (see ABI documentation)
2113    DataExtractor &data) {
2114  llvm::Optional<uint64_t> byte_size = value_type.GetByteSize(nullptr);
2115  if (!byte_size || *byte_size == 0)
2116    return false;
2117
2118  std::unique_ptr<DataBufferHeap> heap_data_ap(
2119      new DataBufferHeap(*byte_size, 0));
2120  const ByteOrder byte_order = exe_ctx.GetProcessRef().GetByteOrder();
2121  Status error;
2122
2123  CompilerType base_type;
2124  const uint32_t homogeneous_count =
2125      value_type.IsHomogeneousAggregate(&base_type);
2126  if (homogeneous_count > 0 && homogeneous_count <= 8) {
2127    // Make sure we have enough registers
2128    if (NSRN < 8 && (8 - NSRN) >= homogeneous_count) {
2129      if (!base_type)
2130        return false;
2131      llvm::Optional<uint64_t> base_byte_size = base_type.GetByteSize(nullptr);
2132      if (!base_byte_size)
2133        return false;
2134      uint32_t data_offset = 0;
2135
2136      for (uint32_t i = 0; i < homogeneous_count; ++i) {
2137        char v_name[8];
2138        ::snprintf(v_name, sizeof(v_name), "v%u", NSRN);
2139        const RegisterInfo *reg_info =
2140            reg_ctx->GetRegisterInfoByName(v_name, 0);
2141        if (reg_info == nullptr)
2142          return false;
2143
2144        if (*base_byte_size > reg_info->byte_size)
2145          return false;
2146
2147        RegisterValue reg_value;
2148
2149        if (!reg_ctx->ReadRegister(reg_info, reg_value))
2150          return false;
2151
2152        // Make sure we have enough room in "heap_data_ap"
2153        if ((data_offset + *base_byte_size) <= heap_data_ap->GetByteSize()) {
2154          const size_t bytes_copied = reg_value.GetAsMemoryData(
2155              reg_info, heap_data_ap->GetBytes() + data_offset, *base_byte_size,
2156              byte_order, error);
2157          if (bytes_copied != *base_byte_size)
2158            return false;
2159          data_offset += bytes_copied;
2160          ++NSRN;
2161        } else
2162          return false;
2163      }
2164      data.SetByteOrder(byte_order);
2165      data.SetAddressByteSize(exe_ctx.GetProcessRef().GetAddressByteSize());
2166      data.SetData(DataBufferSP(heap_data_ap.release()));
2167      return true;
2168    }
2169  }
2170
2171  const size_t max_reg_byte_size = 16;
2172  if (*byte_size <= max_reg_byte_size) {
2173    size_t bytes_left = *byte_size;
2174    uint32_t data_offset = 0;
2175    while (data_offset < *byte_size) {
2176      if (NGRN >= 8)
2177        return false;
2178
2179      uint32_t reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
2180          eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + NGRN);
2181      if (reg_num == LLDB_INVALID_REGNUM)
2182        return false;
2183
2184      const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_num);
2185      if (reg_info == nullptr)
2186        return false;
2187
2188      RegisterValue reg_value;
2189
2190      if (!reg_ctx->ReadRegister(reg_info, reg_value))
2191        return false;
2192
2193      const size_t curr_byte_size = std::min<size_t>(8, bytes_left);
2194      const size_t bytes_copied = reg_value.GetAsMemoryData(
2195          reg_info, heap_data_ap->GetBytes() + data_offset, curr_byte_size,
2196          byte_order, error);
2197      if (bytes_copied == 0)
2198        return false;
2199      if (bytes_copied >= bytes_left)
2200        break;
2201      data_offset += bytes_copied;
2202      bytes_left -= bytes_copied;
2203      ++NGRN;
2204    }
2205  } else {
2206    const RegisterInfo *reg_info = nullptr;
2207    if (is_return_value) {
2208      // We are assuming we are decoding this immediately after returning from
2209      // a function call and that the address of the structure is in x8
2210      reg_info = reg_ctx->GetRegisterInfoByName("x8", 0);
2211    } else {
2212      // We are assuming we are stopped at the first instruction in a function
2213      // and that the ABI is being respected so all parameters appear where
2214      // they should be (functions with no external linkage can legally violate
2215      // the ABI).
2216      if (NGRN >= 8)
2217        return false;
2218
2219      uint32_t reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
2220          eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + NGRN);
2221      if (reg_num == LLDB_INVALID_REGNUM)
2222        return false;
2223      reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_num);
2224      if (reg_info == nullptr)
2225        return false;
2226      ++NGRN;
2227    }
2228
2229    if (reg_info == nullptr)
2230      return false;
2231
2232    const lldb::addr_t value_addr =
2233        reg_ctx->ReadRegisterAsUnsigned(reg_info, LLDB_INVALID_ADDRESS);
2234
2235    if (value_addr == LLDB_INVALID_ADDRESS)
2236      return false;
2237
2238    if (exe_ctx.GetProcessRef().ReadMemory(
2239            value_addr, heap_data_ap->GetBytes(), heap_data_ap->GetByteSize(),
2240            error) != heap_data_ap->GetByteSize()) {
2241      return false;
2242    }
2243  }
2244
2245  data.SetByteOrder(byte_order);
2246  data.SetAddressByteSize(exe_ctx.GetProcessRef().GetAddressByteSize());
2247  data.SetData(DataBufferSP(heap_data_ap.release()));
2248  return true;
2249}
2250
2251ValueObjectSP ABIMacOSX_arm64::GetReturnValueObjectImpl(
2252    Thread &thread, CompilerType &return_compiler_type) const {
2253  ValueObjectSP return_valobj_sp;
2254  Value value;
2255
2256  ExecutionContext exe_ctx(thread.shared_from_this());
2257  if (exe_ctx.GetTargetPtr() == nullptr || exe_ctx.GetProcessPtr() == nullptr)
2258    return return_valobj_sp;
2259
2260  // value.SetContext (Value::eContextTypeClangType, return_compiler_type);
2261  value.SetCompilerType(return_compiler_type);
2262
2263  RegisterContext *reg_ctx = thread.GetRegisterContext().get();
2264  if (!reg_ctx)
2265    return return_valobj_sp;
2266
2267  llvm::Optional<uint64_t> byte_size =
2268      return_compiler_type.GetByteSize(nullptr);
2269  if (!byte_size)
2270    return return_valobj_sp;
2271
2272  const uint32_t type_flags = return_compiler_type.GetTypeInfo(nullptr);
2273  if (type_flags & eTypeIsScalar || type_flags & eTypeIsPointer) {
2274    value.SetValueType(Value::eValueTypeScalar);
2275
2276    bool success = false;
2277    if (type_flags & eTypeIsInteger || type_flags & eTypeIsPointer) {
2278      // Extract the register context so we can read arguments from registers
2279      if (*byte_size <= 8) {
2280        const RegisterInfo *x0_reg_info =
2281            reg_ctx->GetRegisterInfoByName("x0", 0);
2282        if (x0_reg_info) {
2283          uint64_t raw_value =
2284              thread.GetRegisterContext()->ReadRegisterAsUnsigned(x0_reg_info,
2285                                                                  0);
2286          const bool is_signed = (type_flags & eTypeIsSigned) != 0;
2287          switch (*byte_size) {
2288          default:
2289            break;
2290          case 16: // uint128_t
2291            // In register x0 and x1
2292            {
2293              const RegisterInfo *x1_reg_info =
2294                  reg_ctx->GetRegisterInfoByName("x1", 0);
2295
2296              if (x1_reg_info) {
2297                if (*byte_size <=
2298                    x0_reg_info->byte_size + x1_reg_info->byte_size) {
2299                  std::unique_ptr<DataBufferHeap> heap_data_ap(
2300                      new DataBufferHeap(*byte_size, 0));
2301                  const ByteOrder byte_order =
2302                      exe_ctx.GetProcessRef().GetByteOrder();
2303                  RegisterValue x0_reg_value;
2304                  RegisterValue x1_reg_value;
2305                  if (reg_ctx->ReadRegister(x0_reg_info, x0_reg_value) &&
2306                      reg_ctx->ReadRegister(x1_reg_info, x1_reg_value)) {
2307                    Status error;
2308                    if (x0_reg_value.GetAsMemoryData(
2309                            x0_reg_info, heap_data_ap->GetBytes() + 0, 8,
2310                            byte_order, error) &&
2311                        x1_reg_value.GetAsMemoryData(
2312                            x1_reg_info, heap_data_ap->GetBytes() + 8, 8,
2313                            byte_order, error)) {
2314                      DataExtractor data(
2315                          DataBufferSP(heap_data_ap.release()), byte_order,
2316                          exe_ctx.GetProcessRef().GetAddressByteSize());
2317
2318                      return_valobj_sp = ValueObjectConstResult::Create(
2319                          &thread, return_compiler_type, ConstString(""), data);
2320                      return return_valobj_sp;
2321                    }
2322                  }
2323                }
2324              }
2325            }
2326            break;
2327          case sizeof(uint64_t):
2328            if (is_signed)
2329              value.GetScalar() = (int64_t)(raw_value);
2330            else
2331              value.GetScalar() = (uint64_t)(raw_value);
2332            success = true;
2333            break;
2334
2335          case sizeof(uint32_t):
2336            if (is_signed)
2337              value.GetScalar() = (int32_t)(raw_value & UINT32_MAX);
2338            else
2339              value.GetScalar() = (uint32_t)(raw_value & UINT32_MAX);
2340            success = true;
2341            break;
2342
2343          case sizeof(uint16_t):
2344            if (is_signed)
2345              value.GetScalar() = (int16_t)(raw_value & UINT16_MAX);
2346            else
2347              value.GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
2348            success = true;
2349            break;
2350
2351          case sizeof(uint8_t):
2352            if (is_signed)
2353              value.GetScalar() = (int8_t)(raw_value & UINT8_MAX);
2354            else
2355              value.GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
2356            success = true;
2357            break;
2358          }
2359        }
2360      }
2361    } else if (type_flags & eTypeIsFloat) {
2362      if (type_flags & eTypeIsComplex) {
2363        // Don't handle complex yet.
2364      } else {
2365        if (*byte_size <= sizeof(long double)) {
2366          const RegisterInfo *v0_reg_info =
2367              reg_ctx->GetRegisterInfoByName("v0", 0);
2368          RegisterValue v0_value;
2369          if (reg_ctx->ReadRegister(v0_reg_info, v0_value)) {
2370            DataExtractor data;
2371            if (v0_value.GetData(data)) {
2372              lldb::offset_t offset = 0;
2373              if (*byte_size == sizeof(float)) {
2374                value.GetScalar() = data.GetFloat(&offset);
2375                success = true;
2376              } else if (*byte_size == sizeof(double)) {
2377                value.GetScalar() = data.GetDouble(&offset);
2378                success = true;
2379              } else if (*byte_size == sizeof(long double)) {
2380                value.GetScalar() = data.GetLongDouble(&offset);
2381                success = true;
2382              }
2383            }
2384          }
2385        }
2386      }
2387    }
2388
2389    if (success)
2390      return_valobj_sp = ValueObjectConstResult::Create(
2391          thread.GetStackFrameAtIndex(0).get(), value, ConstString(""));
2392  } else if (type_flags & eTypeIsVector) {
2393    if (*byte_size > 0) {
2394
2395      const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
2396
2397      if (v0_info) {
2398        if (*byte_size <= v0_info->byte_size) {
2399          std::unique_ptr<DataBufferHeap> heap_data_ap(
2400              new DataBufferHeap(*byte_size, 0));
2401          const ByteOrder byte_order = exe_ctx.GetProcessRef().GetByteOrder();
2402          RegisterValue reg_value;
2403          if (reg_ctx->ReadRegister(v0_info, reg_value)) {
2404            Status error;
2405            if (reg_value.GetAsMemoryData(v0_info, heap_data_ap->GetBytes(),
2406                                          heap_data_ap->GetByteSize(),
2407                                          byte_order, error)) {
2408              DataExtractor data(DataBufferSP(heap_data_ap.release()),
2409                                 byte_order,
2410                                 exe_ctx.GetProcessRef().GetAddressByteSize());
2411              return_valobj_sp = ValueObjectConstResult::Create(
2412                  &thread, return_compiler_type, ConstString(""), data);
2413            }
2414          }
2415        }
2416      }
2417    }
2418  } else if (type_flags & eTypeIsStructUnion || type_flags & eTypeIsClass) {
2419    DataExtractor data;
2420
2421    uint32_t NGRN = 0; // Search ABI docs for NGRN
2422    uint32_t NSRN = 0; // Search ABI docs for NSRN
2423    const bool is_return_value = true;
2424    if (LoadValueFromConsecutiveGPRRegisters(
2425            exe_ctx, reg_ctx, return_compiler_type, is_return_value, NGRN, NSRN,
2426            data)) {
2427      return_valobj_sp = ValueObjectConstResult::Create(
2428          &thread, return_compiler_type, ConstString(""), data);
2429    }
2430  }
2431  return return_valobj_sp;
2432}
2433
2434void ABIMacOSX_arm64::Initialize() {
2435  PluginManager::RegisterPlugin(GetPluginNameStatic(), pluginDesc,
2436                                CreateInstance);
2437}
2438
2439void ABIMacOSX_arm64::Terminate() {
2440  PluginManager::UnregisterPlugin(CreateInstance);
2441}
2442
2443//------------------------------------------------------------------
2444// PluginInterface protocol
2445//------------------------------------------------------------------
2446
2447ConstString ABIMacOSX_arm64::GetPluginNameStatic() {
2448  static ConstString g_plugin_name("ABIMacOSX_arm64");
2449  return g_plugin_name;
2450}
2451
2452uint32_t ABIMacOSX_arm64::GetPluginVersion() { return 1; }
2453