From 5354347b212c5fb6146476b48019f7fefa251003 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 4 Sep 2019 13:24:02 -0700 Subject: [PATCH 1/2] [wasm2js] Emit __wasm_memory_size() all the time, and not just in memory growth, since it is used by memory.grow() for example --- src/wasm2js.h | 30 +++++++++++++------- test/wasm2js/address.2asm.js | 8 +++--- test/wasm2js/atomic_fence.2asm.js | 8 +++--- test/wasm2js/dynamicLibrary.2asm.js | 4 +++ test/wasm2js/dynamicLibrary.2asm.js.opt | 4 +++ test/wasm2js/emscripten-grow-no.2asm.js | 4 +++ test/wasm2js/emscripten-grow-no.2asm.js.opt | 4 +++ test/wasm2js/emscripten-grow-yes.2asm.js | 8 +++--- test/wasm2js/emscripten-grow-yes.2asm.js.opt | 8 +++--- test/wasm2js/emscripten.2asm.js | 4 +++ test/wasm2js/emscripten.2asm.js.opt | 4 +++ test/wasm2js/endianness.2asm.js | 8 +++--- test/wasm2js/grow-memory-tricky.2asm.js | 8 +++--- test/wasm2js/grow-memory-tricky.2asm.js.opt | 8 +++--- test/wasm2js/left-to-right.2asm.js | 8 +++--- test/wasm2js/traps.2asm.js | 8 +++--- test/wasm2js/unaligned.2asm.js | 4 +++ test/wasm2js/unaligned.2asm.js.opt | 4 +++ 18 files changed, 87 insertions(+), 47 deletions(-) diff --git a/src/wasm2js.h b/src/wasm2js.h index 95ba2e1546e..86af511fb1e 100644 --- a/src/wasm2js.h +++ b/src/wasm2js.h @@ -255,6 +255,7 @@ class Wasm2JSBuilder { void addTable(Ref ast, Module* wasm); void addExports(Ref ast, Module* wasm); void addGlobal(Ref ast, Global* global); + void addMemoryFuncs(Ref ast, Module* wasm); void addMemoryGrowthFuncs(Ref ast, Module* wasm); Wasm2JSBuilder() = delete; @@ -608,8 +609,8 @@ void Wasm2JSBuilder::addExports(Ref ast, Module* wasm) { exports, fromName(export_->name, NameScope::Top), memory); } } - if (wasm->memory.exists && wasm->memory.max > wasm->memory.initial) { - addMemoryGrowthFuncs(ast, wasm); + if (wasm->memory.exists) { + addMemoryFuncs(ast, wasm); } ast->push_back( ValueBuilder::makeStatement(ValueBuilder::makeReturn(exports))); @@ -1900,6 +1901,22 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, return ExpressionProcessor(this, m, func, standaloneFunction).process(); } +void Wasm2JSBuilder::addMemoryFuncs(Ref ast, Module* wasm) { + Ref memorySizeFunc = ValueBuilder::makeFunction(WASM_MEMORY_SIZE); + memorySizeFunc[3]->push_back(ValueBuilder::makeReturn( + makeAsmCoercion(ValueBuilder::makeBinary( + ValueBuilder::makeDot(ValueBuilder::makeName(BUFFER), + IString("byteLength")), + DIV, + ValueBuilder::makeInt(Memory::kPageSize)), + AsmType::ASM_INT))); + ast->push_back(memorySizeFunc); + + if (wasm->memory.max > wasm->memory.initial) { + addMemoryGrowthFuncs(ast, wasm); + } +} + void Wasm2JSBuilder::addMemoryGrowthFuncs(Ref ast, Module* wasm) { Ref memoryGrowFunc = ValueBuilder::makeFunction(WASM_MEMORY_GROW); ValueBuilder::appendArgumentToFunction(memoryGrowFunc, IString("pagesToAdd")); @@ -2016,16 +2033,7 @@ void Wasm2JSBuilder::addMemoryGrowthFuncs(Ref ast, Module* wasm) { memoryGrowFunc[3]->push_back( ValueBuilder::makeReturn(ValueBuilder::makeName(IString("oldPages")))); - Ref memorySizeFunc = ValueBuilder::makeFunction(WASM_MEMORY_SIZE); - memorySizeFunc[3]->push_back(ValueBuilder::makeReturn( - makeAsmCoercion(ValueBuilder::makeBinary( - ValueBuilder::makeDot(ValueBuilder::makeName(BUFFER), - IString("byteLength")), - DIV, - ValueBuilder::makeInt(Memory::kPageSize)), - AsmType::ASM_INT))); ast->push_back(memoryGrowFunc); - ast->push_back(memorySizeFunc); } // Wasm2JSGlue emits the core of the module - the functions etc. that would diff --git a/test/wasm2js/address.2asm.js b/test/wasm2js/address.2asm.js index c811a1a2ec5..d0b9e4a2aa2 100644 --- a/test/wasm2js/address.2asm.js +++ b/test/wasm2js/address.2asm.js @@ -45,6 +45,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -67,10 +71,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "good": $0, "bad": $1 diff --git a/test/wasm2js/atomic_fence.2asm.js b/test/wasm2js/atomic_fence.2asm.js index 7089fd9b494..bf40601bcd5 100644 --- a/test/wasm2js/atomic_fence.2asm.js +++ b/test/wasm2js/atomic_fence.2asm.js @@ -25,6 +25,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -47,10 +51,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "atomic_fence": $0 }; diff --git a/test/wasm2js/dynamicLibrary.2asm.js b/test/wasm2js/dynamicLibrary.2asm.js index 51a3aaba1b1..98332dead19 100644 --- a/test/wasm2js/dynamicLibrary.2asm.js +++ b/test/wasm2js/dynamicLibrary.2asm.js @@ -40,6 +40,10 @@ function asmFunc(global, env, buffer) { var FUNCTION_TABLE = []; FUNCTION_TABLE[import$tableBase + 0] = foo; FUNCTION_TABLE[import$tableBase + 1] = bar; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + return { "baz": baz }; diff --git a/test/wasm2js/dynamicLibrary.2asm.js.opt b/test/wasm2js/dynamicLibrary.2asm.js.opt index 862c1992a78..61669987f91 100644 --- a/test/wasm2js/dynamicLibrary.2asm.js.opt +++ b/test/wasm2js/dynamicLibrary.2asm.js.opt @@ -32,6 +32,10 @@ function asmFunc(global, env, buffer) { var FUNCTION_TABLE = []; FUNCTION_TABLE[import$tableBase + 0] = foo; FUNCTION_TABLE[import$tableBase + 1] = foo; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + return { "baz": foo }; diff --git a/test/wasm2js/emscripten-grow-no.2asm.js b/test/wasm2js/emscripten-grow-no.2asm.js index 895a54fc23d..92a99dfb7b3 100644 --- a/test/wasm2js/emscripten-grow-no.2asm.js +++ b/test/wasm2js/emscripten-grow-no.2asm.js @@ -25,6 +25,10 @@ function asmFunc(global, env, buffer) { // EMSCRIPTEN_START_FUNCS; // EMSCRIPTEN_END_FUNCS; var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + return { "memory": Object.create(Object.prototype, { "grow": { diff --git a/test/wasm2js/emscripten-grow-no.2asm.js.opt b/test/wasm2js/emscripten-grow-no.2asm.js.opt index 895a54fc23d..92a99dfb7b3 100644 --- a/test/wasm2js/emscripten-grow-no.2asm.js.opt +++ b/test/wasm2js/emscripten-grow-no.2asm.js.opt @@ -25,6 +25,10 @@ function asmFunc(global, env, buffer) { // EMSCRIPTEN_START_FUNCS; // EMSCRIPTEN_END_FUNCS; var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + return { "memory": Object.create(Object.prototype, { "grow": { diff --git a/test/wasm2js/emscripten-grow-yes.2asm.js b/test/wasm2js/emscripten-grow-yes.2asm.js index 15363502eff..0f29bccde3c 100644 --- a/test/wasm2js/emscripten-grow-yes.2asm.js +++ b/test/wasm2js/emscripten-grow-yes.2asm.js @@ -25,6 +25,10 @@ function asmFunc(global, env, buffer) { // EMSCRIPTEN_START_FUNCS; // EMSCRIPTEN_END_FUNCS; var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -48,10 +52,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "memory": Object.create(Object.prototype, { "grow": { diff --git a/test/wasm2js/emscripten-grow-yes.2asm.js.opt b/test/wasm2js/emscripten-grow-yes.2asm.js.opt index 15363502eff..0f29bccde3c 100644 --- a/test/wasm2js/emscripten-grow-yes.2asm.js.opt +++ b/test/wasm2js/emscripten-grow-yes.2asm.js.opt @@ -25,6 +25,10 @@ function asmFunc(global, env, buffer) { // EMSCRIPTEN_START_FUNCS; // EMSCRIPTEN_END_FUNCS; var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -48,10 +52,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "memory": Object.create(Object.prototype, { "grow": { diff --git a/test/wasm2js/emscripten.2asm.js b/test/wasm2js/emscripten.2asm.js index a32f3edd6bb..fd9cbc607ba 100644 --- a/test/wasm2js/emscripten.2asm.js +++ b/test/wasm2js/emscripten.2asm.js @@ -187,6 +187,10 @@ function asmFunc(global, env, buffer) { FUNCTION_TABLE[1] = foo; FUNCTION_TABLE[2] = bar; FUNCTION_TABLE[3] = tabled; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + return { "main": main, "other": other, diff --git a/test/wasm2js/emscripten.2asm.js.opt b/test/wasm2js/emscripten.2asm.js.opt index 2aa92c3165a..5dcef5bce8e 100644 --- a/test/wasm2js/emscripten.2asm.js.opt +++ b/test/wasm2js/emscripten.2asm.js.opt @@ -168,6 +168,10 @@ function asmFunc(global, env, buffer) { FUNCTION_TABLE[1] = foo; FUNCTION_TABLE[2] = bar; FUNCTION_TABLE[3] = internal; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + return { "main": main, "other": other, diff --git a/test/wasm2js/endianness.2asm.js b/test/wasm2js/endianness.2asm.js index 418d41b776b..866d7000559 100644 --- a/test/wasm2js/endianness.2asm.js +++ b/test/wasm2js/endianness.2asm.js @@ -650,6 +650,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -672,10 +676,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "i32_load16_s": $6, "i32_load16_u": $7, diff --git a/test/wasm2js/grow-memory-tricky.2asm.js b/test/wasm2js/grow-memory-tricky.2asm.js index 55b51c18116..3cf1bb4bef1 100644 --- a/test/wasm2js/grow-memory-tricky.2asm.js +++ b/test/wasm2js/grow-memory-tricky.2asm.js @@ -37,6 +37,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -59,10 +63,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "memory": Object.create(Object.prototype, { "grow": { diff --git a/test/wasm2js/grow-memory-tricky.2asm.js.opt b/test/wasm2js/grow-memory-tricky.2asm.js.opt index 46b7bea25bf..a2377b4c587 100644 --- a/test/wasm2js/grow-memory-tricky.2asm.js.opt +++ b/test/wasm2js/grow-memory-tricky.2asm.js.opt @@ -27,6 +27,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -49,10 +53,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "memory": Object.create(Object.prototype, { "grow": { diff --git a/test/wasm2js/left-to-right.2asm.js b/test/wasm2js/left-to-right.2asm.js index e8893ae52bf..2e474002b5a 100644 --- a/test/wasm2js/left-to-right.2asm.js +++ b/test/wasm2js/left-to-right.2asm.js @@ -2090,6 +2090,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = [i32_t0, i32_t1, i64_t0, i64_t1, f32_t0, f32_t1, f64_t0, f64_t1]; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -2112,10 +2116,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "i32_add": $35, "i32_sub": $36, diff --git a/test/wasm2js/traps.2asm.js b/test/wasm2js/traps.2asm.js index e9e5a065876..5ca7284d7c9 100644 --- a/test/wasm2js/traps.2asm.js +++ b/test/wasm2js/traps.2asm.js @@ -1969,6 +1969,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -1991,10 +1995,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "no_dce_i32_load": $0, "no_dce_i64_load": legalstub$1, diff --git a/test/wasm2js/unaligned.2asm.js b/test/wasm2js/unaligned.2asm.js index ed595d2c7a4..be3163d17eb 100644 --- a/test/wasm2js/unaligned.2asm.js +++ b/test/wasm2js/unaligned.2asm.js @@ -158,6 +158,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + return { "i32_load": $0, "i64_load": legalstub$1, diff --git a/test/wasm2js/unaligned.2asm.js.opt b/test/wasm2js/unaligned.2asm.js.opt index ca59ff5ff70..b8df22fe5b6 100644 --- a/test/wasm2js/unaligned.2asm.js.opt +++ b/test/wasm2js/unaligned.2asm.js.opt @@ -111,6 +111,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + return { "i32_load": $0, "i64_load": legalstub$1, From 8a227d1dbc6829e4565632260c6e3f679cb083e2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 4 Sep 2019 17:44:30 -0700 Subject: [PATCH 2/2] fix bug --- scripts/test/wasm2js.py | 4 ++-- test/wasm2js/grow_memory.2asm.js | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/test/wasm2js.py b/scripts/test/wasm2js.py index 3cb766bcd2e..24c14680d92 100755 --- a/scripts/test/wasm2js.py +++ b/scripts/test/wasm2js.py @@ -18,11 +18,11 @@ from .support import run_command, split_wast, write_wast from .shared import ( - WASM2JS, MOZJS, NODEJS, fail_if_not_identical, options, tests, + WASM2JS, MOZJS, NODEJS, fail_if_not_identical, options, fail_if_not_identical_to_file, with_pass_debug ) -# tests with i64s, invokes, etc. +tests = sorted(os.listdir(os.path.join(options.binaryen_test))) spec_dir = os.path.join(options.binaryen_test, 'spec') spec_tests = [os.path.join(spec_dir, t) for t in sorted(os.listdir(spec_dir)) diff --git a/test/wasm2js/grow_memory.2asm.js b/test/wasm2js/grow_memory.2asm.js index b9bead794fa..675ee76e2b2 100644 --- a/test/wasm2js/grow_memory.2asm.js +++ b/test/wasm2js/grow_memory.2asm.js @@ -30,6 +30,10 @@ function asmFunc(global, env, buffer) { } var FUNCTION_TABLE = []; + function __wasm_memory_size() { + return buffer.byteLength / 65536 | 0; + } + function __wasm_memory_grow(pagesToAdd) { pagesToAdd = pagesToAdd | 0; var oldPages = __wasm_memory_size() | 0; @@ -52,10 +56,6 @@ function asmFunc(global, env, buffer) { return oldPages; } - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - return { "memory": Object.create(Object.prototype, { "grow": {