From 8b5b85463cd5f5fcfec4d0bc6acb52f2acb30d79 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 6 Mar 2019 16:02:34 -0800 Subject: Don't create already-existing dynCalls (#1932) This can happen in emscripten if we run fpcast-emu after previous passes created dynCalls already. If so, it's fine to just do nothing. Fixes emscripten-core/emscripten#8229 --- src/wasm/wasm-emscripten.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index f7b7213d9..390266d44 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -182,12 +182,18 @@ void EmscriptenGlueGenerator::generateDynCallThunks() { for (const auto& indirectFunc : tableSegmentData) { std::string sig = getSig(wasm.getFunction(indirectFunc)); auto* funcType = ensureFunctionType(sig, &wasm); - if (!sigs.insert(sig).second) continue; // Sig is already in the set + if (!sigs.insert(sig).second) { + continue; // sig is already in the set + } + Name name = std::string("dynCall_") + sig; + if (wasm.getFunctionOrNull(name) || wasm.getExportOrNull(name)) { + continue; // module already contains this dyncall + } std::vector params; params.emplace_back("fptr", i32); // function pointer param int p = 0; for (const auto& ty : funcType->params) params.emplace_back(std::to_string(p++), ty); - Function* f = builder.makeFunction(std::string("dynCall_") + sig, std::move(params), funcType->result, {}); + Function* f = builder.makeFunction(name, std::move(params), funcType->result, {}); Expression* fptr = builder.makeGetLocal(0, i32); std::vector args; for (unsigned i = 0; i < funcType->params.size(); ++i) { -- cgit v1.2.3