[newlib-cygwin/main] Cygwin: Add SEH workaround for aarch64 compilation
Corinna Vinschen via Cygwin-cvs <[email protected]> Mon, 30 Mar 2026 08:32:25 +0000 (GMT)
| Newsgroups | gmane.os.cygwin.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3D5f5462d9117= 36abe831e90eaa5574052e61c9701 commit 5f5462d911736abe831e90eaa5574052e61c9701 Author: Thirumalai Nagalingam <[email protected]= om> AuthorDate: Tue Mar 24 17:51:55 2026 +0530 Commit: Corinna Vinschen <[email protected]> CommitDate: Mon Mar 30 10:20:49 2026 +0200 Cygwin: Add SEH workaround for aarch64 compilation =20 Signed-off-by: Evgeny Karpov <[email protected]> Signed-off-by: Thirumalai Nagalingam <thirumalai.nagalingam@multicorewa= reinc.com> Diff: --- winsup/cygwin/exceptions.cc | 2 ++ winsup/cygwin/local_includes/cygtls.h | 17 ++++++++++------- winsup/cygwin/local_includes/exception.h | 23 +++++++++++++---------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 158d8675bd69..badb11da7323 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -1696,6 +1696,7 @@ done: =20 } =20 +#if defined(__x86_64__) || defined(__aarch64__) static void altstack_wrapper (int sig, siginfo_t *siginfo, ucontext_t *sigctx, void (*handler) (int, siginfo_t *, void *)) @@ -1746,6 +1747,7 @@ altstack_wrapper (int sig, siginfo_t *siginfo, uconte= xt_t *sigctx, teb->Tib.StackLimit =3D old_limit; } } +#endif =20 int _cygtls::call_signal_handler () diff --git a/winsup/cygwin/local_includes/cygtls.h b/winsup/cygwin/local_in= cludes/cygtls.h index 336c72a066d5..289f395e4b56 100644 --- a/winsup/cygwin/local_includes/cygtls.h +++ b/winsup/cygwin/local_includes/cygtls.h @@ -346,8 +346,17 @@ public: =20 #if defined (__aarch64__) #define EXCEPTION_MYFAULT_REF "_ZN9exception7myfaultEP17_EXCEPTION_RECORDP= vP8_CONTEXTP25_DISPATCHER_CONTEXT_ARM64" +#define TRY_HANDLER_DATA (void) &&__l_try; #else #define EXCEPTION_MYFAULT_REF "_ZN9exception7myfaultEP17_EXCEPTION_RECORDP= vP8_CONTEXTP19_DISPATCHER_CONTEXT" +#define TRY_HANDLER_DATA \ + __asm__ goto ("\n" \ + " .seh_handler " EXCEPTION_MYFAULT_REF ", @except \n" \ + " .seh_handlerdata \n" \ + " .long 1 \n" \ + " .rva %l[__l_try],%l[__l_endtry],%l[__l_except],%l[__l_except] \n" \ + " .seh_code \n" \ + : : : : __l_try, __l_endtry, __l_except) #endif =20 /* Exception handling macros. This is a handmade SEH try/except. */ @@ -357,13 +366,7 @@ public: __label__ __l_try, __l_except, __l_endtry; \ __mem_barrier; \ san __sebastian (&&__l_except); \ - __asm__ goto ("\n" \ - " .seh_handler " EXCEPTION_MYFAULT_REF ", @except \n" \ - " .seh_handlerdata \n" \ - " .long 1 \n" \ - " .rva %l[__l_try],%l[__l_endtry],%l[__l_except],%l[__l_except] \n"= \ - " .seh_code \n" \ - : : : : __l_try, __l_endtry, __l_except); \ + TRY_HANDLER_DATA; \ { \ __l_try: \ __mem_barrier; diff --git a/winsup/cygwin/local_includes/exception.h b/winsup/cygwin/local= _includes/exception.h index 19bb109de65a..b26f8ba170a2 100644 --- a/winsup/cygwin/local_includes/exception.h +++ b/winsup/cygwin/local_includes/exception.h @@ -10,8 +10,19 @@ details. */ =20 #if defined (__aarch64__) #define EXCEPTION_HANDLE_REF "_ZN9exception6handleEP17_EXCEPTION_RECORDPvP= 8_CONTEXTP25_DISPATCHER_CONTEXT_ARM64" - #else +#define EXCEPTION_HANDLER_DATA +#else #define EXCEPTION_HANDLE_REF "_ZN9exception6handleEP17_EXCEPTION_RECORDPvP= 8_CONTEXTP19_DISPATCHER_CONTEXT" +#define EXCEPTION_HANDLER_DATA \ + asm volatile ("\n\ + 1: \n\ + .seh_handler " \ + EXCEPTION_HANDLE_REF ", \ + @except \n\ + .seh_handlerdata \n\ + .long 1 \n\ + .rva 1b, 2f, 2f, 2f \n\ + .seh_code \n") #endif =20 class exception @@ -24,15 +35,7 @@ public: exception () __attribute__ ((always_inline)) { /* Install SEH handler. */ - asm volatile ("\n\ - 1: \n\ - .seh_handler " \ - EXCEPTION_HANDLE_REF ", \ - @except \n\ - .seh_handlerdata \n\ - .long 1 \n\ - .rva 1b, 2f, 2f, 2f \n\ - .seh_code \n"); + EXCEPTION_HANDLER_DATA; }; ~exception () __attribute__ ((always_inline)) {