1 //===-- Template to diff single-input-single-output functions ---*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_LIBC_FUZZING_MATH_SINGLE_INPUT_SINGLE_OUTPUT_DIFF_H 10 #define LLVM_LIBC_FUZZING_MATH_SINGLE_INPUT_SINGLE_OUTPUT_DIFF_H 11 12 #include "fuzzing/math/Compare.h" 13 #include "src/__support/FPUtil/FPBits.h" 14 15 #include <math.h> 16 #include <stddef.h> 17 #include <stdint.h> 18 19 template <typename T> using SingleInputSingleOutputFunc = T (*)(T); 20 21 template <typename T> 22 void SingleInputSingleOutputDiff(SingleInputSingleOutputFunc<T> func1, 23 SingleInputSingleOutputFunc<T> func2, 24 const uint8_t *data, size_t size) { 25 if (size < sizeof(T)) 26 return; 27 28 T x = *reinterpret_cast<const T *>(data); 29 30 T result1 = func1(x); 31 T result2 = func2(x); 32 33 if (!ValuesEqual(result1, result2)) 34 __builtin_trap(); 35 } 36 37 template <typename T1, typename T2> 38 using SingleInputSingleOutputWithSideEffectFunc = T1 (*)(T1, T2 *); 39 40 template <typename T1, typename T2> 41 void SingleInputSingleOutputWithSideEffectDiff( 42 SingleInputSingleOutputWithSideEffectFunc<T1, T2> func1, 43 SingleInputSingleOutputWithSideEffectFunc<T1, T2> func2, 44 const uint8_t *data, size_t size) { 45 if (size < sizeof(T1)) 46 return; 47 48 T1 x = *reinterpret_cast<const T1 *>(data); 49 T2 sideEffect1, sideEffect2; 50 51 T1 result1 = func1(x, &sideEffect1); 52 T1 result2 = func2(x, &sideEffect2); 53 54 if (!ValuesEqual(result1, result2)) 55 __builtin_trap(); 56 57 if (!ValuesEqual(sideEffect1, sideEffect2)) 58 __builtin_trap(); 59 } 60 61 #endif // LLVM_LIBC_FUZZING_MATH_SINGLE_INPUT_SINGLE_OUTPUT_DIFF_H 62