On Friday 26 December 2025 00:13:25 Pali Rohár wrote:
> 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));
Here %p0 does not work with clang.
I propose to use %c0 which seems to be supported also by clang.
> + 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