[newlib-cygwin/main] Cygwin: Add SEH workaround for aarch64 compilation

Corinna Vinschen corinna@sourceware.org
Mon Mar 30 08:32:25 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=5f5462d911736abe831e90eaa5574052e61c9701

commit 5f5462d911736abe831e90eaa5574052e61c9701
Author:     Thirumalai Nagalingam <thirumalai.nagalingam@multicorewareinc.com>
AuthorDate: Tue Mar 24 17:51:55 2026 +0530
Commit:     Corinna Vinschen <corinna@vinschen.de>
CommitDate: Mon Mar 30 10:20:49 2026 +0200

    Cygwin: Add SEH workaround for aarch64 compilation
    
    Signed-off-by: Evgeny Karpov <Evgeny.Karpov@microsoft.com>
    Signed-off-by: Thirumalai Nagalingam <thirumalai.nagalingam@multicorewareinc.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:
 
 }
 
+#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, ucontext_t *sigctx,
 	teb->Tib.StackLimit = old_limit;
     }
 }
+#endif
 
 int
 _cygtls::call_signal_handler ()
diff --git a/winsup/cygwin/local_includes/cygtls.h b/winsup/cygwin/local_includes/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:
 
 #if defined (__aarch64__)
 #define EXCEPTION_MYFAULT_REF "_ZN9exception7myfaultEP17_EXCEPTION_RECORDPvP8_CONTEXTP25_DISPATCHER_CONTEXT_ARM64"
+#define TRY_HANDLER_DATA (void) &&__l_try;
 #else
 #define EXCEPTION_MYFAULT_REF "_ZN9exception7myfaultEP17_EXCEPTION_RECORDPvP8_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
 
 /* 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. */
 
 #if defined (__aarch64__)
 #define EXCEPTION_HANDLE_REF "_ZN9exception6handleEP17_EXCEPTION_RECORDPvP8_CONTEXTP25_DISPATCHER_CONTEXT_ARM64"
- #else
+#define EXCEPTION_HANDLER_DATA
+#else
 #define EXCEPTION_HANDLE_REF "_ZN9exception6handleEP17_EXCEPTION_RECORDPvP8_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
 
 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))
   {


More information about the Cygwin-cvs mailing list