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

Reply via email to