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