summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/passes/SafeHeap.cpp16
-rw-r--r--src/wasm/wasm-validator.cpp8
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) {