diff options
Diffstat (limited to 'deps/v8/test/unittests/wasm/ast-decoder-unittest.cc')
-rw-r--r-- | deps/v8/test/unittests/wasm/ast-decoder-unittest.cc | 102 |
1 files changed, 71 insertions, 31 deletions
diff --git a/deps/v8/test/unittests/wasm/ast-decoder-unittest.cc b/deps/v8/test/unittests/wasm/ast-decoder-unittest.cc index cbaf6201c6..e630ac4721 100644 --- a/deps/v8/test/unittests/wasm/ast-decoder-unittest.cc +++ b/deps/v8/test/unittests/wasm/ast-decoder-unittest.cc @@ -11,6 +11,7 @@ #include "src/objects.h" #include "src/wasm/ast-decoder.h" +#include "src/wasm/signature-map.h" #include "src/wasm/wasm-macro-gen.h" #include "src/wasm/wasm-module.h" #include "src/wasm/wasm-opcodes.h" @@ -1149,7 +1150,7 @@ TEST_F(AstDecoderTest, AllSimpleExpressions) { } TEST_F(AstDecoderTest, MemorySize) { - byte code[] = {kExprMemorySize}; + byte code[] = {kExprMemorySize, 0}; EXPECT_VERIFIES_C(i_i, code); EXPECT_FAILURE_C(f_ff, code); } @@ -1183,7 +1184,7 @@ TEST_F(AstDecoderTest, LoadMemAlignment) { {kExprF64LoadMem, 3}, // -- }; - for (int i = 0; i < arraysize(values); i++) { + for (size_t i = 0; i < arraysize(values); i++) { for (byte alignment = 0; alignment <= 4; alignment++) { byte code[] = {WASM_ZERO, static_cast<byte>(values[i].instruction), alignment, ZERO_OFFSET, WASM_DROP}; @@ -1283,7 +1284,7 @@ class TestModuleEnv : public ModuleEnv { module = &mod; } byte AddGlobal(LocalType type, bool mutability = true) { - mod.globals.push_back({type, mutability, NO_INIT, 0, false, false}); + mod.globals.push_back({type, mutability, WasmInitExpr(), 0, false, false}); CHECK(mod.globals.size() <= 127); return static_cast<byte>(mod.globals.size() - 1); } @@ -1311,6 +1312,11 @@ class TestModuleEnv : public ModuleEnv { return result; } + void InitializeFunctionTable() { + mod.function_tables.push_back( + {0, 0, true, std::vector<int32_t>(), false, false, SignatureMap()}); + } + private: WasmModule mod; }; @@ -1421,6 +1427,7 @@ TEST_F(AstDecoderTest, MultiReturnType) { TEST_F(AstDecoderTest, SimpleIndirectCalls) { FunctionSig* sig = sigs.i_i(); TestModuleEnv module_env; + module_env.InitializeFunctionTable(); module = &module_env; byte f0 = module_env.AddSignature(sigs.i_v()); @@ -1436,6 +1443,7 @@ TEST_F(AstDecoderTest, SimpleIndirectCalls) { TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) { FunctionSig* sig = sigs.i_i(); TestModuleEnv module_env; + module_env.InitializeFunctionTable(); module = &module_env; EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO)); @@ -1452,6 +1460,7 @@ TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) { TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) { FunctionSig* sig = sigs.i_i(); TestModuleEnv module_env; + module_env.InitializeFunctionTable(); module = &module_env; byte f0 = module_env.AddFunction(sigs.i_f()); @@ -1471,6 +1480,21 @@ TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) { EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_F32(17.6))); } +TEST_F(AstDecoderTest, IndirectCallsWithoutTableCrash) { + FunctionSig* sig = sigs.i_i(); + TestModuleEnv module_env; + module = &module_env; + + byte f0 = module_env.AddSignature(sigs.i_v()); + byte f1 = module_env.AddSignature(sigs.i_i()); + byte f2 = module_env.AddSignature(sigs.i_ii()); + + EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(f0, WASM_ZERO)); + EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(22))); + EXPECT_FAILURE_S( + sig, WASM_CALL_INDIRECT2(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72))); +} + TEST_F(AstDecoderTest, SimpleImportCalls) { FunctionSig* sig = sigs.i_i(); TestModuleEnv module_env; @@ -1632,7 +1656,7 @@ TEST_F(AstDecoderTest, WasmGrowMemory) { module = &module_env; module->origin = kWasmOrigin; - byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))}; + byte code[] = {WASM_GET_LOCAL(0), kExprGrowMemory, 0}; EXPECT_VERIFIES_C(i_i, code); EXPECT_FAILURE_C(i_d, code); } @@ -1642,7 +1666,7 @@ TEST_F(AstDecoderTest, AsmJsGrowMemory) { module = &module_env; module->origin = kAsmJsOrigin; - byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))}; + byte code[] = {WASM_GET_LOCAL(0), kExprGrowMemory, 0}; EXPECT_FAILURE_C(i_i, code); } @@ -1673,7 +1697,7 @@ TEST_F(AstDecoderTest, AsmJsBinOpsCheckOrigin) { TestModuleEnv module_env; module = &module_env; module->origin = kAsmJsOrigin; - for (int i = 0; i < arraysize(AsmJsBinOps); i++) { + for (size_t i = 0; i < arraysize(AsmJsBinOps); i++) { TestBinop(AsmJsBinOps[i].op, AsmJsBinOps[i].sig); } } @@ -1682,7 +1706,7 @@ TEST_F(AstDecoderTest, AsmJsBinOpsCheckOrigin) { TestModuleEnv module_env; module = &module_env; module->origin = kWasmOrigin; - for (int i = 0; i < arraysize(AsmJsBinOps); i++) { + for (size_t i = 0; i < arraysize(AsmJsBinOps); i++) { byte code[] = { WASM_BINOP(AsmJsBinOps[i].op, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))}; EXPECT_FAILURE_SC(AsmJsBinOps[i].sig, code); @@ -1721,7 +1745,7 @@ TEST_F(AstDecoderTest, AsmJsUnOpsCheckOrigin) { TestModuleEnv module_env; module = &module_env; module->origin = kAsmJsOrigin; - for (int i = 0; i < arraysize(AsmJsUnOps); i++) { + for (size_t i = 0; i < arraysize(AsmJsUnOps); i++) { TestUnop(AsmJsUnOps[i].op, AsmJsUnOps[i].sig); } } @@ -1730,7 +1754,7 @@ TEST_F(AstDecoderTest, AsmJsUnOpsCheckOrigin) { TestModuleEnv module_env; module = &module_env; module->origin = kWasmOrigin; - for (int i = 0; i < arraysize(AsmJsUnOps); i++) { + for (size_t i = 0; i < arraysize(AsmJsUnOps); i++) { byte code[] = {WASM_UNOP(AsmJsUnOps[i].op, WASM_GET_LOCAL(0))}; EXPECT_FAILURE_SC(AsmJsUnOps[i].sig, code); } @@ -2222,7 +2246,7 @@ class BranchTableIteratorTest : public TestWithZone { Decoder decoder(start, end); BranchTableOperand operand(&decoder, start); BranchTableIterator iterator(&decoder, operand); - EXPECT_EQ(end - start - 1, iterator.length()); + EXPECT_EQ(end - start - 1u, iterator.length()); EXPECT_TRUE(decoder.ok()); } void CheckBrTableError(const byte* start, const byte* end) { @@ -2280,16 +2304,18 @@ class WasmOpcodeLengthTest : public TestWithZone { WasmOpcodeLengthTest() : TestWithZone() {} }; -#define EXPECT_LENGTH(expected, opcode) \ - { \ - static const byte code[] = {opcode, 0, 0, 0, 0, 0, 0, 0, 0}; \ - EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \ +#define EXPECT_LENGTH(expected, opcode) \ + { \ + static const byte code[] = {opcode, 0, 0, 0, 0, 0, 0, 0, 0}; \ + EXPECT_EQ(static_cast<unsigned>(expected), \ + OpcodeLength(code, code + sizeof(code))); \ } -#define EXPECT_LENGTH_N(expected, ...) \ - { \ - static const byte code[] = {__VA_ARGS__}; \ - EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \ +#define EXPECT_LENGTH_N(expected, ...) \ + { \ + static const byte code[] = {__VA_ARGS__}; \ + EXPECT_EQ(static_cast<unsigned>(expected), \ + OpcodeLength(code, code + sizeof(code))); \ } TEST_F(WasmOpcodeLengthTest, Statements) { @@ -2316,7 +2342,7 @@ TEST_F(WasmOpcodeLengthTest, MiscExpressions) { EXPECT_LENGTH(2, kExprGetGlobal); EXPECT_LENGTH(2, kExprSetGlobal); EXPECT_LENGTH(2, kExprCallFunction); - EXPECT_LENGTH(2, kExprCallIndirect); + EXPECT_LENGTH(3, kExprCallIndirect); } TEST_F(WasmOpcodeLengthTest, I32Const) { @@ -2375,8 +2401,8 @@ TEST_F(WasmOpcodeLengthTest, LoadsAndStores) { } TEST_F(WasmOpcodeLengthTest, MiscMemExpressions) { - EXPECT_LENGTH(1, kExprMemorySize); - EXPECT_LENGTH(1, kExprGrowMemory); + EXPECT_LENGTH(2, kExprMemorySize); + EXPECT_LENGTH(2, kExprGrowMemory); } TEST_F(WasmOpcodeLengthTest, SimpleExpressions) { @@ -2500,6 +2526,19 @@ TEST_F(WasmOpcodeLengthTest, SimpleExpressions) { EXPECT_LENGTH(1, kExprI64ReinterpretF64); } +TEST_F(WasmOpcodeLengthTest, SimdExpressions) { +#define TEST_SIMD(name, opcode, sig) \ + EXPECT_LENGTH_N(2, kSimdPrefix, static_cast<byte>(kExpr##name & 0xff)); + FOREACH_SIMD_0_OPERAND_OPCODE(TEST_SIMD) +#undef TEST_SIMD +#define TEST_SIMD(name, opcode, sig) \ + EXPECT_LENGTH_N(3, kSimdPrefix, static_cast<byte>(kExpr##name & 0xff)); + FOREACH_SIMD_1_OPERAND_OPCODE(TEST_SIMD) +#undef TEST_SIMD + // test for bad simd opcode + EXPECT_LENGTH_N(2, kSimdPrefix, 0xff); +} + typedef ZoneVector<LocalType> LocalTypeMap; class LocalDeclDecoderTest : public TestWithZone { @@ -2534,7 +2573,7 @@ TEST_F(LocalDeclDecoderTest, NoLocals) { AstLocalDecls decls(zone()); bool result = DecodeLocalDecls(decls, data, data + sizeof(data)); EXPECT_TRUE(result); - EXPECT_EQ(0, decls.total_local_count); + EXPECT_EQ(0u, decls.total_local_count); } TEST_F(LocalDeclDecoderTest, OneLocal) { @@ -2545,10 +2584,10 @@ TEST_F(LocalDeclDecoderTest, OneLocal) { AstLocalDecls decls(zone()); bool result = DecodeLocalDecls(decls, data, data + sizeof(data)); EXPECT_TRUE(result); - EXPECT_EQ(1, decls.total_local_count); + EXPECT_EQ(1u, decls.total_local_count); LocalTypeMap map = Expand(decls); - EXPECT_EQ(1, map.size()); + EXPECT_EQ(1u, map.size()); EXPECT_EQ(type, map[0]); } } @@ -2562,10 +2601,10 @@ TEST_F(LocalDeclDecoderTest, FiveLocals) { bool result = DecodeLocalDecls(decls, data, data + sizeof(data)); EXPECT_TRUE(result); EXPECT_EQ(sizeof(data), decls.decls_encoded_size); - EXPECT_EQ(5, decls.total_local_count); + EXPECT_EQ(5u, decls.total_local_count); LocalTypeMap map = Expand(decls); - EXPECT_EQ(5, map.size()); + EXPECT_EQ(5u, map.size()); ExpectRun(map, 0, type, 5); } } @@ -2581,10 +2620,11 @@ TEST_F(LocalDeclDecoderTest, MixedLocals) { bool result = DecodeLocalDecls(decls, data, data + sizeof(data)); EXPECT_TRUE(result); EXPECT_EQ(sizeof(data), decls.decls_encoded_size); - EXPECT_EQ(a + b + c + d, decls.total_local_count); + EXPECT_EQ(static_cast<uint32_t>(a + b + c + d), + decls.total_local_count); LocalTypeMap map = Expand(decls); - EXPECT_EQ(a + b + c + d, map.size()); + EXPECT_EQ(static_cast<uint32_t>(a + b + c + d), map.size()); size_t pos = 0; pos = ExpectRun(map, pos, kAstI32, a); @@ -2610,7 +2650,7 @@ TEST_F(LocalDeclDecoderTest, UseEncoder) { AstLocalDecls decls(zone()); bool result = DecodeLocalDecls(decls, data, end); EXPECT_TRUE(result); - EXPECT_EQ(5 + 1337 + 212, decls.total_local_count); + EXPECT_EQ(5u + 1337u + 212u, decls.total_local_count); LocalTypeMap map = Expand(decls); size_t pos = 0; @@ -2662,8 +2702,8 @@ TEST_F(BytecodeIteratorTest, WithAstDecls) { AstLocalDecls decls(zone()); BytecodeIterator iter(code, code + sizeof(code), &decls); - EXPECT_EQ(3, decls.decls_encoded_size); - EXPECT_EQ(3, iter.pc_offset()); + EXPECT_EQ(3u, decls.decls_encoded_size); + EXPECT_EQ(3u, iter.pc_offset()); EXPECT_TRUE(iter.has_next()); EXPECT_EQ(kExprI8Const, iter.current()); iter.next(); |