Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
works?
  • Loading branch information
kripken committed Apr 12, 2019
commit fece3ad025ee87607a4e7b14de19ab5fd3195247
32 changes: 26 additions & 6 deletions src/passes/RemoveNonJSOps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ namespace wasm {
struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {
std::unique_ptr<Builder> builder;
std::unordered_set<Name> neededIntrinsics;
std::set<std::pair<Name, Type>> neededImportedGlobals;

bool isFunctionParallel() override { return false; }

Expand Down Expand Up @@ -101,6 +102,21 @@ struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {

// Intrinsics may use memory, so ensure the module has one.
MemoryUtils::ensureExists(module->memory);

// Add missing globals
for (auto& pair : neededImportedGlobals) {
auto name = pair.first;
auto type = pair.second;
if (!getModule()->getGlobalOrNull(name)) {
auto global = make_unique<Global>();
global->name = name;
global->type = type;
global->mutable_ = false;
global->module = ENV;
global->base = name;
module->addGlobal(global.release());
}
}
}

void addNeededFunctions(Module &m, Name name, std::set<Name> &needed) {
Expand All @@ -121,7 +137,7 @@ struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {
PostWalker<RemoveNonJSOpsPass>::doWalkFunction(func);
}

void visitLoad(Load *curr) {
void visitLoad(Load* curr) {
if (curr->align == 0 || curr->align >= curr->bytes) {
return;
}
Expand All @@ -143,7 +159,7 @@ struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {
}
}

void visitStore(Store *curr) {
void visitStore(Store* curr) {
if (curr->align == 0 || curr->align >= curr->bytes) {
return;
}
Expand All @@ -165,7 +181,7 @@ struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {
}
}

void visitBinary(Binary *curr) {
void visitBinary(Binary* curr) {
Name name;
switch (curr->op) {
case CopySignFloat32:
Expand Down Expand Up @@ -207,7 +223,7 @@ struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {
replaceCurrent(builder->makeCall(name, {curr->left, curr->right}, curr->type));
}

void rewriteCopysign(Binary *curr) {
void rewriteCopysign(Binary* curr) {
Literal signBit, otherBits;
UnaryOp int2float, float2int;
BinaryOp bitAnd, bitOr;
Expand Down Expand Up @@ -259,7 +275,7 @@ struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {
);
}

void visitUnary(Unary *curr) {
void visitUnary(Unary* curr) {
Name functionCall;
switch (curr->op) {
case NearestFloat32:
Expand Down Expand Up @@ -295,9 +311,13 @@ struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {
neededIntrinsics.insert(functionCall);
replaceCurrent(builder->makeCall(functionCall, {curr->value}, curr->type));
}

void visitGetGlobal(GetGlobal* curr) {
neededImportedGlobals.insert(std::make_pair(curr->name, curr->type));
}
};

Pass *createRemoveNonJSOpsPass() {
Pass* createRemoveNonJSOpsPass() {
return new RemoveNonJSOpsPass();
}

Expand Down
25 changes: 17 additions & 8 deletions src/passes/wasm-intrinsics.wast
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@
;; these pretty early so they can continue to be optimized by further passes
;; (aka inlining and whatnot)
;;
;; LOCAL MODS done by hand afterwards:
;; * Remove hardcoded address 1024 (apparently a free memory location rustc
;; thinks is ok to use?); add a global __tempMemory__ which is used for that
;; purpose.
;; * Fix function type of __wasm_ctz_i64, which was wrong somehow,
;; i32, i32 => i32 instead of i64 => i64
;;
;; [1]: https://gist.github.com/alexcrichton/e7ea67bcdd17ce4b6254e66f77165690

(module
Expand All @@ -13,7 +20,9 @@
(type $2 (func (param f64) (result f64)))
(type $3 (func (param i32) (result i32)))
(type $4 (func (param i32 i32) (result i32)))
(type $5 (func (param i64) (result i64)))
(import "env" "memory" (memory $0 17))
(import "env" "__tempMemory__" (global $__tempMemory__ i32))
(export "__wasm_i64_sdiv" (func $__wasm_i64_sdiv))
(export "__wasm_i64_udiv" (func $__wasm_i64_udiv))
(export "__wasm_i64_srem" (func $__wasm_i64_srem))
Expand Down Expand Up @@ -128,7 +137,7 @@
)
)
(i64.load
(i32.const 1024)
(global.get $__tempMemory__)
)
)
;; lowering of the i64.mul instruction, return $var0 * $var$1
Expand Down Expand Up @@ -192,7 +201,7 @@
(i32.const 32)
)
;; lowering of the i64.ctz instruction, counting the number of zeros in $var$0
(func $__wasm_ctz_i64 (; 8 ;) (type $4) (param $var$0 i64) (result i64)
(func $__wasm_ctz_i64 (; 8 ;) (type $5) (param $var$0 i64) (result i64)
(if
(i32.eqz
(i64.eqz
Expand Down Expand Up @@ -571,7 +580,7 @@
)
)
(i64.store
(i32.const 1024)
(global.get $__tempMemory__)
(i64.extend_i32_u
(i32.sub
(local.tee $var$2
Expand Down Expand Up @@ -633,7 +642,7 @@
)
)
(i64.store
(i32.const 1024)
(global.get $__tempMemory__)
(i64.or
(i64.shl
(i64.extend_i32_u
Expand Down Expand Up @@ -714,7 +723,7 @@
(br $label$3)
)
(i64.store
(i32.const 1024)
(global.get $__tempMemory__)
(i64.shl
(i64.extend_i32_u
(i32.sub
Expand Down Expand Up @@ -757,7 +766,7 @@
(br $label$2)
)
(i64.store
(i32.const 1024)
(global.get $__tempMemory__)
(i64.extend_i32_u
(i32.and
(local.get $var$4)
Expand Down Expand Up @@ -889,7 +898,7 @@
)
)
(i64.store
(i32.const 1024)
(global.get $__tempMemory__)
(local.get $var$5)
)
(return
Expand All @@ -903,7 +912,7 @@
)
)
(i64.store
(i32.const 1024)
(global.get $__tempMemory__)
(local.get $var$0)
)
(local.set $var$0
Expand Down
1 change: 0 additions & 1 deletion src/wasm2js.h
Original file line number Diff line number Diff line change
Expand Up @@ -2053,7 +2053,6 @@ void Wasm2JSGlue::emitPreES6() {
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) {
Expand Down
29 changes: 13 additions & 16 deletions test/wasm2js/emscripten.2asm.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,23 +73,20 @@ const writeSegment = (
)(wasmMemory.buffer);
writeSegment(1024, "aGVsbG8sIHdvcmxkIQoAAJwMAAAtKyAgIDBYMHgAKG51bGwpAAAAAAAAAAAAAAAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGLTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAuAA==");
writeSegment(1600, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=");
return asmFunc(
{
'env': asmLibraryArg,
'global': {
'Int8Array': Int8Array,
'Int16Array': Int16Array,
'Int32Array': Int32Array,
'Uint8Array': Uint8Array,
'Uint16Array': Uint16Array,
'Uint32Array': Uint32Array,
'Float32Array': Float32Array,
'Float64Array': Float64Array,
'NaN': NaN,
'Infinity': Infinity,
'Math': Math
}
return asmFunc({
'Int8Array': Int8Array,
'Int16Array': Int16Array,
'Int32Array': Int32Array,
'Uint8Array': Uint8Array,
'Uint16Array': Uint16Array,
'Uint32Array': Uint32Array,
'Float32Array': Float32Array,
'Float64Array': Float64Array,
'NaN': NaN,
'Infinity': Infinity,
'Math': Math
},
asmLibraryArg,
wasmMemory.buffer
)

Expand Down
Loading