diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 66 |
1 files changed, 2 insertions, 64 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 2f2eb5e39..4e8e3f0d7 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -2443,7 +2443,6 @@ void WasmBinaryBuilder::readFunctions() { assert(exceptionTargetNames.empty()); assert(expressionStack.empty()); assert(controlFlowStack.empty()); - assert(letStack.empty()); assert(depth == 0); // Even if we are skipping function bodies we need to not skip the start // function. That contains important code for wasm-emscripten-finalize in @@ -2471,7 +2470,6 @@ void WasmBinaryBuilder::readFunctions() { throwError("stack not empty on function exit"); } assert(controlFlowStack.empty()); - assert(letStack.empty()); if (pos != endOfFunction) { throwError("binary offset at function exit not at expected location"); } @@ -3770,10 +3768,6 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { visitCallRef(call); break; } - case BinaryConsts::Let: { - visitLet((curr = allocator.alloc<Block>())->cast<Block>()); - break; - } case BinaryConsts::AtomicPrefix: { code = static_cast<uint8_t>(getU32LEB()); if (maybeVisitLoad(curr, code, /*isAtomic=*/true)) { @@ -4004,36 +3998,6 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { return BinaryConsts::ASTNodes(code); } -Index WasmBinaryBuilder::getAbsoluteLocalIndex(Index index) { - // Wasm binaries put each let at the bottom of the index space, which may be - // good for binary size as often the uses of the let variables are close to - // the let itself. However, in Binaryen IR we just have a simple flat index - // space of absolute values, which we add to as we parse, and we depend on - // later optimizations to reorder locals for size. - // - // For example, if we have $x, then we add a let with $y, the binary would map - // 0 => y, 1 => x, while in Binaryen IR $x always stays at 0, and $y is added - // at 1. - // - // Compute the relative index in the let we were added. We start by looking at - // the last let added, and if we belong to it, we are already relative to it. - // We will continue relativizing as we go down, til we find our let. - int64_t relative = index; - for (auto i = int64_t(letStack.size()) - 1; i >= 0; i--) { - auto& info = letStack[i]; - int64_t currNum = info.num; - // There were |currNum| let items added in this let. Check if we were one of - // them. - if (relative < currNum) { - return info.absoluteStart + relative; - } - relative -= currNum; - } - // We were not a let, but a normal var from the beginning. In that case, after - // we subtracted the let items, we have the proper absolute index. - return relative; -} - void WasmBinaryBuilder::startControlFlow(Expression* curr) { if (DWARF && currFunction) { controlFlowStack.push_back(curr); @@ -4314,7 +4278,7 @@ void WasmBinaryBuilder::visitCallIndirect(CallIndirect* curr) { void WasmBinaryBuilder::visitLocalGet(LocalGet* curr) { BYN_TRACE("zz node: LocalGet " << pos << std::endl); requireFunctionContext("local.get"); - curr->index = getAbsoluteLocalIndex(getU32LEB()); + curr->index = getU32LEB(); if (curr->index >= currFunction->getNumLocals()) { throwError("bad local.get index"); } @@ -4325,7 +4289,7 @@ void WasmBinaryBuilder::visitLocalGet(LocalGet* curr) { void WasmBinaryBuilder::visitLocalSet(LocalSet* curr, uint8_t code) { BYN_TRACE("zz node: Set|LocalTee\n"); requireFunctionContext("local.set outside of function"); - curr->index = getAbsoluteLocalIndex(getU32LEB()); + curr->index = getU32LEB(); if (curr->index >= currFunction->getNumLocals()) { throwError("bad local.set index"); } @@ -6797,32 +6761,6 @@ void WasmBinaryBuilder::visitCallRef(CallRef* curr) { curr->finalize(sig.results); } -void WasmBinaryBuilder::visitLet(Block* curr) { - // A let is lowered into a block that contains the value, and we allocate - // locals as needed, which works as we remove non-nullability. - - startControlFlow(curr); - // Get the output type. - curr->type = getType(); - // Get the new local types. First, get the absolute index from which we will - // start to allocate them. - requireFunctionContext("let"); - Index absoluteStart = currFunction->vars.size(); - readVars(); - Index numNewVars = currFunction->vars.size() - absoluteStart; - // Assign the values into locals. - Builder builder(wasm); - for (Index i = 0; i < numNewVars; i++) { - auto* value = popNonVoidExpression(); - curr->list.push_back(builder.makeLocalSet(absoluteStart + i, value)); - } - // Read the body, with adjusted local indexes. - letStack.emplace_back(LetData{numNewVars, absoluteStart}); - curr->list.push_back(getBlockOrSingleton(curr->type)); - letStack.pop_back(); - curr->finalize(curr->type); -} - bool WasmBinaryBuilder::maybeVisitI31New(Expression*& out, uint32_t code) { if (code != BinaryConsts::I31New) { return false; |