Bug where insn-based unwind plans on arm64 could be wrong
authorJason Molenda <jason@molenda.com>
Tue, 14 Apr 2020 23:51:58 +0000 (16:51 -0700)
committerJason Molenda <jason@molenda.com>
Tue, 14 Apr 2020 23:57:25 +0000 (16:57 -0700)
commit1cd92e480c12c03ab9a381b29e4e3964892afa01
tree81c24e90a3763abc39f76348bdb4efd4d529af59
parent2f8b4545f4960778e37114c024073d208751ca89
Bug where insn-based unwind plans on arm64 could be wrong

Fix a bug where UnwindAssemblyInstEmulation would confuse which
register is used to compute the Canonical Frame Address after it
had branched over a mid-function epilogue (where the CFA reg changes
from $fp to $sp in the process of epiloguing).  Reinstate the
correct CFA register after we forward the unwind rule for branch
targets.  The failure mode was that UnwindAssemblyInstEmulation
would think CFA was set in terms of $sp after one of these epilogues,
and if it sees modifications to $sp after the branch target, it would
change the CFA offset in the unwind rule -- even though the CFA is
defined in terms of $fp and the $sp changes are irrelevant to correct
calculation.

<rdar://problem/60300528>

Differential Revision: https://reviews.llvm.org/D78077
lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
lldb/unittests/UnwindAssembly/ARM64/TestArm64InstEmulation.cpp