diff options
author | Thomas Lively <tlively@google.com> | 2024-01-29 16:03:31 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-29 16:03:31 -0800 |
commit | c0046ad0e44d39f7ef33fa6a401a0d9d5a34a578 (patch) | |
tree | 29437ef5ff67a2a51b8a2566cad228f2e3c7ade7 /src | |
parent | 9a31d7e351910191af2c00a9834bcb2e81a28d12 (diff) | |
download | binaryen-c0046ad0e44d39f7ef33fa6a401a0d9d5a34a578.tar.gz binaryen-c0046ad0e44d39f7ef33fa6a401a0d9d5a34a578.tar.bz2 binaryen-c0046ad0e44d39f7ef33fa6a401a0d9d5a34a578.zip |
[Parser] Parse local.set and global.set of tuple values correctly (#6250)
These instructions always pop a single value, except when tuples are involved,
in which case they need special handling to know how many values to pop.
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-ir-builder.h | 2 | ||||
-rw-r--r-- | src/wasm/wasm-ir-builder.cpp | 18 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index 77ad2490e..fce8bd431 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -223,6 +223,8 @@ public: [[nodiscard]] Result<> visitCall(Call*); [[nodiscard]] Result<> visitCallIndirect(CallIndirect*); [[nodiscard]] Result<> visitCallRef(CallRef*); + [[nodiscard]] Result<> visitLocalSet(LocalSet*); + [[nodiscard]] Result<> visitGlobalSet(GlobalSet*); [[nodiscard]] Result<> visitThrow(Throw*); [[nodiscard]] Result<> visitStringNew(StringNew*); [[nodiscard]] Result<> visitStringEncode(StringEncode*); diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index aace2b1ac..1eea777e0 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -492,6 +492,21 @@ Result<> IRBuilder::visitCallRef(CallRef* curr) { return Ok{}; } +Result<> IRBuilder::visitLocalSet(LocalSet* curr) { + auto type = func->getLocalType(curr->index); + auto val = pop(type.size()); + CHECK_ERR(val); + curr->value = *val; + return Ok{}; +} + +Result<> IRBuilder::visitGlobalSet(GlobalSet* curr) { + auto type = wasm.getGlobal(curr->name)->type; + auto val = pop(type.size()); + CHECK_ERR(val); + curr->value = *val; + return Ok{}; +} Result<> IRBuilder::visitThrow(Throw* curr) { auto numArgs = wasm.getTag(curr->tag)->sig.params.size(); curr->operands.resize(numArgs); @@ -1032,6 +1047,7 @@ Result<> IRBuilder::makeLocalGet(Index local) { Result<> IRBuilder::makeLocalSet(Index local) { LocalSet curr; + curr.index = local; CHECK_ERR(visitLocalSet(&curr)); push(builder.makeLocalSet(local, curr.value)); return Ok{}; @@ -1039,6 +1055,7 @@ Result<> IRBuilder::makeLocalSet(Index local) { Result<> IRBuilder::makeLocalTee(Index local) { LocalSet curr; + curr.index = local; CHECK_ERR(visitLocalSet(&curr)); push(builder.makeLocalTee(local, curr.value, func->getLocalType(local))); return Ok{}; @@ -1051,6 +1068,7 @@ Result<> IRBuilder::makeGlobalGet(Name global) { Result<> IRBuilder::makeGlobalSet(Name global) { GlobalSet curr; + curr.name = global; CHECK_ERR(visitGlobalSet(&curr)); push(builder.makeGlobalSet(global, curr.value)); return Ok{}; |