On 7/13/22, LIU Hao <lh_mo...@126.com> wrote: > 在 2022/7/12 15:50, Ozkan Sezer 写道: >> >> With the patch applied to v5.x branch and crt rebuilt, the game engine >> rebuilt with -fno-asynchronous-unwind-tables in the CFLAGS against the >> newly built crt and setjmp.h seems to behave as it is supposed to when >> it hits longjmp. >> > > Do the patches replace `setjmp()` with something that does not unwind the > stack? Looks so but it was > not I that authored the patches, so...
CC'ing Martin and Jacek. Patches against branches v6.x to v2.x re-attached. -- O.S.
From 5431a1e7907d5bf40a5ce1092c17c4069cd73865 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer <seze...@gmail.com> Date: Tue, 12 Jul 2022 08:05:40 +0300 Subject: [PATCH] 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. --- mingw-w64-crt/def-include/msvcrt-common.def.in | 4 ++-- mingw-w64-crt/lib32/crtdll.def | 2 +- mingw-w64-crt/lib64/ntdll.def | 2 +- mingw-w64-crt/misc/mingw_getsp.S | 23 ----------------------- mingw-w64-headers/crt/setjmp.h | 13 +++++++------ 5 files changed, 11 insertions(+), 33 deletions(-) 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 @@ ADD_UNDERSCORE(hypot) ;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 @@ localtime DATA ;_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 @@ iswxdigit 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 @@ __MINGW_USYMBOL(mingw_getsp): 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 @@ extern "C" { #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 @@ void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); 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
From 76cf3753a3b4713bb4d295818560e0481aa98fae Mon Sep 17 00:00:00 2001 From: Ozkan Sezer <seze...@gmail.com> Date: Tue, 12 Jul 2022 08:05:40 +0300 Subject: [PATCH] backported setjmp/longjmp changes from v7.x branch: Hand-picked from commits 436ad4b830 and 844cb490ab: - 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. --- mingw-w64-crt/def-include/msvcrt-common.def.in | 4 - mingw-w64-crt/lib-common/api-ms-win-crt-private-l1-1-0.def.in | 2 mingw-w64-crt/lib-common/msvcrt.def.in | 1 mingw-w64-crt/lib-common/ucrtbase.def.in | 1 mingw-w64-crt/lib-common/vcruntime140_app.def.in | 2 mingw-w64-crt/lib32/crtdll.def | 2 mingw-w64-crt/lib64/ntdll.def | 2 mingw-w64-crt/misc/mingw_getsp.S | 23 ---------- mingw-w64-headers/crt/setjmp.h | 12 +++-- 9 files changed, 13 insertions(+), 36 deletions(-) diff --git a/mingw-w64-crt/def-include/msvcrt-common.def.in b/mingw-w64-crt/def-include/msvcrt-common.def.in index 364e440..a98f8a1 100644 --- a/mingw-w64-crt/def-include/msvcrt-common.def.in +++ b/mingw-w64-crt/def-include/msvcrt-common.def.in @@ -131,6 +131,8 @@ ADD_UNDERSCORE(hypot) ;logb ADD_UNDERSCORE(nextafter) +longjmp + #ifndef UCRTBASE _daylight DATA _timezone DATA @@ -140,6 +142,4 @@ ADD_UNDERSCORE(timezone) ADD_UNDERSCORE(tzname) ADD_UNDERSCORE(vsnprintf_s) - -longjmp DATA #endif diff --git a/mingw-w64-crt/lib-common/api-ms-win-crt-private-l1-1-0.def.in b/mingw-w64-crt/lib-common/api-ms-win-crt-private-l1-1-0.def.in index e2a1928..821d944 100644 --- a/mingw-w64-crt/lib-common/api-ms-win-crt-private-l1-1-0.def.in +++ b/mingw-w64-crt/lib-common/api-ms-win-crt-private-l1-1-0.def.in @@ -1158,7 +1158,7 @@ F_I386(_seh_longjmp_unwind4@4) _set_purecall_handler _set_se_translator F_I386(_setjmp3) -longjmp F_X86_ANY(DATA) +longjmp memchr memcmp memcpy diff --git a/mingw-w64-crt/lib-common/msvcrt.def.in b/mingw-w64-crt/lib-common/msvcrt.def.in index 1311541..32f7881 100644 --- a/mingw-w64-crt/lib-common/msvcrt.def.in +++ b/mingw-w64-crt/lib-common/msvcrt.def.in @@ -1413,7 +1413,6 @@ log F_X86_ANY(DATA) log10 F_NON_I386(log10f F_X86_ANY(DATA)) F_NON_I386(logf F_X86_ANY(DATA)) -F_ARM_ANY(longjmp) malloc mblen F_ARM_ANY(mbrlen) diff --git a/mingw-w64-crt/lib-common/ucrtbase.def.in b/mingw-w64-crt/lib-common/ucrtbase.def.in index 251b6d3..94399a3 100644 --- a/mingw-w64-crt/lib-common/ucrtbase.def.in +++ b/mingw-w64-crt/lib-common/ucrtbase.def.in @@ -2431,7 +2431,6 @@ logb logbf logbl F_NON_I386(logf F_X86_ANY(DATA)) -longjmp F_X86_ANY(DATA) lrint lrintf lrintl diff --git a/mingw-w64-crt/lib-common/vcruntime140_app.def.in b/mingw-w64-crt/lib-common/vcruntime140_app.def.in index 27f79bd..3ad3e51 100644 --- a/mingw-w64-crt/lib-common/vcruntime140_app.def.in +++ b/mingw-w64-crt/lib-common/vcruntime140_app.def.in @@ -80,7 +80,7 @@ F_I386(_seh_longjmp_unwind@4) _set_purecall_handler _set_se_translator F_I386(_setjmp3) -longjmp F_X86_ANY(DATA) +longjmp memchr memcmp memcpy diff --git a/mingw-w64-crt/lib32/crtdll.def b/mingw-w64-crt/lib32/crtdll.def index 18aeb0b..1b33068 100644 --- a/mingw-w64-crt/lib32/crtdll.def +++ b/mingw-w64-crt/lib32/crtdll.def @@ -599,7 +599,7 @@ localtime DATA ;_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 2b2ad36..85e88ee 100644 --- a/mingw-w64-crt/lib64/ntdll.def +++ b/mingw-w64-crt/lib64/ntdll.def @@ -1963,7 +1963,7 @@ iswxdigit 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 5d224d1..cafe9cd 100644 --- a/mingw-w64-crt/misc/mingw_getsp.S +++ b/mingw-w64-crt/misc/mingw_getsp.S @@ -29,29 +29,6 @@ __MINGW_USYMBOL(mingw_getsp): ret #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__) || defined(_ARM64_) || defined(__aarch64__)) - .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__)) */ - #if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) .globl __MINGW_USYMBOL(__mingw_setjmp) .def __MINGW_USYMBOL(__mingw_setjmp); .scl 2; .type 32; .endef diff --git a/mingw-w64-headers/crt/setjmp.h b/mingw-w64-headers/crt/setjmp.h index fc79f10..9f46164 100644 --- a/mingw-w64-headers/crt/setjmp.h +++ b/mingw-w64-headers/crt/setjmp.h @@ -200,6 +200,8 @@ extern "C" { #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); #if !defined(USE_NO_MINGW_SETJMP_TWO_ARGS) @@ -217,18 +219,21 @@ void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); # define setjmp(BUF) __mingw_setjmp((BUF)) # define longjmp __mingw_longjmp int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) __mingw_setjmp(jmp_buf _Buf); -# else + __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __mingw_longjmp(jmp_buf _Buf,int _Value); +# 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) _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()) @@ -252,9 +257,6 @@ void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) setjmp(jmp_buf _Buf); #endif - __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl ms_longjmp(jmp_buf _Buf,int _Value)/* throw(...)*/; - __MINGW_ATTRIB_NORETURN __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value); - #ifdef __cplusplus } #endif
From bd26126de934f96221301b35a132c84d826dbdd9 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer <seze...@gmail.com> Date: Tue, 12 Jul 2022 08:05:40 +0300 Subject: [PATCH] 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. --- mingw-w64-crt/def-include/msvcrt-common.def.in | 4 ++-- mingw-w64-crt/lib32/crtdll.def | 2 +- mingw-w64-crt/lib64/ntdll.def | 2 +- mingw-w64-crt/misc/mingw_getsp.S | 23 ----------------------- mingw-w64-headers/crt/setjmp.h | 13 +++++++------ 5 files changed, 11 insertions(+), 33 deletions(-) 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 @@ ADD_UNDERSCORE(hypot) ;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 @@ localtime DATA ;_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 @@ iswxdigit 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 @@ __MINGW_USYMBOL(mingw_getsp): 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 @@ extern "C" { #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 @@ void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); 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
From 6606da416058d5dceae16d879977b1ea11be592e Mon Sep 17 00:00:00 2001 From: Ozkan Sezer <seze...@gmail.com> Date: Tue, 12 Jul 2022 08:05:40 +0300 Subject: [PATCH] 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. --- mingw-w64-crt/def-include/msvcrt-common.def.in | 4 ++-- mingw-w64-crt/lib32/crtdll.def | 2 +- mingw-w64-crt/lib64/ntdll.def | 2 +- mingw-w64-crt/misc/mingw_getsp.S | 14 -------------- mingw-w64-headers/crt/setjmp.h | 13 +++++++------ 5 files changed, 11 insertions(+), 24 deletions(-) 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 @@ ADD_UNDERSCORE(hypot) ;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 928f75e..6a3f8da 100644 --- a/mingw-w64-crt/lib32/crtdll.def +++ b/mingw-w64-crt/lib32/crtdll.def @@ -598,7 +598,7 @@ localtime DATA ;_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 @@ iswxdigit 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 8df51f3..f7fa15b 100644 --- a/mingw-w64-crt/misc/mingw_getsp.S +++ b/mingw-w64-crt/misc/mingw_getsp.S @@ -21,17 +21,3 @@ __MINGW_USYMBOL(mingw_getsp): lea 4(%esp),%eax #endif ret - -.globl __MINGW_USYMBOL(longjmp) - .def __MINGW_USYMBOL(longjmp); .scl 2; .type 32; .endef -__MINGW_USYMBOL(longjmp): -#ifdef _WIN64 -#ifndef __SEH__ - xorq %rax,%rax - movq %rax, (%rcx) -#endif - leaq __MINGW_IMP_LSYMBOL(longjmp)(%rip), %rax - jmpq *(%rax) -#else - jmp *__imp__longjmp -#endif diff --git a/mingw-w64-headers/crt/setjmp.h b/mingw-w64-headers/crt/setjmp.h index 131bbfc..f204277 100644 --- a/mingw-w64-headers/crt/setjmp.h +++ b/mingw-w64-headers/crt/setjmp.h @@ -148,24 +148,28 @@ extern "C" { #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()) @@ -189,9 +193,6 @@ void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); 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
From d60b38e6f76d15ec87f4f554728c066f96ae16e6 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer <seze...@gmail.com> Date: Tue, 12 Jul 2022 08:05:40 +0300 Subject: [PATCH] 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. --- mingw-w64-crt/lib32/crtdll.def | 2 +- mingw-w64-crt/lib32/msvcr100.def | 2 +- mingw-w64-crt/lib32/msvcr110.def | 2 +- mingw-w64-crt/lib32/msvcr80.def | 2 +- mingw-w64-crt/lib32/msvcr90.def | 2 +- mingw-w64-crt/lib32/msvcr90d.def | 2 +- mingw-w64-crt/lib32/msvcrt.def | 2 +- mingw-w64-crt/lib64/msvcr100.def | 2 +- mingw-w64-crt/lib64/msvcr110.def | 2 +- mingw-w64-crt/lib64/msvcr80.def | 2 +- mingw-w64-crt/lib64/msvcr90.def | 2 +- mingw-w64-crt/lib64/msvcr90d.def | 2 +- mingw-w64-crt/lib64/msvcrt.def | 2 +- mingw-w64-crt/lib64/ntdll.def | 2 +- mingw-w64-crt/misc/mingw_getsp.S | 14 -------------- mingw-w64-headers/crt/setjmp.h | 13 +++++++------ 16 files changed, 21 insertions(+), 34 deletions(-) diff --git a/mingw-w64-crt/lib32/crtdll.def b/mingw-w64-crt/lib32/crtdll.def index d295dcc..ac132a6 100644 --- a/mingw-w64-crt/lib32/crtdll.def +++ b/mingw-w64-crt/lib32/crtdll.def @@ -598,7 +598,7 @@ localtime DATA ;_localtime32 = localtime log log10 -longjmp DATA +longjmp malloc mblen mbstowcs diff --git a/mingw-w64-crt/lib32/msvcr100.def b/mingw-w64-crt/lib32/msvcr100.def index ba8b8f8..4223909 100644 --- a/mingw-w64-crt/lib32/msvcr100.def +++ b/mingw-w64-crt/lib32/msvcr100.def @@ -1749,7 +1749,7 @@ lldiv DATA localeconv log DATA log10 -longjmp DATA +longjmp malloc mblen mbrlen DATA diff --git a/mingw-w64-crt/lib32/msvcr110.def b/mingw-w64-crt/lib32/msvcr110.def index cbc440c..1bec422 100644 --- a/mingw-w64-crt/lib32/msvcr110.def +++ b/mingw-w64-crt/lib32/msvcr110.def @@ -1882,7 +1882,7 @@ lldiv DATA localeconv log DATA log10 -longjmp DATA ; Check!!! Couldn't determine function argument count. Function doesn't return. +longjmp malloc mblen mbrlen DATA diff --git a/mingw-w64-crt/lib32/msvcr80.def b/mingw-w64-crt/lib32/msvcr80.def index c09ae9f..585ccb6 100644 --- a/mingw-w64-crt/lib32/msvcr80.def +++ b/mingw-w64-crt/lib32/msvcr80.def @@ -608,7 +608,7 @@ localtime DATA ;_localtime32 = localtime log log10 -longjmp DATA +longjmp malloc mblen mbstowcs diff --git a/mingw-w64-crt/lib32/msvcr90.def b/mingw-w64-crt/lib32/msvcr90.def index 6a05615..50d8e6d 100644 --- a/mingw-w64-crt/lib32/msvcr90.def +++ b/mingw-w64-crt/lib32/msvcr90.def @@ -1381,7 +1381,7 @@ ldiv localeconv log DATA log10 -longjmp DATA +longjmp malloc mblen mbrlen DATA diff --git a/mingw-w64-crt/lib32/msvcr90d.def b/mingw-w64-crt/lib32/msvcr90d.def index 9da9137..1860317 100644 --- a/mingw-w64-crt/lib32/msvcr90d.def +++ b/mingw-w64-crt/lib32/msvcr90d.def @@ -1453,7 +1453,7 @@ ldiv localeconv log log10 -longjmp DATA +longjmp malloc mblen mbrlen diff --git a/mingw-w64-crt/lib32/msvcrt.def b/mingw-w64-crt/lib32/msvcrt.def index 55a760d..13a9a2d 100644 --- a/mingw-w64-crt/lib32/msvcrt.def +++ b/mingw-w64-crt/lib32/msvcrt.def @@ -607,7 +607,7 @@ localtime DATA ;_localtime32 = localtime log log10 -longjmp DATA +longjmp malloc mblen mbstowcs diff --git a/mingw-w64-crt/lib64/msvcr100.def b/mingw-w64-crt/lib64/msvcr100.def index e4f2e98..507cec2 100644 --- a/mingw-w64-crt/lib64/msvcr100.def +++ b/mingw-w64-crt/lib64/msvcr100.def @@ -1708,7 +1708,7 @@ log DATA log10 log10f DATA logf DATA -longjmp DATA +longjmp malloc mblen mbrlen DATA diff --git a/mingw-w64-crt/lib64/msvcr110.def b/mingw-w64-crt/lib64/msvcr110.def index 70bca93..a3070f2 100644 --- a/mingw-w64-crt/lib64/msvcr110.def +++ b/mingw-w64-crt/lib64/msvcr110.def @@ -1832,7 +1832,7 @@ log DATA log10 log10f DATA logf DATA -longjmp DATA +longjmp malloc mblen mbrlen DATA diff --git a/mingw-w64-crt/lib64/msvcr80.def b/mingw-w64-crt/lib64/msvcr80.def index 7bdb363..cacdb73 100644 --- a/mingw-w64-crt/lib64/msvcr80.def +++ b/mingw-w64-crt/lib64/msvcr80.def @@ -738,7 +738,7 @@ log log10 log10f logf -longjmp DATA +longjmp malloc mblen mbstowcs diff --git a/mingw-w64-crt/lib64/msvcr90.def b/mingw-w64-crt/lib64/msvcr90.def index 3a4c9cb..4bd6ae5 100644 --- a/mingw-w64-crt/lib64/msvcr90.def +++ b/mingw-w64-crt/lib64/msvcr90.def @@ -1326,7 +1326,7 @@ log DATA log10 log10f DATA logf DATA -longjmp DATA +longjmp malloc mblen mbrlen DATA diff --git a/mingw-w64-crt/lib64/msvcr90d.def b/mingw-w64-crt/lib64/msvcr90d.def index 1d7b757..4e24af2 100644 --- a/mingw-w64-crt/lib64/msvcr90d.def +++ b/mingw-w64-crt/lib64/msvcr90d.def @@ -1392,7 +1392,7 @@ log log10 log10f logf -longjmp DATA +longjmp malloc mblen mbrlen diff --git a/mingw-w64-crt/lib64/msvcrt.def b/mingw-w64-crt/lib64/msvcrt.def index 0e46d65..358089e 100644 --- a/mingw-w64-crt/lib64/msvcrt.def +++ b/mingw-w64-crt/lib64/msvcrt.def @@ -1121,7 +1121,7 @@ log log10 ;log10f ;logf -longjmp DATA +longjmp malloc mblen mbsrtowcs_s 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 @@ iswxdigit 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 b38ce8a..e494d74 100644 --- a/mingw-w64-crt/misc/mingw_getsp.S +++ b/mingw-w64-crt/misc/mingw_getsp.S @@ -21,17 +21,3 @@ __MINGW_USYMBOL(mingw_getsp): lea 4(%esp),%eax #endif ret - -.globl __MINGW_USYMBOL(longjmp) - .def __MINGW_USYMBOL(longjmp); .scl 2; .type 32; .endef -__MINGW_USYMBOL(longjmp): -#ifdef _WIN64 -#ifndef __SEH__ - xorq %rax,%rax - movq %rax, (%rcx) -#endif - leaq __MINGW_IMP_LSYMBOL(longjmp)(%rip), %rax - jmpq *(%rax) -#else - jmp *__imp__longjmp -#endif diff --git a/mingw-w64-headers/crt/setjmp.h b/mingw-w64-headers/crt/setjmp.h index 131bbfc..f204277 100644 --- a/mingw-w64-headers/crt/setjmp.h +++ b/mingw-w64-headers/crt/setjmp.h @@ -148,24 +148,28 @@ extern "C" { #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()) @@ -189,9 +193,6 @@ void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void); 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
_______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public