From 3b3924e4b1d5c2cbf28d7e62cf8d9ee5ae22f2db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 20 Mar 2018 12:00:22 +0200 Subject: [PATCH] test: Add a testcase for setjmp --- Dockerfile.dev | 2 +- run-tests.sh | 2 +- test/setjmp.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 test/setjmp.c diff --git a/Dockerfile.dev b/Dockerfile.dev index db102e0..0c622f0 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -46,7 +46,7 @@ ENV PATH=$TOOLCHAIN_PREFIX/bin:$PATH COPY test/*.c ./test/ RUN cd test && \ for arch in $TOOLCHAIN_ARCHS; do \ - for test in hello hello-tls crt-test; do \ + for test in hello hello-tls crt-test setjmp; do \ $arch-w64-mingw32-clang $test.c -o $test-$arch.exe || exit 1; \ done; \ done diff --git a/run-tests.sh b/run-tests.sh index 5642f34..d52ba4c 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -12,7 +12,7 @@ export PATH=$PREFIX/bin:$PATH : ${ARCHS:=${TOOLCHAIN_ARCHS-i686 x86_64 armv7 aarch64}} cd test -TESTS_C="hello hello-tls crt-test" +TESTS_C="hello hello-tls crt-test setjmp" TESTS_C_NO_BUILTIN="crt-test" TESTS_CPP="hello-cpp hello-exception" for arch in $ARCHS; do diff --git a/test/setjmp.c b/test/setjmp.c new file mode 100644 index 0000000..a4cf5ff --- /dev/null +++ b/test/setjmp.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018 Martin Storsjo + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + +jmp_buf jmp; + +int fibonacci(int val) { + char buf[100]; + if (val <= 1) { + longjmp(jmp, 1); + return val; + } + snprintf(buf, sizeof(buf), "fibonacci(%d)", val); + printf("%s\n", buf); + return fibonacci(val - 1) + fibonacci(val - 2); +} + +double check_d, check_cos; + +int main(int argc, char* argv[]) { + int val = 10, ret; + double val2 = 3.14; + if (argc > 1) + val = atoi(argv[1]); + if (argc > 2) + val2 = atof(argv[2]); + double d = sin(val2); + printf("d = %f\n", d); + printf("cos = %f\n", cos(val2)); + printf("size = %d, %p\n", (int) sizeof(jmp), jmp); + check_d = d; + check_cos = cos(val2); + if ((ret = setjmp(jmp)) != 0) { + printf("setjmp returned %d\n", ret); + printf("d = %f\n", d); + printf("cos = %f\n", cos(val2)); + if (d != check_d || cos(val2) != check_cos) { + printf("local variables were clobbered\n"); + return 1; + } + return 0; + } + printf("fibonacci(%d) = %d\n", val, fibonacci(val)); + return 1; +}