summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/LegalizeJSInterface.cpp9
-rw-r--r--test/wasm-only.asm.js4
-rw-r--r--test/wasm-only.fromasm20
-rw-r--r--test/wasm-only.fromasm.imprecise20
-rw-r--r--test/wasm-only.fromasm.imprecise.no-opts23
-rw-r--r--test/wasm-only.fromasm.no-opts23
6 files changed, 90 insertions, 9 deletions
diff --git a/src/passes/LegalizeJSInterface.cpp b/src/passes/LegalizeJSInterface.cpp
index c9cada3c0..6e070156f 100644
--- a/src/passes/LegalizeJSInterface.cpp
+++ b/src/passes/LegalizeJSInterface.cpp
@@ -57,6 +57,15 @@ struct LegalizeJSInterface : public Pass {
auto* legal = makeLegalStub(im.get(), module, funcName);
illegalToLegal[im->name] = funcName;
newImports.push_back(legal);
+ // we need to use the legalized version in the table, as the import from JS
+ // is legal for JS. Our stub makes it look like a native wasm function.
+ for (auto& segment : module->table.segments) {
+ for (auto& name : segment.data) {
+ if (name == im->name) {
+ name = funcName;
+ }
+ }
+ }
}
}
if (illegalToLegal.size() > 0) {
diff --git a/test/wasm-only.asm.js b/test/wasm-only.asm.js
index eb18fce03..cf0119cd7 100644
--- a/test/wasm-only.asm.js
+++ b/test/wasm-only.asm.js
@@ -22,6 +22,7 @@ function asm(global, env, buffer) {
var illegalImportResult = env.illegalImportResult;
var _fabsf = env._fabsf;
+ var do_i64 = env.do_i64;
function loads() {
var i = 0, f = fround(0), d = +0;
@@ -241,9 +242,10 @@ function asm(global, env, buffer) {
function __emscripten_dceable_type_decls() { // dce-able, but this defines the type of fabsf which has no other use
fround(_fabsf(fround(0.0)));
+ i64(do_i64());
}
- var FUNCTION_TABLE_X = [illegalImport, _fabsf]; // must stay ok in the table, not legalized, as it will be called internally by the true type
+ var FUNCTION_TABLE_X = [illegalImport, _fabsf, do_i64]; // must stay ok in the table, not legalized, as it will be called internally by the true type
return { test64: test64, illegalParam : illegalParam, illegalResult: illegalResult, keepAlive: keepAlive };
}
diff --git a/test/wasm-only.fromasm b/test/wasm-only.fromasm
index 30793df2c..ae8bddbbc 100644
--- a/test/wasm-only.fromasm
+++ b/test/wasm-only.fromasm
@@ -5,17 +5,20 @@
(type $legaltype$illegalImport (func (param f64 i32 i32 i32)))
(type $legaltype$illegalImportResult (func (result i32)))
(type $legaltype$_fabsf (func (param f64) (result f64)))
+ (type $legaltype$do_i64 (func (result i32)))
(import "env" "illegalImport" (func $illegalImport (param f64 i64 i32)))
(import "env" "illegalImportResult" (func $illegalImportResult (result i64)))
(import "env" "_fabsf" (func $_fabsf (param f32) (result f32)))
+ (import "env" "do_i64" (func $do_i64 (result i64)))
(import "env" "illegalImport" (func $legalimport$illegalImport (param f64 i32 i32 i32)))
(import "env" "illegalImportResult" (func $legalimport$illegalImportResult (result i32)))
(import "env" "_fabsf" (func $legalimport$_fabsf (param f64) (result f64)))
+ (import "env" "do_i64" (func $legalimport$do_i64 (result i32)))
(import "env" "memory" (memory $0 256 256))
- (import "env" "table" (table 2 2 anyfunc))
+ (import "env" "table" (table 3 3 anyfunc))
(import "env" "memoryBase" (global $memoryBase i32))
(import "env" "tableBase" (global $tableBase i32))
- (elem (get_global $tableBase) $illegalImport $_fabsf)
+ (elem (get_global $tableBase) $legalfunc$illegalImport $legalfunc$_fabsf $legalfunc$do_i64)
(data (get_global $memoryBase) "wasm-only.asm.js")
(global $tempRet0 (mut i32) (i32.const 0))
(export "test64" (func $test64))
@@ -452,4 +455,17 @@
)
)
)
+ (func $legalfunc$do_i64 (result i64)
+ (i64.or
+ (i64.extend_u/i32
+ (call $legalimport$do_i64)
+ )
+ (i64.shl
+ (i64.extend_u/i32
+ (get_global $tempRet0)
+ )
+ (i64.const 32)
+ )
+ )
+ )
)
diff --git a/test/wasm-only.fromasm.imprecise b/test/wasm-only.fromasm.imprecise
index c65c70ada..a6c5b3f50 100644
--- a/test/wasm-only.fromasm.imprecise
+++ b/test/wasm-only.fromasm.imprecise
@@ -5,17 +5,20 @@
(type $legaltype$illegalImport (func (param f64 i32 i32 i32)))
(type $legaltype$illegalImportResult (func (result i32)))
(type $legaltype$_fabsf (func (param f64) (result f64)))
+ (type $legaltype$do_i64 (func (result i32)))
(import "env" "illegalImport" (func $illegalImport (param f64 i64 i32)))
(import "env" "illegalImportResult" (func $illegalImportResult (result i64)))
(import "env" "_fabsf" (func $_fabsf (param f32) (result f32)))
+ (import "env" "do_i64" (func $do_i64 (result i64)))
(import "env" "illegalImport" (func $legalimport$illegalImport (param f64 i32 i32 i32)))
(import "env" "illegalImportResult" (func $legalimport$illegalImportResult (result i32)))
(import "env" "_fabsf" (func $legalimport$_fabsf (param f64) (result f64)))
+ (import "env" "do_i64" (func $legalimport$do_i64 (result i32)))
(import "env" "memory" (memory $0 256 256))
- (import "env" "table" (table 2 2 anyfunc))
+ (import "env" "table" (table 3 3 anyfunc))
(import "env" "memoryBase" (global $memoryBase i32))
(import "env" "tableBase" (global $tableBase i32))
- (elem (get_global $tableBase) $illegalImport $_fabsf)
+ (elem (get_global $tableBase) $legalfunc$illegalImport $legalfunc$_fabsf $legalfunc$do_i64)
(global $tempRet0 (mut i32) (i32.const 0))
(export "test64" (func $test64))
(export "illegalParam" (func $legalstub$illegalParam))
@@ -380,4 +383,17 @@
)
)
)
+ (func $legalfunc$do_i64 (result i64)
+ (i64.or
+ (i64.extend_u/i32
+ (call $legalimport$do_i64)
+ )
+ (i64.shl
+ (i64.extend_u/i32
+ (get_global $tempRet0)
+ )
+ (i64.const 32)
+ )
+ )
+ )
)
diff --git a/test/wasm-only.fromasm.imprecise.no-opts b/test/wasm-only.fromasm.imprecise.no-opts
index 9311971fb..d718ccc24 100644
--- a/test/wasm-only.fromasm.imprecise.no-opts
+++ b/test/wasm-only.fromasm.imprecise.no-opts
@@ -5,17 +5,20 @@
(type $legaltype$illegalImport (func (param f64 i32 i32 i32)))
(type $legaltype$illegalImportResult (func (result i32)))
(type $legaltype$_fabsf (func (param f64) (result f64)))
+ (type $legaltype$do_i64 (func (result i32)))
(import "env" "illegalImport" (func $illegalImport (param f64 i64 i32)))
(import "env" "illegalImportResult" (func $illegalImportResult (result i64)))
(import "env" "_fabsf" (func $_fabsf (param f32) (result f32)))
+ (import "env" "do_i64" (func $do_i64 (result i64)))
(import "env" "illegalImport" (func $legalimport$illegalImport (param f64 i32 i32 i32)))
(import "env" "illegalImportResult" (func $legalimport$illegalImportResult (result i32)))
(import "env" "_fabsf" (func $legalimport$_fabsf (param f64) (result f64)))
+ (import "env" "do_i64" (func $legalimport$do_i64 (result i32)))
(import "env" "memory" (memory $0 256 256))
- (import "env" "table" (table 2 2 anyfunc))
+ (import "env" "table" (table 3 3 anyfunc))
(import "env" "memoryBase" (global $memoryBase i32))
(import "env" "tableBase" (global $tableBase i32))
- (elem (get_global $tableBase) $illegalImport $_fabsf)
+ (elem (get_global $tableBase) $legalfunc$illegalImport $legalfunc$_fabsf $legalfunc$do_i64)
(global $tempRet0 (mut i32) (i32.const 0))
(export "test64" (func $test64))
(export "illegalParam" (func $legalstub$illegalParam))
@@ -765,6 +768,9 @@
(f32.const 0)
)
)
+ (drop
+ (call $legalfunc$do_i64)
+ )
)
(func $legalstub$illegalParam (param $0 i32) (param $1 i32) (param $2 i32) (param $3 f64)
(call $illegalParam
@@ -837,4 +843,17 @@
)
)
)
+ (func $legalfunc$do_i64 (result i64)
+ (i64.or
+ (i64.extend_u/i32
+ (call $legalimport$do_i64)
+ )
+ (i64.shl
+ (i64.extend_u/i32
+ (get_global $tempRet0)
+ )
+ (i64.const 32)
+ )
+ )
+ )
)
diff --git a/test/wasm-only.fromasm.no-opts b/test/wasm-only.fromasm.no-opts
index 54d39cd0a..e208f870f 100644
--- a/test/wasm-only.fromasm.no-opts
+++ b/test/wasm-only.fromasm.no-opts
@@ -5,17 +5,20 @@
(type $legaltype$illegalImport (func (param f64 i32 i32 i32)))
(type $legaltype$illegalImportResult (func (result i32)))
(type $legaltype$_fabsf (func (param f64) (result f64)))
+ (type $legaltype$do_i64 (func (result i32)))
(import "env" "illegalImport" (func $illegalImport (param f64 i64 i32)))
(import "env" "illegalImportResult" (func $illegalImportResult (result i64)))
(import "env" "_fabsf" (func $_fabsf (param f32) (result f32)))
+ (import "env" "do_i64" (func $do_i64 (result i64)))
(import "env" "illegalImport" (func $legalimport$illegalImport (param f64 i32 i32 i32)))
(import "env" "illegalImportResult" (func $legalimport$illegalImportResult (result i32)))
(import "env" "_fabsf" (func $legalimport$_fabsf (param f64) (result f64)))
+ (import "env" "do_i64" (func $legalimport$do_i64 (result i32)))
(import "env" "memory" (memory $0 256 256))
- (import "env" "table" (table 2 2 anyfunc))
+ (import "env" "table" (table 3 3 anyfunc))
(import "env" "memoryBase" (global $memoryBase i32))
(import "env" "tableBase" (global $tableBase i32))
- (elem (get_global $tableBase) $illegalImport $_fabsf)
+ (elem (get_global $tableBase) $legalfunc$illegalImport $legalfunc$_fabsf $legalfunc$do_i64)
(global $tempRet0 (mut i32) (i32.const 0))
(export "test64" (func $test64))
(export "illegalParam" (func $legalstub$illegalParam))
@@ -813,6 +816,9 @@
(f32.const 0)
)
)
+ (drop
+ (call $legalfunc$do_i64)
+ )
)
(func $legalstub$illegalParam (param $0 i32) (param $1 i32) (param $2 i32) (param $3 f64)
(call $illegalParam
@@ -885,4 +891,17 @@
)
)
)
+ (func $legalfunc$do_i64 (result i64)
+ (i64.or
+ (i64.extend_u/i32
+ (call $legalimport$do_i64)
+ )
+ (i64.shl
+ (i64.extend_u/i32
+ (get_global $tempRet0)
+ )
+ (i64.const 32)
+ )
+ )
+ )
)