[Lldb-commits] [PATCH] D17295: Stack unwinding emulation: handle adjustment of FP

Tamas Berghammer via lldb-commits lldb-commits at lists.llvm.org
Tue Feb 16 09:50:10 PST 2016


tberghammer created this revision.
tberghammer added reviewers: ovyalov, jasonmolenda, clayborg.
tberghammer added a subscriber: lldb-commits.

Stack unwinding emulation: handle adjustment of FP

This change is improving the instruction emulation based unwinding to
handle when the frame pointer is adjusted (increment/decrement) after
it has been initialized. The situation can occur in the prologue of
some function where FP is adjusted before it is copied back to SP.

Example code (thumb, generated by gcc 4.8):
< +0>: push  {r4, r7, lr}
< +2>: sub   sp, #0x14
< +4>: add   r7, sp, #0x0
...
<+50>: adds  r7, #0x14 ; The CL fixes the handling of this instruction
<+52>: mov   sp, r7    ; Previously unwinding from here was broken
<+54>: pop   {r4, r7, pc}

http://reviews.llvm.org/D17295

Files:
  source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp

Index: source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
===================================================================
--- source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
+++ source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
@@ -554,7 +554,6 @@
         case EmulateInstruction::eContextTableBranchReadMemory:
         case EmulateInstruction::eContextWriteRegisterRandomBits:
         case EmulateInstruction::eContextWriteMemoryRandomBits:
-        case EmulateInstruction::eContextArithmetic:
         case EmulateInstruction::eContextAdvancePC:    
         case EmulateInstruction::eContextReturnFromException:
         case EmulateInstruction::eContextPushRegisterOnStack:
@@ -573,6 +572,22 @@
 //            }
             break;
 
+        case EmulateInstruction::eContextArithmetic:
+            {
+                // If we adjusted the current frame pointer by a constant then adjust the CFA offset
+                // with the same amount.
+                lldb::RegisterKind kind = m_unwind_plan_ptr->GetRegisterKind();
+                if (m_fp_is_cfa && reg_info->kinds[kind] == m_cfa_reg_info.kinds[kind] &&
+                    context.info_type == EmulateInstruction::eInfoTypeRegisterPlusOffset &&
+                    context.info.RegisterPlusOffset.reg.kinds[kind] == m_cfa_reg_info.kinds[kind])
+                {
+                    const int64_t offset = context.info.RegisterPlusOffset.signed_offset;
+                    m_curr_row->GetCFAValue().IncOffset(-1 * offset);
+                    m_curr_row_modified = true;
+                }
+            }
+            break;
+
         case EmulateInstruction::eContextAbsoluteBranchRegister:
         case EmulateInstruction::eContextRelativeBranchImmediate:
             {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D17295.48078.patch
Type: text/x-patch
Size: 1837 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160216/769f362d/attachment.bin>


More information about the lldb-commits mailing list