summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/fuzzing.h19
-rw-r--r--src/tools/wasm-opt.cpp5
2 files changed, 23 insertions, 1 deletions
diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h
index 90b7d61b1..f16d0ecad 100644
--- a/src/tools/fuzzing.h
+++ b/src/tools/fuzzing.h
@@ -131,8 +131,14 @@ public:
allowNaNs = allowNaNs_;
}
+ void setAllowMemory(bool allowMemory_) {
+ allowMemory = allowMemory_;
+ }
+
void build() {
- setupMemory();
+ if (allowMemory) {
+ setupMemory();
+ }
setupTable();
setupGlobals();
addImportLoggingSupport();
@@ -187,6 +193,9 @@ private:
// TODO: de-NaN SIMD values
bool allowNaNs = true;
+ // Whether to emit memory operations like loads and stores.
+ bool allowMemory = true;
+
// Features allowed to be emitted
FeatureSet features = FeatureSet::All;
@@ -1137,6 +1146,7 @@ private:
}
Expression* makeLoad(Type type) {
+ if (!allowMemory) return makeTrivial(type);
auto* ret = makeNonAtomicLoad(type);
if (type != i32 && type != i64) return ret;
if (!features.hasAtomics() || oneIn(2)) return ret;
@@ -1208,6 +1218,7 @@ private:
}
Expression* makeStore(Type type) {
+ if (!allowMemory) return makeTrivial(type);
auto* ret = makeNonAtomicStore(type);
auto* store = ret->dynCast<Store>();
if (!store) return ret;
@@ -1595,6 +1606,7 @@ private:
Expression* makeAtomic(Type type) {
assert(features.hasAtomics());
+ if (!allowMemory) return makeTrivial(type);
wasm.memory.shared = true;
if (type == i32 && oneIn(2)) {
if (ATOMIC_WAITS && oneIn(2)) {
@@ -1732,6 +1744,7 @@ private:
}
Expression* makeBulkMemory(Type type) {
+ if (!allowMemory) return makeTrivial(type);
assert(features.hasBulkMemory());
assert(type == none);
switch (upTo(4)) {
@@ -1744,6 +1757,7 @@ private:
}
Expression* makeMemoryInit() {
+ if (!allowMemory) return makeTrivial(none);
auto segment = uint32_t(get32());
Expression* dest = make(i32);
Expression* offset = make(i32);
@@ -1752,10 +1766,12 @@ private:
}
Expression* makeDataDrop() {
+ if (!allowMemory) return makeTrivial(none);
return builder.makeDataDrop(get32());
}
Expression* makeMemoryCopy() {
+ if (!allowMemory) return makeTrivial(none);
Expression* dest = make(i32);
Expression* source = make(i32);
Expression* size = make(i32);
@@ -1763,6 +1779,7 @@ private:
}
Expression* makeMemoryFill() {
+ if (!allowMemory) return makeTrivial(none);
Expression* dest = make(i32);
Expression* value = make(i32);
Expression* size = make(i32);
diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp
index d2f3d718c..ca4d87dd8 100644
--- a/src/tools/wasm-opt.cpp
+++ b/src/tools/wasm-opt.cpp
@@ -72,6 +72,7 @@ int main(int argc, const char* argv[]) {
bool translateToFuzz = false;
bool fuzzPasses = false;
bool fuzzNaNs = true;
+ bool fuzzMemory = true;
std::string emitJSWrapper;
std::string emitSpecWrapper;
std::string inputSourceMapFilename;
@@ -116,6 +117,9 @@ int main(int argc, const char* argv[]) {
.add("--no-fuzz-nans", "", "don't emit NaNs when fuzzing, and remove them at runtime as well (helps avoid nondeterminism between VMs)",
Options::Arguments::Zero,
[&](Options *o, const std::string& arguments) { fuzzNaNs = false; })
+ .add("--no-fuzz-memory", "", "don't emit memory ops when fuzzing",
+ Options::Arguments::Zero,
+ [&](Options *o, const std::string& arguments) { fuzzMemory = false; })
.add("--emit-js-wrapper", "-ejw", "Emit a JavaScript wrapper file that can run the wasm with some test values, useful for fuzzing",
Options::Arguments::One,
[&](Options *o, const std::string& arguments) { emitJSWrapper = arguments; })
@@ -172,6 +176,7 @@ int main(int argc, const char* argv[]) {
}
reader.setFeatures(options.getFeatures());
reader.setAllowNaNs(fuzzNaNs);
+ reader.setAllowMemory(fuzzMemory);
reader.build();
if (options.passOptions.validate) {
if (!WasmValidator().validate(wasm, options.getFeatures())) {