diff options
-rw-r--r-- | src/passes/PostEmscripten.cpp | 18 | ||||
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 9 | ||||
-rw-r--r-- | test/lld/longjmp.wat.out | 10 | ||||
-rw-r--r-- | test/lld/shared_longjmp.wat.out | 14 | ||||
-rw-r--r-- | test/passes/post-emscripten.txt | 13 | ||||
-rw-r--r-- | test/passes/post-emscripten.wast | 11 |
6 files changed, 57 insertions, 18 deletions
diff --git a/src/passes/PostEmscripten.cpp b/src/passes/PostEmscripten.cpp index 2397284c3..aa6c90977 100644 --- a/src/passes/PostEmscripten.cpp +++ b/src/passes/PostEmscripten.cpp @@ -130,6 +130,9 @@ struct PostEmscripten : public Pass { } } + // Optimize imports + optimizeImports(runner, module); + // Optimize calls OptimizeCalls().run(runner, module); @@ -137,6 +140,21 @@ struct PostEmscripten : public Pass { optimizeExceptions(runner, module); } + void optimizeImports(PassRunner* runner, Module* module) { + // Calling emscripten_longjmp_jmpbuf is the same as emscripten_longjmp. + Name EMSCRIPTEN_LONGJMP("emscripten_longjmp"); + Name EMSCRIPTEN_LONGJMP_JMPBUF("emscripten_longjmp_jmpbuf"); + ImportInfo info(*module); + auto* emscripten_longjmp = + info.getImportedFunction(ENV, EMSCRIPTEN_LONGJMP); + auto* emscripten_longjmp_jmpbuf = + info.getImportedFunction(ENV, EMSCRIPTEN_LONGJMP_JMPBUF); + if (emscripten_longjmp && emscripten_longjmp_jmpbuf) { + // Both exist, so it is worth renaming so that we have only one. + emscripten_longjmp_jmpbuf->base = EMSCRIPTEN_LONGJMP; + } + } + // Optimize exceptions (and setjmp) by removing unnecessary invoke* calls. // An invoke is a call to JS with a function pointer; JS does a try-catch // and calls the pointer, catching and reporting any error. If we know no diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index c287087c9..e41d0df48 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -633,19 +633,12 @@ struct FixInvokeFunctionNamesWalker getSig(sigWoOrigFunc.results, sigWoOrigFunc.params)); } - Name fixEmEHSjLjNames(const Name& name, Signature sig) { - if (name == "emscripten_longjmp_jmpbuf") { - return "emscripten_longjmp"; - } - return fixEmExceptionInvoke(name, sig); - } - void visitFunction(Function* curr) { if (!curr->imported()) { return; } - Name newname = fixEmEHSjLjNames(curr->base, curr->sig); + Name newname = fixEmExceptionInvoke(curr->base, curr->sig); if (newname == curr->base) { return; } diff --git a/test/lld/longjmp.wat.out b/test/lld/longjmp.wat.out index 97c391ad0..71f2d9d89 100644 --- a/test/lld/longjmp.wat.out +++ b/test/lld/longjmp.wat.out @@ -1,6 +1,6 @@ (module - (type $i32_=>_none (func (param i32))) (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $none_=>_i32 (func (result i32))) (type $i32_=>_i32 (func (param i32) (result i32))) @@ -11,14 +11,15 @@ (import "env" "malloc" (func $fimport$0 (param i32) (result i32))) (import "env" "saveSetjmp" (func $fimport$1 (param i32 i32 i32 i32) (result i32))) (import "env" "getTempRet0" (func $fimport$2 (result i32))) + (import "env" "emscripten_longjmp_jmpbuf" (func $fimport$3 (param i32 i32))) (import "env" "invoke_vii" (func $invoke_vii (param i32 i32 i32))) (import "env" "testSetjmp" (func $fimport$5 (param i32 i32 i32) (result i32))) (import "env" "setTempRet0" (func $fimport$6 (param i32))) (import "env" "free" (func $fimport$7 (param i32))) - (import "env" "emscripten_longjmp" (func $emscripten_longjmp (param i32 i32))) + (import "env" "emscripten_longjmp" (func $fimport$8 (param i32 i32))) (memory $0 2) (table $0 2 2 funcref) - (elem (i32.const 1) $emscripten_longjmp) + (elem (i32.const 1) $fimport$3) (global $global$0 (mut i32) (i32.const 66112)) (global $global$1 i32 (i32.const 576)) (export "memory" (memory $0)) @@ -124,7 +125,7 @@ (i32.const 0) ) ) - (call $emscripten_longjmp + (call $fimport$8 (local.get $0) (local.get $3) ) @@ -158,6 +159,7 @@ "malloc", "saveSetjmp", "getTempRet0", + "emscripten_longjmp_jmpbuf", "testSetjmp", "setTempRet0", "free", diff --git a/test/lld/shared_longjmp.wat.out b/test/lld/shared_longjmp.wat.out index 47b4ea14e..7bfb1f597 100644 --- a/test/lld/shared_longjmp.wat.out +++ b/test/lld/shared_longjmp.wat.out @@ -1,8 +1,8 @@ (module (type $none_=>_none (func)) (type $none_=>_i32 (func (result i32))) - (type $i32_=>_none (func (param i32))) (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) @@ -15,14 +15,15 @@ (import "env" "malloc" (func $fimport$4 (param i32) (result i32))) (import "env" "saveSetjmp" (func $fimport$5 (param i32 i32 i32 i32) (result i32))) (import "env" "getTempRet0" (func $fimport$6 (result i32))) + (import "env" "emscripten_longjmp_jmpbuf" (func $fimport$7 (param i32 i32))) (import "env" "invoke_vii" (func $invoke_vii (param i32 i32 i32))) (import "env" "testSetjmp" (func $fimport$9 (param i32 i32 i32) (result i32))) (import "env" "setTempRet0" (func $fimport$10 (param i32))) (import "env" "free" (func $fimport$11 (param i32))) - (import "env" "emscripten_longjmp" (func $emscripten_longjmp (param i32 i32))) + (import "env" "emscripten_longjmp" (func $fimport$12 (param i32 i32))) (import "env" "g$__THREW__" (func $g$__THREW__ (result i32))) (import "env" "g$__threwValue" (func $g$__threwValue (result i32))) - (import "env" "fp$emscripten_longjmp$vii" (func $fp$emscripten_longjmp$vii (result i32))) + (import "env" "fp$emscripten_longjmp_jmpbuf$vii" (func $fp$emscripten_longjmp_jmpbuf$vii (result i32))) (global $gimport$13 (mut i32) (i32.const 0)) (global $gimport$14 (mut i32) (i32.const 0)) (global $gimport$15 (mut i32) (i32.const 0)) @@ -136,7 +137,7 @@ ) (return) ) - (call $emscripten_longjmp + (call $fimport$12 (local.get $3) (local.get $0) ) @@ -157,7 +158,7 @@ (call $g$__threwValue) ) (global.set $gimport$14 - (call $fp$emscripten_longjmp$vii) + (call $fp$emscripten_longjmp_jmpbuf$vii) ) ) (func $__post_instantiate @@ -174,13 +175,14 @@ "malloc", "saveSetjmp", "getTempRet0", + "emscripten_longjmp_jmpbuf", "testSetjmp", "setTempRet0", "free", "emscripten_longjmp", "g$__THREW__", "g$__threwValue", - "fp$emscripten_longjmp$vii" + "fp$emscripten_longjmp_jmpbuf$vii" ], "externs": [ "___memory_base", diff --git a/test/passes/post-emscripten.txt b/test/passes/post-emscripten.txt index 556ef8280..c1427d8fd 100644 --- a/test/passes/post-emscripten.txt +++ b/test/passes/post-emscripten.txt @@ -176,3 +176,16 @@ ) ) ) +(module + (type $i32_i32_=>_none (func (param i32 i32))) + (import "env" "emscripten_longjmp" (func $a (param i32 i32))) + (import "env" "emscripten_longjmp" (func $b (param i32 i32))) +) +(module + (type $i32_i32_=>_none (func (param i32 i32))) + (import "env" "emscripten_longjmp_jmpbuf" (func $b (param i32 i32))) +) +(module + (type $i32_i32_=>_none (func (param i32 i32))) + (import "env" "emscripten_longjmp" (func $a (param i32 i32))) +) diff --git a/test/passes/post-emscripten.wast b/test/passes/post-emscripten.wast index e5a4637cc..05bdf9d69 100644 --- a/test/passes/post-emscripten.wast +++ b/test/passes/post-emscripten.wast @@ -148,3 +148,14 @@ ) ) ) +;; longjmp renaming +(module + (import "env" "emscripten_longjmp" (func $a (param i32 i32))) + (import "env" "emscripten_longjmp_jmpbuf" (func $b (param i32 i32))) +) +(module + (import "env" "emscripten_longjmp_jmpbuf" (func $b (param i32 i32))) +) +(module + (import "env" "emscripten_longjmp" (func $a (param i32 i32))) +) |