summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm2js.h61
-rw-r--r--test/wasm2js/address.2asm.js4
-rw-r--r--test/wasm2js/endianness.2asm.js6
-rw-r--r--test/wasm2js/grow-memory-tricky.2asm.js4
-rw-r--r--test/wasm2js/i64.2asm.js2
-rw-r--r--test/wasm2js/left-to-right.2asm.js4
6 files changed, 50 insertions, 31 deletions
diff --git a/src/wasm2js.h b/src/wasm2js.h
index 518a8037b..fde436722 100644
--- a/src/wasm2js.h
+++ b/src/wasm2js.h
@@ -35,6 +35,7 @@
#include "mixed_arena.h"
#include "asm_v_wasm.h"
#include "ir/import-utils.h"
+#include "ir/load-utils.h"
#include "ir/module-utils.h"
#include "ir/names.h"
#include "ir/utils.h"
@@ -275,6 +276,7 @@ private:
void addEsmExportsAndInstantiate(Ref ast, Module* wasm, Name funcName);
void addBasics(Ref ast);
void addFunctionImport(Ref ast, Function* import);
+ void addGlobalImport(Ref ast, Global* import);
void addTables(Ref ast, Module* wasm);
void addExports(Ref ast, Module* wasm);
void addGlobal(Ref ast, Global* global);
@@ -347,7 +349,7 @@ Ref Wasm2JSBuilder::processWasm(Module* wasm, Name funcName) {
addFunctionImport(asmFunc[3], import);
});
ModuleUtils::iterImportedGlobals(*wasm, [&](Global* import) {
- addGlobal(asmFunc[3], import);
+ addGlobalImport(asmFunc[3], import);
});
// figure out the table size
tableSize = std::accumulate(wasm->table.segments.begin(),
@@ -408,33 +410,37 @@ Ref Wasm2JSBuilder::processWasm(Module* wasm, Name funcName) {
}
void Wasm2JSBuilder::addEsmImports(Ref ast, Module* wasm) {
- std::unordered_map<Name, Name> nameMap;
+ std::unordered_map<Name, Name> baseModuleMap;
- ImportInfo imports(*wasm);
- if (imports.getNumImportedGlobals() > 0) {
- Fatal() << "non-function imports aren't supported yet\n";
- abort();
- }
- ModuleUtils::iterImportedFunctions(*wasm, [&](Function* import) {
+ auto noteImport = [&](Name module, Name base) {
// Right now codegen requires a flat namespace going into the module,
- // meaning we don't importing the same name from multiple namespaces yet.
- if (nameMap.count(import->base) && nameMap[import->base] != import->module) {
- Fatal() << "the name " << import->base << " cannot be imported from "
- << "two different modules yet\n";
- abort();
+ // meaning we don't support importing the same name from multiple namespaces yet.
+ if (baseModuleMap.count(base) && baseModuleMap[base] != module) {
+ Fatal() << "the name " << base << " cannot be imported from "
+ << "two different modules yet\n";
+ abort();
}
-
- nameMap[import->base] = import->module;
+ baseModuleMap[base] = module;
std::ostringstream out;
out << "import { "
- << import->base.str
+ << base.str
<< " } from '"
- << import->module.str
+ << module.str
<< "'";
std::string os = out.str();
- IString name(os.c_str(), false);
+ Name name(os.c_str());
flattenAppend(ast, ValueBuilder::makeName(name));
+ };
+
+ ImportInfo imports(*wasm);
+
+ ModuleUtils::iterImportedGlobals(*wasm, [&](Global* import) {
+ Fatal() << "non-function imports aren't supported yet\n";
+ noteImport(import->module, import->base);
+ });
+ ModuleUtils::iterImportedFunctions(*wasm, [&](Function* import) {
+ noteImport(import->module, import->base);
});
}
@@ -690,6 +696,19 @@ void Wasm2JSBuilder::addFunctionImport(Ref ast, Function* import) {
);
}
+void Wasm2JSBuilder::addGlobalImport(Ref ast, Global* import) {
+ Ref theVar = ValueBuilder::makeVar();
+ ast->push_back(theVar);
+ Ref module = ValueBuilder::makeName(ENV); // TODO: handle nested module imports
+ ValueBuilder::appendToVar(theVar,
+ fromName(import->name, NameScope::Top),
+ ValueBuilder::makeDot(
+ module,
+ fromName(import->base, NameScope::Top)
+ )
+ );
+}
+
void Wasm2JSBuilder::addTables(Ref ast, Module* wasm) {
std::map<std::string, std::vector<IString>> tables; // asm.js tables, sig => contents of table
for (Table::Segment& seg : wasm->table.segments) {
@@ -1373,17 +1392,17 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, Function* func, IString resul
switch (curr->bytes) {
case 1:
ret = ValueBuilder::makeSub(
- ValueBuilder::makeName(curr->signed_ ? HEAP8 : HEAPU8 ),
+ ValueBuilder::makeName(LoadUtils::isSignRelevant(curr) && curr->signed_ ? HEAP8 : HEAPU8),
ValueBuilder::makePtrShift(ptr, 0));
break;
case 2:
ret = ValueBuilder::makeSub(
- ValueBuilder::makeName(curr->signed_ ? HEAP16 : HEAPU16),
+ ValueBuilder::makeName(LoadUtils::isSignRelevant(curr) && curr->signed_ ? HEAP16 : HEAPU16),
ValueBuilder::makePtrShift(ptr, 1));
break;
case 4:
ret = ValueBuilder::makeSub(
- ValueBuilder::makeName(curr->signed_ ? HEAP32 : HEAPU32),
+ ValueBuilder::makeName(HEAP32),
ValueBuilder::makePtrShift(ptr, 2));
break;
default: {
diff --git a/test/wasm2js/address.2asm.js b/test/wasm2js/address.2asm.js
index 205be25d7..32b839db2 100644
--- a/test/wasm2js/address.2asm.js
+++ b/test/wasm2js/address.2asm.js
@@ -35,7 +35,7 @@ function asmFunc(global, env, buffer) {
print((wasm2js_i32$0 = i, HEAPU8[(wasm2js_i32$0 + 1 | 0) >> 0] | 0 | 0 | (HEAPU8[(wasm2js_i32$0 + 2 | 0) >> 0] | 0 | 0) << 8) | 0);
print(HEAPU16[(i + 2 | 0) >> 1] | 0 | 0);
print((wasm2js_i32$0 = i, HEAPU8[(wasm2js_i32$0 + 25 | 0) >> 0] | 0 | 0 | (HEAPU8[(wasm2js_i32$0 + 26 | 0) >> 0] | 0 | 0) << 8) | 0);
- print(HEAPU32[i >> 2] | 0 | 0);
+ print(HEAP32[i >> 2] | 0 | 0);
print((wasm2js_i32$0 = i, HEAPU8[(wasm2js_i32$0 + 1 | 0) >> 0] | 0 | 0 | (HEAPU8[(wasm2js_i32$0 + 2 | 0) >> 0] | 0 | 0) << 8 | (HEAPU8[(wasm2js_i32$0 + 3 | 0) >> 0] | 0 | 0) << 16 | (HEAPU8[(wasm2js_i32$0 + 4 | 0) >> 0] | 0 | 0) << 24) | 0);
print((wasm2js_i32$0 = i, HEAPU8[(wasm2js_i32$0 + 2 | 0) >> 0] | 0 | 0 | (HEAPU8[(wasm2js_i32$0 + 3 | 0) >> 0] | 0 | 0) << 8 | (HEAPU8[(wasm2js_i32$0 + 4 | 0) >> 0] | 0 | 0) << 16 | (HEAPU8[(wasm2js_i32$0 + 5 | 0) >> 0] | 0 | 0) << 24) | 0);
print((wasm2js_i32$0 = i, HEAPU8[(wasm2js_i32$0 + 25 | 0) >> 0] | 0 | 0 | (HEAPU8[(wasm2js_i32$0 + 26 | 0) >> 0] | 0 | 0) << 8 | (HEAPU8[(wasm2js_i32$0 + 27 | 0) >> 0] | 0 | 0) << 16 | (HEAPU8[(wasm2js_i32$0 + 28 | 0) >> 0] | 0 | 0) << 24) | 0);
@@ -43,7 +43,7 @@ function asmFunc(global, env, buffer) {
function $1(i) {
i = i | 0;
- HEAPU32[(i + 4294967295 | 0) >> 2] | 0;
+ HEAP32[(i + 4294967295 | 0) >> 2] | 0;
}
return {
diff --git a/test/wasm2js/endianness.2asm.js b/test/wasm2js/endianness.2asm.js
index 9e2bf5b8a..3796af318 100644
--- a/test/wasm2js/endianness.2asm.js
+++ b/test/wasm2js/endianness.2asm.js
@@ -116,7 +116,7 @@ function asmFunc(global, env, buffer) {
function $8(value) {
value = value | 0;
i32_store_little(0 | 0, value | 0);
- return HEAPU32[0 >> 2] | 0 | 0;
+ return HEAP32[0 >> 2] | 0 | 0;
}
function $9(value, value$hi) {
@@ -161,7 +161,7 @@ function asmFunc(global, env, buffer) {
var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0;
i64toi32_i32$0 = value$hi;
i32_store_little(0 | 0, value | 0);
- i64toi32_i32$0 = HEAPU32[0 >> 2] | 0;
+ i64toi32_i32$0 = HEAP32[0 >> 2] | 0;
i64toi32_i32$1 = 0;
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
return i64toi32_i32$0 | 0;
@@ -174,7 +174,7 @@ function asmFunc(global, env, buffer) {
i64toi32_i32$0 = value$hi;
i64_store_little(0 | 0, value | 0, i64toi32_i32$0 | 0);
i64toi32_i32$2 = 0;
- i64toi32_i32$0 = HEAPU32[i64toi32_i32$2 >> 2] | 0;
+ i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0;
i64toi32_i32$1 = (wasm2js_i32$0 = i64toi32_i32$2, HEAPU8[(wasm2js_i32$0 + 4 | 0) >> 0] | 0 | 0 | (HEAPU8[(wasm2js_i32$0 + 5 | 0) >> 0] | 0 | 0) << 8 | (HEAPU8[(wasm2js_i32$0 + 6 | 0) >> 0] | 0 | 0) << 16 | (HEAPU8[(wasm2js_i32$0 + 7 | 0) >> 0] | 0 | 0) << 24);
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
return i64toi32_i32$0 | 0;
diff --git a/test/wasm2js/grow-memory-tricky.2asm.js b/test/wasm2js/grow-memory-tricky.2asm.js
index 6d5aae8f1..81c5952cb 100644
--- a/test/wasm2js/grow-memory-tricky.2asm.js
+++ b/test/wasm2js/grow-memory-tricky.2asm.js
@@ -26,7 +26,7 @@ function asmFunc(global, env, buffer) {
wasm2js_i32$0 = 0;
wasm2js_i32$1 = __wasm_grow_memory(1 | 0);
HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1;
- return HEAPU32[0 >> 2] | 0 | 0;
+ return HEAP32[0 >> 2] | 0 | 0;
}
function $1() {
@@ -34,7 +34,7 @@ function asmFunc(global, env, buffer) {
wasm2js_i32$0 = 0;
wasm2js_i32$1 = grow() | 0;
HEAP32[wasm2js_i32$0 >> 2] = wasm2js_i32$1;
- return HEAPU32[0 >> 2] | 0 | 0;
+ return HEAP32[0 >> 2] | 0 | 0;
}
function grow() {
diff --git a/test/wasm2js/i64.2asm.js b/test/wasm2js/i64.2asm.js
index 4edf6f67b..065cf071e 100644
--- a/test/wasm2js/i64.2asm.js
+++ b/test/wasm2js/i64.2asm.js
@@ -1304,7 +1304,7 @@ function asmFunc(global, env, buffer) {
i64toi32_i32$1 = _ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E(var$0 | 0, i64toi32_i32$0 | 0, var$1 | 0, i64toi32_i32$1 | 0) | 0;
i64toi32_i32$0 = i64toi32_i32$HIGH_BITS;
i64toi32_i32$2 = 1024;
- i64toi32_i32$0 = HEAPU32[i64toi32_i32$2 >> 2] | 0;
+ i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0;
i64toi32_i32$1 = (wasm2js_i32$0 = i64toi32_i32$2, HEAPU8[(wasm2js_i32$0 + 4 | 0) >> 0] | 0 | 0 | (HEAPU8[(wasm2js_i32$0 + 5 | 0) >> 0] | 0 | 0) << 8 | (HEAPU8[(wasm2js_i32$0 + 6 | 0) >> 0] | 0 | 0) << 16 | (HEAPU8[(wasm2js_i32$0 + 7 | 0) >> 0] | 0 | 0) << 24);
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
return i64toi32_i32$0 | 0;
diff --git a/test/wasm2js/left-to-right.2asm.js b/test/wasm2js/left-to-right.2asm.js
index 94f18db42..835175ee6 100644
--- a/test/wasm2js/left-to-right.2asm.js
+++ b/test/wasm2js/left-to-right.2asm.js
@@ -97,7 +97,7 @@ function asmFunc(global, env, buffer) {
}
function get() {
- return HEAPU32[8 >> 2] | 0 | 0;
+ return HEAP32[8 >> 2] | 0 | 0;
}
function i32_left() {
@@ -2101,7 +2101,7 @@ function asmFunc(global, env, buffer) {
i64toi32_i32$1 = _ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E(var$0 | 0, i64toi32_i32$0 | 0, var$1 | 0, i64toi32_i32$1 | 0) | 0;
i64toi32_i32$0 = i64toi32_i32$HIGH_BITS;
i64toi32_i32$2 = 1024;
- i64toi32_i32$0 = HEAPU32[i64toi32_i32$2 >> 2] | 0;
+ i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0;
i64toi32_i32$1 = (wasm2js_i32$0 = i64toi32_i32$2, HEAPU8[(wasm2js_i32$0 + 4 | 0) >> 0] | 0 | 0 | (HEAPU8[(wasm2js_i32$0 + 5 | 0) >> 0] | 0 | 0) << 8 | (HEAPU8[(wasm2js_i32$0 + 6 | 0) >> 0] | 0 | 0) << 16 | (HEAPU8[(wasm2js_i32$0 + 7 | 0) >> 0] | 0 | 0) << 24);
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
return i64toi32_i32$0 | 0;