summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Molenda <jmolenda@apple.com>2014-11-04 05:48:11 +0000
committerJason Molenda <jmolenda@apple.com>2014-11-04 05:48:11 +0000
commit8030ffda9156f6ac290035bcf692823763d77a8f (patch)
tree2f30fd4514bd08d22262f9499221749f13f96666
parent652a3f3257dcb824c9be061994c8f3e22394bb40 (diff)
downloadbcm5719-llvm-8030ffda9156f6ac290035bcf692823763d77a8f.tar.gz
bcm5719-llvm-8030ffda9156f6ac290035bcf692823763d77a8f.zip
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> llvm-svn: 221241
-rw-r--r--lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp b/lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp
index 32a21d2b8bb..d6f8f2457f0 100644
--- a/lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp
+++ b/lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp
@@ -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)
OpenPOWER on IntegriCloud