aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-03-15 12:34:17 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2021-03-15 12:34:17 -0400
commit146cb3889c3ccb3fce198fe7464a1296a9e107c3 (patch)
tree47c436adf7839e52a50f1535f7964ef3bbd4ee94
parenteeb60e45d82d5840b713a8741ae552238d57e8b9 (diff)
downloadpostgresql-146cb3889c3ccb3fce198fe7464a1296a9e107c3.tar.gz
postgresql-146cb3889c3ccb3fce198fe7464a1296a9e107c3.zip
Work around issues in MinGW-64's setjmp/longjmp support.
It's hard to avoid the conclusion that there is something wrong with setjmp/longjmp on MinGW-64, as we have seen failures come and go after entirely-unrelated-looking changes in our own code. Other projects such as Ruby have given up and started using gcc's setjmp/longjmp builtins on that platform; this patch just follows that lead. Note that this is a pretty fundamental ABI break for functions containining either setjmp or longjmp, so we can't really consider a back-patch. Per reports from Regina Obe and Heath Lord, as well as recent failures on buildfarm member walleye, and less-recent failures on fairywren. Juan José Santamaría Flecha Discussion: https://postgr.es/m/000401d716a0$1ed0fc70$5c72f550$@pcorp.us Discussion: https://postgr.es/m/CA+BEBhvHhM-Bn628pf-LsjqRh3Ang7qCSBG0Ga+7KwhGqrNUPw@mail.gmail.com Discussion: https://postgr.es/m/f1caef93-9640-022e-9211-bbe8755a56b0@2ndQuadrant.com
-rw-r--r--src/include/c.h13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/include/c.h b/src/include/c.h
index 2b45e6d6ca7..c8ede082739 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -1335,14 +1335,21 @@ extern unsigned long long strtoull(const char *str, char **endptr, int base);
/*
* When there is no sigsetjmp, its functionality is provided by plain
- * setjmp. Incidentally, nothing provides setjmp's functionality in
- * that case. We now support the case only on Windows.
+ * setjmp. We now support the case only on Windows. However, it seems
+ * that MinGW-64 has some longstanding issues in its setjmp support,
+ * so on that toolchain we cheat and use gcc's builtins.
*/
#ifdef WIN32
+#ifdef __MINGW64__
+typedef intptr_t sigjmp_buf[5];
+#define sigsetjmp(x,y) __builtin_setjmp(x)
+#define siglongjmp __builtin_longjmp
+#else /* !__MINGW64__ */
#define sigjmp_buf jmp_buf
#define sigsetjmp(x,y) setjmp(x)
#define siglongjmp longjmp
-#endif
+#endif /* __MINGW64__ */
+#endif /* WIN32 */
/* EXEC_BACKEND defines */
#ifdef EXEC_BACKEND