On Thu, 24 Apr 2025, Jacek Caban wrote:
This avoids splitting the function into multiple .text chunks, which triggers
an error on ARM64EC:
error: cannot perform a PC-relative fixup with a non-zero symbol offset
---
I haven't looked deeper into the LLVM side. Even if there's something that
could be improved there, splitting a function like this feels like asking for
trouble, so the patch seems like an improvement regardless.
mingw-w64-libraries/winpthreads/src/thread.c | 25 +++++++++++---------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/mingw-w64-libraries/winpthreads/src/thread.c
b/mingw-w64-libraries/winpthreads/src/thread.c
index 742a02238..2ebf1ad66 100644
--- a/mingw-w64-libraries/winpthreads/src/thread.c
+++ b/mingw-w64-libraries/winpthreads/src/thread.c
@@ -1553,17 +1553,7 @@ pthread_create_wrapper (void *args)
if (tv->func)
trslt = (intptr_t) tv->func(tv->ret_arg);
#ifdef __SEH__
- asm ("\tnop\n\t.tl_end: nop\n"
-#ifdef __arm__
- "\t.seh_handler __C_specific_handler, %except\n"
-#else
- "\t.seh_handler __C_specific_handler, @except\n"
-#endif
- "\t.seh_handlerdata\n"
- "\t.long 1\n"
- "\t.rva .tl_start, .tl_end, _gnu_exception_handler ,.tl_end\n"
- "\t.text"
- );
+ asm ("\tnop\n\t.tl_end: nop\n");
#endif
pthread_mutex_lock (&mtx_pthr_locked);
tv->ret_arg = (void*) trslt;
@@ -1601,6 +1591,19 @@ pthread_create_wrapper (void *args)
Sleep (0);
_endthreadex (rslt);
return rslt;
+
+#if defined(__SEH__)
+ asm(
+#ifdef __arm__
+ "\t.seh_handler __C_specific_handler, %except\n"
+#else
+ "\t.seh_handler __C_specific_handler, @except\n"
+#endif
+ "\t.seh_handlerdata\n"
+ "\t.long 1\n"
+ "\t.rva .tl_start, .tl_end, _gnu_exception_handler ,.tl_end\n"
+ "\t.text\n");
+#endif
}
I think this is fine. But don't we have something similar in mingw-w64-crt
too? (There we only seem to have a "return" statement after the SEH inline
assembly block though.)
// Martin
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public