在 2025-4-24 20:10, Martin Storsjö 写道:
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.

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.)

I have an alternative implementation that doesn't use handler data and does not 
require switching sections.

   ```
   // in main function:
   __asm__ (".seh_handler _top_se_handler, @except");

   static __attribute__((__used__))
   EXCEPTION_DISPOSITION
   __cdecl
   _top_se_handler(EXCEPTION_RECORD* pExceptionRecord, void* pEstablisherFrame,
                   CONTEXT* pContextRecord, void* pDispatcherContext)
     {
       (void) pEstablisherFrame;
       (void) pContextRecord;
       (void) pDispatcherContext;

       // `throw` raises an exception with code `(1 << 29) | 'GCC'`. If control
       // flow resumes after it, `std::terminate()` is called.
       if((pExceptionRecord->ExceptionCode & 0x20FFFFFFU) != 0x20474343U)
         return ExceptionContinueSearch;

       if(pExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE)
         return ExceptionContinueSearch;

       return ExceptionContinueExecution;
     }
   ```


--
Best regards,
LIU Hao

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature

_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to