Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Unified Diff: test/cctest/wasm/test-run-wasm-64.cc

Issue 2042773002: [wasm] Move 64-bit call tests into test-run-wasm-64.cc so they also run on 32-bit platforms. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/wasm/test-run-wasm.cc ('k') | test/cctest/wasm/wasm-run-utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/wasm/test-run-wasm-64.cc
diff --git a/test/cctest/wasm/test-run-wasm-64.cc b/test/cctest/wasm/test-run-wasm-64.cc
index 1a5b341b744c8b3a3410b27158d84d1691cfe90e..af8749864e8e76e102cc48c1d196ce3d628c1835 100644
--- a/test/cctest/wasm/test-run-wasm-64.cc
+++ b/test/cctest/wasm/test-run-wasm-64.cc
@@ -14,6 +14,13 @@
#include "test/cctest/wasm/test-signatures.h"
#include "test/cctest/wasm/wasm-run-utils.h"
+// If the target architecture is 64-bit, enable all tests.
+#if !V8_TARGET_ARCH_32_BIT || V8_TARGET_ARCH_X64
+#define WASM_64 1
+#else
+#define WASM_64 0
+#endif
+
#define CHECK_TRAP32(x) \
CHECK_EQ(0xdeadbeef, (bit_cast<uint32_t>(x)) & 0xFFFFFFFF)
#define CHECK_TRAP64(x) \
@@ -1416,3 +1423,153 @@ WASM_EXEC_TEST(I64Rol) {
}
}
}
+
+WASM_EXEC_TEST(StoreMem_offset_oob_i64) {
+ TestingModule module(execution_mode);
+ byte* memory = module.AddMemoryElems<byte>(32);
+
+ static const MachineType machineTypes[] = {
+ MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(),
+ MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(),
+ MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(),
+ MachineType::Float64()};
+
+ for (size_t m = 0; m < arraysize(machineTypes); m++) {
+ module.RandomizeMemory(1119 + static_cast<int>(m));
+ WasmRunner<int32_t> r(&module, MachineType::Uint32());
+
+ BUILD(r, WASM_STORE_MEM_OFFSET(machineTypes[m], 8, WASM_GET_LOCAL(0),
+ WASM_LOAD_MEM(machineTypes[m], WASM_ZERO)),
+ WASM_ZERO);
+
+ byte memsize = WasmOpcodes::MemSize(machineTypes[m]);
+ uint32_t boundary = 24 - memsize;
+ CHECK_EQ(0, r.Call(boundary)); // in bounds.
+ CHECK_EQ(0, memcmp(&memory[0], &memory[8 + boundary], memsize));
+
+ for (uint32_t offset = boundary + 1; offset < boundary + 19; offset++) {
+ CHECK_TRAP(r.Call(offset)); // out of bounds.
+ }
+ }
+}
+
+#define ADD_CODE(vec, ...) \
+ do { \
+ byte __buf[] = {__VA_ARGS__}; \
+ for (size_t i = 0; i < sizeof(__buf); i++) vec.push_back(__buf[i]); \
+ } while (false)
+
+static void CompileCallIndirectMany(LocalType param) {
+ // Make sure we don't run out of registers when compiling indirect calls
+ // with many many parameters.
+ TestSignatures sigs;
+ for (byte num_params = 0; num_params < 40; num_params++) {
+ v8::base::AccountingAllocator allocator;
+ Zone zone(&allocator);
+ HandleScope scope(CcTest::InitIsolateOnce());
+ TestingModule module(kExecuteCompiled);
+ FunctionSig* sig = sigs.many(&zone, kAstStmt, param, num_params);
+
+ module.AddSignature(sig);
+ module.AddSignature(sig);
+ module.AddIndirectFunctionTable(nullptr, 0);
+
+ WasmFunctionCompiler t(sig, &module);
+
+ std::vector<byte> code;
+ ADD_CODE(code, kExprI8Const, 0);
+ for (byte p = 0; p < num_params; p++) {
+ ADD_CODE(code, kExprGetLocal, p);
+ }
+ ADD_CODE(code, kExprCallIndirect, static_cast<byte>(num_params), 1);
+
+ t.Build(&code[0], &code[0] + code.size());
+ t.Compile();
+ }
+}
+
+TEST(Compile_Wasm_CallIndirect_Many_i64) { CompileCallIndirectMany(kAstI64); }
+
+static void Run_WasmMixedCall_N(WasmExecutionMode execution_mode, int start) {
+ const int kExpected = 6333;
+ const int kElemSize = 8;
+ TestSignatures sigs;
+
+ static MachineType mixed[] = {
+ MachineType::Int32(), MachineType::Float32(), MachineType::Int64(),
+ MachineType::Float64(), MachineType::Float32(), MachineType::Int64(),
+ MachineType::Int32(), MachineType::Float64(), MachineType::Float32(),
+ MachineType::Float64(), MachineType::Int32(), MachineType::Int64(),
+ MachineType::Int32(), MachineType::Int32()};
+
+ int num_params = static_cast<int>(arraysize(mixed)) - start;
+ for (int which = 0; which < num_params; which++) {
+ v8::base::AccountingAllocator allocator;
+ Zone zone(&allocator);
+ TestingModule module(execution_mode);
+ module.AddMemory(1024);
+ MachineType* memtypes = &mixed[start];
+ MachineType result = memtypes[which];
+
+ // =========================================================================
+ // Build the selector function.
+ // =========================================================================
+ uint32_t index;
+ FunctionSig::Builder b(&zone, 1, num_params);
+ b.AddReturn(WasmOpcodes::LocalTypeFor(result));
+ for (int i = 0; i < num_params; i++) {
+ b.AddParam(WasmOpcodes::LocalTypeFor(memtypes[i]));
+ }
+ WasmFunctionCompiler t(b.Build(), &module);
+ BUILD(t, WASM_GET_LOCAL(which));
+ index = t.CompileAndAdd();
+
+ // =========================================================================
+ // Build the calling function.
+ // =========================================================================
+ WasmRunner<int32_t> r(&module);
+ std::vector<byte> code;
+
+ // Load the offset for the store.
+ ADD_CODE(code, WASM_ZERO);
+
+ // Load the arguments.
+ for (int i = 0; i < num_params; i++) {
+ int offset = (i + 1) * kElemSize;
+ ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset)));
+ }
+
+ // Call the selector function.
+ ADD_CODE(code, kExprCallFunction, static_cast<byte>(num_params),
+ static_cast<byte>(index));
+
+ // Store the result in memory.
+ ADD_CODE(code,
+ static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)),
+ ZERO_ALIGNMENT, ZERO_OFFSET);
+
+ // Return the expected value.
+ ADD_CODE(code, WASM_I32V_2(kExpected));
+
+ r.Build(&code[0], &code[0] + code.size());
+
+ // Run the code.
+ for (int t = 0; t < 10; t++) {
+ module.RandomizeMemory();
+ CHECK_EQ(kExpected, r.Call());
+
+ int size = WasmOpcodes::MemSize(result);
+ for (int i = 0; i < size; i++) {
+ int base = (which + 1) * kElemSize;
+ byte expected = module.raw_mem_at<byte>(base + i);
+ byte result = module.raw_mem_at<byte>(i);
+ CHECK_EQ(expected, result);
+ }
+ }
+ }
+}
+
+WASM_EXEC_TEST(MixedCall_i64_0) { Run_WasmMixedCall_N(execution_mode, 0); }
+WASM_EXEC_TEST(MixedCall_i64_1) { Run_WasmMixedCall_N(execution_mode, 1); }
+WASM_EXEC_TEST(MixedCall_i64_2) { Run_WasmMixedCall_N(execution_mode, 2); }
+WASM_EXEC_TEST(MixedCall_i64_3) { Run_WasmMixedCall_N(execution_mode, 3); }
« no previous file with comments | « test/cctest/wasm/test-run-wasm.cc ('k') | test/cctest/wasm/wasm-run-utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698