diff options
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 10 | ||||
-rw-r--r-- | test/passes/fpcast-emu.txt | 41 | ||||
-rw-r--r-- | test/passes/fpcast-emu.wast | 10 |
3 files changed, 59 insertions, 2 deletions
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<NameType> 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<Expression*> args; for (unsigned i = 0; i < funcType->params.size(); ++i) { diff --git a/test/passes/fpcast-emu.txt b/test/passes/fpcast-emu.txt index c1a76b1d3..bb0c4950b 100644 --- a/test/passes/fpcast-emu.txt +++ b/test/passes/fpcast-emu.txt @@ -455,3 +455,44 @@ ) ) ) +(module + (type $0 (func (param f32))) + (type $1 (func (param f64))) + (type $FUNCSIG$jjjjjjjjjjjjjjjjj (func (param i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64 i64) (result i64))) + (type $FUNCSIG$vf (func (param f32))) + (type $FUNCSIG$vd (func (param f64))) + (table $0 42 42 funcref) + (elem (i32.const 0) $byn$fpcast-emu$a $byn$fpcast-emu$b) + (export "dynCall_vf" (func $dynCall_vf)) + (export "dynCall_vd" (func $min_vd)) + (func $a (; 0 ;) (type $0) (param $0 f32) + (nop) + ) + (func $b (; 1 ;) (type $1) (param $0 f64) + (nop) + ) + (func $dynCall_vf (; 2 ;) (type $0) (param $0 f32) + (nop) + ) + (func $min_vd (; 3 ;) (type $0) (param $0 f32) + (nop) + ) + (func $byn$fpcast-emu$a (; 4 ;) (type $FUNCSIG$jjjjjjjjjjjjjjjjj) (param $0 i64) (param $1 i64) (param $2 i64) (param $3 i64) (param $4 i64) (param $5 i64) (param $6 i64) (param $7 i64) (param $8 i64) (param $9 i64) (param $10 i64) (param $11 i64) (param $12 i64) (param $13 i64) (param $14 i64) (param $15 i64) (result i64) + (call $a + (f32.reinterpret_i32 + (i32.wrap_i64 + (local.get $0) + ) + ) + ) + (i64.const 0) + ) + (func $byn$fpcast-emu$b (; 5 ;) (type $FUNCSIG$jjjjjjjjjjjjjjjjj) (param $0 i64) (param $1 i64) (param $2 i64) (param $3 i64) (param $4 i64) (param $5 i64) (param $6 i64) (param $7 i64) (param $8 i64) (param $9 i64) (param $10 i64) (param $11 i64) (param $12 i64) (param $13 i64) (param $14 i64) (param $15 i64) (result i64) + (call $b + (f64.reinterpret_i64 + (local.get $0) + ) + ) + (i64.const 0) + ) +) diff --git a/test/passes/fpcast-emu.wast b/test/passes/fpcast-emu.wast index 1ea95b348..90af71d6f 100644 --- a/test/passes/fpcast-emu.wast +++ b/test/passes/fpcast-emu.wast @@ -67,4 +67,14 @@ ) ) ) +(module + (table 42 42 funcref) + (elem (i32.const 0) $a $b) + (export "dynCall_vf" (func $dynCall_vf)) + (export "dynCall_vd" (func $min_vd)) + (func $a (param $0 f32)) + (func $b (param $0 f64)) + (func $dynCall_vf (param $0 f32)) + (func $min_vd (param $0 f32)) +) |