diff options
35 files changed, 101 insertions, 27 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h index e27c5d9e2..0cb9b8dbe 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -840,6 +840,29 @@ void Asm2WasmBuilder::processAsm(Ref ast) { tableImport->base = TABLE; tableImport->kind = Import::Table; wasm.addImport(tableImport.release()); + + // Import memory offset + { + auto* import = new Import; + import->name = Name("memoryBase"); + import->module = Name("env"); + import->base = Name("memoryBase"); + import->kind = Import::Global; + import->globalType = i32; + wasm.addImport(import); + } + + // Import table offset + { + auto* import = new Import; + import->name = Name("tableBase"); + import->module = Name("env"); + import->base = Name("tableBase"); + import->kind = Import::Global; + import->globalType = i32; + wasm.addImport(import); + } + #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 d691c22f2..1c5e6b0b1 100644 --- a/src/js/wasm.js-post.js +++ b/src/js/wasm.js-post.js @@ -212,8 +212,11 @@ function integrateWasmJS(Module) { info.global = global; info.env = env; - if (!('memInitBase' in env)) { - env['memInitBase'] = STATIC_BASE; // tell the memory segments where to place themselves + if (!('memoryBase' in env)) { + env['memoryBase'] = STATIC_BASE; // tell the memory segments where to place themselves + } + if (!('tableBase' in env)) { + env['tableBase'] = 0; // tell the memory segments where to place themselves } wasmJS['providedTotalMemory'] = Module['buffer'].byteLength; diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp index af2cf6f5a..031b1fd23 100644 --- a/src/tools/asm2wasm.cpp +++ b/src/tools/asm2wasm.cpp @@ -101,16 +101,8 @@ int main(int argc, const char *argv[]) { if (memInit != options.extra.end()) { auto filename = memInit->second.c_str(); auto data(read_file<std::vector<char>>(filename, Flags::Binary, options.debug ? Flags::Debug : Flags::Release)); - // the mem init's base is imported - auto* import = new Import; - import->name = Name("memInitBase"); - import->module = Name("env"); - import->base = Name("memInitBase"); - import->kind = Import::Global; - import->globalType = i32; - wasm.addImport(import); // create the memory segment - wasm.memory.segments.emplace_back(Builder(wasm).makeGetGlobal(import->name, import->globalType), data); + wasm.memory.segments.emplace_back(Builder(wasm).makeGetGlobal(Name("memoryBase"), i32), data); } if (options.debug) std::cerr << "printing..." << std::endl; diff --git a/test/emcc_O2_hello_world.fromasm b/test/emcc_O2_hello_world.fromasm index fbf527eb4..72023d55c 100644 --- a/test/emcc_O2_hello_world.fromasm +++ b/test/emcc_O2_hello_world.fromasm @@ -1,6 +1,6 @@ (module (memory 256 256) - (data (get_global $memInitBase) "emcc_O2_hello_world.asm.js") + (data (get_global $memoryBase) "emcc_O2_hello_world.asm.js") (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32))) (type $FUNCSIG$iii (func (param i32 i32) (result i32))) (type $FUNCSIG$ii (func (param i32) (result i32))) @@ -32,7 +32,8 @@ (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) + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "_free" $_free) (export "_main" $_main) (export "_memset" $_memset) diff --git a/test/emcc_O2_hello_world.fromasm.imprecise b/test/emcc_O2_hello_world.fromasm.imprecise index 3a518cf6c..691e60f0a 100644 --- a/test/emcc_O2_hello_world.fromasm.imprecise +++ b/test/emcc_O2_hello_world.fromasm.imprecise @@ -30,6 +30,8 @@ (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 af862279a..6eaa96fd7 100644 --- a/test/emcc_O2_hello_world.fromasm.imprecise.no-opts +++ b/test/emcc_O2_hello_world.fromasm.imprecise.no-opts @@ -30,6 +30,8 @@ (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 634a53659..189de5e62 100644 --- a/test/emcc_O2_hello_world.fromasm.no-opts +++ b/test/emcc_O2_hello_world.fromasm.no-opts @@ -31,6 +31,8 @@ (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "_free" $_free) (export "_main" $_main) (export "_memset" $_memset) diff --git a/test/emcc_hello_world.fromasm b/test/emcc_hello_world.fromasm index 036619963..49f2c0080 100644 --- a/test/emcc_hello_world.fromasm +++ b/test/emcc_hello_world.fromasm @@ -1,6 +1,6 @@ (module (memory 256 256) - (data (get_global $memInitBase) "emcc_hello_world.asm.js") + (data (get_global $memoryBase) "emcc_hello_world.asm.js") (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32))) (type $FUNCSIG$id (func (param f64) (result i32))) (type $FUNCSIG$iii (func (param i32 i32) (result i32))) @@ -41,7 +41,8 @@ (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) + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "_i64Subtract" $_i64Subtract) (export "_free" $_free) (export "_main" $_main) diff --git a/test/emcc_hello_world.fromasm.imprecise b/test/emcc_hello_world.fromasm.imprecise index 99ae85d71..0cf544e09 100644 --- a/test/emcc_hello_world.fromasm.imprecise +++ b/test/emcc_hello_world.fromasm.imprecise @@ -34,6 +34,8 @@ (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 b5e740df2..339580ad7 100644 --- a/test/emcc_hello_world.fromasm.imprecise.no-opts +++ b/test/emcc_hello_world.fromasm.imprecise.no-opts @@ -34,6 +34,8 @@ (import $___syscall146 "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 49c0aed22..98f57b812 100644 --- a/test/emcc_hello_world.fromasm.no-opts +++ b/test/emcc_hello_world.fromasm.no-opts @@ -40,6 +40,8 @@ (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "_i64Subtract" $_i64Subtract) (export "_free" $_free) (export "_main" $_main) diff --git a/test/empty.fromasm b/test/empty.fromasm index 2afc01ebf..b68429ccf 100644 --- a/test/empty.fromasm +++ b/test/empty.fromasm @@ -1,7 +1,8 @@ (module (memory 256 256) - (data (get_global $memInitBase) "empty.asm.js") + (data (get_global $memoryBase) "empty.asm.js") (import $memory memory "env" "memory") (import $table table "env" "table") - (import $memInitBase global "env" "memInitBase" i32) + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) ) diff --git a/test/empty.fromasm.imprecise b/test/empty.fromasm.imprecise index f0a2ff208..2042278ee 100644 --- a/test/empty.fromasm.imprecise +++ b/test/empty.fromasm.imprecise @@ -2,4 +2,6 @@ (memory 256 256) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) ) diff --git a/test/empty.fromasm.imprecise.no-opts b/test/empty.fromasm.imprecise.no-opts index f0a2ff208..2042278ee 100644 --- a/test/empty.fromasm.imprecise.no-opts +++ b/test/empty.fromasm.imprecise.no-opts @@ -2,4 +2,6 @@ (memory 256 256) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) ) diff --git a/test/empty.fromasm.no-opts b/test/empty.fromasm.no-opts index f0a2ff208..2042278ee 100644 --- a/test/empty.fromasm.no-opts +++ b/test/empty.fromasm.no-opts @@ -2,4 +2,6 @@ (memory 256 256) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) ) diff --git a/test/hello_world.fromasm b/test/hello_world.fromasm index 64839186a..1706d2a2b 100644 --- a/test/hello_world.fromasm +++ b/test/hello_world.fromasm @@ -1,9 +1,10 @@ (module (memory 256 256) - (data (get_global $memInitBase) "hello_world.asm.js") + (data (get_global $memoryBase) "hello_world.asm.js") (import $memory memory "env" "memory") (import $table table "env" "table") - (import $memInitBase global "env" "memInitBase" i32) + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "add" $add) (func $add (param $0 i32) (param $1 i32) (result i32) (i32.add diff --git a/test/hello_world.fromasm.imprecise b/test/hello_world.fromasm.imprecise index 90eea0c3b..c69686d27 100644 --- a/test/hello_world.fromasm.imprecise +++ b/test/hello_world.fromasm.imprecise @@ -2,6 +2,8 @@ (memory 256 256) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 deae6ab2a..1bd263d54 100644 --- a/test/hello_world.fromasm.imprecise.no-opts +++ b/test/hello_world.fromasm.imprecise.no-opts @@ -2,6 +2,8 @@ (memory 256 256) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 deae6ab2a..1bd263d54 100644 --- a/test/hello_world.fromasm.no-opts +++ b/test/hello_world.fromasm.no-opts @@ -2,6 +2,8 @@ (memory 256 256) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 ec2f13065..eaec42b73 100644 --- a/test/memorygrowth.fromasm +++ b/test/memorygrowth.fromasm @@ -1,6 +1,6 @@ (module (memory 256 256) - (data (get_global $memInitBase) "memorygrowth.asm.js") + (data (get_global $memoryBase) "memorygrowth.asm.js") (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32))) (type $FUNCSIG$iii (func (param i32 i32) (result i32))) (type $FUNCSIG$ii (func (param i32) (result i32))) @@ -28,7 +28,8 @@ (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) + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "_free" $fb) (export "_main" $Na) (export "_pthread_self" $ib) diff --git a/test/memorygrowth.fromasm.imprecise b/test/memorygrowth.fromasm.imprecise index 0ade046a3..68912b28b 100644 --- a/test/memorygrowth.fromasm.imprecise +++ b/test/memorygrowth.fromasm.imprecise @@ -26,6 +26,8 @@ (import $ya "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 e8ec51644..ac5e13f93 100644 --- a/test/memorygrowth.fromasm.imprecise.no-opts +++ b/test/memorygrowth.fromasm.imprecise.no-opts @@ -26,6 +26,8 @@ (import $ya "env" "___syscall146" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 a5c292652..4c91ef8eb 100644 --- a/test/memorygrowth.fromasm.no-opts +++ b/test/memorygrowth.fromasm.no-opts @@ -27,6 +27,8 @@ (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "_free" $fb) (export "_main" $Na) (export "_pthread_self" $ib) diff --git a/test/min.fromasm b/test/min.fromasm index 907bc572e..9250c1693 100644 --- a/test/min.fromasm +++ b/test/min.fromasm @@ -1,10 +1,11 @@ (module (memory 256 256) - (data (get_global $memInitBase) "min.asm.js") + (data (get_global $memoryBase) "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) + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "floats" $floats) (func $floats (param $0 f32) (result f32) (local $1 f32) diff --git a/test/min.fromasm.imprecise b/test/min.fromasm.imprecise index 612ed2388..9d0edd356 100644 --- a/test/min.fromasm.imprecise +++ b/test/min.fromasm.imprecise @@ -3,6 +3,8 @@ (import $tDP global "env" "tempDoublePtr" i32) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 00740ad5f..31828a21a 100644 --- a/test/min.fromasm.imprecise.no-opts +++ b/test/min.fromasm.imprecise.no-opts @@ -3,6 +3,8 @@ (import $tDP global "env" "tempDoublePtr" i32) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 00740ad5f..31828a21a 100644 --- a/test/min.fromasm.no-opts +++ b/test/min.fromasm.no-opts @@ -3,6 +3,8 @@ (import $tDP global "env" "tempDoublePtr" i32) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 53831b7ec..c567116ae 100644 --- a/test/two_sides.fromasm +++ b/test/two_sides.fromasm @@ -1,11 +1,12 @@ (module (memory 256 256) - (data (get_global $memInitBase) "two_sides.asm.js") + (data (get_global $memoryBase) "two_sides.asm.js") (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) + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 b/test/two_sides.fromasm.imprecise index cd13cea64..fbd3799c4 100644 --- a/test/two_sides.fromasm.imprecise +++ b/test/two_sides.fromasm.imprecise @@ -2,6 +2,8 @@ (memory 256 256) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 cce1e9b62..550d747dc 100644 --- a/test/two_sides.fromasm.imprecise.no-opts +++ b/test/two_sides.fromasm.imprecise.no-opts @@ -2,6 +2,8 @@ (memory 256 256) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 a55ccddf1..4123ec856 100644 --- a/test/two_sides.fromasm.no-opts +++ b/test/two_sides.fromasm.no-opts @@ -4,6 +4,8 @@ (import $f64-to-int "asm2wasm" "f64-to-int" (param f64) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 1987f990b..0260adb81 100644 --- a/test/unit.fromasm +++ b/test/unit.fromasm @@ -1,6 +1,6 @@ (module (memory 256 256) - (data (get_global $memInitBase) "unit.asm.js") + (data (get_global $memoryBase) "unit.asm.js") (type $FUNCSIG$id (func (param f64) (result i32))) (type $FUNCSIG$ddd (func (param f64 f64) (result f64))) (type $FUNCSIG$iii (func (param i32 i32) (result i32))) @@ -21,7 +21,8 @@ (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) + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "big_negative" $big_negative) (export "pick" $big_negative) (global $Int i32 (i32.const 0)) diff --git a/test/unit.fromasm.imprecise b/test/unit.fromasm.imprecise index 3bd3d6881..5ebe88c6f 100644 --- a/test/unit.fromasm.imprecise +++ b/test/unit.fromasm.imprecise @@ -16,6 +16,8 @@ (import $f64-rem "asm2wasm" "f64-rem" (param f64 f64) (result f64)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 afacf0794..7fdd01aaa 100644 --- a/test/unit.fromasm.imprecise.no-opts +++ b/test/unit.fromasm.imprecise.no-opts @@ -16,6 +16,8 @@ (import $f64-rem "asm2wasm" "f64-rem" (param f64 f64) (result f64)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (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 165b9df50..14c4d6615 100644 --- a/test/unit.fromasm.no-opts +++ b/test/unit.fromasm.no-opts @@ -20,6 +20,8 @@ (import $i32u-div "asm2wasm" "i32u-div" (param i32 i32) (result i32)) (import $memory memory "env" "memory") (import $table table "env" "table") + (import $memoryBase global "env" "memoryBase" i32) + (import $tableBase global "env" "tableBase" i32) (export "big_negative" $big_negative) (export "pick" $exportMe) (global $Int i32 (i32.const 0)) |