diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-12-06 17:47:09 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-12-06 17:47:09 -0800 |
commit | 52c8004d2b5c7bbd059ee36089e5724498933fc5 (patch) | |
tree | a0b965623429697ae980141ea5b30dbb294a5b3f /src | |
parent | 7efb88f9806799357f026dd15ffe28e898bf283d (diff) | |
download | binaryen-52c8004d2b5c7bbd059ee36089e5724498933fc5.tar.gz binaryen-52c8004d2b5c7bbd059ee36089e5724498933fc5.tar.bz2 binaryen-52c8004d2b5c7bbd059ee36089e5724498933fc5.zip |
emit heap views in wasm2asm
Diffstat (limited to 'src')
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 7 | ||||
-rw-r--r-- | src/shared-constants.h | 2 | ||||
-rw-r--r-- | src/wasm2asm.h | 34 |
3 files changed, 43 insertions, 0 deletions
diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h index 94cae9f2f..d83eb4cdd 100644 --- a/src/emscripten-optimizer/simple_ast.h +++ b/src/emscripten-optimizer/simple_ast.h @@ -1336,6 +1336,13 @@ public: .push_back(target) .push_back(makeRawArray()); } + static Ref makeCall(Ref target, Ref arg) { + Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL)) + .push_back(target) + .push_back(makeRawArray()); + ret[2]->push_back(arg); + return ret; + } static Ref makeCall(IString target) { Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL)) .push_back(makeName(target)) diff --git a/src/shared-constants.h b/src/shared-constants.h index 15fe8647f..b052f54df 100644 --- a/src/shared-constants.h +++ b/src/shared-constants.h @@ -53,6 +53,8 @@ cashew::IString GLOBAL("global"), CASE("case"), BR("br"), USE_ASM("use asm"), + BUFFER("buffer"), + ENV("env"), FAKE_RETURN("fake_return_waka123"), MATH_CLZ32("Math_clz32"), MATH_CTZ32("Math_ctz32"), diff --git a/src/wasm2asm.h b/src/wasm2asm.h index b919a6d3f..415c904c7 100644 --- a/src/wasm2asm.h +++ b/src/wasm2asm.h @@ -154,13 +154,19 @@ private: // Label names to which we break with a value aka spooky-return-at-a-distance std::set<Name> breakedWithValue; + + void addHeaps(Ref ast); }; Ref Wasm2AsmBuilder::processWasm(Module* wasm) { Ref ret = ValueBuilder::makeToplevel(); Ref asmFunc = ValueBuilder::makeFunction(ASM_FUNC); ret[1]->push_back(asmFunc); + ValueBuilder::appendArgumentToFunction(asmFunc, GLOBAL); + ValueBuilder::appendArgumentToFunction(asmFunc, ENV); + ValueBuilder::appendArgumentToFunction(asmFunc, BUFFER); asmFunc[3]->push_back(ValueBuilder::makeStatement(ValueBuilder::makeString(USE_ASM))); + addHeaps(asmFunc[3]); // imports XXX // exports XXX // functions @@ -172,6 +178,34 @@ Ref Wasm2AsmBuilder::processWasm(Module* wasm) { return ret; } +void Wasm2AsmBuilder::addHeaps(Ref ast) { + // var HEAP8 = new global.Int8Array(buffer); etc + auto add = [&](IString name, IString view) { + Ref theVar = ValueBuilder::makeVar(); + ast->push_back(theVar); + ValueBuilder::appendToVar(theVar, + name, + ValueBuilder::makeNew( + ValueBuilder::makeCall( + ValueBuilder::makeDot( + ValueBuilder::makeName(GLOBAL), + view + ), + ValueBuilder::makeName(BUFFER) + ) + ) + ); + }; + add(HEAP8, INT8ARRAY); + add(HEAP16, INT16ARRAY); + add(HEAP32, INT32ARRAY); + add(HEAPU8, UINT8ARRAY); + add(HEAPU16, UINT16ARRAY); + add(HEAPU32, UINT32ARRAY); + add(HEAPF32, FLOAT32ARRAY); + add(HEAPF64, FLOAT64ARRAY); +} + Ref Wasm2AsmBuilder::processFunction(Function* func) { Ref ret = ValueBuilder::makeFunction(fromName(func->name)); frees.clear(); |