summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWouter van Oortmerssen <aardappel@gmail.com>2021-07-19 13:10:00 -0700
committerGitHub <noreply@github.com>2021-07-19 13:10:00 -0700
commit2d385ff8ebfcf65e3b532f4c42795758966abff4 (patch)
treeae42efc6ecbf715ae12f436397b489a555bb46af
parentec6ef26ec4f4fdfc974e7087896ac004ac7c130a (diff)
downloadbinaryen-2d385ff8ebfcf65e3b532f4c42795758966abff4.tar.gz
binaryen-2d385ff8ebfcf65e3b532f4c42795758966abff4.tar.bz2
binaryen-2d385ff8ebfcf65e3b532f4c42795758966abff4.zip
[Memory64] Fixed atomics / bulk memory support. (#3992)
-rw-r--r--src/passes/Memory64Lowering.cpp16
-rw-r--r--src/wasm/wasm-emscripten.cpp4
-rw-r--r--test/passes/memory64-lowering_enable-memory64_enable-bulk-memory_enable-threads.txt (renamed from test/passes/memory64-lowering_enable-memory64_enable-bulk-memory.txt)47
-rw-r--r--test/passes/memory64-lowering_enable-memory64_enable-bulk-memory_enable-threads.wast (renamed from test/passes/memory64-lowering_enable-memory64_enable-bulk-memory.wast)6
4 files changed, 68 insertions, 5 deletions
diff --git a/src/passes/Memory64Lowering.cpp b/src/passes/Memory64Lowering.cpp
index c376ed6c6..95dbf4f17 100644
--- a/src/passes/Memory64Lowering.cpp
+++ b/src/passes/Memory64Lowering.cpp
@@ -90,11 +90,21 @@ struct Memory64Lowering : public WalkerPass<PostWalker<Memory64Lowering>> {
wrapAddress64(curr->size);
}
+ void visitAtomicRMW(AtomicRMW* curr) { wrapAddress64(curr->ptr); }
+
+ void visitAtomicCmpxchg(AtomicCmpxchg* curr) { wrapAddress64(curr->ptr); }
+
+ void visitAtomicWait(AtomicWait* curr) { wrapAddress64(curr->ptr); }
+
+ void visitAtomicNotify(AtomicNotify* curr) { wrapAddress64(curr->ptr); }
+
void visitMemory(Memory* memory) {
for (auto& segment : memory->segments) {
- auto* c = segment.offset->cast<Const>();
- c->value = Literal(static_cast<uint32_t>(c->value.geti64()));
- c->type = Type::i32;
+ if (!segment.isPassive) {
+ auto* c = segment.offset->cast<Const>();
+ c->value = Literal(static_cast<uint32_t>(c->value.geti64()));
+ c->type = Type::i32;
+ }
}
// This is visited last.
memory->indexType = Type::i32;
diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp
index 5eed4d4c4..7e56ef849 100644
--- a/src/wasm/wasm-emscripten.cpp
+++ b/src/wasm/wasm-emscripten.cpp
@@ -148,7 +148,7 @@ private:
Fatal() << "Cannot get offset of passive segment initialized "
"multiple times";
}
- offsets[curr->segment] = dest->value.geti32();
+ offsets[curr->segment] = dest->value.getInteger();
}
} searcher(passiveOffsets);
searcher.walkModule(&wasm);
@@ -514,7 +514,7 @@ void EmscriptenGlueGenerator::separateDataSegments(Output* outfile,
if (!seg.offset->is<Const>()) {
Fatal() << "separating relocatable segments not implemented";
}
- size_t offset = seg.offset->cast<Const>()->value.geti32();
+ size_t offset = seg.offset->cast<Const>()->value.getInteger();
offset -= base;
size_t fill = offset - lastEnd;
if (fill > 0) {
diff --git a/test/passes/memory64-lowering_enable-memory64_enable-bulk-memory.txt b/test/passes/memory64-lowering_enable-memory64_enable-bulk-memory_enable-threads.txt
index ee263c3cb..535778232 100644
--- a/test/passes/memory64-lowering_enable-memory64_enable-bulk-memory.txt
+++ b/test/passes/memory64-lowering_enable-memory64_enable-bulk-memory_enable-threads.txt
@@ -164,6 +164,53 @@
(i64.const 3)
)
)
+ (drop
+ (i32.atomic.load
+ (i32.wrap_i64
+ (i64.const 4)
+ )
+ )
+ )
+ (i32.atomic.store
+ (i32.wrap_i64
+ (i64.const 4)
+ )
+ (i32.const 8)
+ )
+ (drop
+ (i32.atomic.rmw8.add_u
+ (i32.wrap_i64
+ (i64.const 1)
+ )
+ (i32.const 2)
+ )
+ )
+ (drop
+ (i32.atomic.rmw8.cmpxchg_u
+ (i32.wrap_i64
+ (i64.const 1)
+ )
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ (drop
+ (memory.atomic.wait32
+ (i32.wrap_i64
+ (i64.const 1)
+ )
+ (i32.const 2)
+ (i64.const 3)
+ )
+ )
+ (drop
+ (memory.atomic.notify
+ (i32.wrap_i64
+ (i64.const 1)
+ )
+ (i32.const 2)
+ )
+ )
)
)
(module
diff --git a/test/passes/memory64-lowering_enable-memory64_enable-bulk-memory.wast b/test/passes/memory64-lowering_enable-memory64_enable-bulk-memory_enable-threads.wast
index 68422aea8..c59da359d 100644
--- a/test/passes/memory64-lowering_enable-memory64_enable-bulk-memory.wast
+++ b/test/passes/memory64-lowering_enable-memory64_enable-bulk-memory_enable-threads.wast
@@ -27,6 +27,12 @@
(memory.init 0 (i64.const 1) (i32.const 2) (i32.const 3))
(memory.fill (i64.const 1) (i32.const 2) (i64.const 3))
(memory.copy (i64.const 1) (i64.const 2) (i64.const 3))
+ (drop (i32.atomic.load (i64.const 4)))
+ (i32.atomic.store (i64.const 4) (i32.const 8))
+ (drop (i32.atomic.rmw8.add_u (i64.const 1) (i32.const 2)))
+ (drop (i32.atomic.rmw8.cmpxchg_u (i64.const 1) (i32.const 2) (i32.const 3)))
+ (drop (memory.atomic.wait32 (i64.const 1) (i32.const 2) (i64.const 3)))
+ (drop (memory.atomic.notify (i64.const 1) (i32.const 2)))
)
)