summaryrefslogtreecommitdiff
path: root/src/tools/fuzzing.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/fuzzing.h')
-rw-r--r--src/tools/fuzzing.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h
index 56c633f14..63e7dca43 100644
--- a/src/tools/fuzzing.h
+++ b/src/tools/fuzzing.h
@@ -727,6 +727,9 @@ private:
&Self::makeSelect,
&Self::makeGetGlobal)
.add(FeatureSet::SIMD, &Self::makeSIMD);
+ if (type == none) {
+ options.add(FeatureSet::BulkMemory, &Self::makeBulkMemory);
+ }
if (type == i32 || type == i64) {
options.add(FeatureSet::Atomics, &Self::makeAtomic);
}
@@ -1713,6 +1716,44 @@ private:
return builder.makeSIMDShift(op, vec, shift);
}
+ Expression* makeBulkMemory(Type type) {
+ assert(features.hasBulkMemory());
+ assert(type == none);
+ switch (upTo(4)) {
+ case 0: return makeMemoryInit();
+ case 1: return makeDataDrop();
+ case 2: return makeMemoryCopy();
+ case 3: return makeMemoryFill();
+ }
+ WASM_UNREACHABLE();
+ }
+
+ Expression* makeMemoryInit() {
+ auto segment = uint32_t(get32());
+ Expression* dest = make(i32);
+ Expression* offset = make(i32);
+ Expression* size = make(i32);
+ return builder.makeMemoryInit(segment, dest, offset, size);
+ }
+
+ Expression* makeDataDrop() {
+ return builder.makeDataDrop(get32());
+ }
+
+ Expression* makeMemoryCopy() {
+ Expression* dest = make(i32);
+ Expression* source = make(i32);
+ Expression* size = make(i32);
+ return builder.makeMemoryCopy(dest, source, size);
+ }
+
+ Expression* makeMemoryFill() {
+ Expression* dest = make(i32);
+ Expression* value = make(i32);
+ Expression* size = make(i32);
+ return builder.makeMemoryFill(dest, value, size);
+ }
+
// special makers
Expression* makeLogging() {