[libcxx-commits] [PATCH] D106626: [libunwind] Allow restoring SP while unwinding.
Marco Vanotti via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jul 22 19:07:35 PDT 2021
charco updated this revision to Diff 361064.
charco edited the summary of this revision.
charco added a comment.
update commit msg
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D106626/new/
https://reviews.llvm.org/D106626
Files:
libunwind/src/DwarfInstructions.hpp
Index: libunwind/src/DwarfInstructions.hpp
===================================================================
--- libunwind/src/DwarfInstructions.hpp
+++ libunwind/src/DwarfInstructions.hpp
@@ -167,6 +167,16 @@
// restore registers that DWARF says were saved
R newRegisters = registers;
+
+ // Typically, the CFA is the stack pointer at the call site in
+ // the previous frame. However, there are scenarios in which this is not
+ // true. For example, if we switched to a new stack. In that case, the
+ // value of the previous SP might be indicated by a CFI directive.
+ //
+ // We set the SP here to the CFA, allowing for it to be overridden
+ // by a CFI directive later on.
+ newRegisters.setSP(cfa);
+
pint_t returnAddress = 0;
const int lastReg = R::lastDwarfRegNum();
assert(static_cast<int>(CFI_Parser<A>::kMaxRegisterNumber) >= lastReg &&
@@ -200,10 +210,6 @@
}
}
- // By definition, the CFA is the stack pointer at the call site, so
- // restoring SP means setting it to CFA.
- newRegisters.setSP(cfa);
-
isSignalFrame = cieInfo.isSignalFrame;
#if defined(_LIBUNWIND_TARGET_AARCH64)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D106626.361064.patch
Type: text/x-patch
Size: 1216 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20210723/c6a67377/attachment.bin>
More information about the libcxx-commits
mailing list