22 #include "llvm/Support/MathExtras.h"
35 UNWIND_IS_NOT_FUNCTION_START = 0x80000000, UNWIND_HAS_LSDA = 0x40000000,
36 UNWIND_PERSONALITY_MASK = 0x30000000,
40 UNWIND_X86_MODE_MASK = 0x0F000000,
41 UNWIND_X86_MODE_EBP_FRAME = 0x01000000,
42 UNWIND_X86_MODE_STACK_IMMD = 0x02000000,
43 UNWIND_X86_MODE_STACK_IND = 0x03000000,
44 UNWIND_X86_MODE_DWARF = 0x04000000,
46 UNWIND_X86_EBP_FRAME_REGISTERS = 0x00007FFF,
47 UNWIND_X86_EBP_FRAME_OFFSET = 0x00FF0000,
49 UNWIND_X86_FRAMELESS_STACK_SIZE = 0x00FF0000,
50 UNWIND_X86_FRAMELESS_STACK_ADJUST = 0x0000E000,
51 UNWIND_X86_FRAMELESS_STACK_REG_COUNT = 0x00001C00,
52 UNWIND_X86_FRAMELESS_STACK_REG_PERMUTATION = 0x000003FF,
54 UNWIND_X86_DWARF_SECTION_OFFSET = 0x00FFFFFF,
68 UNWIND_X86_64_MODE_MASK = 0x0F000000,
69 UNWIND_X86_64_MODE_RBP_FRAME = 0x01000000,
70 UNWIND_X86_64_MODE_STACK_IMMD = 0x02000000,
71 UNWIND_X86_64_MODE_STACK_IND = 0x03000000,
72 UNWIND_X86_64_MODE_DWARF = 0x04000000,
74 UNWIND_X86_64_RBP_FRAME_REGISTERS = 0x00007FFF,
75 UNWIND_X86_64_RBP_FRAME_OFFSET = 0x00FF0000,
77 UNWIND_X86_64_FRAMELESS_STACK_SIZE = 0x00FF0000,
78 UNWIND_X86_64_FRAMELESS_STACK_ADJUST = 0x0000E000,
79 UNWIND_X86_64_FRAMELESS_STACK_REG_COUNT = 0x00001C00,
80 UNWIND_X86_64_FRAMELESS_STACK_REG_PERMUTATION = 0x000003FF,
82 UNWIND_X86_64_DWARF_SECTION_OFFSET = 0x00FFFFFF,
96 UNWIND_ARM64_MODE_MASK = 0x0F000000,
97 UNWIND_ARM64_MODE_FRAMELESS = 0x02000000,
98 UNWIND_ARM64_MODE_DWARF = 0x03000000,
99 UNWIND_ARM64_MODE_FRAME = 0x04000000,
101 UNWIND_ARM64_FRAME_X19_X20_PAIR = 0x00000001,
102 UNWIND_ARM64_FRAME_X21_X22_PAIR = 0x00000002,
103 UNWIND_ARM64_FRAME_X23_X24_PAIR = 0x00000004,
104 UNWIND_ARM64_FRAME_X25_X26_PAIR = 0x00000008,
105 UNWIND_ARM64_FRAME_X27_X28_PAIR = 0x00000010,
106 UNWIND_ARM64_FRAME_D8_D9_PAIR = 0x00000100,
107 UNWIND_ARM64_FRAME_D10_D11_PAIR = 0x00000200,
108 UNWIND_ARM64_FRAME_D12_D13_PAIR = 0x00000400,
109 UNWIND_ARM64_FRAME_D14_D15_PAIR = 0x00000800,
111 UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK = 0x00FFF000,
112 UNWIND_ARM64_DWARF_SECTION_OFFSET = 0x00FFFFFF,
116 UNWIND_ARM_MODE_MASK = 0x0F000000,
117 UNWIND_ARM_MODE_FRAME = 0x01000000,
118 UNWIND_ARM_MODE_FRAME_D = 0x02000000,
119 UNWIND_ARM_MODE_DWARF = 0x04000000,
121 UNWIND_ARM_FRAME_STACK_ADJUST_MASK = 0x00C00000,
123 UNWIND_ARM_FRAME_FIRST_PUSH_R4 = 0x00000001,
124 UNWIND_ARM_FRAME_FIRST_PUSH_R5 = 0x00000002,
125 UNWIND_ARM_FRAME_FIRST_PUSH_R6 = 0x00000004,
127 UNWIND_ARM_FRAME_SECOND_PUSH_R8 = 0x00000008,
128 UNWIND_ARM_FRAME_SECOND_PUSH_R9 = 0x00000010,
129 UNWIND_ARM_FRAME_SECOND_PUSH_R10 = 0x00000020,
130 UNWIND_ARM_FRAME_SECOND_PUSH_R11 = 0x00000040,
131 UNWIND_ARM_FRAME_SECOND_PUSH_R12 = 0x00000080,
133 UNWIND_ARM_FRAME_D_REG_COUNT_MASK = 0x00000700,
135 UNWIND_ARM_DWARF_SECTION_OFFSET = 0x00FFFFFF,
139 #ifndef UNWIND_SECOND_LEVEL_REGULAR
140 #define UNWIND_SECOND_LEVEL_REGULAR 2
143 #ifndef UNWIND_SECOND_LEVEL_COMPRESSED
144 #define UNWIND_SECOND_LEVEL_COMPRESSED 3
147 #ifndef UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET
148 #define UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entry) (entry & 0x00FFFFFF)
151 #ifndef UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX
152 #define UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX(entry) \
153 ((entry >> 24) & 0xFF)
156 #define EXTRACT_BITS(value, mask) \
158 llvm::countTrailingZeros(static_cast<uint32_t>(mask), llvm::ZB_Width)) & \
159 (((1 << llvm::countPopulation(static_cast<uint32_t>(mask)))) - 1))
163 CompactUnwindInfo::CompactUnwindInfo(
ObjectFile &objfile, SectionSP §ion_sp)
164 : m_objfile(objfile), m_section_sp(section_sp),
165 m_section_contents_if_encrypted(), m_mutex(), m_indexes(),
167 m_unwindinfo_data_computed(false), m_unwind_header() {}
191 Address::DumpStyle::DumpStyleResolvedDescriptionNoFunctionArguments,
192 Address::DumpStyle::DumpStyleFileAddress,
194 LLDB_LOGF(log,
"Got compact unwind encoding 0x%x for function %s",
202 addr_t func_range_start_file_addr =
213 if (arch.GetTriple().getArch() == llvm::Triple::x86_64) {
217 if (arch.GetTriple().getArch() == llvm::Triple::aarch64 ||
218 arch.GetTriple().getArch() == llvm::Triple::aarch64_32) {
221 if (arch.GetTriple().getArch() == llvm::Triple::x86) {
224 if (arch.GetTriple().getArch() == llvm::Triple::arm ||
225 arch.GetTriple().getArch() == llvm::Triple::thumb) {
246 std::lock_guard<std::mutex> guard(
m_mutex);
258 log,
"Reading compact unwind first-level indexes");
264 if (process_sp.get() ==
nullptr)
267 std::make_shared<DataBufferHeap>(
m_section_sp->GetByteSize(), 0);
269 if (process_sp->ReadMemory(
270 m_section_sp->GetLoadBaseAddress(&process_sp->GetTarget()),
276 process_sp->GetTarget().GetArchitecture().GetAddressByteSize());
278 process_sp->GetTarget().GetArchitecture().GetByteOrder());
321 "encountered in compact unwind "
338 bool clear_address_zeroth_bit =
false;
340 if (arch.GetTriple().getArch() == llvm::Triple::arm ||
341 arch.GetTriple().getArch() == llvm::Triple::thumb)
342 clear_address_zeroth_bit =
true;
345 offset = indexSectionOffset;
346 for (
uint32_t idx = 0; idx < indexCount; idx++) {
354 if (second_level_offset >
m_section_sp->GetByteSize() ||
359 if (clear_address_zeroth_bit)
360 function_offset &= ~1ull;
371 if (second_level_offset == 0) {
396 offset_t offset = first_entry + (mid * 8);
400 if (mid_func_offset == function_offset) {
401 return mid_lsda_offset;
403 if (mid_func_offset < function_offset) {
420 offset_t first_entry = entry_page_offset;
427 offset_t offset = first_entry + (mid * 8);
432 offset = first_entry + ((mid + 1) * 8);
435 if (mid_func_offset <= function_offset) {
436 if (mid == last || (next_func_offset > function_offset)) {
437 if (entry_func_start_offset)
438 *entry_func_start_offset = mid_func_offset;
439 if (mid != last && entry_func_end_offset)
440 *entry_func_end_offset = next_func_offset;
441 return first_entry + (mid * 8);
456 offset_t first_entry = entry_page_offset;
463 offset_t offset = first_entry + (mid * 4);
466 mid_func_offset += function_offset_base;
469 offset = first_entry + ((mid + 1) * 4);
472 next_func_offset += function_offset_base;
474 if (mid_func_offset <= function_offset_to_find) {
475 if (mid == last || (next_func_offset > function_offset_to_find)) {
476 if (entry_func_start_offset)
477 *entry_func_start_offset = mid_func_offset;
478 if (mid != last && entry_func_end_offset)
479 *entry_func_end_offset = next_func_offset;
505 if (text_sect.get()) {
506 text_section_file_address = text_sect->GetFileAddress();
518 std::vector<UnwindIndex>::const_iterator it;
529 if (it->sentinal_entry) {
533 auto next_it = it + 1;
541 offset_t second_page_offset = it->second_level;
542 offset_t lsda_array_start = it->lsda_array_start;
543 offset_t lsda_array_count = (it->lsda_array_end - it->lsda_array_start) / 8;
545 offset_t offset = second_page_offset;
565 second_page_offset + entry_page_offset, entry_count, function_offset,
573 if (unwind_info.
encoding & UNWIND_HAS_LSDA) {
577 lsda_array_start, lsda_array_count, function_offset);
578 addr_t objfile_base_address =
581 objfile_base_address + lsda_offset, sl);
584 if (unwind_info.
encoding & UNWIND_PERSONALITY_MASK) {
588 if (personality_index > 0) {
592 offset += 4 * personality_index;
596 addr_t objfile_base_address =
599 objfile_base_address + personality_offset, sl);
631 second_page_offset + entry_page_offset, entry_count, function_offset,
642 (encoding_index *
sizeof(
uint32_t));
646 uint32_t page_specific_entry_index =
648 offset = second_page_offset + encodings_page_offset +
649 (page_specific_entry_index *
sizeof(
uint32_t));
657 if (unwind_info.
encoding & UNWIND_HAS_LSDA) {
661 lsda_array_start, lsda_array_count, function_offset);
662 addr_t objfile_base_address =
665 objfile_base_address + lsda_offset, sl);
668 if (unwind_info.
encoding & UNWIND_PERSONALITY_MASK) {
672 if (personality_index > 0) {
676 offset += 4 * personality_index;
680 addr_t objfile_base_address =
683 objfile_base_address + personality_offset, sl);
717 switch (unwind_regno) {
738 Address pc_or_function_start) {
750 const int wordsize = 8;
751 int mode = function_info.
encoding & UNWIND_X86_64_MODE_MASK;
753 case UNWIND_X86_64_MODE_RBP_FRAME: {
754 row->GetCFAValue().SetIsRegisterPlusOffset(
759 wordsize * -2,
true);
761 wordsize * -1,
true);
767 uint32_t saved_registers_locations =
770 saved_registers_offset += 2;
772 for (
int i = 0; i < 5; i++) {
773 uint32_t regnum = saved_registers_locations & 0x7;
782 row->SetRegisterLocationToAtCFAPlusOffset(
784 wordsize * -saved_registers_offset,
true);
787 saved_registers_offset--;
788 saved_registers_locations >>= 3;
794 case UNWIND_X86_64_MODE_STACK_IND: {
801 case UNWIND_X86_64_MODE_STACK_IMMD: {
803 UNWIND_X86_64_FRAMELESS_STACK_SIZE);
805 function_info.
encoding, UNWIND_X86_64_FRAMELESS_STACK_REG_COUNT);
807 function_info.
encoding, UNWIND_X86_64_FRAMELESS_STACK_REG_PERMUTATION);
809 if (mode == UNWIND_X86_64_MODE_STACK_IND &&
812 function_info.
encoding, UNWIND_X86_64_FRAMELESS_STACK_ADJUST);
817 function_info.
encoding, UNWIND_X86_64_FRAMELESS_STACK_SIZE);
824 subl_payload_addr.
Slide(offset_to_subl_insn);
826 uint64_t large_stack_size = process_sp->ReadUnsignedIntegerFromMemory(
828 if (large_stack_size != 0 &&
error.Success()) {
830 stack_size = large_stack_size + (stack_adjust * wordsize);
842 int32_t offset = mode == UNWIND_X86_64_MODE_STACK_IND
844 : stack_size * wordsize;
849 wordsize * -1,
true);
852 if (register_count > 0) {
861 int permunreg[6] = {0, 0, 0, 0, 0, 0};
866 switch (register_count) {
868 permunreg[0] = permutation / 120;
869 permutation -= (permunreg[0] * 120);
870 permunreg[1] = permutation / 24;
871 permutation -= (permunreg[1] * 24);
872 permunreg[2] = permutation / 6;
873 permutation -= (permunreg[2] * 6);
874 permunreg[3] = permutation / 2;
875 permutation -= (permunreg[3] * 2);
876 permunreg[4] = permutation;
880 permunreg[0] = permutation / 120;
881 permutation -= (permunreg[0] * 120);
882 permunreg[1] = permutation / 24;
883 permutation -= (permunreg[1] * 24);
884 permunreg[2] = permutation / 6;
885 permutation -= (permunreg[2] * 6);
886 permunreg[3] = permutation / 2;
887 permutation -= (permunreg[3] * 2);
888 permunreg[4] = permutation;
891 permunreg[0] = permutation / 60;
892 permutation -= (permunreg[0] * 60);
893 permunreg[1] = permutation / 12;
894 permutation -= (permunreg[1] * 12);
895 permunreg[2] = permutation / 3;
896 permutation -= (permunreg[2] * 3);
897 permunreg[3] = permutation;
900 permunreg[0] = permutation / 20;
901 permutation -= (permunreg[0] * 20);
902 permunreg[1] = permutation / 4;
903 permutation -= (permunreg[1] * 4);
904 permunreg[2] = permutation;
907 permunreg[0] = permutation / 5;
908 permutation -= (permunreg[0] * 5);
909 permunreg[1] = permutation;
912 permunreg[0] = permutation;
922 bool used[7] = {
false,
false,
false,
false,
false,
false,
false};
923 for (
uint32_t i = 0; i < register_count; i++) {
925 for (
int j = 1; j < 7; j++) {
927 if (renum == permunreg[i]) {
937 uint32_t saved_registers_offset = 1;
938 saved_registers_offset++;
940 for (
int i = (
sizeof(registers) /
sizeof(int)) - 1; i >= 0; i--) {
941 switch (registers[i]) {
950 row->SetRegisterLocationToAtCFAPlusOffset(
952 wordsize * -saved_registers_offset,
true);
953 saved_registers_offset++;
962 case UNWIND_X86_64_MODE_DWARF: {
989 switch (unwind_regno) {
1010 Address pc_or_function_start) {
1022 const int wordsize = 4;
1023 int mode = function_info.
encoding & UNWIND_X86_MODE_MASK;
1025 case UNWIND_X86_MODE_EBP_FRAME: {
1026 row->GetCFAValue().SetIsRegisterPlusOffset(
1030 wordsize * -2,
true);
1032 wordsize * -1,
true);
1038 uint32_t saved_registers_locations =
1041 saved_registers_offset += 2;
1043 for (
int i = 0; i < 5; i++) {
1044 uint32_t regnum = saved_registers_locations & 0x7;
1053 row->SetRegisterLocationToAtCFAPlusOffset(
1055 wordsize * -saved_registers_offset,
true);
1058 saved_registers_offset--;
1059 saved_registers_locations >>= 3;
1065 case UNWIND_X86_MODE_STACK_IND:
1066 case UNWIND_X86_MODE_STACK_IMMD: {
1070 function_info.
encoding, UNWIND_X86_FRAMELESS_STACK_REG_COUNT);
1072 function_info.
encoding, UNWIND_X86_FRAMELESS_STACK_REG_PERMUTATION);
1074 if (mode == UNWIND_X86_MODE_STACK_IND &&
1077 UNWIND_X86_FRAMELESS_STACK_ADJUST);
1089 subl_payload_addr.
Slide(offset_to_subl_insn);
1091 uint64_t large_stack_size = process_sp->ReadUnsignedIntegerFromMemory(
1093 if (large_stack_size != 0 &&
error.Success()) {
1095 stack_size = large_stack_size + (stack_adjust * wordsize);
1108 mode == UNWIND_X86_MODE_STACK_IND ? stack_size : stack_size * wordsize;
1112 wordsize * -1,
true);
1115 if (register_count > 0) {
1124 int permunreg[6] = {0, 0, 0, 0, 0, 0};
1129 switch (register_count) {
1131 permunreg[0] = permutation / 120;
1132 permutation -= (permunreg[0] * 120);
1133 permunreg[1] = permutation / 24;
1134 permutation -= (permunreg[1] * 24);
1135 permunreg[2] = permutation / 6;
1136 permutation -= (permunreg[2] * 6);
1137 permunreg[3] = permutation / 2;
1138 permutation -= (permunreg[3] * 2);
1139 permunreg[4] = permutation;
1143 permunreg[0] = permutation / 120;
1144 permutation -= (permunreg[0] * 120);
1145 permunreg[1] = permutation / 24;
1146 permutation -= (permunreg[1] * 24);
1147 permunreg[2] = permutation / 6;
1148 permutation -= (permunreg[2] * 6);
1149 permunreg[3] = permutation / 2;
1150 permutation -= (permunreg[3] * 2);
1151 permunreg[4] = permutation;
1154 permunreg[0] = permutation / 60;
1155 permutation -= (permunreg[0] * 60);
1156 permunreg[1] = permutation / 12;
1157 permutation -= (permunreg[1] * 12);
1158 permunreg[2] = permutation / 3;
1159 permutation -= (permunreg[2] * 3);
1160 permunreg[3] = permutation;
1163 permunreg[0] = permutation / 20;
1164 permutation -= (permunreg[0] * 20);
1165 permunreg[1] = permutation / 4;
1166 permutation -= (permunreg[1] * 4);
1167 permunreg[2] = permutation;
1170 permunreg[0] = permutation / 5;
1171 permutation -= (permunreg[0] * 5);
1172 permunreg[1] = permutation;
1175 permunreg[0] = permutation;
1185 bool used[7] = {
false,
false,
false,
false,
false,
false,
false};
1186 for (
uint32_t i = 0; i < register_count; i++) {
1188 for (
int j = 1; j < 7; j++) {
1190 if (renum == permunreg[i]) {
1200 uint32_t saved_registers_offset = 1;
1201 saved_registers_offset++;
1203 for (
int i = (
sizeof(registers) /
sizeof(int)) - 1; i >= 0; i--) {
1204 switch (registers[i]) {
1213 row->SetRegisterLocationToAtCFAPlusOffset(
1215 wordsize * -saved_registers_offset,
true);
1216 saved_registers_offset++;
1226 case UNWIND_X86_MODE_DWARF: {
1307 Address pc_or_function_start) {
1319 const int wordsize = 8;
1320 int mode = function_info.
encoding & UNWIND_ARM64_MODE_MASK;
1322 if (mode == UNWIND_ARM64_MODE_DWARF)
1325 if (mode == UNWIND_ARM64_MODE_FRAMELESS) {
1330 UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK)) *
1345 if (mode != UNWIND_ARM64_MODE_FRAME)
1358 int reg_pairs_saved_count = 1;
1362 if (saved_register_bits & UNWIND_ARM64_FRAME_X19_X20_PAIR) {
1363 int cfa_offset = reg_pairs_saved_count * -2 * wordsize;
1364 cfa_offset -= wordsize;
1367 cfa_offset -= wordsize;
1370 reg_pairs_saved_count++;
1373 if (saved_register_bits & UNWIND_ARM64_FRAME_X21_X22_PAIR) {
1374 int cfa_offset = reg_pairs_saved_count * -2 * wordsize;
1375 cfa_offset -= wordsize;
1378 cfa_offset -= wordsize;
1381 reg_pairs_saved_count++;
1384 if (saved_register_bits & UNWIND_ARM64_FRAME_X23_X24_PAIR) {
1385 int cfa_offset = reg_pairs_saved_count * -2 * wordsize;
1386 cfa_offset -= wordsize;
1389 cfa_offset -= wordsize;
1392 reg_pairs_saved_count++;
1395 if (saved_register_bits & UNWIND_ARM64_FRAME_X25_X26_PAIR) {
1396 int cfa_offset = reg_pairs_saved_count * -2 * wordsize;
1397 cfa_offset -= wordsize;
1400 cfa_offset -= wordsize;
1403 reg_pairs_saved_count++;
1406 if (saved_register_bits & UNWIND_ARM64_FRAME_X27_X28_PAIR) {
1407 int cfa_offset = reg_pairs_saved_count * -2 * wordsize;
1408 cfa_offset -= wordsize;
1411 cfa_offset -= wordsize;
1414 reg_pairs_saved_count++;
1421 if (saved_register_bits & UNWIND_ARM64_FRAME_D8_D9_PAIR) {
1422 reg_pairs_saved_count++;
1424 if (saved_register_bits & UNWIND_ARM64_FRAME_D10_D11_PAIR) {
1425 reg_pairs_saved_count++;
1427 if (saved_register_bits & UNWIND_ARM64_FRAME_D12_D13_PAIR) {
1428 reg_pairs_saved_count++;
1430 if (saved_register_bits & UNWIND_ARM64_FRAME_D14_D15_PAIR) {
1431 reg_pairs_saved_count++;
1441 Address pc_or_function_start) {
1453 const int wordsize = 4;
1454 int mode = function_info.
encoding & UNWIND_ARM_MODE_MASK;
1456 if (mode == UNWIND_ARM_MODE_DWARF)
1460 UNWIND_ARM_FRAME_STACK_ADJUST_MASK)) *
1463 row->GetCFAValue().SetIsRegisterPlusOffset(
arm_r7,
1464 (2 * wordsize) + stack_adjust);
1466 row->SetRegisterLocationToAtCFAPlusOffset(
1467 arm_r7, (wordsize * -2) - stack_adjust,
true);
1468 row->SetRegisterLocationToAtCFAPlusOffset(
1469 arm_pc, (wordsize * -1) - stack_adjust,
true);
1470 row->SetRegisterLocationToIsCFAPlusOffset(
arm_sp, 0,
true);
1472 int cfa_offset = -stack_adjust - (2 * wordsize);
1476 if (saved_register_bits & UNWIND_ARM_FRAME_FIRST_PUSH_R6) {
1477 cfa_offset -= wordsize;
1478 row->SetRegisterLocationToAtCFAPlusOffset(
arm_r6, cfa_offset,
true);
1481 if (saved_register_bits & UNWIND_ARM_FRAME_FIRST_PUSH_R5) {
1482 cfa_offset -= wordsize;
1483 row->SetRegisterLocationToAtCFAPlusOffset(
arm_r5, cfa_offset,
true);
1486 if (saved_register_bits & UNWIND_ARM_FRAME_FIRST_PUSH_R4) {
1487 cfa_offset -= wordsize;
1488 row->SetRegisterLocationToAtCFAPlusOffset(
arm_r4, cfa_offset,
true);
1491 if (saved_register_bits & UNWIND_ARM_FRAME_SECOND_PUSH_R12) {
1492 cfa_offset -= wordsize;
1493 row->SetRegisterLocationToAtCFAPlusOffset(
arm_r12, cfa_offset,
true);
1496 if (saved_register_bits & UNWIND_ARM_FRAME_SECOND_PUSH_R11) {
1497 cfa_offset -= wordsize;
1498 row->SetRegisterLocationToAtCFAPlusOffset(
arm_r11, cfa_offset,
true);
1501 if (saved_register_bits & UNWIND_ARM_FRAME_SECOND_PUSH_R10) {
1502 cfa_offset -= wordsize;
1503 row->SetRegisterLocationToAtCFAPlusOffset(
arm_r10, cfa_offset,
true);
1506 if (saved_register_bits & UNWIND_ARM_FRAME_SECOND_PUSH_R9) {
1507 cfa_offset -= wordsize;
1508 row->SetRegisterLocationToAtCFAPlusOffset(
arm_r9, cfa_offset,
true);
1511 if (saved_register_bits & UNWIND_ARM_FRAME_SECOND_PUSH_R8) {
1512 cfa_offset -= wordsize;
1513 row->SetRegisterLocationToAtCFAPlusOffset(
arm_r8, cfa_offset,
true);
1516 if (mode == UNWIND_ARM_MODE_FRAME_D) {
1519 switch (d_reg_bits) {
1523 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d8, cfa_offset,
true);
1529 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d10, cfa_offset,
true);
1531 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d8, cfa_offset,
true);
1538 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d12, cfa_offset,
true);
1540 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d10, cfa_offset,
true);
1542 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d8, cfa_offset,
true);
1550 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d14, cfa_offset,
true);
1552 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d12, cfa_offset,
true);
1554 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d10, cfa_offset,
true);
1556 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d8, cfa_offset,
true);
1564 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d14, cfa_offset,
true);
1566 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d12, cfa_offset,
true);
1580 row->SetRegisterLocationToAtCFAPlusOffset(
arm_d14, cfa_offset,
true);