summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/PostEmscripten.cpp18
-rw-r--r--src/wasm/wasm-emscripten.cpp9
-rw-r--r--test/lld/longjmp.wat.out10
-rw-r--r--test/lld/shared_longjmp.wat.out14
-rw-r--r--test/passes/post-emscripten.txt13
-rw-r--r--test/passes/post-emscripten.wast11
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)))
+)