Commit 6b3fb29e authored by Andrea Corallo's avatar Andrea Corallo

; src/alloc.c: Add a GC reg spill mechanism and Bug#41357 related commentary.

parent 453ffe5d
Pipeline #5625 passed with stage
in 57 minutes and 10 seconds
......@@ -4998,8 +4998,9 @@ mark_stack (char const *bottom, char const *end)
#endif
}
/* This is a trampoline function that flushes registers to the stack,
and then calls FUNC. ARG is passed through to FUNC verbatim.
/* flush_stack_call_func is the trampoline function that flushes
registers to the stack, and then calls FUNC. ARG is passed through
to FUNC verbatim.
This function must be called whenever Emacs is about to release the
global interpreter lock. This lets the garbage collector easily
......@@ -5007,7 +5008,20 @@ mark_stack (char const *bottom, char const *end)
Lisp.
It is invalid to run any Lisp code or to allocate any GC memory
from FUNC. */
from FUNC.
Note: all register spilling is done in flush_stack_call_func before
flush_stack_call_func1 is activated.
flush_stack_call_func1 is responsible for identifying the stack
address range to be scanned. It *must* be carefully kept as
noinline to make sure that registers has been spilled before it is
called, otherwise given __builtin_frame_address (0) typically
returns the frame pointer (base pointer) and not the stack pointer
[1] GC will miss to scan callee-saved registers content
(Bug#41357).
[1] <https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html>. */
NO_INLINE void
flush_stack_call_func1 (void (*func) (void *arg), void *arg)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment