libgcc: Expose the instruction pointer and stack pointer in SEH _Unwind_Backtrace
authorMartin Storsjö <martin@martin.st>
Tue, 8 Sep 2020 12:21:51 +0000 (15:21 +0300)
committerJonathan Yong <10walls@gmail.com>
Tue, 3 Nov 2020 00:30:35 +0000 (00:30 +0000)
Previously, the SEH version of _Unwind_Backtrace did unwind
the stack and call the provided callback function as intended,
but there was little the caller could do within the callback to
actually get any info about that particular level in the unwind.

Set the ra and cfa pointers, which are used by _Unwind_GetIP
and _Unwind_GetCFA, to allow using these functions from the
callacb to inspect the state at each stack frame.

2020-09-08  Martin Storsjö  <martin@martin.st>

libgcc/
* unwind-seh.c (_Unwind_Backtrace): Set the ra and cfa pointers
before calling the callback.

libgcc/unwind-seh.c

index 1a70180cfaa12bf54415bef14444b12a1872843f..275d782903ad6eb6b4b72dcb15ad62774607f671 100644 (file)
@@ -466,6 +466,11 @@ _Unwind_Backtrace(_Unwind_Trace_Fn trace,
                            &gcc_context.disp->HandlerData,
                            &gcc_context.disp->EstablisherFrame, NULL);
 
+      /* Set values that the callback can inspect via _Unwind_GetIP
+       * and _Unwind_GetCFA. */
+      gcc_context.ra = ms_context.Rip;
+      gcc_context.cfa = ms_context.Rsp;
+
       /* Call trace function.  */
       if (trace (&gcc_context, trace_argument) != _URC_NO_REASON)
        return _URC_FATAL_PHASE1_ERROR;