aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2020-09-08 15:21:51 +0300
committerJonathan Yong <10walls@gmail.com>2020-11-03 00:30:35 +0000
commitbd6ecbe48ada79bb14cbb30ef8318495b5237790 (patch)
tree1f7a9038f9f577216f5962c0333c39257f05802b /libgcc
parent18f8fc9329c8ddd6db272e3c643f28bea11e52e4 (diff)
downloadgcc-bd6ecbe48ada79bb14cbb30ef8318495b5237790.zip
gcc-bd6ecbe48ada79bb14cbb30ef8318495b5237790.tar.gz
gcc-bd6ecbe48ada79bb14cbb30ef8318495b5237790.tar.bz2
libgcc: Expose the instruction pointer and stack pointer in SEH _Unwind_Backtrace
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.
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/unwind-seh.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/libgcc/unwind-seh.c b/libgcc/unwind-seh.c
index 1a70180..275d782 100644
--- a/libgcc/unwind-seh.c
+++ b/libgcc/unwind-seh.c
@@ -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;