diff options
35 files changed, 79 insertions, 17 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h index 306a953a7..e27c5d9e2 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -832,6 +832,14 @@ void Asm2WasmBuilder::processAsm(Ref ast) { memoryImport->base = MEMORY; memoryImport->kind = Import::Memory; wasm.addImport(memoryImport.release()); + + // import table + auto tableImport = make_unique<Import>(); + tableImport->name = TABLE; + tableImport->module = ENV; + tableImport->base = TABLE; + tableImport->kind = Import::Table; + wasm.addImport(tableImport.release()); #endif #if 0 // enable asm2wasm i64 optimizations when browsers have consistent i64 support in wasm diff --git a/src/js/wasm.js-post.js b/src/js/wasm.js-post.js index dcffb1ee8..d691c22f2 100644 --- a/src/js/wasm.js-post.js +++ b/src/js/wasm.js-post.js @@ -274,10 +274,13 @@ function integrateWasmJS(Module) { global = fixImports(global); env = fixImports(env); - // import memory + // import memory and table if (!env['memory']) { env['memory'] = providedBuffer; } + if (!env['table']) { + env['table'] = new Array(1024); + } // try the methods. each should return the exports if it succeeded diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp index 31448d2a0..7d71cec3c 100644 --- a/src/wasm-js.cpp +++ b/src/wasm-js.cpp @@ -145,14 +145,16 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() { Module['asmExports'] = {}; }); for (auto& curr : module->exports) { - EM_ASM_({ - var name = Pointer_stringify($0); - Module['asmExports'][name] = function() { - Module['tempArguments'] = Array.prototype.slice.call(arguments); - Module['_call_from_js']($0); - return Module['tempReturn']; - }; - }, curr->name.str); + if (curr->kind == Export::Function) { + EM_ASM_({ + var name = Pointer_stringify($0); + Module['asmExports'][name] = function() { + Module['tempArguments'] = Array.prototype.slice.call(arguments); + Module['_call_from_js']($0); + return Module['tempReturn']; + }; + }, curr->name.str); + } } // verify imports are provided @@ -177,7 +179,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() { assert(import->kind == Import::Memory); // memory is imported EM_ASM({ - Module['outside']['tempBuffer'] = Module['lookupImport']('env', 'memory'); + Module['asmExports']['memory'] = Module['lookupImport']('env', 'memory'); }); found = true; } @@ -185,25 +187,42 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() { if (!found) { // no memory import; create a new buffer here, just like native wasm support would. EM_ASM_({ - Module['outside']['tempBuffer'] = Module['outside']['newBuffer'] = new ArrayBuffer($0); + Module['asmExports']['memory'] = Module['outside']['newBuffer'] = new ArrayBuffer($0); }, wasm.memory.initial * Memory::kPageSize); } } for (auto segment : wasm.memory.segments) { EM_ASM_({ var source = Module['HEAP8'].subarray($1, $1 + $2); - var target = new Int8Array(Module['outside']['tempBuffer']); + var target = new Int8Array(Module['asmExports']['memory']); target.set(source, $0); }, ConstantExpressionRunner(instance.globals).visit(segment.offset).value.geti32(), &segment.data[0], segment.data.size()); } + // look for imported table + { + bool found = false; + for (auto& import : wasm.imports) { + if (import->module == ENV && import->base == TABLE) { + assert(import->kind == Import::Table); + // table is imported + EM_ASM({ + Module['outside']['wasmTable'] = Module['lookupImport']('env', 'table'); + }); + found = true; + } + } + if (!found) { + // no table import; create a new one here, just like native wasm support would. + EM_ASM_({ + Module['outside']['wasmTable'] = new Array($0); + }, wasm.table.initial); + } + } EM_ASM({ - Module['outside']['tempBuffer'] = null; + Module['asmExports']['table'] = Module['outside']['wasmTable']; }); - // Table support is in a JS array. If the entry is a number, it's a function pointer. If not, it's a JS method to be called directly + // Emulated table support is in a JS array. If the entry is a number, it's a function pointer. If not, it's a JS method to be called directly // TODO: make them all JS methods, wrapping a dynCall where necessary? - EM_ASM_({ - Module['outside']['wasmTable'] = new Array($0); - }, wasm.table.initial); for (auto segment : wasm.table.segments) { Address offset = ConstantExpressionRunner(instance.globals).visit(segment.offset).value.geti32(); assert(offset + segment.data.size() <= wasm.table.initial); diff --git a/test/emcc_O2_hello_world.fromasm b/test/emcc_O2_hello_world.fromasm index 21873f241..fbf527eb4 100644 --- a/test/emcc_O2_hello_world.fromasm +++ b/test/emcc_O2_hello_world.fromasm @@ -31,6 +31,7 @@ (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (import $memInitBase global "env" "memInitBase" i32) (export "_free" $_free) (export "_main" $_main) diff --git a/test/emcc_O2_hello_world.fromasm.imprecise b/test/emcc_O2_hello_world.fromasm.imprecise index 39e95673c..3a518cf6c 100644 --- a/test/emcc_O2_hello_world.fromasm.imprecise +++ b/test/emcc_O2_hello_world.fromasm.imprecise @@ -29,6 +29,7 @@ (import $___syscall140 "env" "___syscall140" (param i32 i32) (result i32)) (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_free" $_free) (export "_main" $_main) (export "_memset" $_memset) diff --git a/test/emcc_O2_hello_world.fromasm.imprecise.no-opts b/test/emcc_O2_hello_world.fromasm.imprecise.no-opts index a5e952b4c..af862279a 100644 --- a/test/emcc_O2_hello_world.fromasm.imprecise.no-opts +++ b/test/emcc_O2_hello_world.fromasm.imprecise.no-opts @@ -29,6 +29,7 @@ (import $___syscall140 "env" "___syscall140" (param i32 i32) (result i32)) (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_free" $_free) (export "_main" $_main) (export "_memset" $_memset) diff --git a/test/emcc_O2_hello_world.fromasm.no-opts b/test/emcc_O2_hello_world.fromasm.no-opts index 303b1e723..634a53659 100644 --- a/test/emcc_O2_hello_world.fromasm.no-opts +++ b/test/emcc_O2_hello_world.fromasm.no-opts @@ -30,6 +30,7 @@ (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_free" $_free) (export "_main" $_main) (export "_memset" $_memset) diff --git a/test/emcc_hello_world.fromasm b/test/emcc_hello_world.fromasm index 666f03482..036619963 100644 --- a/test/emcc_hello_world.fromasm +++ b/test/emcc_hello_world.fromasm @@ -40,6 +40,7 @@ (import $i32u-rem "asm2wasm" "i32u-rem" (param i32 i32) (result i32)) (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (import $memInitBase global "env" "memInitBase" i32) (export "_i64Subtract" $_i64Subtract) (export "_free" $_free) diff --git a/test/emcc_hello_world.fromasm.imprecise b/test/emcc_hello_world.fromasm.imprecise index e30167119..99ae85d71 100644 --- a/test/emcc_hello_world.fromasm.imprecise +++ b/test/emcc_hello_world.fromasm.imprecise @@ -33,6 +33,7 @@ (import $_sysconf "env" "_sysconf" (param i32) (result i32)) (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_i64Subtract" $_i64Subtract) (export "_free" $_free) (export "_main" $_main) diff --git a/test/emcc_hello_world.fromasm.imprecise.no-opts b/test/emcc_hello_world.fromasm.imprecise.no-opts index a0429b58c..b5e740df2 100644 --- a/test/emcc_hello_world.fromasm.imprecise.no-opts +++ b/test/emcc_hello_world.fromasm.imprecise.no-opts @@ -33,6 +33,7 @@ (import $_sysconf "env" "_sysconf" (param i32) (result i32)) (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_i64Subtract" $_i64Subtract) (export "_free" $_free) (export "_main" $_main) diff --git a/test/emcc_hello_world.fromasm.no-opts b/test/emcc_hello_world.fromasm.no-opts index 3c9f8123a..49c0aed22 100644 --- a/test/emcc_hello_world.fromasm.no-opts +++ b/test/emcc_hello_world.fromasm.no-opts @@ -39,6 +39,7 @@ (import $i32u-rem "asm2wasm" "i32u-rem" (param i32 i32) (result i32)) (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_i64Subtract" $_i64Subtract) (export "_free" $_free) (export "_main" $_main) diff --git a/test/empty.fromasm b/test/empty.fromasm index 2dcb800dd..2afc01ebf 100644 --- a/test/empty.fromasm +++ b/test/empty.fromasm @@ -2,5 +2,6 @@ (memory 256 256) (data (get_global $memInitBase) "empty.asm.js") (import $memory memory "env" "memory") + (import $table table "env" "table") (import $memInitBase global "env" "memInitBase" i32) ) diff --git a/test/empty.fromasm.imprecise b/test/empty.fromasm.imprecise index 6c3928ac1..f0a2ff208 100644 --- a/test/empty.fromasm.imprecise +++ b/test/empty.fromasm.imprecise @@ -1,4 +1,5 @@ (module (memory 256 256) (import $memory memory "env" "memory") + (import $table table "env" "table") ) diff --git a/test/empty.fromasm.imprecise.no-opts b/test/empty.fromasm.imprecise.no-opts index 6c3928ac1..f0a2ff208 100644 --- a/test/empty.fromasm.imprecise.no-opts +++ b/test/empty.fromasm.imprecise.no-opts @@ -1,4 +1,5 @@ (module (memory 256 256) (import $memory memory "env" "memory") + (import $table table "env" "table") ) diff --git a/test/empty.fromasm.no-opts b/test/empty.fromasm.no-opts index 6c3928ac1..f0a2ff208 100644 --- a/test/empty.fromasm.no-opts +++ b/test/empty.fromasm.no-opts @@ -1,4 +1,5 @@ (module (memory 256 256) (import $memory memory "env" "memory") + (import $table table "env" "table") ) diff --git a/test/hello_world.fromasm b/test/hello_world.fromasm index cea20a687..64839186a 100644 --- a/test/hello_world.fromasm +++ b/test/hello_world.fromasm @@ -2,6 +2,7 @@ (memory 256 256) (data (get_global $memInitBase) "hello_world.asm.js") (import $memory memory "env" "memory") + (import $table table "env" "table") (import $memInitBase global "env" "memInitBase" i32) (export "add" $add) (func $add (param $0 i32) (param $1 i32) (result i32) diff --git a/test/hello_world.fromasm.imprecise b/test/hello_world.fromasm.imprecise index 0438017ff..90eea0c3b 100644 --- a/test/hello_world.fromasm.imprecise +++ b/test/hello_world.fromasm.imprecise @@ -1,6 +1,7 @@ (module (memory 256 256) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "add" $add) (func $add (param $0 i32) (param $1 i32) (result i32) (i32.add diff --git a/test/hello_world.fromasm.imprecise.no-opts b/test/hello_world.fromasm.imprecise.no-opts index 80e7688e2..deae6ab2a 100644 --- a/test/hello_world.fromasm.imprecise.no-opts +++ b/test/hello_world.fromasm.imprecise.no-opts @@ -1,6 +1,7 @@ (module (memory 256 256) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "add" $add) (func $add (param $x i32) (param $y i32) (result i32) (return diff --git a/test/hello_world.fromasm.no-opts b/test/hello_world.fromasm.no-opts index 80e7688e2..deae6ab2a 100644 --- a/test/hello_world.fromasm.no-opts +++ b/test/hello_world.fromasm.no-opts @@ -1,6 +1,7 @@ (module (memory 256 256) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "add" $add) (func $add (param $x i32) (param $y i32) (result i32) (return diff --git a/test/memorygrowth.fromasm b/test/memorygrowth.fromasm index 390f163bb..ec2f13065 100644 --- a/test/memorygrowth.fromasm +++ b/test/memorygrowth.fromasm @@ -27,6 +27,7 @@ (import $ya "env" "___syscall146" (param i32 i32) (result i32)) (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (import $memInitBase global "env" "memInitBase" i32) (export "_free" $fb) (export "_main" $Na) diff --git a/test/memorygrowth.fromasm.imprecise b/test/memorygrowth.fromasm.imprecise index fb8b5b085..0ade046a3 100644 --- a/test/memorygrowth.fromasm.imprecise +++ b/test/memorygrowth.fromasm.imprecise @@ -25,6 +25,7 @@ (import $xa "env" "___unlock" (param i32)) (import $ya "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_free" $fb) (export "_main" $Na) (export "_pthread_self" $ib) diff --git a/test/memorygrowth.fromasm.imprecise.no-opts b/test/memorygrowth.fromasm.imprecise.no-opts index 6cdc4fd40..e8ec51644 100644 --- a/test/memorygrowth.fromasm.imprecise.no-opts +++ b/test/memorygrowth.fromasm.imprecise.no-opts @@ -25,6 +25,7 @@ (import $xa "env" "___unlock" (param i32)) (import $ya "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_free" $fb) (export "_main" $Na) (export "_pthread_self" $ib) diff --git a/test/memorygrowth.fromasm.no-opts b/test/memorygrowth.fromasm.no-opts index fd1b541d1..a5c292652 100644 --- a/test/memorygrowth.fromasm.no-opts +++ b/test/memorygrowth.fromasm.no-opts @@ -26,6 +26,7 @@ (import $ya "env" "___syscall146" (param i32 i32) (result i32)) (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_free" $fb) (export "_main" $Na) (export "_pthread_self" $ib) diff --git a/test/min.fromasm b/test/min.fromasm index 1a69787ab..907bc572e 100644 --- a/test/min.fromasm +++ b/test/min.fromasm @@ -3,6 +3,7 @@ (data (get_global $memInitBase) "min.asm.js") (import $tDP global "env" "tempDoublePtr" i32) (import $memory memory "env" "memory") + (import $table table "env" "table") (import $memInitBase global "env" "memInitBase" i32) (export "floats" $floats) (func $floats (param $0 f32) (result f32) diff --git a/test/min.fromasm.imprecise b/test/min.fromasm.imprecise index c1703c203..612ed2388 100644 --- a/test/min.fromasm.imprecise +++ b/test/min.fromasm.imprecise @@ -2,6 +2,7 @@ (memory 256 256) (import $tDP global "env" "tempDoublePtr" i32) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "floats" $floats) (func $floats (param $0 f32) (result f32) (local $1 f32) diff --git a/test/min.fromasm.imprecise.no-opts b/test/min.fromasm.imprecise.no-opts index 7ba8db448..00740ad5f 100644 --- a/test/min.fromasm.imprecise.no-opts +++ b/test/min.fromasm.imprecise.no-opts @@ -2,6 +2,7 @@ (memory 256 256) (import $tDP global "env" "tempDoublePtr" i32) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "floats" $floats) (func $floats (param $f f32) (result f32) (local $t f32) diff --git a/test/min.fromasm.no-opts b/test/min.fromasm.no-opts index 7ba8db448..00740ad5f 100644 --- a/test/min.fromasm.no-opts +++ b/test/min.fromasm.no-opts @@ -2,6 +2,7 @@ (memory 256 256) (import $tDP global "env" "tempDoublePtr" i32) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "floats" $floats) (func $floats (param $f f32) (result f32) (local $t f32) diff --git a/test/two_sides.fromasm b/test/two_sides.fromasm index 45649cba6..53831b7ec 100644 --- a/test/two_sides.fromasm +++ b/test/two_sides.fromasm @@ -4,6 +4,7 @@ (type $FUNCSIG$id (func (param f64) (result i32))) (import $f64-to-int "asm2wasm" "f64-to-int" (param f64) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (import $memInitBase global "env" "memInitBase" i32) (export "_test" $_test) (func $_test (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) diff --git a/test/two_sides.fromasm.imprecise b/test/two_sides.fromasm.imprecise index ce7b83d1f..cd13cea64 100644 --- a/test/two_sides.fromasm.imprecise +++ b/test/two_sides.fromasm.imprecise @@ -1,6 +1,7 @@ (module (memory 256 256) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_test" $_test) (func $_test (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) (local $5 f64) diff --git a/test/two_sides.fromasm.imprecise.no-opts b/test/two_sides.fromasm.imprecise.no-opts index 3d27fcef4..cce1e9b62 100644 --- a/test/two_sides.fromasm.imprecise.no-opts +++ b/test/two_sides.fromasm.imprecise.no-opts @@ -1,6 +1,7 @@ (module (memory 256 256) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_test" $_test) (func $_test (param $i1 i32) (param $i2 i32) (param $i3 i32) (param $i4 i32) (param $i5 i32) (result i32) (local $d6 f64) diff --git a/test/two_sides.fromasm.no-opts b/test/two_sides.fromasm.no-opts index 51b871191..a55ccddf1 100644 --- a/test/two_sides.fromasm.no-opts +++ b/test/two_sides.fromasm.no-opts @@ -3,6 +3,7 @@ (type $FUNCSIG$id (func (param f64) (result i32))) (import $f64-to-int "asm2wasm" "f64-to-int" (param f64) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "_test" $_test) (func $_test (param $i1 i32) (param $i2 i32) (param $i3 i32) (param $i4 i32) (param $i5 i32) (result i32) (local $d6 f64) diff --git a/test/unit.fromasm b/test/unit.fromasm index 740c6ff52..1987f990b 100644 --- a/test/unit.fromasm +++ b/test/unit.fromasm @@ -20,6 +20,7 @@ (import $f64-rem "asm2wasm" "f64-rem" (param f64 f64) (result f64)) (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (import $memInitBase global "env" "memInitBase" i32) (export "big_negative" $big_negative) (export "pick" $big_negative) diff --git a/test/unit.fromasm.imprecise b/test/unit.fromasm.imprecise index e9d6e4300..3bd3d6881 100644 --- a/test/unit.fromasm.imprecise +++ b/test/unit.fromasm.imprecise @@ -15,6 +15,7 @@ (import $h "env" "h" (param i32)) (import $f64-rem "asm2wasm" "f64-rem" (param f64 f64) (result f64)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "big_negative" $big_negative) (export "pick" $big_negative) (global $Int i32 (i32.const 0)) diff --git a/test/unit.fromasm.imprecise.no-opts b/test/unit.fromasm.imprecise.no-opts index ec758bf32..afacf0794 100644 --- a/test/unit.fromasm.imprecise.no-opts +++ b/test/unit.fromasm.imprecise.no-opts @@ -15,6 +15,7 @@ (import $h "env" "h" (param i32)) (import $f64-rem "asm2wasm" "f64-rem" (param f64 f64) (result f64)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "big_negative" $big_negative) (export "pick" $exportMe) (global $Int i32 (i32.const 0)) diff --git a/test/unit.fromasm.no-opts b/test/unit.fromasm.no-opts index 546fcd7fc..165b9df50 100644 --- a/test/unit.fromasm.no-opts +++ b/test/unit.fromasm.no-opts @@ -19,6 +19,7 @@ (import $f64-rem "asm2wasm" "f64-rem" (param f64 f64) (result f64)) (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") + (import $table table "env" "table") (export "big_negative" $big_negative) (export "pick" $exportMe) (global $Int i32 (i32.const 0)) |