When parsing the epilogue of a thumbv2 function, when we see the

frame pointer overwritten with the caller's fp value, return to 
expressing the CFA in terms of the stack pointer.
<rdar://problem/11855862>

llvm-svn: 160150
This commit is contained in:
Jason Molenda 2012-07-12 23:43:02 +00:00
parent 9460fbf219
commit d59fd74eec
1 changed files with 14 additions and 0 deletions

View File

@ -490,6 +490,20 @@ UnwindAssemblyInstEmulation::WriteRegister (EmulateInstruction *instruction,
{
m_curr_row.SetRegisterLocationToSame (reg_num, must_replace);
}
// if we just restored the caller's reg value in the reg we were using for the frame pointer,
// change the CFA to be in terms of the stack pointer again.
if (m_fp_is_cfa && reg_num == m_cfa_reg_info.kinds[m_unwind_plan_ptr->GetRegisterKind()])
{
m_fp_is_cfa = false;
m_inst_emulator_ap->GetRegisterInfo (m_unwind_plan_ptr->GetRegisterKind(),
m_unwind_plan_ptr->GetInitialCFARegister(),
m_cfa_reg_info);
m_curr_row.SetCFARegister(m_cfa_reg_info.kinds[m_unwind_plan_ptr->GetRegisterKind()]);
if (log && log->GetVerbose())
{
log->Printf("UnwindAssemblyInstEmulation::WriteRegister - CFA is expressed in terms of %s again", m_cfa_reg_info.name);
}
}
}
break;