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.
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 @@
;logb
ADD_UNDERSCORE(nextafter)
+longjmp
+
#ifndef UCRTBASE
_daylight DATA
_timezone DATA
@@ -140,6 +142,4 @@
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 @@
_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 @@
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 @@
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 @@
_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 @@
;_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 @@
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 @@
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 @@
#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 @@
# 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 @@
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