summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2019-09-05 18:12:26 -0700
committerGitHub <noreply@github.com>2019-09-05 18:12:26 -0700
commita0c77bf09dc561f9857bd44167fb04d571e3036a (patch)
tree26b5469f15742609b7ad7691c11b93f2f0416a55
parent3ac5416a6b070096fcd26c94fcdb7c0c144c72b4 (diff)
downloadbinaryen-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-xscripts/test/wasm2js.py4
-rw-r--r--src/wasm2js.h30
-rw-r--r--test/wasm2js/address.2asm.js8
-rw-r--r--test/wasm2js/atomic_fence.2asm.js8
-rw-r--r--test/wasm2js/dynamicLibrary.2asm.js4
-rw-r--r--test/wasm2js/dynamicLibrary.2asm.js.opt4
-rw-r--r--test/wasm2js/emscripten-grow-no.2asm.js4
-rw-r--r--test/wasm2js/emscripten-grow-no.2asm.js.opt4
-rw-r--r--test/wasm2js/emscripten-grow-yes.2asm.js8
-rw-r--r--test/wasm2js/emscripten-grow-yes.2asm.js.opt8
-rw-r--r--test/wasm2js/emscripten.2asm.js4
-rw-r--r--test/wasm2js/emscripten.2asm.js.opt4
-rw-r--r--test/wasm2js/endianness.2asm.js8
-rw-r--r--test/wasm2js/grow-memory-tricky.2asm.js8
-rw-r--r--test/wasm2js/grow-memory-tricky.2asm.js.opt8
-rw-r--r--test/wasm2js/grow_memory.2asm.js8
-rw-r--r--test/wasm2js/left-to-right.2asm.js8
-rw-r--r--test/wasm2js/traps.2asm.js8
-rw-r--r--test/wasm2js/unaligned.2asm.js4
-rw-r--r--test/wasm2js/unaligned.2asm.js.opt4
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,