[Lldb-commits] [PATCH] Ignore "push/pop {sp}" in emulation based unwinding

Tamas Berghammer tberghammer at google.com
Mon Jun 29 08:39:17 PDT 2015


Hi jasonmolenda,

Ignore "push/pop {sp}" in emulation based unwinding

These instructions confusing the unwind code because in case of a
push it assumes that the original value of a register is pushed to
the stack what is not necessarily true in case of SP. The same is
true for the pop (in the opposite way).

http://reviews.llvm.org/D10806

Files:
  source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
  test/functionalities/unwind/standard/TestStandardUnwind.py
  test/functionalities/unwind/standard/hand_written/divmod.cpp

Index: source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
===================================================================
--- source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
+++ source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
@@ -422,13 +422,17 @@
         case EmulateInstruction::eContextPushRegisterOnStack:
             {
                 uint32_t reg_num = LLDB_INVALID_REGNUM;
-                const uint32_t unwind_reg_kind = m_unwind_plan_ptr->GetRegisterKind();
+                uint32_t generic_regnum = LLDB_INVALID_REGNUM;
                 if (context.info_type == EmulateInstruction::eInfoTypeRegisterToRegisterPlusOffset)
+                {
+                    const uint32_t unwind_reg_kind = m_unwind_plan_ptr->GetRegisterKind();
                     reg_num = context.info.RegisterToRegisterPlusOffset.data_reg.kinds[unwind_reg_kind];
+                    generic_regnum = context.info.RegisterToRegisterPlusOffset.data_reg.kinds[eRegisterKindGeneric];
+                }
                 else
                     assert (!"unhandled case, add code to handle this!");
 
-                if (reg_num != LLDB_INVALID_REGNUM)
+                if (reg_num != LLDB_INVALID_REGNUM && generic_regnum != LLDB_REGNUM_GENERIC_SP)
                 {
                     if (m_pushed_regs.find (reg_num) == m_pushed_regs.end())
                     {
@@ -570,7 +574,8 @@
         case EmulateInstruction::eContextPopRegisterOffStack:
             {
                 const uint32_t reg_num = reg_info->kinds[m_unwind_plan_ptr->GetRegisterKind()];
-                if (reg_num != LLDB_INVALID_REGNUM)
+                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;
Index: test/functionalities/unwind/standard/TestStandardUnwind.py
===================================================================
--- test/functionalities/unwind/standard/TestStandardUnwind.py
+++ test/functionalities/unwind/standard/TestStandardUnwind.py
@@ -40,8 +40,6 @@
                 "__memcpy_base",         # Function reached by a fall through from the previous function
                 "__memcpy_base_aligned", # Function reached by a fall through from the previous function
                 "__subdf3",              # __aeabi_ui2d jumps into the middle of the function. Possibly missing symbol?
-                "__aeabi_ldivmod",       # llvm.org/pr23879 ("push {sp}" not handled correctly)
-                "__aeabi_uldivmod",      # llvm.org/pr23879 ("push {sp}" not handled correctly)
             ]
             no_step_function_names = [
                 "__sync_fetch_and_add_4", # Calls into a special SO where we can't set a breakpoint
Index: test/functionalities/unwind/standard/hand_written/divmod.cpp
===================================================================
--- /dev/null
+++ test/functionalities/unwind/standard/hand_written/divmod.cpp
@@ -0,0 +1,15 @@
+//===-- divmod.cpp ----------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int
+main(int argc, char const *argv[])
+{
+    signed long long a = 123456789, b = 12, c = a / b, d = a % b;
+    unsigned long long e = 123456789, f = 12, g = e / f, h = e % f;
+}

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10806.28678.patch
Type: text/x-patch
Size: 3766 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150629/2a136f30/attachment.bin>


More information about the lldb-commits mailing list