aboutsummaryrefslogtreecommitdiff
path: root/meson.build
diff options
context:
space:
mode:
authorPierrick Bouvier <pierrick.bouvier@linaro.org>2023-02-21 16:30:04 +0100
committerRichard Henderson <richard.henderson@linaro.org>2023-02-21 13:45:48 -1000
commitdbd672c87f19949bb62bfb1fb3a97b9729fd7560 (patch)
tree48261c1a254b426e8516c609ee0f3cf39beb95b9 /meson.build
parentb3c326029554a7d134e26e749240ba2d8ac288b1 (diff)
downloadqemu-dbd672c87f19949bb62bfb1fb3a97b9729fd7560.zip
qemu-dbd672c87f19949bb62bfb1fb3a97b9729fd7560.tar.gz
qemu-dbd672c87f19949bb62bfb1fb3a97b9729fd7560.tar.bz2
sysemu/os-win32: fix setjmp/longjmp on windows-arm64
Windows implementation of setjmp/longjmp is done in C:/WINDOWS/system32/ucrtbase.dll. Alas, on arm64, it seems to *always* perform stack unwinding, which crashes from generated code. By using alternative implementation built in mingw, we avoid doing stack unwinding and this fixes crash when calling longjmp. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Acked-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20230221153006.20300-3-pierrick.bouvier@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build21
1 files changed, 21 insertions, 0 deletions
diff --git a/meson.build b/meson.build
index bc7e5b1..6a139e7 100644
--- a/meson.build
+++ b/meson.build
@@ -2466,6 +2466,27 @@ if targetos == 'windows'
}''', name: '_lock_file and _unlock_file'))
endif
+if targetos == 'windows'
+ mingw_has_setjmp_longjmp = cc.links('''
+ #include <setjmp.h>
+ int main(void) {
+ /*
+ * These functions are not available in setjmp header, but may be
+ * available at link time, from libmingwex.a.
+ */
+ extern int __mingw_setjmp(jmp_buf);
+ extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
+ jmp_buf env;
+ __mingw_setjmp(env);
+ __mingw_longjmp(env, 0);
+ }
+ ''', name: 'mingw setjmp and longjmp')
+
+ if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
+ error('mingw must provide setjmp/longjmp for windows-arm64')
+ endif
+endif
+
########################
# Target configuration #
########################