diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/passes/ReplaceStackPointer.cpp | 103 | ||||
-rw-r--r-- | src/passes/pass.cpp | 4 | ||||
-rw-r--r-- | src/passes/passes.h | 1 | ||||
-rw-r--r-- | src/tools/wasm-emscripten-finalize.cpp | 7 | ||||
-rw-r--r-- | src/wasm-emscripten.h | 4 | ||||
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 26 |
7 files changed, 0 insertions, 146 deletions
diff --git a/src/passes/CMakeLists.txt b/src/passes/CMakeLists.txt index d352e841b..1551ba256 100644 --- a/src/passes/CMakeLists.txt +++ b/src/passes/CMakeLists.txt @@ -65,7 +65,6 @@ set(passes_SOURCES RemoveImports.cpp RemoveMemory.cpp RemoveNonJSOps.cpp - ReplaceStackPointer.cpp RemoveUnusedBrs.cpp RemoveUnusedNames.cpp RemoveUnusedModuleElements.cpp diff --git a/src/passes/ReplaceStackPointer.cpp b/src/passes/ReplaceStackPointer.cpp deleted file mode 100644 index da57f8c3d..000000000 --- a/src/passes/ReplaceStackPointer.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2020 WebAssembly Community Group participants - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Convert llvm's stack pointer usage from from global.get/global.set into -// cals to external stackSave/stackRestore. -// This is needed to emscripten SIDE_MODULE code where mutable global imports -// are not yet permitted by default. -// - -#include "abi/js.h" -#include "ir/import-utils.h" -#include "pass.h" -#include "support/debug.h" -#include "wasm-emscripten.h" - -#define DEBUG_TYPE "replace-stack-pointer" - -namespace wasm { - -static Name STACK_SAVE("stackSave"); -static Name STACK_RESTORE("stackRestore"); - -struct ReplaceStackPointer - : public WalkerPass<PostWalker<ReplaceStackPointer>> { - void visitGlobalGet(GlobalGet* curr) { - if (getModule()->getGlobalOrNull(curr->name) == stackPointer) { - needStackSave = true; - if (!builder) { - builder = make_unique<Builder>(*getModule()); - } - replaceCurrent(builder->makeCall(STACK_SAVE, {}, Type::i32)); - } - } - - void visitGlobalSet(GlobalSet* curr) { - if (getModule()->getGlobalOrNull(curr->name) == stackPointer) { - needStackRestore = true; - if (!builder) { - builder = make_unique<Builder>(*getModule()); - } - replaceCurrent( - builder->makeCall(STACK_RESTORE, {curr->value}, Type::none)); - } - } - - void doWalkModule(Module* module) { - stackPointer = getStackPointerGlobal(*module); - if (!stackPointer) { - BYN_DEBUG(std::cerr << "no stack pointer found\n"); - return; - } - BYN_DEBUG(std::cerr << "stack pointer found\n"); - super::doWalkModule(module); - if (needStackSave) { - ensureFunctionImport( - module, STACK_SAVE, Signature(Type::none, Type::i32)); - } - if (needStackRestore) { - ensureFunctionImport( - module, STACK_RESTORE, Signature(Type::i32, Type::none)); - } - // Finally remove the stack pointer global itself. This avoids importing - // a mutable global. - module->removeGlobal(stackPointer->name); - } - - void ensureFunctionImport(Module* module, Name name, Signature sig) { - ImportInfo info(*module); - if (info.getImportedFunction(ENV, name)) { - return; - } - auto import = new Function; - import->name = name; - import->module = ENV; - import->base = name; - import->sig = sig; - module->addFunction(import); - } - -private: - std::unique_ptr<Builder> builder; - Global* stackPointer = nullptr; - bool needStackSave = false; - bool needStackRestore = false; -}; - -Pass* createReplaceStackPointerPass() { return new ReplaceStackPointer; } - -} // namespace wasm diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index 9b56fa54d..67e1ca53b 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -303,10 +303,6 @@ void PassRegistry::registerPasses() { registerPass("rereloop", "re-optimize control flow using the relooper algorithm", createReReloopPass); - registerPass("replace-stack-pointer", - "Replace llvm-generated stack pointer global with calls with " - "imported functions.", - createReplaceStackPointerPass); registerPass( "rse", "remove redundant local.sets", createRedundantSetEliminationPass); registerPass("roundtrip", diff --git a/src/passes/passes.h b/src/passes/passes.h index 434b6e382..a36aeb7c3 100644 --- a/src/passes/passes.h +++ b/src/passes/passes.h @@ -100,7 +100,6 @@ Pass* createRemoveUnusedNonFunctionModuleElementsPass(); Pass* createRemoveUnusedNamesPass(); Pass* createReorderFunctionsPass(); Pass* createReorderLocalsPass(); -Pass* createReplaceStackPointerPass(); Pass* createReReloopPass(); Pass* createRedundantSetEliminationPass(); Pass* createRoundTripPass(); diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index e79bafa32..2c21d49ca 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -289,10 +289,6 @@ int main(int argc, const char* argv[]) { passRunner.add("stack-check"); } - if (sideModule && !mutableSP) { - passRunner.add("replace-stack-pointer"); - } - if (legacyPIC) { if (sideModule) { passRunner.add("emscripten-pic"); @@ -334,9 +330,6 @@ int main(int argc, const char* argv[]) { } else { BYN_TRACE("finalizing as regular module\n"); if (legacyPIC) { - if (!mutableSP) { - generator.internalizeStackPointerGlobal(); - } // For side modules these gets called via __post_instantiate if (Function* F = wasm.getFunctionOrNull(ASSIGN_GOT_ENTRIES)) { auto* ex = new Export(); diff --git a/src/wasm-emscripten.h b/src/wasm-emscripten.h index dd5c2009f..8275f7bc8 100644 --- a/src/wasm-emscripten.h +++ b/src/wasm-emscripten.h @@ -36,10 +36,6 @@ public: Function* generateAssignGOTEntriesFunction(); void generatePostInstantiateFunction(); - // Remove the import of a mutable __stack_pointer and instead initialize the - // stack pointer from an immutable import. - void internalizeStackPointerGlobal(); - std::string generateEmscriptenMetadata(Address staticBump, std::vector<Name> const& initializerFunctions); diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index dec824331..7f7b227cf 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -116,32 +116,6 @@ void EmscriptenGlueGenerator::generatePostInstantiateFunction() { wasm.addExport(ex); } -// lld can sometimes produce a build with an imported mutable __stack_pointer -// (i.e. when linking with -fpie). This method internalizes the -// __stack_pointer and initializes it from an immutable global instead. -// For -shared builds we instead call replaceStackPointerGlobal. -void EmscriptenGlueGenerator::internalizeStackPointerGlobal() { - Global* stackPointer = getStackPointerGlobal(wasm); - if (!stackPointer || !stackPointer->imported() || !stackPointer->mutable_) { - return; - } - - Name internalName = stackPointer->name; - Name externalName = internalName.c_str() + std::string("_import"); - - // Rename the imported global, and make it immutable - stackPointer->name = externalName; - stackPointer->mutable_ = false; - wasm.updateMaps(); - - // Create a new global with the old name that is not imported. - Builder builder(wasm); - auto* init = builder.makeGlobalGet(externalName, stackPointer->type); - auto* sp = builder.makeGlobal( - internalName, stackPointer->type, init, Builder::Mutable); - wasm.addGlobal(sp); -} - const Address UNKNOWN_OFFSET(uint32_t(-1)); std::vector<Address> getSegmentOffsets(Module& wasm) { |