Fix assertion failure caused by r245546

Change the way EmulateInstruction::eContextPopRegisterOffStack handled
in UnwindAssemblyInstEmulation::WriteRegister to accomodate for
additional cases when eContextPopRegisterOffStack (pop PC/FLAGS).

llvm-svn: 245690
This commit is contained in:
Tamas Berghammer
2015-08-21 10:49:09 +00:00
parent eab960c46f
commit f5d3e66bf5
2 changed files with 25 additions and 11 deletions

View File

@@ -10321,8 +10321,7 @@ EmulateInstructionARM::EmulateLDRDImmediate (const uint32_t opcode, const ARMEnc
return false;
//R[t2] = MemA[address+4,4];
context.SetRegisterPlusOffset (base_reg, (address + 4) - Rn);
context.SetAddress(address + 4);
data = MemARead (context, address + 4, addr_byte_size, 0, &success);
if (!success)
return false;

View File

@@ -580,17 +580,32 @@ UnwindAssemblyInstEmulation::WriteRegister (EmulateInstruction *instruction,
const uint32_t generic_regnum = reg_info->kinds[eRegisterKindGeneric];
if (reg_num != LLDB_INVALID_REGNUM && generic_regnum != LLDB_REGNUM_GENERIC_SP)
{
if (context.info_type == EmulateInstruction::eInfoTypeAddress)
switch (context.info_type)
{
if (m_pushed_regs.find (reg_num) != m_pushed_regs.end () &&
context.info.address == m_pushed_regs[reg_num])
{
m_curr_row->SetRegisterLocationToSame (reg_num, /*must_replace*/ false);
m_curr_row_modified = true;
}
case EmulateInstruction::eInfoTypeAddress:
if (m_pushed_regs.find(reg_num) != m_pushed_regs.end() &&
context.info.address == m_pushed_regs[reg_num])
{
m_curr_row->SetRegisterLocationToSame(reg_num,
false /*must_replace*/);
m_curr_row_modified = true;
}
break;
case EmulateInstruction::eInfoTypeISA:
assert((generic_regnum == LLDB_REGNUM_GENERIC_PC ||
generic_regnum == LLDB_REGNUM_GENERIC_FLAGS) &&
"eInfoTypeISA used for poping a register other the the PC/FLAGS");
if (generic_regnum != LLDB_REGNUM_GENERIC_FLAGS)
{
m_curr_row->SetRegisterLocationToSame(reg_num,
false /*must_replace*/);
m_curr_row_modified = true;
}
break;
default:
assert(false && "unhandled case, add code to handle this!");
break;
}
else
assert (!"unhandled case, add code to handle this!");
}
}
}