From aa0c38f3586d462c7b4d489542b32580f489fdc5 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 14 Oct 2017 11:13:47 +0300 Subject: [PATCH] Make sure thread stack is properly aligned on MS-Windows * src/systhread.c: Include w32term.h instead of windows.h. (w32_beginthread_wrapper): Add ALIGN_STACK attribute, to ensure the thread's stack is correctly aligned. * src/w32term.h (ALIGN_STACK): Update commentary. --- src/systhread.c | 7 ++++--- src/w32term.h | 15 ++++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/systhread.c b/src/systhread.c index ee89a1ed3ff..6f9baabaf2e 100644 --- a/src/systhread.c +++ b/src/systhread.c @@ -187,7 +187,7 @@ sys_thread_yield (void) #elif defined (WINDOWSNT) -#include +#include /* Cannot include because of the local header by the same name, sigh. */ @@ -326,8 +326,9 @@ sys_thread_self (void) static thread_creation_function *thread_start_address; /* _beginthread wants a void function, while we are passed a function - that returns a pointer. So we use a wrapper. */ -static void + that returns a pointer. So we use a wrapper. See the command in + w32term.h about the need for ALIGN_STACK attribute. */ +static void ALIGN_STACK w32_beginthread_wrapper (void *arg) { (void)thread_start_address (arg); diff --git a/src/w32term.h b/src/w32term.h index 16b44b0ca2f..8d08ca0a2bf 100644 --- a/src/w32term.h +++ b/src/w32term.h @@ -22,13 +22,14 @@ along with GNU Emacs. If not, see . */ #include "frame.h" #include "atimer.h" -/* Stack alignment stuff. Every CALLBACK function should have the - ALIGN_STACK attribute if it manipulates Lisp objects, because - Windows x86 32-bit ABI only guarantees 4-byte stack alignment, and - that is what we will get when a Windows function calls us. The - ALIGN_STACK attribute forces GCC to emit a preamble code to - re-align the stack at function entry. Further details about this - can be found in http://www.peterstock.co.uk/games/mingw_sse/. */ +/* Stack alignment stuff. Every CALLBACK and thread function should + have the ALIGN_STACK attribute if it manipulates Lisp objects, + because Windows x86 32-bit ABI only guarantees 4-byte stack + alignment, and that is what we will get when a Windows function + calls us. The ALIGN_STACK attribute forces GCC to emit a preamble + code to re-align the stack at function entry. Further details + about this can be found in + http://www.peterstock.co.uk/games/mingw_sse/. */ #ifdef __GNUC__ # if USE_STACK_LISP_OBJECTS && !defined _WIN64 && !defined __x86_64__ \ && __GNUC__ + (__GNUC_MINOR__ > 1) >= 5 -- 2.39.2