[libunwind] [libunwind] fix unwinding from signal handler (PR #92291)
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 15 09:19:01 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libunwind
Author: Azat Khuzhin (azat)
<details>
<summary>Changes</summary>
In case of this is frame of signal handler, the IP should be incremented, because the IP saved in the signal handler points to first non-executed instruction, while FDE/CIE expects IP to be after the first non-executed instruction.
Refs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=26208
---
Full diff: https://github.com/llvm/llvm-project/pull/92291.diff
1 Files Affected:
- (modified) libunwind/src/DwarfInstructions.hpp (+6-1)
``````````diff
diff --git a/libunwind/src/DwarfInstructions.hpp b/libunwind/src/DwarfInstructions.hpp
index bd9ece60ee588..5ea535be4b974 100644
--- a/libunwind/src/DwarfInstructions.hpp
+++ b/libunwind/src/DwarfInstructions.hpp
@@ -365,7 +365,12 @@ int DwarfInstructions<A, R>::stepWithDwarf(A &addressSpace, pint_t pc,
// Return address is address after call site instruction, so setting IP to
// that does simulates a return.
- newRegisters.setIP(returnAddress);
+ //
+ // In case of this is frame of signal handler, the IP should be
+ // incremented, because the IP saved in the signal handler points to
+ // first non-executed instruction, while FDE/CIE expects IP to be after
+ // the first non-executed instruction.
+ newRegisters.setIP(returnAddress + cieInfo.isSignalFrame);
// Simulate the step by replacing the register set with the new ones.
registers = newRegisters;
``````````
</details>
https://github.com/llvm/llvm-project/pull/92291
More information about the cfe-commits
mailing list