forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch moves most of the multiprecision logic to the `multiword` namespace and simplifies some logic in `BigInt`. It also fully implements the mask and count functions and increases test coverage. `math_extras.h` is also reworked to make it more concise.
- Loading branch information
Showing
13 changed files
with
1,011 additions
and
762 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
add_libc_fuzzer( | ||
uint_fuzz | ||
SRCS | ||
uint_fuzz.cpp | ||
DEPENDS | ||
libc.src.__support.uint | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
#include "src/__support/CPP/bit.h" | ||
#include "src/__support/UInt.h" | ||
#include "src/string/memory_utils/inline_memcpy.h" | ||
|
||
using namespace LIBC_NAMESPACE; | ||
|
||
// Helper function when using gdb / lldb to set a breakpoint and inspect values. | ||
template <typename T> void debug_and_trap(const char *msg, T a, T b) { | ||
__builtin_trap(); | ||
} | ||
|
||
#define DEBUG_AND_TRAP() | ||
|
||
#define TEST_BINOP(OP) \ | ||
if ((a OP b) != (static_cast<T>(BigInt(a) OP BigInt(b)))) \ | ||
debug_and_trap(#OP, a, b); | ||
|
||
#define TEST_SHIFTOP(OP) \ | ||
if ((a OP b) != (static_cast<T>(BigInt(a) OP b))) \ | ||
debug_and_trap(#OP, a, b); | ||
|
||
#define TEST_FUNCTION(FUN) \ | ||
if (FUN(a) != FUN(BigInt(a))) \ | ||
debug_and_trap(#FUN, a, b); | ||
|
||
// Test that basic arithmetic operations of BigInt behave like their scalar | ||
// counterparts. | ||
template <typename T, typename BigInt> void run_tests(T a, T b) { | ||
TEST_BINOP(+) | ||
TEST_BINOP(-) | ||
TEST_BINOP(*) | ||
if (b != 0) | ||
TEST_BINOP(/) | ||
if (b >= 0 && b < cpp::numeric_limits<T>::digits) { | ||
TEST_SHIFTOP(<<) | ||
TEST_SHIFTOP(>>) | ||
} | ||
if constexpr (!BigInt::SIGNED) { | ||
TEST_FUNCTION(cpp::has_single_bit) | ||
TEST_FUNCTION(cpp::countr_zero) | ||
TEST_FUNCTION(cpp::countl_zero) | ||
TEST_FUNCTION(cpp::countl_one) | ||
TEST_FUNCTION(cpp::countr_one) | ||
} | ||
} | ||
|
||
// Reads a T from libfuzzer data. | ||
template <typename T> T read(const uint8_t *data, size_t &remainder) { | ||
T out = 0; | ||
constexpr size_t T_SIZE = sizeof(T); | ||
const size_t copy_size = remainder < T_SIZE ? remainder : T_SIZE; | ||
inline_memcpy(&out, data, copy_size); | ||
remainder -= copy_size; | ||
return out; | ||
} | ||
|
||
template <typename T, typename BigInt> | ||
void run_tests(const uint8_t *data, size_t size) { | ||
const auto a = read<T>(data, size); | ||
const auto b = read<T>(data, size); | ||
run_tests<T, BigInt>(a, b); | ||
} | ||
|
||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { | ||
// unsigned | ||
run_tests<uint64_t, BigInt<64, false, uint16_t>>(data, size); | ||
// signed | ||
run_tests<int64_t, BigInt<64, true, uint16_t>>(data, size); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.