Add support for mid-function epilogues on x86 that end in a non-local jump.
authorJason Molenda <jmolenda@apple.com>
Mon, 3 Jun 2019 22:34:12 +0000 (22:34 +0000)
committerJason Molenda <jmolenda@apple.com>
Mon, 3 Jun 2019 22:34:12 +0000 (22:34 +0000)
commitc3ea7c66fec021867e005ad1b02f3c7e80feaa85
tree145deba4f8f55240dc4a665528f092530f1ee59a
parent6dc8ce323e24bed62cf9938b60f7323464c0da38
Add support for mid-function epilogues on x86 that end in a non-local jump.

The x86 assembly inspection engine has code to support detecting a
mid-function epilogue that ends in a RET instruction; add support for
recognizing an epilogue that ends in a JMP, and add a check that the
unwind state has been restored to the original stack setup; reinstate
the post-prologue unwind state after this JMP instruction.

The assembly inspection engine used for other architectures,
UnwindAssemblyInstEmulation, detects mid-function epilogues by
tracking branch instructions within the function and "forwards"
the current unwind state to the targets of the branches.  If
an epilogue unwinds the stack and exits, followed by a branch
target, we get back to the correct unwind state.  The x86
unwinder should move to this same algorithm, or possibly even
look at implementing an x86 instruction emulation plugin and
get UnwindAssemblyInstEmulation to work for x86 too.  I added
a branch instruction recognizier method that will be necessary
if we want to switch the algorithm.

Differential Revision: https://reviews.llvm.org/D62764
<rdar://problem/51074422>

llvm-svn: 362456
lldb/source/Plugins/UnwindAssembly/x86/x86AssemblyInspectionEngine.cpp
lldb/source/Plugins/UnwindAssembly/x86/x86AssemblyInspectionEngine.h
lldb/unittests/UnwindAssembly/x86/Testx86AssemblyInspectionEngine.cpp