[libc] Accommodate Fuchsia's death test framework in fenv tests.

Fuchsia's death test framework runs the closure which can die in a
different thread. Hence, the FP exceptions which cause the closure to
die should be enalbed in the closure.

Reviewed By: michaelrj

Differential Revision: https://reviews.llvm.org/D106683
This commit is contained in:
Siva Chandra Reddy 2021-07-23 16:56:56 +00:00
parent 92c085e7c4
commit c24c18bba6
2 changed files with 27 additions and 5 deletions

View File

@ -49,6 +49,17 @@ TEST(LlvmLibcExceptionStatusTest, RaiseAndCrash) {
ASSERT_EQ(__llvm_libc::fetestexcept(others), others);
}
ASSERT_RAISES_FP_EXCEPT([=] { __llvm_libc::feraiseexcept(e); });
ASSERT_RAISES_FP_EXCEPT([=] {
// In test frameworks like Fuchsia's zxtest, this translates to
// a death test which runs this closure in a different thread. So,
// we enable the exception again inside this closure so that the
// exception gets enabled for the thread running this closure.
__llvm_libc::fputil::enableExcept(e);
__llvm_libc::feraiseexcept(e);
});
// Cleanup.
__llvm_libc::fputil::disableExcept(FE_ALL_EXCEPT);
ASSERT_EQ(__llvm_libc::feclearexcept(FE_ALL_EXCEPT), 0);
}
}

View File

@ -28,9 +28,20 @@ TEST(LlvmLibcFEnvTest, RaiseAndCrash) {
// should not crash/invoke the exception handler.
ASSERT_EQ(__llvm_libc::fputil::raiseExcept(e), 0);
// When we put back the saved env which has the exception enabled, it
// should crash with SIGFPE.
__llvm_libc::fputil::setEnv(&env);
ASSERT_RAISES_FP_EXCEPT([=] { __llvm_libc::fputil::raiseExcept(e); });
ASSERT_RAISES_FP_EXCEPT([=] {
// When we put back the saved env, which has the exception enabled, it
// should crash with SIGFPE. Note that we set the old environment
// back inside this closure because in some test frameworks like Fuchsia's
// zxtest, this test translates to a death test in which this closure is
// run in a different thread. So, we set the old environment inside
// this closure so that the exception gets enabled for the thread running
// this closure.
__llvm_libc::fputil::setEnv(&env);
__llvm_libc::fputil::raiseExcept(e);
});
// Cleanup
__llvm_libc::fputil::disableExcept(FE_ALL_EXCEPT);
ASSERT_EQ(__llvm_libc::fputil::clearExcept(FE_ALL_EXCEPT), 0);
}
}