[libunwind] [libunwind] fix unwinding from signal handler (PR #92291)

Saleem Abdulrasool via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 5 08:49:24 PDT 2024


================
@@ -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);
----------------
compnerd wrote:

The idea here is that `cieInfo.isSignalFrame` is a boolean and will increment by 1. However, how do we ensure that the IP should be incremented by 1 and not say 4 or some other size for the instruction? Particularly in the case of an ARMv7 + thumb2 environment, this can potentially change the meaning as the bottom bit is used as an ISA selector.

https://github.com/llvm/llvm-project/pull/92291


More information about the cfe-commits mailing list