diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/SafeHeap.cpp | 16 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 8 |
2 files changed, 19 insertions, 5 deletions
diff --git a/src/passes/SafeHeap.cpp b/src/passes/SafeHeap.cpp index 5c1980f28..ce1adff15 100644 --- a/src/passes/SafeHeap.cpp +++ b/src/passes/SafeHeap.cpp @@ -152,6 +152,10 @@ struct SafeHeap : public Pass { } } + bool isPossibleAtomicOperation(Index align, Index bytes, bool shared, Type type) { + return align == bytes && shared && isIntegerType(type); + } + void addGlobals(Module* module) { // load funcs Load load; @@ -168,8 +172,10 @@ struct SafeHeap : public Pass { if (align > bytes) continue; for (auto isAtomic : { true, false }) { load.isAtomic = isAtomic; - if (isAtomic && align != bytes) continue; - if (isAtomic && !module->memory.shared) continue; + if (isAtomic && + !isPossibleAtomicOperation(align, bytes, module->memory.shared, type)) { + continue; + } addLoadFunc(load, module); } } @@ -189,8 +195,10 @@ struct SafeHeap : public Pass { if (align > bytes) continue; for (auto isAtomic : { true, false }) { store.isAtomic = isAtomic; - if (isAtomic && align != bytes) continue; - if (isAtomic && !module->memory.shared) continue; + if (isAtomic && + !isPossibleAtomicOperation(align, bytes, module->memory.shared, valueType)) { + continue; + } addStoreFunc(store, module); } } diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 36069f8db..4d88b9d1f 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -502,7 +502,10 @@ void FunctionValidator::visitLoad(Load* curr) { validateMemBytes(curr->bytes, curr->type, curr); validateAlignment(curr->align, curr->type, curr->bytes, curr->isAtomic, curr); shouldBeEqualOrFirstIsUnreachable(curr->ptr->type, i32, curr, "load pointer type must be i32"); - if (curr->isAtomic) shouldBeFalse(curr->signed_, curr, "atomic loads must be unsigned"); + if (curr->isAtomic) { + shouldBeFalse(curr->signed_, curr, "atomic loads must be unsigned"); + shouldBeTrue(isIntegerType(curr->type), curr, "atomic loads must be of integers"); + } } void FunctionValidator::visitStore(Store* curr) { @@ -513,6 +516,9 @@ void FunctionValidator::visitStore(Store* curr) { shouldBeEqualOrFirstIsUnreachable(curr->ptr->type, i32, curr, "store pointer type must be i32"); shouldBeUnequal(curr->value->type, none, curr, "store value type must not be none"); shouldBeEqualOrFirstIsUnreachable(curr->value->type, curr->valueType, curr, "store value type must match"); + if (curr->isAtomic) { + shouldBeTrue(isIntegerType(curr->valueType), curr, "atomic stores must be of integers"); + } } void FunctionValidator::visitAtomicRMW(AtomicRMW* curr) { |