diff options
author | Tamas Berghammer <tberghammer@google.com> | 2015-07-17 11:44:14 +0000 |
---|---|---|
committer | Tamas Berghammer <tberghammer@google.com> | 2015-07-17 11:44:14 +0000 |
commit | 022622f1d4ee7fc981d182868e0d8aded4c346fe (patch) | |
tree | abcfb10a70a8e373b7d04b7c51a02d27a68bd35d /lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp | |
parent | c2672e5dacb8d41f1ddc5ce789fed5d8c5ddd7e7 (diff) | |
download | bcm5719-llvm-022622f1d4ee7fc981d182868e0d8aded4c346fe.tar.gz bcm5719-llvm-022622f1d4ee7fc981d182868e0d8aded4c346fe.zip |
Improve conditional opcode handling in emulation based unwinding
Don't chane the CFI information when a conditional instruction
is emulated (eg.: popeq {r0, pc}) because the CFI for the next
instruction should be the same as the CFI for the current instruction.
Differential revision: http://reviews.llvm.org/D11258
llvm-svn: 242519
Diffstat (limited to 'lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp')
-rw-r--r-- | lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp b/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp index 8f5d9269750..5c016d04e30 100644 --- a/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp +++ b/lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp @@ -511,7 +511,8 @@ UnwindAssemblyInstEmulation::WriteRegister (EmulateInstruction *instruction, log->PutCString(strm.GetData()); } - SetRegisterValue (*reg_info, reg_value); + if (!instruction->IsInstructionConditional()) + SetRegisterValue (*reg_info, reg_value); switch (context.type) { @@ -573,18 +574,21 @@ UnwindAssemblyInstEmulation::WriteRegister (EmulateInstruction *instruction, case EmulateInstruction::eContextPopRegisterOffStack: { - const uint32_t reg_num = reg_info->kinds[m_unwind_plan_ptr->GetRegisterKind()]; - const uint32_t generic_regnum = reg_info->kinds[eRegisterKindGeneric]; - if (reg_num != LLDB_INVALID_REGNUM && generic_regnum != LLDB_REGNUM_GENERIC_SP) + if (!instruction->IsInstructionConditional()) { - m_curr_row->SetRegisterLocationToSame (reg_num, /*must_replace*/ false); - m_curr_row_modified = true; + const uint32_t reg_num = reg_info->kinds[m_unwind_plan_ptr->GetRegisterKind()]; + const uint32_t generic_regnum = reg_info->kinds[eRegisterKindGeneric]; + if (reg_num != LLDB_INVALID_REGNUM && generic_regnum != LLDB_REGNUM_GENERIC_SP) + { + m_curr_row->SetRegisterLocationToSame (reg_num, /*must_replace*/ false); + m_curr_row_modified = true; + } } } break; case EmulateInstruction::eContextSetFramePointer: - if (!m_fp_is_cfa) + if (!m_fp_is_cfa && !instruction->IsInstructionConditional()) { m_fp_is_cfa = true; m_cfa_reg_info = *reg_info; @@ -599,7 +603,7 @@ UnwindAssemblyInstEmulation::WriteRegister (EmulateInstruction *instruction, case EmulateInstruction::eContextAdjustStackPointer: // If we have created a frame using the frame pointer, don't follow // subsequent adjustments to the stack pointer. - if (!m_fp_is_cfa) + if (!m_fp_is_cfa && !instruction->IsInstructionConditional()) { m_curr_row->GetCFAValue().SetIsRegisterPlusOffset( m_curr_row->GetCFAValue().GetRegisterNumber(), |