>From ef923e029d5192b67ff7a0aede75a19c2c5327d4 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sun, 17 May 2020 13:23:59 +0100 Subject: [PATCH] * Fix Garbage Collector for missing calle safe registers content * 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 | 4 +--- src/lisp.h | 9 ++++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index f2b80fac88..d6ba4d9790 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4952,12 +4952,10 @@ test_setjmp (void) #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)) @@ -5033,7 +5031,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; diff --git a/src/lisp.h b/src/lisp.h index 66a86ddadf..c7ce3918fc 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3819,7 +3819,14 @@ verify (FLT_RADIX == 2 || FLT_RADIX == 16); 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); + +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; -- 2.17.1