906 if (data ==
nullptr || size == 0)
915 addr_t current_func_text_offset = 0;
916 int current_sp_bytes_offset_from_fa = 0;
917 bool is_aligned =
false;
944 std::vector<bool> saved_registers(32,
false);
951 std::optional<UnwindPlan::Row>
952 prologue_completed_row;
953 int prologue_completed_sp_bytes_offset_from_cfa = 0;
955 bool prologue_completed_is_aligned =
false;
956 std::vector<bool> prologue_completed_saved_registers;
958 while (current_func_text_offset < size) {
959 int stack_offset, insn_len;
964 bool in_epilogue =
false;
965 bool row_updated =
false;
966 bool current_sp_offset_updated =
979 auto fa_value_ptr = is_aligned ? &afa_value : &cfa_value;
983 fa_value_ptr->SetIsRegisterPlusOffset(
991 fa_value_ptr->SetIsRegisterPlusOffset(
998 current_sp_bytes_offset_from_fa = 0;
999 afa_value.SetIsRegisterPlusOffset(
1001 fa_value_ptr = &afa_value;
1010 fa_value_ptr = &cfa_value;
1011 afa_value.SetUnspecified();
1015 current_sp_bytes_offset_from_fa = fa_value_ptr->GetOffset();
1016 current_sp_offset_updated =
true;
1024 fa_value_ptr = &cfa_value;
1025 afa_value.SetUnspecified();
1029 current_sp_bytes_offset_from_fa = fa_value_ptr->GetOffset();
1030 current_sp_offset_updated =
true;
1043 current_sp_bytes_offset_from_fa +=
m_wordsize;
1044 current_sp_offset_updated =
true;
1049 fa_value_ptr->SetOffset(current_sp_bytes_offset_from_fa);
1056 !saved_registers[machine_regno]) {
1063 saved_registers[machine_regno] =
true;
1069 current_sp_bytes_offset_from_fa -=
m_wordsize;
1070 current_sp_offset_updated =
true;
1074 saved_registers[machine_regno]) {
1075 saved_registers[machine_regno] =
false;
1078 if (lldb_regno == fa_value_ptr->GetRegisterNumber()) {
1079 fa_value_ptr->SetIsRegisterPlusOffset(
1090 fa_value_ptr->SetIsRegisterPlusOffset(
1097 current_sp_bytes_offset_from_fa -=
m_wordsize;
1098 current_sp_offset_updated =
true;
1100 fa_value_ptr->SetIsRegisterPlusOffset(
1120 fa_value_ptr = &cfa_value;
1121 afa_value.SetUnspecified();
1127 fa_value_ptr->SetIsRegisterPlusOffset(
1130 current_sp_bytes_offset_from_fa = fa_value_ptr->GetOffset();
1133 current_sp_bytes_offset_from_fa -=
m_wordsize;
1134 current_sp_offset_updated =
true;
1137 fa_value_ptr->SetIsRegisterPlusOffset(
1148 !saved_registers[machine_regno]) {
1149 saved_registers[machine_regno] =
true;
1169 current_sp_bytes_offset_from_fa += stack_offset;
1170 current_sp_offset_updated =
true;
1172 fa_value_ptr->SetOffset(current_sp_bytes_offset_from_fa);
1178 current_sp_bytes_offset_from_fa -= stack_offset;
1179 current_sp_offset_updated =
true;
1181 fa_value_ptr->SetOffset(current_sp_bytes_offset_from_fa);
1189 current_sp_bytes_offset_from_fa +=
m_wordsize;
1190 current_sp_offset_updated =
true;
1192 fa_value_ptr->SetOffset(current_sp_bytes_offset_from_fa);
1198 current_sp_bytes_offset_from_fa -= stack_offset;
1199 current_sp_offset_updated =
true;
1201 fa_value_ptr->SetOffset(current_sp_bytes_offset_from_fa);
1204 if (stack_offset > 0)
1212 fa_value_ptr = &cfa_value;
1213 afa_value.SetUnspecified();
1217 current_sp_bytes_offset_from_fa =
1218 fa_value_ptr->GetOffset() - stack_offset;
1219 current_sp_offset_updated =
true;
1227 fa_value_ptr = &cfa_value;
1228 afa_value.SetUnspecified();
1232 current_sp_bytes_offset_from_fa = fa_value_ptr->GetOffset() - stack_offset;
1233 current_sp_offset_updated =
true;
1237 else if (prologue_completed_row &&
1257 (
sp.IsCFAPlusOffset() &&
sp.GetOffset() == 0 &&
1262 row = *prologue_completed_row;
1263 current_sp_bytes_offset_from_fa =
1264 prologue_completed_sp_bytes_offset_from_cfa;
1265 current_sp_offset_updated =
true;
1266 is_aligned = prologue_completed_is_aligned;
1268 saved_registers = prologue_completed_saved_registers;
1281 current_sp_bytes_offset_from_fa +=
m_wordsize;
1282 current_sp_offset_updated =
true;
1284 fa_value_ptr->SetOffset(current_sp_bytes_offset_from_fa);
1290 if (current_func_text_offset + insn_len < size) {
1291 row.
SetOffset(current_func_text_offset + insn_len);
1296 if (!in_epilogue && row_updated) {
1298 prologue_completed_row = row;
1299 prologue_completed_saved_registers = saved_registers;
1304 if (!in_epilogue && current_sp_offset_updated) {
1305 prologue_completed_sp_bytes_offset_from_cfa =
1306 current_sp_bytes_offset_from_fa;
1307 prologue_completed_is_aligned = is_aligned;
1311 current_func_text_offset += insn_len;