]> git.eshelyaron.com Git - emacs.git/commitdiff
* Fix Garbage Collector for missing calle-saved regs content (Bug#41357)
authorAndrea Corallo <akrl@sdf.org>
Sun, 17 May 2020 12:23:59 +0000 (13:23 +0100)
committerAndrea Corallo <akrl@sdf.org>
Sun, 17 May 2020 21:37:28 +0000 (22:37 +0100)
* src/alloc.c (SET_STACK_TOP_ADDRESS): Do not call
__builtin_unwind_init.
(flush_stack_call_func1): Rename from 'flush_stack_call_func'.
(flush_stack_call_func): New function to spill all registers
before calling 'flush_stack_call_func1'.  This to make sure the
top of the stack identified includes those registers.

src/alloc.c
src/lisp.h

index cc9ba8dbf50902dc39f20e6c2863ebcbc4e849dd..ebc55857ea02f5692c03dfb8a5f4244fde8d78cf 100644 (file)
@@ -4944,12 +4944,10 @@ typedef union
 #ifdef HAVE___BUILTIN_UNWIND_INIT
 # define SET_STACK_TOP_ADDRESS(p)      \
    stacktop_sentry sentry;             \
-   __builtin_unwind_init ();           \
    *(p) = NEAR_STACK_TOP (&sentry)
 #else
 # define SET_STACK_TOP_ADDRESS(p)              \
    stacktop_sentry sentry;                     \
-   __builtin_unwind_init ();                   \
    test_setjmp ();                             \
    sys_setjmp (sentry.j);                      \
    *(p) = NEAR_STACK_TOP (&sentry + (stack_bottom < &sentry.c))
@@ -5025,7 +5023,7 @@ mark_stack (char const *bottom, char const *end)
    from FUNC.  */
 
 NO_INLINE void
-flush_stack_call_func (void (*func) (void *arg), void *arg)
+flush_stack_call_func1 (void (*func) (void *arg), void *arg)
 {
   void *end;
   struct thread_state *self = current_thread;
index a55fa32950d4dca139c3bf4aa2acac7f3c03f742..ad7d67ae695093216cc1f2e05dc326a99518eaa0 100644 (file)
@@ -3811,7 +3811,15 @@ extern void alloc_unexec_pre (void);
 extern void alloc_unexec_post (void);
 extern void mark_maybe_objects (Lisp_Object const *, ptrdiff_t);
 extern void mark_stack (char const *, char const *);
-extern void flush_stack_call_func (void (*func) (void *arg), void *arg);
+extern void flush_stack_call_func1 (void (*func) (void *arg), void *arg);
+
+INLINE void
+flush_stack_call_func (void (*func) (void *arg), void *arg)
+{
+  __builtin_unwind_init ();
+  flush_stack_call_func1 (func, arg);
+}
+
 extern void garbage_collect (void);
 extern void maybe_garbage_collect (void);
 extern const char *pending_malloc_warning;