diff options
-rw-r--r-- | src/passes/LegalizeJSInterface.cpp | 9 | ||||
-rw-r--r-- | test/wasm-only.asm.js | 4 | ||||
-rw-r--r-- | test/wasm-only.fromasm | 20 | ||||
-rw-r--r-- | test/wasm-only.fromasm.imprecise | 20 | ||||
-rw-r--r-- | test/wasm-only.fromasm.imprecise.no-opts | 23 | ||||
-rw-r--r-- | test/wasm-only.fromasm.no-opts | 23 |
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) + ) + ) + ) ) |