/
GitCaptain
/
llvm-project
Обзор
Документация
Войти
/
GitCaptain
/
llvm-project
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
fix-tests
libc/utils/UnitTest/FPExceptMatcher.cpp
52 строки
1 KB
Siva Chandra Reddy
[libc][NFC] Move test related pieces from FPUtil to util/UnitTest.
29 окт 2021, 18:37
29 окт 2021, 18:37
6c3f53c
Код
Авторство
О чём код?
//===-- FPExceptMatchers.cpp ----------------------------------------------===// // // 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 "FPExceptMatcher.h" #include <fenv.h> #include <memory> #include <setjmp.h> #include <signal.h> namespace __llvm_libc { namespace fputil { namespace testing { #if defined(_WIN32) #define sigjmp_buf jmp_buf #define sigsetjmp(buf, save) setjmp(buf) #define siglongjmp(buf, val) longjmp(buf, val) #endif static thread_local sigjmp_buf jumpBuffer; static thread_local bool caughtExcept; static void sigfpeHandler(int sig) { caughtExcept = true; siglongjmp(jumpBuffer, -1); } FPExceptMatcher::FPExceptMatcher(FunctionCaller *func) { auto oldSIGFPEHandler = signal(SIGFPE, &sigfpeHandler); std::unique_ptr<FunctionCaller> funcUP(func); caughtExcept = false; fenv_t oldEnv; fegetenv(&oldEnv); if (sigsetjmp(jumpBuffer, 1) == 0) funcUP->call(); // We restore the previous floating point environment after // the call to the function which can potentially raise SIGFPE. fesetenv(&oldEnv); signal(SIGFPE, oldSIGFPEHandler); exceptionRaised = caughtExcept; } } // namespace testing } // namespace fputil } // namespace __llvm_libc