spirv: workaround setjmp/longjmp crash on MinGW
authorMichel Zou <xantares09@hotmail.com>
Wed, 11 Nov 2020 18:16:50 +0000 (19:16 +0100)
committerMarge Bot <eric+marge@anholt.net>
Wed, 18 Nov 2020 13:53:36 +0000 (13:53 +0000)
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7555>

src/compiler/spirv/gl_spirv.c
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_private.h

index 55b4437..5ef3892 100644 (file)
@@ -238,7 +238,7 @@ gl_spirv_validation(const uint32_t *words, size_t word_count,
       return false;
 
    /* See also _vtn_fail() */
-   if (setjmp(b->fail_jump)) {
+   if (vtn_setjmp(b->fail_jump)) {
       ralloc_free(b);
       return false;
    }
index de3d12d..73f3a7b 100644 (file)
@@ -160,7 +160,7 @@ _vtn_fail(struct vtn_builder *b, const char *file, unsigned line,
    if (dump_path)
       vtn_dump_shader(b, dump_path, "fail");
 
-   longjmp(b->fail_jump, 1);
+   vtn_longjmp(b->fail_jump, 1);
 }
 
 static struct vtn_ssa_value *
@@ -5744,7 +5744,7 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
       return NULL;
 
    /* See also _vtn_fail() */
-   if (setjmp(b->fail_jump)) {
+   if (vtn_setjmp(b->fail_jump)) {
       ralloc_free(b);
       return NULL;
    }
index 45187a0..97fc67f 100644 (file)
 struct vtn_builder;
 struct vtn_decoration;
 
+/* setjmp/longjmp is broken on MinGW: https://sourceforge.net/p/mingw-w64/bugs/406/ */
+#ifdef __MINGW32__
+  #define vtn_setjmp __builtin_setjmp
+  #define vtn_longjmp __builtin_longjmp
+#else
+  #define vtn_setjmp setjmp
+  #define vtn_longjmp longjmp
+#endif
+
 void vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level,
              size_t spirv_offset, const char *message);