summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/asm2wasm.h28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index 92cef7be9..e68a06dc6 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -104,8 +104,9 @@ private:
struct View {
unsigned bytes;
bool integer, signed_;
+ AsmType type;
View() : bytes(0) {}
- View(unsigned bytes, bool integer, bool signed_) : bytes(bytes), integer(integer), signed_(signed_) {}
+ View(unsigned bytes, bool integer, bool signed_, AsmType type) : bytes(bytes), integer(integer), signed_(signed_), type(type) {}
};
std::map<IString, View> views; // name (e.g. HEAP8) => view info
@@ -223,6 +224,12 @@ private:
assert(mappedGlobals.find(name) != mappedGlobals.end());
return wasmToAsmType(mappedGlobals[name].type);
}
+ } else if (ast[0] == SUB && ast[1][0] == NAME) {
+ // could be a heap access, use view info
+ auto view = views.find(ast[1][1]->getIString());
+ if (view != views.end()) {
+ return view->second.type;
+ }
}
return detectType(ast, data);
}
@@ -425,25 +432,26 @@ void Asm2WasmBuilder::processAsm(Ref ast) {
IString heap = constructor[2]->getIString();
unsigned bytes;
bool integer, signed_;
+ AsmType asmType;
if (heap == INT8ARRAY) {
- bytes = 1; integer = true; signed_ = true;
+ bytes = 1; integer = true; signed_ = true; asmType = ASM_INT;
} else if (heap == INT16ARRAY) {
- bytes = 2; integer = true; signed_ = true;
+ bytes = 2; integer = true; signed_ = true; asmType = ASM_INT;
} else if (heap == INT32ARRAY) {
- bytes = 4; integer = true; signed_ = true;
+ bytes = 4; integer = true; signed_ = true; asmType = ASM_INT;
} else if (heap == UINT8ARRAY) {
- bytes = 1; integer = true; signed_ = false;
+ bytes = 1; integer = true; signed_ = false; asmType = ASM_INT;
} else if (heap == UINT16ARRAY) {
- bytes = 2; integer = true; signed_ = false;
+ bytes = 2; integer = true; signed_ = false; asmType = ASM_INT;
} else if (heap == UINT32ARRAY) {
- bytes = 4; integer = true; signed_ = false;
+ bytes = 4; integer = true; signed_ = false; asmType = ASM_INT;
} else if (heap == FLOAT32ARRAY) {
- bytes = 4; integer = false; signed_ = true;
+ bytes = 4; integer = false; signed_ = true; asmType = ASM_DOUBLE;
} else if (heap == FLOAT64ARRAY) {
- bytes = 8; integer = false; signed_ = true;
+ bytes = 8; integer = false; signed_ = true; asmType = ASM_DOUBLE;
}
assert(views.find(name) == views.end());
- views.emplace(name, View(bytes, integer, signed_));
+ views.emplace(name, View(bytes, integer, signed_, asmType));
} else if (value[0] == ARRAY) {
// function table. we "merge" them, so e.g. [foo, b1] , [b2, bar] => [foo, bar] , assuming b* are the aborting thunks
// when minified, we can't tell from the name b\d+, but null thunks appear multiple times in a table; others never do