Commit 4e57789f authored by Clemens Backes's avatar Clemens Backes Committed by Commit Bot

[wasm] Remove bulk-memory flag

bulk-memory shipped in V8 v7.5, hence the feature flag can be removed
now. This saves some binary size and a few dynamic checks for the flag.

R=ahaas@chromium.org

Bug: v8:11074
Change-Id: Ia73622637939f2192940fdd6909520786ed27286
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2622913Reviewed-by: 's avatarAndreas Haas <ahaas@chromium.org>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#72045}
parent cab067c6
...@@ -8665,7 +8665,7 @@ class V8_EXPORT Isolate { ...@@ -8665,7 +8665,7 @@ class V8_EXPORT Isolate {
kWasmSimdOpcodes = 106, kWasmSimdOpcodes = 106,
kVarRedeclaredCatchBinding = 107, kVarRedeclaredCatchBinding = 107,
kWasmRefTypes = 108, kWasmRefTypes = 108,
kWasmBulkMemory = 109, kWasmBulkMemory = 109, // Unused.
kWasmMultiValue = 110, kWasmMultiValue = 110,
// If you add new values here, you'll also need to update Chromium's: // If you add new values here, you'll also need to update Chromium's:
......
...@@ -3146,8 +3146,6 @@ class WasmFullDecoder : public WasmDecoder<validate> { ...@@ -3146,8 +3146,6 @@ class WasmFullDecoder : public WasmDecoder<validate> {
if (full_opcode == kExprTableGrow || full_opcode == kExprTableSize || if (full_opcode == kExprTableGrow || full_opcode == kExprTableSize ||
full_opcode == kExprTableFill) { full_opcode == kExprTableFill) {
CHECK_PROTOTYPE_OPCODE(reftypes); CHECK_PROTOTYPE_OPCODE(reftypes);
} else if (full_opcode >= kExprMemoryInit) {
CHECK_PROTOTYPE_OPCODE(bulk_memory);
} }
trace_msg->AppendOpcode(full_opcode); trace_msg->AppendOpcode(full_opcode);
return DecodeNumericOpcode(full_opcode, opcode_length); return DecodeNumericOpcode(full_opcode, opcode_length);
......
...@@ -755,7 +755,6 @@ void UpdateFeatureUseCounts(Isolate* isolate, const WasmFeatures& detected) { ...@@ -755,7 +755,6 @@ void UpdateFeatureUseCounts(Isolate* isolate, const WasmFeatures& detected) {
using Feature = v8::Isolate::UseCounterFeature; using Feature = v8::Isolate::UseCounterFeature;
constexpr static std::pair<WasmFeature, Feature> kUseCounters[] = { constexpr static std::pair<WasmFeature, Feature> kUseCounters[] = {
{kFeature_reftypes, Feature::kWasmRefTypes}, {kFeature_reftypes, Feature::kWasmRefTypes},
{kFeature_bulk_memory, Feature::kWasmBulkMemory},
{kFeature_mv, Feature::kWasmMultiValue}, {kFeature_mv, Feature::kWasmMultiValue},
{kFeature_simd, Feature::kWasmSimdOpcodes}, {kFeature_simd, Feature::kWasmSimdOpcodes},
{kFeature_threads, Feature::kWasmThreadOpcodes}}; {kFeature_threads, Feature::kWasmThreadOpcodes}};
......
...@@ -499,11 +499,7 @@ class ModuleDecoderImpl : public Decoder { ...@@ -499,11 +499,7 @@ class ModuleDecoderImpl : public Decoder {
} }
break; break;
case kDataCountSectionCode: case kDataCountSectionCode:
if (enabled_features_.has_bulk_memory()) { DecodeDataCountSection();
DecodeDataCountSection();
} else {
errorf(pc(), "unexpected section <%s>", SectionName(section_code));
}
break; break;
case kExceptionSectionCode: case kExceptionSectionCode:
if (enabled_features_.has_eh()) { if (enabled_features_.has_eh()) {
...@@ -1972,21 +1968,7 @@ class ModuleDecoderImpl : public Decoder { ...@@ -1972,21 +1968,7 @@ class ModuleDecoderImpl : public Decoder {
ValueType* type, uint32_t* table_index, ValueType* type, uint32_t* table_index,
WasmInitExpr* offset) { WasmInitExpr* offset) {
const byte* pos = pc(); const byte* pos = pc();
uint32_t flag; uint32_t flag = consume_u32v("flag");
if (enabled_features_.has_bulk_memory() ||
enabled_features_.has_reftypes()) {
flag = consume_u32v("flag");
} else {
uint32_t table_index = consume_u32v("table index");
// The only valid flag value without bulk_memory or externref is '0'.
if (table_index != 0) {
error(
"Element segments with table indices require "
"--experimental-wasm-bulk-memory or --experimental-wasm-reftypes");
return;
}
flag = 0;
}
// The mask for the bit in the flag which indicates if the segment is // The mask for the bit in the flag which indicates if the segment is
// active or not. // active or not.
...@@ -2022,24 +2004,6 @@ class ModuleDecoderImpl : public Decoder { ...@@ -2022,24 +2004,6 @@ class ModuleDecoderImpl : public Decoder {
"Declarative element segments require --experimental-wasm-reftypes"); "Declarative element segments require --experimental-wasm-reftypes");
return; return;
} }
if (*status == WasmElemSegment::kStatusPassive &&
!enabled_features_.has_bulk_memory()) {
error("Passive element segments require --experimental-wasm-bulk-memory");
return;
}
if (*functions_as_elements && !enabled_features_.has_bulk_memory()) {
error(
"Illegal segment flag. Did you forget "
"--experimental-wasm-bulk-memory?");
return;
}
if (flag != 0 && !enabled_features_.has_bulk_memory() &&
!enabled_features_.has_reftypes()) {
error(
"Invalid segment flag. Enable with --experimental-wasm-bulk-memory "
"or --experimental-wasm-reftypes");
return;
}
if ((flag & kFullMask) != flag) { if ((flag & kFullMask) != flag) {
errorf(pos, "illegal flag value %u. Must be between 0 and 7", flag); errorf(pos, "illegal flag value %u. Must be between 0 and 7", flag);
} }
...@@ -2088,21 +2052,9 @@ class ModuleDecoderImpl : public Decoder { ...@@ -2088,21 +2052,9 @@ class ModuleDecoderImpl : public Decoder {
uint32_t flag = consume_u32v("flag"); uint32_t flag = consume_u32v("flag");
// Some flag values are only valid for specific proposals. // Some flag values are only valid for specific proposals.
if (flag == SegmentFlags::kPassive) { if (flag != SegmentFlags::kActiveNoIndex &&
if (!enabled_features_.has_bulk_memory()) { flag != SegmentFlags::kPassive &&
error( flag != SegmentFlags::kActiveWithIndex) {
"Passive element segments require --experimental-wasm-bulk-memory");
return;
}
} else if (flag == SegmentFlags::kActiveWithIndex) {
if (!(enabled_features_.has_bulk_memory() ||
enabled_features_.has_reftypes())) {
error(
"Element segments with table indices require "
"--experimental-wasm-bulk-memory or --experimental-wasm-reftypes");
return;
}
} else if (flag != SegmentFlags::kActiveNoIndex) {
errorf(pos, "illegal flag value %u. Must be 0, 1, or 2", flag); errorf(pos, "illegal flag value %u. Must be 0, 1, or 2", flag);
return; return;
} }
......
...@@ -655,45 +655,6 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() { ...@@ -655,45 +655,6 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
InitializeExceptions(instance); InitializeExceptions(instance);
} }
// The bulk memory proposal changes the MVP behavior here; the segments are
// written as if `memory.init` and `table.init` are executed directly, and
// not bounds checked ahead of time.
if (!enabled_.has_bulk_memory()) {
//--------------------------------------------------------------------------
// Check that indirect function table segments are within bounds.
//--------------------------------------------------------------------------
for (const WasmElemSegment& elem_segment : module_->elem_segments) {
if (elem_segment.status != WasmElemSegment::kStatusActive) continue;
DCHECK_LT(elem_segment.table_index, table_count);
uint32_t base = EvalUint32InitExpr(instance, elem_segment.offset);
// Because of imported tables, {table_size} has to come from the table
// object itself.
auto table_object = handle(WasmTableObject::cast(instance->tables().get(
elem_segment.table_index)),
isolate_);
uint32_t table_size = table_object->current_length();
if (!base::IsInBounds<uint32_t>(
base, static_cast<uint32_t>(elem_segment.entries.size()),
table_size)) {
thrower_->LinkError("table initializer is out of bounds");
return {};
}
}
//--------------------------------------------------------------------------
// Check that memory segments are within bounds.
//--------------------------------------------------------------------------
for (const WasmDataSegment& seg : module_->data_segments) {
if (!seg.active) continue;
uint32_t base = EvalUint32InitExpr(instance, seg.dest_addr);
if (!base::IsInBounds<uint64_t>(base, seg.source.length(),
instance->memory_size())) {
thrower_->LinkError("data segment is out of bounds");
return {};
}
}
}
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Set up the exports object for the new instance. // Set up the exports object for the new instance.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
...@@ -862,33 +823,20 @@ void InstanceBuilder::LoadDataSegments(Handle<WasmInstanceObject> instance) { ...@@ -862,33 +823,20 @@ void InstanceBuilder::LoadDataSegments(Handle<WasmInstanceObject> instance) {
for (const WasmDataSegment& segment : module_->data_segments) { for (const WasmDataSegment& segment : module_->data_segments) {
uint32_t size = segment.source.length(); uint32_t size = segment.source.length();
if (enabled_.has_bulk_memory()) { // Passive segments are not copied during instantiation.
// Passive segments are not copied during instantiation. if (!segment.active) continue;
if (!segment.active) continue;
uint32_t dest_offset = EvalUint32InitExpr(instance, segment.dest_addr); uint32_t dest_offset = EvalUint32InitExpr(instance, segment.dest_addr);
bool ok = base::ClampToBounds( bool ok = base::ClampToBounds(
dest_offset, &size, static_cast<uint32_t>(instance->memory_size())); dest_offset, &size, static_cast<uint32_t>(instance->memory_size()));
if (!ok) { if (!ok) {
thrower_->RuntimeError("data segment is out of bounds"); thrower_->RuntimeError("data segment is out of bounds");
return; return;
}
// No need to copy empty segments.
if (size == 0) continue;
std::memcpy(instance->memory_start() + dest_offset,
wire_bytes.begin() + segment.source.offset(), size);
} else {
DCHECK(segment.active);
// Segments of size == 0 are just nops.
if (size == 0) continue;
uint32_t dest_offset = EvalUint32InitExpr(instance, segment.dest_addr);
DCHECK(base::IsInBounds<uint64_t>(dest_offset, size,
instance->memory_size()));
byte* dest = instance->memory_start() + dest_offset;
const byte* src = wire_bytes.begin() + segment.source.offset();
base::Memcpy(dest, src, size);
} }
// No need to copy empty segments.
if (size == 0) continue;
std::memcpy(instance->memory_start() + dest_offset,
wire_bytes.begin() + segment.source.offset(), size);
} }
} }
...@@ -1994,16 +1942,12 @@ void InstanceBuilder::LoadTableSegments(Handle<WasmInstanceObject> instance) { ...@@ -1994,16 +1942,12 @@ void InstanceBuilder::LoadTableSegments(Handle<WasmInstanceObject> instance) {
// a dropped passive segment and an active segment have the same // a dropped passive segment and an active segment have the same
// behavior. // behavior.
instance->dropped_elem_segments()[segment_index] = 1; instance->dropped_elem_segments()[segment_index] = 1;
if (enabled_.has_bulk_memory()) { if (!success) {
if (!success) { thrower_->RuntimeError("table initializer is out of bounds");
thrower_->RuntimeError("table initializer is out of bounds"); // Break out instead of returning; we don't want to continue to
// Break out instead of returning; we don't want to continue to // initialize any further element segments, but still need to add
// initialize any further element segments, but still need to add // dispatch tables below.
// dispatch tables below. break;
break;
}
} else {
CHECK(success);
} }
} }
......
...@@ -80,13 +80,6 @@ ...@@ -80,13 +80,6 @@
// Shipped features (enabled by default). Remove the feature flag once they hit // Shipped features (enabled by default). Remove the feature flag once they hit
// stable and are expected to stay enabled. // stable and are expected to stay enabled.
#define FOREACH_WASM_SHIPPED_FEATURE_FLAG(V) /* (force 80 columns) */ \ #define FOREACH_WASM_SHIPPED_FEATURE_FLAG(V) /* (force 80 columns) */ \
/* Bulk memory operations. */ \
/* https://github.com/webassembly/bulk-memory-operations */ \
/* V8 side owner: binji */ \
/* Shipped in v7.5. */ \
/* ITS: https://groups.google.com/forum/#!topic/v8-users/zM05lYEBVog */ \
V(bulk_memory, "bulk memory opcodes", true) \
\
/* Multi-value proposal. */ \ /* Multi-value proposal. */ \
/* https://github.com/WebAssembly/multi-value */ \ /* https://github.com/WebAssembly/multi-value */ \
/* V8 side owner: thibaudm */ \ /* V8 side owner: thibaudm */ \
......
...@@ -46,7 +46,6 @@ void CheckMemoryEqualsFollowedByZeroes(TestingModuleBuilder* builder, ...@@ -46,7 +46,6 @@ void CheckMemoryEqualsFollowedByZeroes(TestingModuleBuilder* builder,
} // namespace } // namespace
WASM_EXEC_TEST(MemoryInit) { WASM_EXEC_TEST(MemoryInit) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
const byte data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const byte data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
...@@ -83,7 +82,6 @@ WASM_EXEC_TEST(MemoryInit) { ...@@ -83,7 +82,6 @@ WASM_EXEC_TEST(MemoryInit) {
} }
WASM_EXEC_TEST(MemoryInitOutOfBoundsData) { WASM_EXEC_TEST(MemoryInitOutOfBoundsData) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
const byte data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const byte data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
...@@ -105,7 +103,6 @@ WASM_EXEC_TEST(MemoryInitOutOfBoundsData) { ...@@ -105,7 +103,6 @@ WASM_EXEC_TEST(MemoryInitOutOfBoundsData) {
} }
WASM_EXEC_TEST(MemoryInitOutOfBounds) { WASM_EXEC_TEST(MemoryInitOutOfBounds) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
const byte data[kWasmPageSize] = {}; const byte data[kWasmPageSize] = {};
...@@ -137,7 +134,6 @@ WASM_EXEC_TEST(MemoryInitOutOfBounds) { ...@@ -137,7 +134,6 @@ WASM_EXEC_TEST(MemoryInitOutOfBounds) {
} }
WASM_EXEC_TEST(MemoryCopy) { WASM_EXEC_TEST(MemoryCopy) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
byte* mem = r.builder().AddMemory(kWasmPageSize); byte* mem = r.builder().AddMemory(kWasmPageSize);
BUILD( BUILD(
...@@ -166,7 +162,6 @@ WASM_EXEC_TEST(MemoryCopy) { ...@@ -166,7 +162,6 @@ WASM_EXEC_TEST(MemoryCopy) {
} }
WASM_EXEC_TEST(MemoryCopyOverlapping) { WASM_EXEC_TEST(MemoryCopyOverlapping) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
byte* mem = r.builder().AddMemory(kWasmPageSize); byte* mem = r.builder().AddMemory(kWasmPageSize);
BUILD( BUILD(
...@@ -189,7 +184,6 @@ WASM_EXEC_TEST(MemoryCopyOverlapping) { ...@@ -189,7 +184,6 @@ WASM_EXEC_TEST(MemoryCopyOverlapping) {
} }
WASM_EXEC_TEST(MemoryCopyOutOfBoundsData) { WASM_EXEC_TEST(MemoryCopyOutOfBoundsData) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
byte* mem = r.builder().AddMemory(kWasmPageSize); byte* mem = r.builder().AddMemory(kWasmPageSize);
BUILD( BUILD(
...@@ -218,7 +212,6 @@ WASM_EXEC_TEST(MemoryCopyOutOfBoundsData) { ...@@ -218,7 +212,6 @@ WASM_EXEC_TEST(MemoryCopyOutOfBoundsData) {
} }
WASM_EXEC_TEST(MemoryCopyOutOfBounds) { WASM_EXEC_TEST(MemoryCopyOutOfBounds) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
BUILD( BUILD(
...@@ -248,7 +241,6 @@ WASM_EXEC_TEST(MemoryCopyOutOfBounds) { ...@@ -248,7 +241,6 @@ WASM_EXEC_TEST(MemoryCopyOutOfBounds) {
} }
WASM_EXEC_TEST(MemoryFill) { WASM_EXEC_TEST(MemoryFill) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
BUILD( BUILD(
...@@ -272,7 +264,6 @@ WASM_EXEC_TEST(MemoryFill) { ...@@ -272,7 +264,6 @@ WASM_EXEC_TEST(MemoryFill) {
} }
WASM_EXEC_TEST(MemoryFillValueWrapsToByte) { WASM_EXEC_TEST(MemoryFillValueWrapsToByte) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
BUILD( BUILD(
...@@ -286,7 +277,6 @@ WASM_EXEC_TEST(MemoryFillValueWrapsToByte) { ...@@ -286,7 +277,6 @@ WASM_EXEC_TEST(MemoryFillValueWrapsToByte) {
} }
WASM_EXEC_TEST(MemoryFillOutOfBoundsData) { WASM_EXEC_TEST(MemoryFillOutOfBoundsData) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
BUILD( BUILD(
...@@ -299,7 +289,6 @@ WASM_EXEC_TEST(MemoryFillOutOfBoundsData) { ...@@ -299,7 +289,6 @@ WASM_EXEC_TEST(MemoryFillOutOfBoundsData) {
} }
WASM_EXEC_TEST(MemoryFillOutOfBounds) { WASM_EXEC_TEST(MemoryFillOutOfBounds) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
BUILD( BUILD(
...@@ -322,7 +311,6 @@ WASM_EXEC_TEST(MemoryFillOutOfBounds) { ...@@ -322,7 +311,6 @@ WASM_EXEC_TEST(MemoryFillOutOfBounds) {
} }
WASM_EXEC_TEST(DataDropTwice) { WASM_EXEC_TEST(DataDropTwice) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t> r(execution_tier); WasmRunner<uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
const byte data[] = {0}; const byte data[] = {0};
...@@ -334,7 +322,6 @@ WASM_EXEC_TEST(DataDropTwice) { ...@@ -334,7 +322,6 @@ WASM_EXEC_TEST(DataDropTwice) {
} }
WASM_EXEC_TEST(DataDropThenMemoryInit) { WASM_EXEC_TEST(DataDropThenMemoryInit) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t> r(execution_tier); WasmRunner<uint32_t> r(execution_tier);
r.builder().AddMemory(kWasmPageSize); r.builder().AddMemory(kWasmPageSize);
const byte data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const byte data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
...@@ -348,7 +335,6 @@ WASM_EXEC_TEST(DataDropThenMemoryInit) { ...@@ -348,7 +335,6 @@ WASM_EXEC_TEST(DataDropThenMemoryInit) {
void TestTableCopyInbounds(TestExecutionTier execution_tier, int table_dst, void TestTableCopyInbounds(TestExecutionTier execution_tier, int table_dst,
int table_src) { int table_src) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
const uint32_t kTableSize = 5; const uint32_t kTableSize = 5;
// Add 10 function tables, even though we only test one table. // Add 10 function tables, even though we only test one table.
...@@ -411,7 +397,6 @@ void CheckTableCall(Isolate* isolate, Handle<WasmTableObject> table, ...@@ -411,7 +397,6 @@ void CheckTableCall(Isolate* isolate, Handle<WasmTableObject> table,
} // namespace } // namespace
void TestTableInitElems(TestExecutionTier execution_tier, int table_index) { void TestTableInitElems(TestExecutionTier execution_tier, int table_index) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
Isolate* isolate = CcTest::InitIsolateOnce(); Isolate* isolate = CcTest::InitIsolateOnce();
HandleScope scope(isolate); HandleScope scope(isolate);
TestSignatures sigs; TestSignatures sigs;
...@@ -489,7 +474,6 @@ WASM_COMPILED_EXEC_TEST(TableInitElems9) { ...@@ -489,7 +474,6 @@ WASM_COMPILED_EXEC_TEST(TableInitElems9) {
} }
void TestTableInitOob(TestExecutionTier execution_tier, int table_index) { void TestTableInitOob(TestExecutionTier execution_tier, int table_index) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
Isolate* isolate = CcTest::InitIsolateOnce(); Isolate* isolate = CcTest::InitIsolateOnce();
HandleScope scope(isolate); HandleScope scope(isolate);
TestSignatures sigs; TestSignatures sigs;
...@@ -569,7 +553,6 @@ WASM_COMPILED_EXEC_TEST(TableInitOob9) { ...@@ -569,7 +553,6 @@ WASM_COMPILED_EXEC_TEST(TableInitOob9) {
void TestTableCopyElems(TestExecutionTier execution_tier, int table_dst, void TestTableCopyElems(TestExecutionTier execution_tier, int table_dst,
int table_src) { int table_src) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
Isolate* isolate = CcTest::InitIsolateOnce(); Isolate* isolate = CcTest::InitIsolateOnce();
HandleScope scope(isolate); HandleScope scope(isolate);
TestSignatures sigs; TestSignatures sigs;
...@@ -651,7 +634,6 @@ WASM_COMPILED_EXEC_TEST(TableCopyElemsFrom6To6) { ...@@ -651,7 +634,6 @@ WASM_COMPILED_EXEC_TEST(TableCopyElemsFrom6To6) {
void TestTableCopyCalls(TestExecutionTier execution_tier, int table_dst, void TestTableCopyCalls(TestExecutionTier execution_tier, int table_dst,
int table_src) { int table_src) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
Isolate* isolate = CcTest::InitIsolateOnce(); Isolate* isolate = CcTest::InitIsolateOnce();
HandleScope scope(isolate); HandleScope scope(isolate);
TestSignatures sigs; TestSignatures sigs;
...@@ -726,7 +708,6 @@ WASM_COMPILED_EXEC_TEST(TableCopyCallsTo6From6) { ...@@ -726,7 +708,6 @@ WASM_COMPILED_EXEC_TEST(TableCopyCallsTo6From6) {
void TestTableCopyOobWrites(TestExecutionTier execution_tier, int table_dst, void TestTableCopyOobWrites(TestExecutionTier execution_tier, int table_dst,
int table_src) { int table_src) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
Isolate* isolate = CcTest::InitIsolateOnce(); Isolate* isolate = CcTest::InitIsolateOnce();
HandleScope scope(isolate); HandleScope scope(isolate);
TestSignatures sigs; TestSignatures sigs;
...@@ -802,7 +783,6 @@ WASM_COMPILED_EXEC_TEST(TableCopyOobWritesFrom6To6) { ...@@ -802,7 +783,6 @@ WASM_COMPILED_EXEC_TEST(TableCopyOobWritesFrom6To6) {
void TestTableCopyOob1(TestExecutionTier execution_tier, int table_dst, void TestTableCopyOob1(TestExecutionTier execution_tier, int table_dst,
int table_src) { int table_src) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t, uint32_t, uint32_t> r(execution_tier);
const uint32_t kTableSize = 5; const uint32_t kTableSize = 5;
...@@ -860,7 +840,6 @@ WASM_COMPILED_EXEC_TEST(TableCopyOob1From6To6) { ...@@ -860,7 +840,6 @@ WASM_COMPILED_EXEC_TEST(TableCopyOob1From6To6) {
} }
WASM_COMPILED_EXEC_TEST(ElemDropTwice) { WASM_COMPILED_EXEC_TEST(ElemDropTwice) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t> r(execution_tier); WasmRunner<uint32_t> r(execution_tier);
r.builder().AddIndirectFunctionTable(nullptr, 1); r.builder().AddIndirectFunctionTable(nullptr, 1);
r.builder().AddPassiveElementSegment({}); r.builder().AddPassiveElementSegment({});
...@@ -871,7 +850,6 @@ WASM_COMPILED_EXEC_TEST(ElemDropTwice) { ...@@ -871,7 +850,6 @@ WASM_COMPILED_EXEC_TEST(ElemDropTwice) {
} }
WASM_COMPILED_EXEC_TEST(ElemDropThenTableInit) { WASM_COMPILED_EXEC_TEST(ElemDropThenTableInit) {
EXPERIMENTAL_FLAG_SCOPE(bulk_memory);
WasmRunner<uint32_t, uint32_t> r(execution_tier); WasmRunner<uint32_t, uint32_t> r(execution_tier);
r.builder().AddIndirectFunctionTable(nullptr, 1); r.builder().AddIndirectFunctionTable(nullptr, 1);
r.builder().AddPassiveElementSegment({}); r.builder().AddPassiveElementSegment({});
......
...@@ -904,41 +904,6 @@ TEST(EmptyMemoryEmptyDataSegment) { ...@@ -904,41 +904,6 @@ TEST(EmptyMemoryEmptyDataSegment) {
Cleanup(); Cleanup();
} }
TEST(MemoryWithOOBEmptyDataSegment) {
{
FlagScope<bool> no_bulk_memory(
&v8::internal::FLAG_experimental_wasm_bulk_memory, false);
Isolate* isolate = CcTest::InitIsolateOnce();
HandleScope scope(isolate);
testing::SetupIsolateForWasmModule(isolate);
ErrorThrower thrower(isolate, "Run_WasmModule_InitDataAtTheUpperLimit");
const byte data[] = {
WASM_MODULE_HEADER, // --
kMemorySectionCode, // --
U32V_1(4), // section size
ENTRY_COUNT(1), // --
kWithMaximum, // --
1, // initial size
1, // maximum size
kDataSectionCode, // --
U32V_1(9), // section size
ENTRY_COUNT(1), // --
0, // linear memory index
WASM_I32V_4(0x2468ACE), // destination offset
kExprEnd,
U32V_1(0), // source size
};
CompileAndInstantiateForTesting(
isolate, &thrower, ModuleWireBytes(data, data + arraysize(data)));
// It should not be possible to instantiate this module.
CHECK(thrower.error());
}
Cleanup();
}
#undef EMIT_CODE_WITH_END #undef EMIT_CODE_WITH_END
} // namespace test_run_wasm_module } // namespace test_run_wasm_module
......
...@@ -3171,9 +3171,6 @@ TEST_F(FunctionBodyDecoderTest, MemoryInit) { ...@@ -3171,9 +3171,6 @@ TEST_F(FunctionBodyDecoderTest, MemoryInit) {
builder.InitializeMemory(); builder.InitializeMemory();
builder.SetDataSegmentCount(1); builder.SetDataSegmentCount(1);
ExpectFailure(sigs.v_v(),
{WASM_MEMORY_INIT(0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
WASM_FEATURE_SCOPE(bulk_memory);
ExpectValidates(sigs.v_v(), ExpectValidates(sigs.v_v(),
{WASM_MEMORY_INIT(0, WASM_ZERO, WASM_ZERO, WASM_ZERO)}); {WASM_MEMORY_INIT(0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
ExpectFailure(sigs.v_v(), ExpectFailure(sigs.v_v(),
...@@ -3184,7 +3181,6 @@ TEST_F(FunctionBodyDecoderTest, MemoryInitInvalid) { ...@@ -3184,7 +3181,6 @@ TEST_F(FunctionBodyDecoderTest, MemoryInitInvalid) {
builder.InitializeMemory(); builder.InitializeMemory();
builder.SetDataSegmentCount(1); builder.SetDataSegmentCount(1);
WASM_FEATURE_SCOPE(bulk_memory);
byte code[] = {WASM_MEMORY_INIT(0, WASM_ZERO, WASM_ZERO, WASM_ZERO), byte code[] = {WASM_MEMORY_INIT(0, WASM_ZERO, WASM_ZERO, WASM_ZERO),
WASM_END}; WASM_END};
for (size_t i = 0; i <= arraysize(code); ++i) { for (size_t i = 0; i <= arraysize(code); ++i) {
...@@ -3196,8 +3192,6 @@ TEST_F(FunctionBodyDecoderTest, DataDrop) { ...@@ -3196,8 +3192,6 @@ TEST_F(FunctionBodyDecoderTest, DataDrop) {
builder.InitializeMemory(); builder.InitializeMemory();
builder.SetDataSegmentCount(1); builder.SetDataSegmentCount(1);
ExpectFailure(sigs.v_v(), {WASM_DATA_DROP(0)});
WASM_FEATURE_SCOPE(bulk_memory);
ExpectValidates(sigs.v_v(), {WASM_DATA_DROP(0)}); ExpectValidates(sigs.v_v(), {WASM_DATA_DROP(0)});
ExpectFailure(sigs.v_v(), {WASM_DATA_DROP(1)}); ExpectFailure(sigs.v_v(), {WASM_DATA_DROP(1)});
} }
...@@ -3206,7 +3200,6 @@ TEST_F(FunctionBodyDecoderTest, DataSegmentIndexUnsigned) { ...@@ -3206,7 +3200,6 @@ TEST_F(FunctionBodyDecoderTest, DataSegmentIndexUnsigned) {
builder.InitializeMemory(); builder.InitializeMemory();
builder.SetDataSegmentCount(65); builder.SetDataSegmentCount(65);
WASM_FEATURE_SCOPE(bulk_memory);
// Make sure that the index is interpreted as an unsigned number; 64 is // Make sure that the index is interpreted as an unsigned number; 64 is
// interpreted as -64 when decoded as a signed LEB. // interpreted as -64 when decoded as a signed LEB.
ExpectValidates(sigs.v_v(), ExpectValidates(sigs.v_v(),
...@@ -3217,9 +3210,6 @@ TEST_F(FunctionBodyDecoderTest, DataSegmentIndexUnsigned) { ...@@ -3217,9 +3210,6 @@ TEST_F(FunctionBodyDecoderTest, DataSegmentIndexUnsigned) {
TEST_F(FunctionBodyDecoderTest, MemoryCopy) { TEST_F(FunctionBodyDecoderTest, MemoryCopy) {
builder.InitializeMemory(); builder.InitializeMemory();
ExpectFailure(sigs.v_v(),
{WASM_MEMORY_COPY(WASM_ZERO, WASM_ZERO, WASM_ZERO)});
WASM_FEATURE_SCOPE(bulk_memory);
ExpectValidates(sigs.v_v(), ExpectValidates(sigs.v_v(),
{WASM_MEMORY_COPY(WASM_ZERO, WASM_ZERO, WASM_ZERO)}); {WASM_MEMORY_COPY(WASM_ZERO, WASM_ZERO, WASM_ZERO)});
} }
...@@ -3227,15 +3217,11 @@ TEST_F(FunctionBodyDecoderTest, MemoryCopy) { ...@@ -3227,15 +3217,11 @@ TEST_F(FunctionBodyDecoderTest, MemoryCopy) {
TEST_F(FunctionBodyDecoderTest, MemoryFill) { TEST_F(FunctionBodyDecoderTest, MemoryFill) {
builder.InitializeMemory(); builder.InitializeMemory();
ExpectFailure(sigs.v_v(),
{WASM_MEMORY_FILL(WASM_ZERO, WASM_ZERO, WASM_ZERO)});
WASM_FEATURE_SCOPE(bulk_memory);
ExpectValidates(sigs.v_v(), ExpectValidates(sigs.v_v(),
{WASM_MEMORY_FILL(WASM_ZERO, WASM_ZERO, WASM_ZERO)}); {WASM_MEMORY_FILL(WASM_ZERO, WASM_ZERO, WASM_ZERO)});
} }
TEST_F(FunctionBodyDecoderTest, BulkMemoryOpsWithoutMemory) { TEST_F(FunctionBodyDecoderTest, BulkMemoryOpsWithoutMemory) {
WASM_FEATURE_SCOPE(bulk_memory);
ExpectFailure(sigs.v_v(), ExpectFailure(sigs.v_v(),
{WASM_MEMORY_INIT(0, WASM_ZERO, WASM_ZERO, WASM_ZERO)}); {WASM_MEMORY_INIT(0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
ExpectFailure(sigs.v_v(), ExpectFailure(sigs.v_v(),
...@@ -3248,9 +3234,6 @@ TEST_F(FunctionBodyDecoderTest, TableInit) { ...@@ -3248,9 +3234,6 @@ TEST_F(FunctionBodyDecoderTest, TableInit) {
builder.InitializeTable(wasm::kWasmFuncRef); builder.InitializeTable(wasm::kWasmFuncRef);
builder.AddPassiveElementSegment(wasm::kWasmFuncRef); builder.AddPassiveElementSegment(wasm::kWasmFuncRef);
ExpectFailure(sigs.v_v(),
{WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
WASM_FEATURE_SCOPE(bulk_memory);
ExpectValidates(sigs.v_v(), ExpectValidates(sigs.v_v(),
{WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)}); {WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
ExpectFailure(sigs.v_v(), ExpectFailure(sigs.v_v(),
...@@ -3262,7 +3245,6 @@ TEST_F(FunctionBodyDecoderTest, TableInitWrongType) { ...@@ -3262,7 +3245,6 @@ TEST_F(FunctionBodyDecoderTest, TableInitWrongType) {
uint32_t element_index = uint32_t element_index =
builder.AddPassiveElementSegment(wasm::kWasmExternRef); builder.AddPassiveElementSegment(wasm::kWasmExternRef);
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
ExpectFailure(sigs.v_v(), {WASM_TABLE_INIT(table_index, element_index, ExpectFailure(sigs.v_v(), {WASM_TABLE_INIT(table_index, element_index,
WASM_ZERO, WASM_ZERO, WASM_ZERO)}); WASM_ZERO, WASM_ZERO, WASM_ZERO)});
...@@ -3272,7 +3254,6 @@ TEST_F(FunctionBodyDecoderTest, TableInitInvalid) { ...@@ -3272,7 +3254,6 @@ TEST_F(FunctionBodyDecoderTest, TableInitInvalid) {
builder.InitializeTable(wasm::kWasmFuncRef); builder.InitializeTable(wasm::kWasmFuncRef);
builder.AddPassiveElementSegment(wasm::kWasmFuncRef); builder.AddPassiveElementSegment(wasm::kWasmFuncRef);
WASM_FEATURE_SCOPE(bulk_memory);
byte code[] = {WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO), byte code[] = {WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO),
WASM_END}; WASM_END};
for (size_t i = 0; i <= arraysize(code); ++i) { for (size_t i = 0; i <= arraysize(code); ++i) {
...@@ -3284,8 +3265,6 @@ TEST_F(FunctionBodyDecoderTest, ElemDrop) { ...@@ -3284,8 +3265,6 @@ TEST_F(FunctionBodyDecoderTest, ElemDrop) {
builder.InitializeTable(wasm::kWasmFuncRef); builder.InitializeTable(wasm::kWasmFuncRef);
builder.AddPassiveElementSegment(wasm::kWasmFuncRef); builder.AddPassiveElementSegment(wasm::kWasmFuncRef);
ExpectFailure(sigs.v_v(), {WASM_ELEM_DROP(0)});
WASM_FEATURE_SCOPE(bulk_memory);
ExpectValidates(sigs.v_v(), {WASM_ELEM_DROP(0)}); ExpectValidates(sigs.v_v(), {WASM_ELEM_DROP(0)});
ExpectFailure(sigs.v_v(), {WASM_ELEM_DROP(1)}); ExpectFailure(sigs.v_v(), {WASM_ELEM_DROP(1)});
} }
...@@ -3294,7 +3273,6 @@ TEST_F(FunctionBodyDecoderTest, TableInitDeclarativeElem) { ...@@ -3294,7 +3273,6 @@ TEST_F(FunctionBodyDecoderTest, TableInitDeclarativeElem) {
builder.InitializeTable(wasm::kWasmFuncRef); builder.InitializeTable(wasm::kWasmFuncRef);
builder.AddDeclarativeElementSegment(); builder.AddDeclarativeElementSegment();
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
byte code[] = {WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO), byte code[] = {WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO),
WASM_END}; WASM_END};
...@@ -3307,8 +3285,6 @@ TEST_F(FunctionBodyDecoderTest, DeclarativeElemDrop) { ...@@ -3307,8 +3285,6 @@ TEST_F(FunctionBodyDecoderTest, DeclarativeElemDrop) {
builder.InitializeTable(wasm::kWasmFuncRef); builder.InitializeTable(wasm::kWasmFuncRef);
builder.AddDeclarativeElementSegment(); builder.AddDeclarativeElementSegment();
ExpectFailure(sigs.v_v(), {WASM_ELEM_DROP(0)});
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
ExpectValidates(sigs.v_v(), {WASM_ELEM_DROP(0)}); ExpectValidates(sigs.v_v(), {WASM_ELEM_DROP(0)});
ExpectFailure(sigs.v_v(), {WASM_ELEM_DROP(1)}); ExpectFailure(sigs.v_v(), {WASM_ELEM_DROP(1)});
...@@ -3319,7 +3295,6 @@ TEST_F(FunctionBodyDecoderTest, RefFuncDeclared) { ...@@ -3319,7 +3295,6 @@ TEST_F(FunctionBodyDecoderTest, RefFuncDeclared) {
byte function_index = builder.AddFunction(sigs.v_i()); byte function_index = builder.AddFunction(sigs.v_i());
ExpectFailure(sigs.a_v(), {WASM_REF_FUNC(function_index)}); ExpectFailure(sigs.a_v(), {WASM_REF_FUNC(function_index)});
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
ExpectValidates(sigs.a_v(), {WASM_REF_FUNC(function_index)}); ExpectValidates(sigs.a_v(), {WASM_REF_FUNC(function_index)});
} }
...@@ -3328,7 +3303,6 @@ TEST_F(FunctionBodyDecoderTest, RefFuncUndeclared) { ...@@ -3328,7 +3303,6 @@ TEST_F(FunctionBodyDecoderTest, RefFuncUndeclared) {
builder.InitializeTable(wasm::kWasmStmt); builder.InitializeTable(wasm::kWasmStmt);
byte function_index = builder.AddFunction(sigs.v_i(), false); byte function_index = builder.AddFunction(sigs.v_i(), false);
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
ExpectFailure(sigs.a_v(), {WASM_REF_FUNC(function_index)}); ExpectFailure(sigs.a_v(), {WASM_REF_FUNC(function_index)});
} }
...@@ -3339,7 +3313,6 @@ TEST_F(FunctionBodyDecoderTest, ElemSegmentIndexUnsigned) { ...@@ -3339,7 +3313,6 @@ TEST_F(FunctionBodyDecoderTest, ElemSegmentIndexUnsigned) {
builder.AddPassiveElementSegment(wasm::kWasmFuncRef); builder.AddPassiveElementSegment(wasm::kWasmFuncRef);
} }
WASM_FEATURE_SCOPE(bulk_memory);
// Make sure that the index is interpreted as an unsigned number; 64 is // Make sure that the index is interpreted as an unsigned number; 64 is
// interpreted as -64 when decoded as a signed LEB. // interpreted as -64 when decoded as a signed LEB.
ExpectValidates(sigs.v_v(), ExpectValidates(sigs.v_v(),
...@@ -3350,9 +3323,6 @@ TEST_F(FunctionBodyDecoderTest, ElemSegmentIndexUnsigned) { ...@@ -3350,9 +3323,6 @@ TEST_F(FunctionBodyDecoderTest, ElemSegmentIndexUnsigned) {
TEST_F(FunctionBodyDecoderTest, TableCopy) { TEST_F(FunctionBodyDecoderTest, TableCopy) {
builder.InitializeTable(wasm::kWasmStmt); builder.InitializeTable(wasm::kWasmStmt);
ExpectFailure(sigs.v_v(),
{WASM_TABLE_COPY(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
WASM_FEATURE_SCOPE(bulk_memory);
ExpectValidates(sigs.v_v(), ExpectValidates(sigs.v_v(),
{WASM_TABLE_COPY(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)}); {WASM_TABLE_COPY(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
} }
...@@ -3361,7 +3331,6 @@ TEST_F(FunctionBodyDecoderTest, TableCopyWrongType) { ...@@ -3361,7 +3331,6 @@ TEST_F(FunctionBodyDecoderTest, TableCopyWrongType) {
uint32_t dst_table_index = builder.InitializeTable(wasm::kWasmFuncRef); uint32_t dst_table_index = builder.InitializeTable(wasm::kWasmFuncRef);
uint32_t src_table_index = builder.InitializeTable(wasm::kWasmExternRef); uint32_t src_table_index = builder.InitializeTable(wasm::kWasmExternRef);
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
ExpectFailure(sigs.v_v(), {WASM_TABLE_COPY(dst_table_index, src_table_index, ExpectFailure(sigs.v_v(), {WASM_TABLE_COPY(dst_table_index, src_table_index,
WASM_ZERO, WASM_ZERO, WASM_ZERO)}); WASM_ZERO, WASM_ZERO, WASM_ZERO)});
...@@ -3438,18 +3407,14 @@ TEST_F(FunctionBodyDecoderTest, TableOpsWithoutTable) { ...@@ -3438,18 +3407,14 @@ TEST_F(FunctionBodyDecoderTest, TableOpsWithoutTable) {
{WASM_TABLE_FILL(0, WASM_ONE, WASM_REF_NULL(kExternRefCode), {WASM_TABLE_FILL(0, WASM_ONE, WASM_REF_NULL(kExternRefCode),
WASM_ONE)}); WASM_ONE)});
} }
{ builder.AddPassiveElementSegment(wasm::kWasmFuncRef);
WASM_FEATURE_SCOPE(bulk_memory); ExpectFailure(sigs.v_v(),
builder.AddPassiveElementSegment(wasm::kWasmFuncRef); {WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
ExpectFailure(sigs.v_v(), ExpectFailure(sigs.v_v(),
{WASM_TABLE_INIT(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)}); {WASM_TABLE_COPY(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
ExpectFailure(sigs.v_v(),
{WASM_TABLE_COPY(0, 0, WASM_ZERO, WASM_ZERO, WASM_ZERO)});
}
} }
TEST_F(FunctionBodyDecoderTest, TableCopyMultiTable) { TEST_F(FunctionBodyDecoderTest, TableCopyMultiTable) {
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
{ {
TestModuleBuilder builder; TestModuleBuilder builder;
...@@ -3499,7 +3464,6 @@ TEST_F(FunctionBodyDecoderTest, TableCopyMultiTable) { ...@@ -3499,7 +3464,6 @@ TEST_F(FunctionBodyDecoderTest, TableCopyMultiTable) {
} }
TEST_F(FunctionBodyDecoderTest, TableInitMultiTable) { TEST_F(FunctionBodyDecoderTest, TableInitMultiTable) {
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
{ {
TestModuleBuilder builder; TestModuleBuilder builder;
......
...@@ -280,7 +280,6 @@ TEST_F(WasmModuleVerifyTest, S128Global) { ...@@ -280,7 +280,6 @@ TEST_F(WasmModuleVerifyTest, S128Global) {
TEST_F(WasmModuleVerifyTest, ExternRefGlobal) { TEST_F(WasmModuleVerifyTest, ExternRefGlobal) {
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = { static const byte data[] = {
// sig#0 --------------------------------------------------------------- // sig#0 ---------------------------------------------------------------
TYPE_SECTION_ONE_SIG_VOID_VOID, TYPE_SECTION_ONE_SIG_VOID_VOID,
...@@ -329,7 +328,6 @@ TEST_F(WasmModuleVerifyTest, ExternRefGlobal) { ...@@ -329,7 +328,6 @@ TEST_F(WasmModuleVerifyTest, ExternRefGlobal) {
TEST_F(WasmModuleVerifyTest, FuncRefGlobal) { TEST_F(WasmModuleVerifyTest, FuncRefGlobal) {
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = { static const byte data[] = {
// sig#0 --------------------------------------------------------------- // sig#0 ---------------------------------------------------------------
TYPE_SECTION_ONE_SIG_VOID_VOID, TYPE_SECTION_ONE_SIG_VOID_VOID,
...@@ -1628,7 +1626,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMultipleTables) { ...@@ -1628,7 +1626,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMultipleTables) {
// Test that if we have multiple tables, in the element section we can target // Test that if we have multiple tables, in the element section we can target
// and initialize all tables. // and initialize all tables.
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = { static const byte data[] = {
// sig#0 --------------------------------------------------------------- // sig#0 ---------------------------------------------------------------
TYPE_SECTION_ONE_SIG_VOID_VOID, TYPE_SECTION_ONE_SIG_VOID_VOID,
...@@ -1661,7 +1658,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMixedTables) { ...@@ -1661,7 +1658,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMixedTables) {
// Test that if we have multiple tables, both imported and module-defined, in // Test that if we have multiple tables, both imported and module-defined, in
// the element section we can target and initialize all tables. // the element section we can target and initialize all tables.
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = { static const byte data[] = {
// sig#0 --------------------------------------------------------------- // sig#0 ---------------------------------------------------------------
TYPE_SECTION_ONE_SIG_VOID_VOID, TYPE_SECTION_ONE_SIG_VOID_VOID,
...@@ -1719,7 +1715,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMultipleTablesArbitraryOrder) { ...@@ -1719,7 +1715,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMultipleTablesArbitraryOrder) {
// Test that the order in which tables are targeted in the element secion // Test that the order in which tables are targeted in the element secion
// can be arbitrary. // can be arbitrary.
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = { static const byte data[] = {
// sig#0 --------------------------------------------------------------- // sig#0 ---------------------------------------------------------------
TYPE_SECTION_ONE_SIG_VOID_VOID, TYPE_SECTION_ONE_SIG_VOID_VOID,
...@@ -1756,7 +1751,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMixedTablesArbitraryOrder) { ...@@ -1756,7 +1751,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMixedTablesArbitraryOrder) {
// Test that the order in which tables are targeted in the element secion can // Test that the order in which tables are targeted in the element secion can
// be arbitrary. In this test, tables can be both imported and module-defined. // be arbitrary. In this test, tables can be both imported and module-defined.
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = { static const byte data[] = {
// sig#0 --------------------------------------------------------------- // sig#0 ---------------------------------------------------------------
TYPE_SECTION_ONE_SIG_VOID_VOID, TYPE_SECTION_ONE_SIG_VOID_VOID,
...@@ -1812,7 +1806,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMixedTablesArbitraryOrder) { ...@@ -1812,7 +1806,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMixedTablesArbitraryOrder) {
TEST_F(WasmModuleVerifyTest, ElementSectionInitExternRefTableWithFuncRef) { TEST_F(WasmModuleVerifyTest, ElementSectionInitExternRefTableWithFuncRef) {
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = { static const byte data[] = {
// sig#0 --------------------------------------------------------------- // sig#0 ---------------------------------------------------------------
TYPE_SECTION_ONE_SIG_VOID_VOID, TYPE_SECTION_ONE_SIG_VOID_VOID,
...@@ -1847,7 +1840,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionDontInitExternRefImportedTable) { ...@@ -1847,7 +1840,6 @@ TEST_F(WasmModuleVerifyTest, ElementSectionDontInitExternRefImportedTable) {
// Test that imported tables of type ExternRef cannot be initialized in the // Test that imported tables of type ExternRef cannot be initialized in the
// elements section. // elements section.
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = { static const byte data[] = {
// sig#0 --------------------------------------------------------------- // sig#0 ---------------------------------------------------------------
TYPE_SECTION_ONE_SIG_VOID_VOID, TYPE_SECTION_ONE_SIG_VOID_VOID,
...@@ -3016,8 +3008,6 @@ TEST_F(WasmModuleVerifyTest, PassiveDataSegment) { ...@@ -3016,8 +3008,6 @@ TEST_F(WasmModuleVerifyTest, PassiveDataSegment) {
// data segments -------------------------------------------------------- // data segments --------------------------------------------------------
SECTION(Data, ENTRY_COUNT(1), PASSIVE, ADD_COUNT('h', 'i')), SECTION(Data, ENTRY_COUNT(1), PASSIVE, ADD_COUNT('h', 'i')),
}; };
EXPECT_FAILURE(data);
WASM_FEATURE_SCOPE(bulk_memory);
EXPECT_VERIFIES(data); EXPECT_VERIFIES(data);
EXPECT_OFF_END_FAILURE(data, arraysize(data) - 5); EXPECT_OFF_END_FAILURE(data, arraysize(data) - 5);
} }
...@@ -3036,8 +3026,6 @@ TEST_F(WasmModuleVerifyTest, ActiveElementSegmentWithElements) { ...@@ -3036,8 +3026,6 @@ TEST_F(WasmModuleVerifyTest, ActiveElementSegmentWithElements) {
REF_FUNC_ELEMENT(0), REF_FUNC_ELEMENT(0), REF_NULL_ELEMENT), REF_FUNC_ELEMENT(0), REF_FUNC_ELEMENT(0), REF_NULL_ELEMENT),
// code ------------------------------------------------------------------ // code ------------------------------------------------------------------
ONE_EMPTY_BODY}; ONE_EMPTY_BODY};
EXPECT_FAILURE(data);
WASM_FEATURE_SCOPE(bulk_memory);
EXPECT_VERIFIES(data); EXPECT_VERIFIES(data);
EXPECT_OFF_END_FAILURE(data, arraysize(data) - 5); EXPECT_OFF_END_FAILURE(data, arraysize(data) - 5);
} }
...@@ -3056,8 +3044,6 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegment) { ...@@ -3056,8 +3044,6 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegment) {
REF_NULL_ELEMENT), REF_NULL_ELEMENT),
// code ------------------------------------------------------------------ // code ------------------------------------------------------------------
ONE_EMPTY_BODY}; ONE_EMPTY_BODY};
EXPECT_FAILURE(data);
WASM_FEATURE_SCOPE(bulk_memory);
EXPECT_VERIFIES(data); EXPECT_VERIFIES(data);
EXPECT_OFF_END_FAILURE(data, arraysize(data) - 5); EXPECT_OFF_END_FAILURE(data, arraysize(data) - 5);
} }
...@@ -3075,7 +3061,6 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegmentExternRef) { ...@@ -3075,7 +3061,6 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegmentExternRef) {
U32V_1(0)), U32V_1(0)),
// code ------------------------------------------------------------------ // code ------------------------------------------------------------------
ONE_EMPTY_BODY}; ONE_EMPTY_BODY};
WASM_FEATURE_SCOPE(bulk_memory);
EXPECT_FAILURE(data); EXPECT_FAILURE(data);
} }
...@@ -3092,8 +3077,6 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegmentWithIndices) { ...@@ -3092,8 +3077,6 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegmentWithIndices) {
ENTRY_COUNT(3), U32V_1(0), U32V_1(0), U32V_1(0)), ENTRY_COUNT(3), U32V_1(0), U32V_1(0), U32V_1(0)),
// code ------------------------------------------------------------------ // code ------------------------------------------------------------------
ONE_EMPTY_BODY}; ONE_EMPTY_BODY};
EXPECT_FAILURE(data);
WASM_FEATURE_SCOPE(bulk_memory);
EXPECT_VERIFIES(data); EXPECT_VERIFIES(data);
EXPECT_OFF_END_FAILURE(data, arraysize(data) - 5); EXPECT_OFF_END_FAILURE(data, arraysize(data) - 5);
} }
...@@ -3113,14 +3096,11 @@ TEST_F(WasmModuleVerifyTest, DeclarativeElementSegmentFuncRef) { ...@@ -3113,14 +3096,11 @@ TEST_F(WasmModuleVerifyTest, DeclarativeElementSegmentFuncRef) {
// code ------------------------------------------------------------------ // code ------------------------------------------------------------------
ONE_EMPTY_BODY}; ONE_EMPTY_BODY};
EXPECT_FAILURE(data); EXPECT_FAILURE(data);
WASM_FEATURE_SCOPE(bulk_memory);
EXPECT_FAILURE(data);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
EXPECT_VERIFIES(data); EXPECT_VERIFIES(data);
} }
TEST_F(WasmModuleVerifyTest, DeclarativeElementSegmentWithInvalidIndex) { TEST_F(WasmModuleVerifyTest, DeclarativeElementSegmentWithInvalidIndex) {
WASM_FEATURE_SCOPE(bulk_memory);
WASM_FEATURE_SCOPE(reftypes); WASM_FEATURE_SCOPE(reftypes);
static const byte data[] = { static const byte data[] = {
// sig#0 ----------------------------------------------------------------- // sig#0 -----------------------------------------------------------------
...@@ -3144,15 +3124,12 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionCorrectPlacement) { ...@@ -3144,15 +3124,12 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionCorrectPlacement) {
static const byte data[] = {SECTION(Element, ENTRY_COUNT(0)), static const byte data[] = {SECTION(Element, ENTRY_COUNT(0)),
SECTION(DataCount, ENTRY_COUNT(0)), SECTION(DataCount, ENTRY_COUNT(0)),
SECTION(Code, ENTRY_COUNT(0))}; SECTION(Code, ENTRY_COUNT(0))};
EXPECT_FAILURE(data);
WASM_FEATURE_SCOPE(bulk_memory);
EXPECT_VERIFIES(data); EXPECT_VERIFIES(data);
} }
TEST_F(WasmModuleVerifyTest, DataCountSectionAfterCode) { TEST_F(WasmModuleVerifyTest, DataCountSectionAfterCode) {
static const byte data[] = {SECTION(Code, ENTRY_COUNT(0)), static const byte data[] = {SECTION(Code, ENTRY_COUNT(0)),
SECTION(DataCount, ENTRY_COUNT(0))}; SECTION(DataCount, ENTRY_COUNT(0))};
WASM_FEATURE_SCOPE(bulk_memory);
ModuleResult result = DecodeModule(data, data + sizeof(data)); ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, EXPECT_NOT_OK(result,
"The DataCount section must appear before the Code section"); "The DataCount section must appear before the Code section");
...@@ -3161,7 +3138,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionAfterCode) { ...@@ -3161,7 +3138,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionAfterCode) {
TEST_F(WasmModuleVerifyTest, DataCountSectionBeforeElement) { TEST_F(WasmModuleVerifyTest, DataCountSectionBeforeElement) {
static const byte data[] = {SECTION(DataCount, ENTRY_COUNT(0)), static const byte data[] = {SECTION(DataCount, ENTRY_COUNT(0)),
SECTION(Element, ENTRY_COUNT(0))}; SECTION(Element, ENTRY_COUNT(0))};
WASM_FEATURE_SCOPE(bulk_memory);
ModuleResult result = DecodeModule(data, data + sizeof(data)); ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "unexpected section <Element>"); EXPECT_NOT_OK(result, "unexpected section <Element>");
} }
...@@ -3178,7 +3154,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionAfterStartBeforeElement) { ...@@ -3178,7 +3154,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionAfterStartBeforeElement) {
SECTION(DataCount, ENTRY_COUNT(0)), // DataCount section. SECTION(DataCount, ENTRY_COUNT(0)), // DataCount section.
SECTION(Element, ENTRY_COUNT(0)) // Element section. SECTION(Element, ENTRY_COUNT(0)) // Element section.
}; };
WASM_FEATURE_SCOPE(bulk_memory);
ModuleResult result = DecodeModule(data, data + sizeof(data)); ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "unexpected section <Element>"); EXPECT_NOT_OK(result, "unexpected section <Element>");
} }
...@@ -3186,7 +3161,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionAfterStartBeforeElement) { ...@@ -3186,7 +3161,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionAfterStartBeforeElement) {
TEST_F(WasmModuleVerifyTest, MultipleDataCountSections) { TEST_F(WasmModuleVerifyTest, MultipleDataCountSections) {
static const byte data[] = {SECTION(DataCount, ENTRY_COUNT(0)), static const byte data[] = {SECTION(DataCount, ENTRY_COUNT(0)),
SECTION(DataCount, ENTRY_COUNT(0))}; SECTION(DataCount, ENTRY_COUNT(0))};
WASM_FEATURE_SCOPE(bulk_memory);
ModuleResult result = DecodeModule(data, data + sizeof(data)); ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "Multiple DataCount sections not allowed"); EXPECT_NOT_OK(result, "Multiple DataCount sections not allowed");
} }
...@@ -3198,8 +3172,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSegmentCountMatch) { ...@@ -3198,8 +3172,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSegmentCountMatch) {
SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0, // Data section. SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0, // Data section.
WASM_INIT_EXPR_I32V_1(12), ADD_COUNT('h', 'i'))}; WASM_INIT_EXPR_I32V_1(12), ADD_COUNT('h', 'i'))};
EXPECT_FAILURE(data);
WASM_FEATURE_SCOPE(bulk_memory);
EXPECT_VERIFIES(data); EXPECT_VERIFIES(data);
} }
...@@ -3208,7 +3180,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSegmentCount_greater) { ...@@ -3208,7 +3180,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSegmentCount_greater) {
SECTION(Memory, ENTRY_COUNT(1), 0, 1), // Memory section. SECTION(Memory, ENTRY_COUNT(1), 0, 1), // Memory section.
SECTION(DataCount, ENTRY_COUNT(3)), // DataCount section. SECTION(DataCount, ENTRY_COUNT(3)), // DataCount section.
SECTION(Data, ENTRY_COUNT(0))}; // Data section. SECTION(Data, ENTRY_COUNT(0))}; // Data section.
WASM_FEATURE_SCOPE(bulk_memory);
ModuleResult result = DecodeModule(data, data + sizeof(data)); ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "data segments count 0 mismatch (3 expected)"); EXPECT_NOT_OK(result, "data segments count 0 mismatch (3 expected)");
} }
...@@ -3219,7 +3190,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSegmentCount_less) { ...@@ -3219,7 +3190,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSegmentCount_less) {
SECTION(DataCount, ENTRY_COUNT(0)), // DataCount section. SECTION(DataCount, ENTRY_COUNT(0)), // DataCount section.
SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0, // Data section. SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0, // Data section.
WASM_INIT_EXPR_I32V_1(12), ADD_COUNT('a', 'b', 'c'))}; WASM_INIT_EXPR_I32V_1(12), ADD_COUNT('a', 'b', 'c'))};
WASM_FEATURE_SCOPE(bulk_memory);
ModuleResult result = DecodeModule(data, data + sizeof(data)); ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "data segments count 1 mismatch (0 expected)"); EXPECT_NOT_OK(result, "data segments count 1 mismatch (0 expected)");
} }
...@@ -3227,7 +3197,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSegmentCount_less) { ...@@ -3227,7 +3197,6 @@ TEST_F(WasmModuleVerifyTest, DataCountSegmentCount_less) {
TEST_F(WasmModuleVerifyTest, DataCountSegmentCount_omitted) { TEST_F(WasmModuleVerifyTest, DataCountSegmentCount_omitted) {
static const byte data[] = {SECTION(Memory, ENTRY_COUNT(1), 0, 1), static const byte data[] = {SECTION(Memory, ENTRY_COUNT(1), 0, 1),
SECTION(DataCount, ENTRY_COUNT(1))}; SECTION(DataCount, ENTRY_COUNT(1))};
WASM_FEATURE_SCOPE(bulk_memory);
ModuleResult result = DecodeModule(data, data + sizeof(data)); ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "data segments count 0 mismatch (1 expected)"); EXPECT_NOT_OK(result, "data segments count 0 mismatch (1 expected)");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment