diff options
author | Alon Zakai <azakai@google.com> | 2019-09-05 18:12:26 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-05 18:12:26 -0700 |
commit | a0c77bf09dc561f9857bd44167fb04d571e3036a (patch) | |
tree | 26b5469f15742609b7ad7691c11b93f2f0416a55 | |
parent | 3ac5416a6b070096fcd26c94fcdb7c0c144c72b4 (diff) | |
download | binaryen-a0c77bf09dc561f9857bd44167fb04d571e3036a.tar.gz binaryen-a0c77bf09dc561f9857bd44167fb04d571e3036a.tar.bz2 binaryen-a0c77bf09dc561f9857bd44167fb04d571e3036a.zip |
[wasm2js] Fix memory.size (#2330)
We emitted the __wasm_memory_size function only when memory growth was enabled, but it can be used without that too.
In theory we could only emit it if either memory growth or memory.size is used, but I think we can expect JS minifiers to do that later.
Also fix a test suite bug - the check/auto_update script didn't run all the wasm2js tests when you run it with argument wasm2js (it used that as the list of tests, instead of the list of files, which confused me here for a while...).
-rwxr-xr-x | scripts/test/wasm2js.py | 4 | ||||
-rw-r--r-- | src/wasm2js.h | 30 | ||||
-rw-r--r-- | test/wasm2js/address.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/atomic_fence.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/dynamicLibrary.2asm.js | 4 | ||||
-rw-r--r-- | test/wasm2js/dynamicLibrary.2asm.js.opt | 4 | ||||
-rw-r--r-- | test/wasm2js/emscripten-grow-no.2asm.js | 4 | ||||
-rw-r--r-- | test/wasm2js/emscripten-grow-no.2asm.js.opt | 4 | ||||
-rw-r--r-- | test/wasm2js/emscripten-grow-yes.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/emscripten-grow-yes.2asm.js.opt | 8 | ||||
-rw-r--r-- | test/wasm2js/emscripten.2asm.js | 4 | ||||
-rw-r--r-- | test/wasm2js/emscripten.2asm.js.opt | 4 | ||||
-rw-r--r-- | test/wasm2js/endianness.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/grow-memory-tricky.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/grow-memory-tricky.2asm.js.opt | 8 | ||||
-rw-r--r-- | test/wasm2js/grow_memory.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/left-to-right.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/traps.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/unaligned.2asm.js | 4 | ||||
-rw-r--r-- | test/wasm2js/unaligned.2asm.js.opt | 4 |
20 files changed, 93 insertions, 53 deletions
diff --git a/scripts/test/wasm2js.py b/scripts/test/wasm2js.py index 3cb766bcd..24c14680d 100755 --- a/scripts/test/wasm2js.py +++ b/scripts/test/wasm2js.py @@ -18,11 +18,11 @@ import os 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/src/wasm2js.h b/src/wasm2js.h index 95ba2e154..86af511fb 100644 --- a/src/wasm2js.h +++ b/src/wasm2js.h @@ -255,6 +255,7 @@ private: 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 c811a1a2e..d0b9e4a2a 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 7089fd9b4..bf40601bc 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 51a3aaba1..98332dead 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 862c1992a..61669987f 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 895a54fc2..92a99dfb7 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 895a54fc2..92a99dfb7 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 15363502e..0f29bccde 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 15363502e..0f29bccde 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 a32f3edd6..fd9cbc607 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 2aa92c316..5dcef5bce 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 418d41b77..866d70005 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 55b51c181..3cf1bb4be 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 46b7bea25..a2377b4c5 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/grow_memory.2asm.js b/test/wasm2js/grow_memory.2asm.js index b9bead794..675ee76e2 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": { diff --git a/test/wasm2js/left-to-right.2asm.js b/test/wasm2js/left-to-right.2asm.js index e8893ae52..2e474002b 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 e9e5a0658..5ca7284d7 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 ed595d2c7..be3163d17 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 ca59ff5ff..b8df22fe5 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, |