diff options
-rw-r--r-- | src/wasm2js.h | 61 | ||||
-rw-r--r-- | test/wasm2js/address.2asm.js | 4 | ||||
-rw-r--r-- | test/wasm2js/endianness.2asm.js | 6 | ||||
-rw-r--r-- | test/wasm2js/grow-memory-tricky.2asm.js | 4 | ||||
-rw-r--r-- | test/wasm2js/i64.2asm.js | 2 | ||||
-rw-r--r-- | test/wasm2js/left-to-right.2asm.js | 4 |
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; |