For non-i386 builds use asm .seh_handler directive for registering the SEH
handler. This directive register SEH handler for the whole function and
therefore function has to be marked as noinline. Use exactly same SEH
handler as it used for i386 builds, function API is same across platforms.
This asm .seh_handler directive requires support for compiler, assembler
and linker. So check for SEH_INLINE_ASM macro in the same way as it is in
the mingw-w64-crt/crt/crtexe.c file.
---
mingw-w64-libraries/winpthreads/src/thread.c | 28 ++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/mingw-w64-libraries/winpthreads/src/thread.c
b/mingw-w64-libraries/winpthreads/src/thread.c
index e2f9806ad579..ed2e8d07d84a 100644
--- a/mingw-w64-libraries/winpthreads/src/thread.c
+++ b/mingw-w64-libraries/winpthreads/src/thread.c
@@ -86,7 +86,16 @@ SetThreadName_VEH (PEXCEPTION_POINTERS ExceptionInfo)
return EXCEPTION_CONTINUE_SEARCH;
}
-#if !defined(_MSC_VER) && defined(__i386__)
+#if defined(__SEH__) && (!defined(__clang__) || __clang_major__ >= 7)
+#define SEH_INLINE_ASM
+#ifdef __arm__
+#define ASM_EXCEPT "%%except"
+#else
+#define ASM_EXCEPT "@except"
+#endif
+#endif
+
+#if !defined(_MSC_VER) && (defined(__i386__) || defined(SEH_INLINE_ASM))
static EXCEPTION_DISPOSITION __cdecl
SetThreadName_SEH (EXCEPTION_RECORD *ExceptionRecord, PVOID EstablisherFrame,
CONTEXT *ContextRecord, PVOID DispatcherContext)
{
@@ -110,6 +119,9 @@ typedef struct _THREADNAME_INFO
DWORD dwFlags; /* reserved for future use, must be zero */
} THREADNAME_INFO;
+#if !defined(_MSC_VER) && !defined(__i386__) && defined(SEH_INLINE_ASM)
+WINPTHREADS_ATTRIBUTE((noinline)) /* required for asm .seh_handler directive */
+#endif
static void
SetThreadName (DWORD dwThreadID, LPCSTR szThreadName)
{
@@ -152,8 +164,20 @@ SetThreadName (DWORD dwThreadID, LPCSTR szThreadName)
__writefsdword (0, (DWORD) &exception_record); /* register our SEH handler
*/
RaiseException (EXCEPTION_SET_THREAD_NAME, 0, infosize, (ULONG_PTR *)
&info);
__writefsdword (0, (DWORD) exception_record.Next); /* unregister our SEH
handler */
+#elif defined(SEH_INLINE_ASM)
+ /* On other platforms is SEH handler registered at compile time.
+ Assembler directive .seh_handler statically register SEH handler for
+ the whole current function. It does not matter at which line is this
+ directive called. It always applies for the whole function, so also
+ for code before the directive itself. As this function does not do
+ anything other, we can register our SEH handler for the whole function.
+ Function has to be marked as noinline to ensure that SEH handler
+ would not be registered for parent caller function too.
+ */
+ asm volatile (".seh_handler %p0, " ASM_EXCEPT :: "i" (SetThreadName_SEH));
+ RaiseException (EXCEPTION_SET_THREAD_NAME, 0, infosize, (ULONG_PTR *)
&info);
#else
- /* TODO: SEH exception handling is not implemented for other platforms yet
*/
+ /* Other compilers / platforms do not provide SEH support */
#endif
#endif
}
--
2.20.1
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public