backported setjmp/longjmp changes from v7.x branch: Hand-picked from commits 02390fa9c1, 436ad4b830, and 844cb490ab: - Only use _setjmp3 on i386. Don't use _WIN64 to decide this, but check explicitly for i386, and use _setjmp on other platforms. - setjmp.h: Only pass a frame pointer to setjmp if SEH is enabled This should avoid the need for clearing the frame pointer in the longjmp wrapper. - crt: Use importlibs for longjmp. Fixes setjmp/longjmp code built with -fno-asynchronous-unwind-tables with SEH toolchains.
diff --git a/mingw-w64-crt/def-include/msvcrt-common.def.in b/mingw-w64-crt/def-include/msvcrt-common.def.in index 76e1fa3..a27fd22 100644 --- a/mingw-w64-crt/def-include/msvcrt-common.def.in +++ b/mingw-w64-crt/def-include/msvcrt-common.def.in
@@ -125,11 +125,11 @@ ;logb ADD_UNDERSCORE(nextafter) +longjmp + _daylight DATA _timezone DATA _tzname DATA ADD_UNDERSCORE(daylight) ADD_UNDERSCORE(timezone) ADD_UNDERSCORE(tzname) - -longjmp DATA
diff --git a/mingw-w64-crt/lib32/crtdll.def b/mingw-w64-crt/lib32/crtdll.def index 1c73001..38e300a 100644 --- a/mingw-w64-crt/lib32/crtdll.def +++ b/mingw-w64-crt/lib32/crtdll.def
@@ -598,7 +598,7 @@ ;_localtime32 = localtime log log10 -longjmp DATA +longjmp malloc mblen mbstowcs
diff --git a/mingw-w64-crt/lib64/ntdll.def b/mingw-w64-crt/lib64/ntdll.def index cc81a06..d08f498 100644 --- a/mingw-w64-crt/lib64/ntdll.def +++ b/mingw-w64-crt/lib64/ntdll.def
@@ -1963,7 +1963,7 @@ isxdigit labs log -longjmp DATA +longjmp mbstowcs memchr memcmp
diff --git a/mingw-w64-crt/misc/mingw_getsp.S b/mingw-w64-crt/misc/mingw_getsp.S index 3c99658..7992abd 100644 --- a/mingw-w64-crt/misc/mingw_getsp.S +++ b/mingw-w64-crt/misc/mingw_getsp.S
@@ -25,26 +25,3 @@ mov r0, sp bx lr #endif - -/* On ARM: - * Error: cannot represent BFD_RELOC_32_PCREL relocation in this object file format - * But anyway, nothing is needed here as libarm32/libmsvcrt.a is exporting longjmp - ldr ip, 1f - ldr pc, [pc, ip] - 1: .long __imp_longjmp - (1b + 4) -*/ -#if !(defined(_ARM_) || defined(__arm__)) - .globl __MINGW_USYMBOL(longjmp) - .def __MINGW_USYMBOL(longjmp); .scl 2; .type 32; .endef -__MINGW_USYMBOL(longjmp): -#if defined(_AMD64_) || defined(__x86_64__) -#ifndef __SEH__ - xorq %rax,%rax - movq %rax, (%rcx) -#endif - leaq __MINGW_IMP_LSYMBOL(longjmp)(%rip), %rax - jmpq *(%rax) -#elif defined(_X86_) || defined(__i386__) - jmp *__imp__longjmp -#endif -#endif /* !(defined(_ARM_) || defined(__arm__)) */
diff --git a/mingw-w64-headers/crt/setjmp.h b/mingw-w64-headers/crt/setjmp.h index 5be566d..d116bd4 100644 --- a/mingw-w64-headers/crt/setjmp.h +++ b/mingw-w64-headers/crt/setjmp.h
@@ -169,24 +169,28 @@ #define _JMP_BUF_DEFINED #endif +_CRTIMP __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value); + void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); #ifndef USE_NO_MINGW_SETJMP_TWO_ARGS # ifndef _INC_SETJMPEX -# ifdef _WIN64 +# if defined(_X86_) || defined(__i386__) +# define setjmp(BUF) _setjmp3((BUF), NULL) +# elif defined(__SEH__) # if (__MINGW_GCC_VERSION < 40702) # define setjmp(BUF) _setjmp((BUF), mingw_getsp()) # else # define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0)) # endif # else -# define setjmp(BUF) _setjmp3((BUF), NULL) +# define setjmp(BUF) _setjmp((BUF), NULL) # endif int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf, void *_Ctx); int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp3(jmp_buf _Buf, void *_Ctx); # else # undef setjmp -# ifdef _WIN64 +# ifdef __SEH__ # if (__MINGW_GCC_VERSION < 40702) # define setjmp(BUF) _setjmpex((BUF), mingw_getsp()) # define setjmpex(BUF) _setjmpex((BUF), mingw_getsp()) @@ -210,9 +214,6 @@ int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) setjmp(jmp_buf _Buf); #endif - __declspec(noreturn) __attribute__ ((__nothrow__)) void __cdecl ms_longjmp(jmp_buf _Buf,int _Value)/* throw(...)*/; - __declspec(noreturn) __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value); - #ifdef __cplusplus } #endif