[Lldb-commits] [lldb] r221241 - Add recognition for another x86 epilogue sequence (ret followed by

Jason Molenda jmolenda at apple.com
Mon Nov 3 21:48:11 PST 2014


Author: jmolenda
Date: Mon Nov  3 23:48:11 2014
New Revision: 221241

URL: http://llvm.org/viewvc/llvm-project?rev=221241&view=rev
Log:
Add recognition for another x86 epilogue sequence (ret followed by
a nop).  Fixes an instruction stepping problem when trying to step
over the final instructions of an epilogue.
<rdar://problem/18068877> 

Modified:
    lldb/trunk/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp

Modified: lldb/trunk/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp?rev=221241&r1=221240&r2=221241&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp (original)
+++ lldb/trunk/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp Mon Nov  3 23:48:11 2014
@@ -804,6 +804,12 @@ loopnext:
     //  [ 0xc3 ] ret
     //  [ 0xe8 xx xx xx xx ] call __stack_chk_fail  (this is sometimes the final insn in the function)
 
+    // or
+
+    //  [ 0x5d ] mov %rbp, %rsp  (aka pop %rbp)
+    //  [ 0xc3 ] ret
+    //  [ 0x0f 0x1f 0x44 xx xx ] nopl (%rax,%rax)   (aka nop)
+
     // We want to add a Row describing how to unwind when we're stopped on the 'ret' instruction where the
     // CFA is no longer defined in terms of rbp, but is now defined in terms of rsp like on function entry.
     // (or the 'jmp' instruction in the second case)
@@ -834,6 +840,11 @@ loopnext:
             {
                 ret_insn_offset = m_func_bounds.GetByteSize() - 6;
             }
+            else if (bytebuf[0] == 0x5d && bytebuf[1] == 0xc3 
+                     && bytebuf[2] == 0x0f && bytebuf[3] == 0x1f & bytebuf[4] == 0x44) // mov & ret & nop
+            {
+                ret_insn_offset = m_func_bounds.GetByteSize() - 6;
+            }
         }
     }
     else if (m_func_bounds.GetByteSize() > 2)





More information about the lldb-commits mailing list