summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/emscripten-optimizer/simple_ast.h7
-rw-r--r--src/shared-constants.h2
-rw-r--r--src/wasm2asm.h34
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();