]> git.eshelyaron.com Git - emacs.git/commitdiff
; src/alloc.c: Add a GC reg spill mechanism and Bug#41357 related commentary.
authorAndrea Corallo <akrl@sdf.org>
Tue, 19 May 2020 21:33:38 +0000 (22:33 +0100)
committerAndrea Corallo <akrl@sdf.org>
Wed, 20 May 2020 10:32:16 +0000 (11:32 +0100)
src/alloc.c

index b7ebaa63a5b8e32971c8a624b898de542cadded1..d5a6d9167ea92194ab86d49269b7de86227b6eaf 100644 (file)
@@ -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)