//===-- Unittests for setjmp and longjmp ----------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "src/setjmp/longjmp.h" #include "src/setjmp/setjmp_impl.h" #include "test/UnitTest/Test.h" constexpr int MAX_LOOP = 123; int longjmp_called = 0; void jump_back(jmp_buf buf, int n) { longjmp_called++; LIBC_NAMESPACE::longjmp(buf, n); // Will return |n| out of setjmp } TEST(LlvmLibcSetJmpTest, SetAndJumpBack) { jmp_buf buf; longjmp_called = 0; // Local variables in setjmp scope should be declared volatile. volatile int n = 0; // The first time setjmp is called, it should return 0. // Subsequent calls will return the value passed to jump_back below. if (LIBC_NAMESPACE::setjmp(buf) <= MAX_LOOP) { ++n; jump_back(buf, n); } ASSERT_EQ(longjmp_called, n); ASSERT_EQ(n, MAX_LOOP + 1); } TEST(LlvmLibcSetJmpTest, SetAndJumpBackValOne) { jmp_buf buf; longjmp_called = 0; int val = LIBC_NAMESPACE::setjmp(buf); if (val == 0) jump_back(buf, val); ASSERT_EQ(longjmp_called, 1); ASSERT_EQ(val, 1); }