node/deps/v8/test/unittests/wasm/signature-hashing-unittest.cc
Michaël Zasso 9d7cd9b864
deps: update V8 to 12.8.374.13
PR-URL: https://github.com/nodejs/node/pull/54077
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Richard Lau <rlau@redhat.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
2024-08-16 16:03:01 +02:00

80 lines
2.4 KiB
C++

// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/wasm/signature-hashing.h"
#include "test/unittests/test-utils.h"
namespace v8::internal::wasm::signature_hashing_unittest {
#if V8_ENABLE_SANDBOX
class WasmSignatureHashingTest : public TestWithPlatform {
public:
uint64_t H(std::initializer_list<ValueType> params,
std::initializer_list<ValueType> returns) {
const FunctionSig* sig = FunctionSig::Build(&zone_, returns, params);
return SignatureHasher::Hash(sig);
}
private:
AccountingAllocator allocator_;
Zone zone_{&allocator_, "WasmSignatureHashingTestZone"};
};
TEST_F(WasmSignatureHashingTest, SignatureHashing) {
ValueType i = kWasmI32;
ValueType l = kWasmI64;
ValueType d = kWasmF64;
ValueType s = kWasmS128;
ValueType r = kWasmExternRef;
USE(l);
std::vector<uint64_t> distinct_hashes{
// Some simple signatures.
H({}, {}), // --
H({i}, {}), // --
H({r}, {}), // --
H({}, {i}), // --
H({}, {r}), // --
// These two have the same number of parameters, but need different
// numbers of stack slots for them. Assume that no more than 8
// untagged params can be passed in registers; the 9th must be on the
// stack.
H({d, d, d, d, d, d, d, d, d}, {}), // --
H({d, d, d, d, d, d, d, d, s}, {}), // --
#if V8_TARGET_ARCH_32_BIT
// Same, but only relevant for 32-bit platforms.
H({i, i, i, i, i, i, i, i, i}, {}), // --
H({i, i, i, i, i, i, i, i, l}, {}),
#endif // V8_TARGET_ARCH_32_BIT
// Same, but for returns. We only use 2 return registers.
H({}, {d, d, d, d}), // --
H({}, {d, d, s, d}), // --
// These two have the same number of stack parameters, but some are
// tagged.
H({i, i, i, i, i, i, i, i, i, i}, {}), // --
H({i, i, i, i, i, i, i, i, i, r}, {}), // --
};
for (size_t j = 0; j < distinct_hashes.size(); j++) {
for (size_t k = j + 1; k < distinct_hashes.size(); k++) {
uint64_t hash_j = distinct_hashes[j];
uint64_t hash_k = distinct_hashes[k];
if (hash_j == hash_k) {
PrintF("Hash collision for signatures %zu and %zu\n", j, k);
}
EXPECT_NE(hash_j, hash_k);
}
}
}
#endif // V8_ENABLE_SANDBOX
} // namespace v8::internal::wasm::signature_hashing_unittest