[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