1 //===-- ABIMacOSX_arm64.cpp -------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "ABIMacOSX_arm64.h"
16 // Other libraries and framework includes
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/Triple.h"
20 #include "lldb/Core/Module.h"
21 #include "lldb/Core/PluginManager.h"
22 #include "lldb/Core/RegisterValue.h"
23 #include "lldb/Core/Scalar.h"
24 #include "lldb/Core/Value.h"
25 #include "lldb/Core/ValueObjectConstResult.h"
26 #include "lldb/Symbol/UnwindPlan.h"
27 #include "lldb/Target/Process.h"
28 #include "lldb/Target/RegisterContext.h"
29 #include "lldb/Target/Target.h"
30 #include "lldb/Target/Thread.h"
31 #include "lldb/Utility/ConstString.h"
32 #include "lldb/Utility/Log.h"
33 #include "lldb/Utility/Status.h"
35 #include "Utility/ARM64_DWARF_Registers.h"
38 using namespace lldb_private;
40 static const char *pluginDesc = "Mac OS X ABI for arm64 targets";
42 static RegisterInfo g_register_infos[] = {
43 // NAME ALT SZ OFF ENCODING FORMAT
44 // EH_FRAME DWARF GENERIC
45 // PROCESS PLUGIN LLDB NATIVE
46 // ========== ======= == === ============= ===================
47 // =================== ====================== ===========================
48 // ======================= ======================
55 {LLDB_INVALID_REGNUM, arm64_dwarf::x0, LLDB_REGNUM_GENERIC_ARG1,
56 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
67 {LLDB_INVALID_REGNUM, arm64_dwarf::x1, LLDB_REGNUM_GENERIC_ARG2,
68 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
79 {LLDB_INVALID_REGNUM, arm64_dwarf::x2, LLDB_REGNUM_GENERIC_ARG3,
80 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
91 {LLDB_INVALID_REGNUM, arm64_dwarf::x3, LLDB_REGNUM_GENERIC_ARG4,
92 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
103 {LLDB_INVALID_REGNUM, arm64_dwarf::x4, LLDB_REGNUM_GENERIC_ARG5,
104 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
115 {LLDB_INVALID_REGNUM, arm64_dwarf::x5, LLDB_REGNUM_GENERIC_ARG6,
116 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
127 {LLDB_INVALID_REGNUM, arm64_dwarf::x6, LLDB_REGNUM_GENERIC_ARG7,
128 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
139 {LLDB_INVALID_REGNUM, arm64_dwarf::x7, LLDB_REGNUM_GENERIC_ARG8,
140 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
151 {LLDB_INVALID_REGNUM, arm64_dwarf::x8, LLDB_INVALID_REGNUM,
152 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
163 {LLDB_INVALID_REGNUM, arm64_dwarf::x9, LLDB_INVALID_REGNUM,
164 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
175 {LLDB_INVALID_REGNUM, arm64_dwarf::x10, LLDB_INVALID_REGNUM,
176 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
187 {LLDB_INVALID_REGNUM, arm64_dwarf::x11, LLDB_INVALID_REGNUM,
188 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
199 {LLDB_INVALID_REGNUM, arm64_dwarf::x12, LLDB_INVALID_REGNUM,
200 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
211 {LLDB_INVALID_REGNUM, arm64_dwarf::x13, LLDB_INVALID_REGNUM,
212 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
223 {LLDB_INVALID_REGNUM, arm64_dwarf::x14, LLDB_INVALID_REGNUM,
224 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
235 {LLDB_INVALID_REGNUM, arm64_dwarf::x15, LLDB_INVALID_REGNUM,
236 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
247 {LLDB_INVALID_REGNUM, arm64_dwarf::x16, LLDB_INVALID_REGNUM,
248 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
259 {LLDB_INVALID_REGNUM, arm64_dwarf::x17, LLDB_INVALID_REGNUM,
260 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
271 {LLDB_INVALID_REGNUM, arm64_dwarf::x18, LLDB_INVALID_REGNUM,
272 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
283 {LLDB_INVALID_REGNUM, arm64_dwarf::x19, LLDB_INVALID_REGNUM,
284 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
295 {LLDB_INVALID_REGNUM, arm64_dwarf::x20, LLDB_INVALID_REGNUM,
296 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
307 {LLDB_INVALID_REGNUM, arm64_dwarf::x21, LLDB_INVALID_REGNUM,
308 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
319 {LLDB_INVALID_REGNUM, arm64_dwarf::x22, LLDB_INVALID_REGNUM,
320 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
331 {LLDB_INVALID_REGNUM, arm64_dwarf::x23, LLDB_INVALID_REGNUM,
332 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
343 {LLDB_INVALID_REGNUM, arm64_dwarf::x24, LLDB_INVALID_REGNUM,
344 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
355 {LLDB_INVALID_REGNUM, arm64_dwarf::x25, LLDB_INVALID_REGNUM,
356 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
367 {LLDB_INVALID_REGNUM, arm64_dwarf::x26, LLDB_INVALID_REGNUM,
368 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
379 {LLDB_INVALID_REGNUM, arm64_dwarf::x27, LLDB_INVALID_REGNUM,
380 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
391 {LLDB_INVALID_REGNUM, arm64_dwarf::x28, LLDB_INVALID_REGNUM,
392 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
403 {LLDB_INVALID_REGNUM, arm64_dwarf::x29, LLDB_REGNUM_GENERIC_FP,
404 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
415 {LLDB_INVALID_REGNUM, arm64_dwarf::x30, LLDB_REGNUM_GENERIC_RA,
416 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
427 {LLDB_INVALID_REGNUM, arm64_dwarf::x31, LLDB_REGNUM_GENERIC_SP,
428 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
439 {LLDB_INVALID_REGNUM, arm64_dwarf::pc, LLDB_REGNUM_GENERIC_PC,
440 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
451 {LLDB_INVALID_REGNUM, arm64_dwarf::cpsr, LLDB_REGNUM_GENERIC_FLAGS,
452 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
463 eFormatVectorOfUInt8,
464 {LLDB_INVALID_REGNUM, arm64_dwarf::v0, LLDB_INVALID_REGNUM,
465 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
475 eFormatVectorOfUInt8,
476 {LLDB_INVALID_REGNUM, arm64_dwarf::v1, LLDB_INVALID_REGNUM,
477 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
487 eFormatVectorOfUInt8,
488 {LLDB_INVALID_REGNUM, arm64_dwarf::v2, LLDB_INVALID_REGNUM,
489 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
499 eFormatVectorOfUInt8,
500 {LLDB_INVALID_REGNUM, arm64_dwarf::v3, LLDB_INVALID_REGNUM,
501 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
511 eFormatVectorOfUInt8,
512 {LLDB_INVALID_REGNUM, arm64_dwarf::v4, LLDB_INVALID_REGNUM,
513 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
523 eFormatVectorOfUInt8,
524 {LLDB_INVALID_REGNUM, arm64_dwarf::v5, LLDB_INVALID_REGNUM,
525 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
535 eFormatVectorOfUInt8,
536 {LLDB_INVALID_REGNUM, arm64_dwarf::v6, LLDB_INVALID_REGNUM,
537 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
547 eFormatVectorOfUInt8,
548 {LLDB_INVALID_REGNUM, arm64_dwarf::v7, LLDB_INVALID_REGNUM,
549 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
559 eFormatVectorOfUInt8,
560 {LLDB_INVALID_REGNUM, arm64_dwarf::v8, LLDB_INVALID_REGNUM,
561 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
571 eFormatVectorOfUInt8,
572 {LLDB_INVALID_REGNUM, arm64_dwarf::v9, LLDB_INVALID_REGNUM,
573 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
583 eFormatVectorOfUInt8,
584 {LLDB_INVALID_REGNUM, arm64_dwarf::v10, LLDB_INVALID_REGNUM,
585 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
595 eFormatVectorOfUInt8,
596 {LLDB_INVALID_REGNUM, arm64_dwarf::v11, LLDB_INVALID_REGNUM,
597 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
607 eFormatVectorOfUInt8,
608 {LLDB_INVALID_REGNUM, arm64_dwarf::v12, LLDB_INVALID_REGNUM,
609 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
619 eFormatVectorOfUInt8,
620 {LLDB_INVALID_REGNUM, arm64_dwarf::v13, LLDB_INVALID_REGNUM,
621 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
631 eFormatVectorOfUInt8,
632 {LLDB_INVALID_REGNUM, arm64_dwarf::v14, LLDB_INVALID_REGNUM,
633 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
643 eFormatVectorOfUInt8,
644 {LLDB_INVALID_REGNUM, arm64_dwarf::v15, LLDB_INVALID_REGNUM,
645 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
655 eFormatVectorOfUInt8,
656 {LLDB_INVALID_REGNUM, arm64_dwarf::v16, LLDB_INVALID_REGNUM,
657 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
667 eFormatVectorOfUInt8,
668 {LLDB_INVALID_REGNUM, arm64_dwarf::v17, LLDB_INVALID_REGNUM,
669 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
679 eFormatVectorOfUInt8,
680 {LLDB_INVALID_REGNUM, arm64_dwarf::v18, LLDB_INVALID_REGNUM,
681 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
691 eFormatVectorOfUInt8,
692 {LLDB_INVALID_REGNUM, arm64_dwarf::v19, LLDB_INVALID_REGNUM,
693 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
703 eFormatVectorOfUInt8,
704 {LLDB_INVALID_REGNUM, arm64_dwarf::v20, LLDB_INVALID_REGNUM,
705 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
715 eFormatVectorOfUInt8,
716 {LLDB_INVALID_REGNUM, arm64_dwarf::v21, LLDB_INVALID_REGNUM,
717 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
727 eFormatVectorOfUInt8,
728 {LLDB_INVALID_REGNUM, arm64_dwarf::v22, LLDB_INVALID_REGNUM,
729 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
739 eFormatVectorOfUInt8,
740 {LLDB_INVALID_REGNUM, arm64_dwarf::v23, LLDB_INVALID_REGNUM,
741 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
751 eFormatVectorOfUInt8,
752 {LLDB_INVALID_REGNUM, arm64_dwarf::v24, LLDB_INVALID_REGNUM,
753 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
763 eFormatVectorOfUInt8,
764 {LLDB_INVALID_REGNUM, arm64_dwarf::v25, LLDB_INVALID_REGNUM,
765 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
775 eFormatVectorOfUInt8,
776 {LLDB_INVALID_REGNUM, arm64_dwarf::v26, LLDB_INVALID_REGNUM,
777 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
787 eFormatVectorOfUInt8,
788 {LLDB_INVALID_REGNUM, arm64_dwarf::v27, LLDB_INVALID_REGNUM,
789 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
799 eFormatVectorOfUInt8,
800 {LLDB_INVALID_REGNUM, arm64_dwarf::v28, LLDB_INVALID_REGNUM,
801 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
811 eFormatVectorOfUInt8,
812 {LLDB_INVALID_REGNUM, arm64_dwarf::v29, LLDB_INVALID_REGNUM,
813 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
823 eFormatVectorOfUInt8,
824 {LLDB_INVALID_REGNUM, arm64_dwarf::v30, LLDB_INVALID_REGNUM,
825 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
835 eFormatVectorOfUInt8,
836 {LLDB_INVALID_REGNUM, arm64_dwarf::v31, LLDB_INVALID_REGNUM,
837 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
849 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
850 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
861 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
862 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
874 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
875 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
886 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
887 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
898 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
899 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
910 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
911 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
922 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
923 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
934 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
935 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
946 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
947 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
958 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
959 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
970 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
971 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
982 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
983 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
994 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
995 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1006 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1007 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1018 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1019 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1030 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1031 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1042 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1043 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1054 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1055 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1066 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1067 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1078 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1079 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1090 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1091 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1102 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1103 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1114 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1115 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1126 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1127 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1138 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1139 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1150 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1151 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1162 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1163 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1174 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1175 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1186 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1187 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1198 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1199 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1210 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1211 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1222 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1223 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1234 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1235 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1246 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1247 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1259 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1260 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1271 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1272 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1283 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1284 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1295 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1296 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1307 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1308 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1319 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1320 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1331 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1332 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1343 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1344 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1355 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1356 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1367 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1368 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1379 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1380 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1391 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1392 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1403 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1404 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1415 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1416 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1427 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1428 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1439 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1440 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1451 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1452 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1463 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1464 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1475 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1476 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1487 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1488 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1499 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1500 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1511 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1512 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1523 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1524 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1535 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1536 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1547 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1548 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1559 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1560 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1571 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1572 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1583 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1584 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1595 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1596 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1607 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1608 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1619 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1620 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1631 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1632 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},
1638 static const uint32_t k_num_register_infos =
1639 llvm::array_lengthof(g_register_infos);
1640 static bool g_register_info_names_constified = false;
1642 const lldb_private::RegisterInfo *
1643 ABIMacOSX_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();
1658 count = k_num_register_infos;
1659 return g_register_infos;
1662 size_t ABIMacOSX_arm64::GetRedZoneSize() const { return 128; }
1664 //------------------------------------------------------------------
1666 //------------------------------------------------------------------
1669 ABIMacOSX_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();
1674 if (vendor_type == llvm::Triple::Apple) {
1675 if (arch_type == llvm::Triple::aarch64) {
1677 g_abi_sp.reset(new ABIMacOSX_arm64(process_sp));
1685 bool 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();
1692 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
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);
1702 for (size_t i = 0; i < args.size(); ++i)
1703 s.Printf(", arg%d = 0x%" PRIx64, static_cast<int>(i + 1), args[i]);
1705 log->PutString(s.GetString());
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);
1715 // x0 - x7 contain first 8 simple args
1716 if (args.size() > 8) // TODO handle more than 6 arguments
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);
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]))
1729 // Set "lr" to the return address
1730 if (!reg_ctx->WriteRegisterFromUnsigned(
1731 reg_ctx->GetRegisterInfoAtIndex(ra_reg_num), return_addr))
1734 // Set "sp" to the requested value
1735 if (!reg_ctx->WriteRegisterFromUnsigned(
1736 reg_ctx->GetRegisterInfoAtIndex(sp_reg_num), sp))
1739 // Set "pc" to the address requested
1740 if (!reg_ctx->WriteRegisterFromUnsigned(
1741 reg_ctx->GetRegisterInfoAtIndex(pc_reg_num), func_addr))
1747 bool ABIMacOSX_arm64::GetArgumentValues(Thread &thread,
1748 ValueList &values) const {
1749 uint32_t num_values = values.GetSize();
1751 ExecutionContext exe_ctx(thread.shared_from_this());
1753 // Extract the register context so we can read arguments from registers
1755 RegisterContext *reg_ctx = thread.GetRegisterContext().get();
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);
1770 CompilerType value_type = value->GetCompilerType();
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);
1779 // We only handle integer, pointer and reference types currently...
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);
1793 switch (value_idx) {
1795 reg_info = reg_ctx->GetRegisterInfoByName("x0");
1798 reg_info = reg_ctx->GetRegisterInfoByName("x1");
1801 reg_info = reg_ctx->GetRegisterInfoByName("x2");
1804 reg_info = reg_ctx->GetRegisterInfoByName("x3");
1807 reg_info = reg_ctx->GetRegisterInfoByName("x4");
1810 reg_info = reg_ctx->GetRegisterInfoByName("x5");
1813 reg_info = reg_ctx->GetRegisterInfoByName("x6");
1816 reg_info = reg_ctx->GetRegisterInfoByName("x7");
1822 RegisterValue reg_value;
1824 if (reg_ctx->ReadRegister(reg_info, reg_value)) {
1826 reg_value.SignExtend(bit_width);
1827 if (!reg_value.GetScalarValue(value->GetScalar()))
1835 // Read the stack pointer if we already haven't read it
1836 sp = reg_ctx->GetSP(0);
1841 // Arguments 5 on up are on the stack
1842 const uint32_t arg_byte_size = (bit_width + (8 - 1)) / 8;
1844 if (!exe_ctx.GetProcessRef().ReadScalarIntegerFromMemory(
1845 sp, arg_byte_size, is_signed, value->GetScalar(), error))
1848 sp += arg_byte_size;
1849 // Align up to the next 8 byte boundary if needed
1863 ABIMacOSX_arm64::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
1864 lldb::ValueObjectSP &new_value_sp) {
1866 if (!new_value_sp) {
1867 error.SetErrorString("Empty value object for return value.");
1871 CompilerType return_value_type = new_value_sp->GetCompilerType();
1872 if (!return_value_type) {
1873 error.SetErrorString("Null clang type for return value.");
1877 Thread *thread = frame_sp->GetThread().get();
1879 RegisterContext *reg_ctx = thread->GetRegisterContext().get();
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());
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);
1902 if (!reg_ctx->WriteRegisterFromUnsigned(x0_info, raw_value))
1903 error.SetErrorString("failed to write register x0");
1905 uint64_t raw_value = data.GetMaxU64(&offset, 8);
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);
1912 if (!reg_ctx->WriteRegisterFromUnsigned(x1_info, raw_value))
1913 error.SetErrorString("failed to write register x1");
1917 error.SetErrorString("We don't support returning longer than 128 bit "
1918 "integer values at present.");
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");
1926 const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
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");
1938 error.SetErrorStringWithFormat(
1939 "returning float values with a byte size of %" PRIu64
1940 " are not supported",
1944 error.SetErrorString("returning float values longer than 128 "
1945 "bits are not supported");
1948 error.SetErrorString("v0 register is not available on this target");
1952 } else if (type_flags & eTypeIsVector) {
1953 if (byte_size > 0) {
1954 const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
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");
1969 error.SetErrorString("no registers are available");
1975 bool ABIMacOSX_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
1976 unwind_plan.Clear();
1977 unwind_plan.SetRegisterKind(eRegisterKindDWARF);
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;
1983 UnwindPlan::RowSP row(new UnwindPlan::Row);
1985 // Our previous Call Frame Address is the stack pointer
1986 row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
1988 // Our previous PC is in the LR
1989 row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true);
1991 unwind_plan.AppendRow(row);
1993 // All other registers are the same.
1995 unwind_plan.SetSourceName("arm64 at-func-entry default");
1996 unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
2001 bool ABIMacOSX_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
2002 unwind_plan.Clear();
2003 unwind_plan.SetRegisterKind(eRegisterKindDWARF);
2005 uint32_t fp_reg_num = arm64_dwarf::fp;
2006 uint32_t pc_reg_num = arm64_dwarf::pc;
2008 UnwindPlan::RowSP row(new UnwindPlan::Row);
2009 const int32_t ptr_size = 8;
2011 row->GetCFAValue().SetIsRegisterPlusOffset(fp_reg_num, 2 * ptr_size);
2014 row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
2015 row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
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);
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.
2029 // We treat x29 as callee preserved also, else the unwinder won't try to
2030 // retrieve fp saves.
2032 bool ABIMacOSX_arm64::RegisterIsVolatile(const RegisterInfo *reg_info) {
2034 const char *name = reg_info->name;
2036 // Sometimes we'll be called with the "alternate" name for these registers;
2037 // recognize them as non-volatile.
2039 if (name[0] == 'p' && name[1] == 'c') // pc
2041 if (name[0] == 'f' && name[1] == 'p') // fp
2043 if (name[0] == 's' && name[1] == 'p') // sp
2045 if (name[0] == 'l' && name[1] == 'r') // lr
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
2055 return false; // x19 is non-volatile
2071 return false; // x20 - 28 are non-volatile
2073 return false; // x29 aka fp treat as non-volatile on Darwin
2077 case '3': // x30 aka lr treat as non-volatile
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
2090 return false; // v8-v9 are non-volatile
2099 return false; // v10-v15 are non-volatile
2111 static 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);
2123 std::unique_ptr<DataBufferHeap> heap_data_ap(
2124 new DataBufferHeap(byte_size, 0));
2125 const ByteOrder byte_order = exe_ctx.GetProcessRef().GetByteOrder();
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) {
2136 const size_t base_byte_size = base_type.GetByteSize(nullptr);
2137 uint32_t data_offset = 0;
2139 for (uint32_t i = 0; i < homogeneous_count; ++i) {
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)
2147 if (base_byte_size > reg_info->byte_size)
2150 RegisterValue reg_value;
2152 if (!reg_ctx->ReadRegister(reg_info, reg_value))
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,
2160 if (bytes_copied != base_byte_size)
2162 data_offset += bytes_copied;
2167 data.SetByteOrder(byte_order);
2168 data.SetAddressByteSize(exe_ctx.GetProcessRef().GetAddressByteSize());
2169 data.SetData(DataBufferSP(heap_data_ap.release()));
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) {
2182 uint32_t reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
2183 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + NGRN);
2184 if (reg_num == LLDB_INVALID_REGNUM)
2187 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_num);
2188 if (reg_info == nullptr)
2191 RegisterValue reg_value;
2193 if (!reg_ctx->ReadRegister(reg_info, reg_value))
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,
2200 if (bytes_copied == 0)
2202 if (bytes_copied >= bytes_left)
2204 data_offset += bytes_copied;
2205 bytes_left -= bytes_copied;
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);
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
2222 uint32_t reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(
2223 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + NGRN);
2224 if (reg_num == LLDB_INVALID_REGNUM)
2226 reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_num);
2227 if (reg_info == nullptr)
2232 if (reg_info == nullptr)
2235 const lldb::addr_t value_addr =
2236 reg_ctx->ReadRegisterAsUnsigned(reg_info, LLDB_INVALID_ADDRESS);
2238 if (value_addr == LLDB_INVALID_ADDRESS)
2241 if (exe_ctx.GetProcessRef().ReadMemory(
2242 value_addr, heap_data_ap->GetBytes(), heap_data_ap->GetByteSize(),
2243 error) != heap_data_ap->GetByteSize()) {
2248 data.SetByteOrder(byte_order);
2249 data.SetAddressByteSize(exe_ctx.GetProcessRef().GetAddressByteSize());
2250 data.SetData(DataBufferSP(heap_data_ap.release()));
2254 ValueObjectSP ABIMacOSX_arm64::GetReturnValueObjectImpl(
2255 Thread &thread, CompilerType &return_compiler_type) const {
2256 ValueObjectSP return_valobj_sp;
2259 ExecutionContext exe_ctx(thread.shared_from_this());
2260 if (exe_ctx.GetTargetPtr() == nullptr || exe_ctx.GetProcessPtr() == nullptr)
2261 return return_valobj_sp;
2263 // value.SetContext (Value::eContextTypeClangType, return_compiler_type);
2264 value.SetCompilerType(return_compiler_type);
2266 RegisterContext *reg_ctx = thread.GetRegisterContext().get();
2268 return return_valobj_sp;
2270 const size_t byte_size = return_compiler_type.GetByteSize(nullptr);
2272 const uint32_t type_flags = return_compiler_type.GetTypeInfo(nullptr);
2273 if (type_flags & eTypeIsScalar || type_flags & eTypeIsPointer) {
2274 value.SetValueType(Value::eValueTypeScalar);
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);
2283 uint64_t raw_value =
2284 thread.GetRegisterContext()->ReadRegisterAsUnsigned(x0_reg_info,
2286 const bool is_signed = (type_flags & eTypeIsSigned) != 0;
2287 switch (byte_size) {
2290 case 16: // uint128_t
2291 // In register x0 and x1
2293 const RegisterInfo *x1_reg_info =
2294 reg_ctx->GetRegisterInfoByName("x1", 0);
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)) {
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)) {
2315 DataBufferSP(heap_data_ap.release()), byte_order,
2316 exe_ctx.GetProcessRef().GetAddressByteSize());
2318 return_valobj_sp = ValueObjectConstResult::Create(
2319 &thread, return_compiler_type, ConstString(""), data);
2320 return return_valobj_sp;
2327 case sizeof(uint64_t):
2329 value.GetScalar() = (int64_t)(raw_value);
2331 value.GetScalar() = (uint64_t)(raw_value);
2335 case sizeof(uint32_t):
2337 value.GetScalar() = (int32_t)(raw_value & UINT32_MAX);
2339 value.GetScalar() = (uint32_t)(raw_value & UINT32_MAX);
2343 case sizeof(uint16_t):
2345 value.GetScalar() = (int16_t)(raw_value & UINT16_MAX);
2347 value.GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
2351 case sizeof(uint8_t):
2353 value.GetScalar() = (int8_t)(raw_value & UINT8_MAX);
2355 value.GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
2361 } else if (type_flags & eTypeIsFloat) {
2362 if (type_flags & eTypeIsComplex) {
2363 // Don't handle complex yet.
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)) {
2371 if (v0_value.GetData(data)) {
2372 lldb::offset_t offset = 0;
2373 if (byte_size == sizeof(float)) {
2374 value.GetScalar() = data.GetFloat(&offset);
2376 } else if (byte_size == sizeof(double)) {
2377 value.GetScalar() = data.GetDouble(&offset);
2379 } else if (byte_size == sizeof(long double)) {
2380 value.GetScalar() = data.GetLongDouble(&offset);
2390 return_valobj_sp = ValueObjectConstResult::Create(
2391 thread.GetStackFrameAtIndex(0).get(), value, ConstString(""));
2392 } else if (type_flags & eTypeIsVector) {
2393 if (byte_size > 0) {
2395 const RegisterInfo *v0_info = reg_ctx->GetRegisterInfoByName("v0", 0);
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)) {
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()),
2410 exe_ctx.GetProcessRef().GetAddressByteSize());
2411 return_valobj_sp = ValueObjectConstResult::Create(
2412 &thread, return_compiler_type, ConstString(""), data);
2418 } else if (type_flags & eTypeIsStructUnion || type_flags & eTypeIsClass) {
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,
2427 return_valobj_sp = ValueObjectConstResult::Create(
2428 &thread, return_compiler_type, ConstString(""), data);
2431 return return_valobj_sp;
2434 void ABIMacOSX_arm64::Initialize() {
2435 PluginManager::RegisterPlugin(GetPluginNameStatic(), pluginDesc,
2439 void ABIMacOSX_arm64::Terminate() {
2440 PluginManager::UnregisterPlugin(CreateInstance);
2443 //------------------------------------------------------------------
2444 // PluginInterface protocol
2445 //------------------------------------------------------------------
2447 ConstString ABIMacOSX_arm64::GetPluginNameStatic() {
2448 static ConstString g_plugin_name("ABIMacOSX_arm64");
2449 return g_plugin_name;
2452 uint32_t ABIMacOSX_arm64::GetPluginVersion() { return 1; }