summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-29 22:30:00 -0500
committerAlon Zakai <alonzakai@gmail.com>2015-12-29 22:16:58 -0800
commitd62b5863dc8231bfdea1b72291b7c854dec64f8c (patch)
treef6e15f99cc16cfd7fd10e5caf581867ca59be333 /src
parent41e1551c99a8f7378e5941e684c95b615c5b120d (diff)
downloadbinaryen-d62b5863dc8231bfdea1b72291b7c854dec64f8c.tar.gz
binaryen-d62b5863dc8231bfdea1b72291b7c854dec64f8c.tar.bz2
binaryen-d62b5863dc8231bfdea1b72291b7c854dec64f8c.zip
start to emit AST nodes in binary format
Diffstat (limited to 'src')
-rw-r--r--src/wasm-binary.h228
1 files changed, 220 insertions, 8 deletions
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index 74d3eba0b..e564f75c8 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -22,6 +22,7 @@
#define wasm_wasm_binary_h
#include <ostream>
+#include <sstream>
#include "wasm.h"
#include "shared-constants.h"
@@ -44,6 +45,162 @@ enum FunctionEntry {
Export = 8
};
+enum ASTNodes {
+ MemorySize = 0x3b,
+ GrowMemory = 0x39,
+ I32Add = 0x40,
+ I32Sub = 0x41,
+ I32Mul = 0x42,
+ I32DivS = 0x43,
+ I32DivU = 0x44,
+ I32RemS = 0x45,
+ I32RemU = 0x46,
+ I32And = 0x47,
+ I32Ior = 0x48,
+ I32Xor = 0x49,
+ I32Shl = 0x4a,
+ I32ShrU = 0x4b,
+ I32ShrS = 0x4c,
+ I32Eq = 0x4d,
+ I32Ne = 0x4e,
+ I32LtS = 0x4f,
+ I32LeS = 0x50,
+ I32LtU = 0x51,
+ I32LeU = 0x52,
+ I32GtS = 0x53,
+ I32GeS = 0x54,
+ I32GtU = 0x55,
+ I32GeU = 0x56,
+ I32Clz = 0x57,
+ I32Ctz = 0x58,
+ I32Popcnt = 0x59,
+ BoolNot = 0x5a,
+ I64Add = 0x5b,
+ I64Sub = 0x5c,
+ I64Mul = 0x5d,
+ I64DivS = 0x5e,
+ I64DivU = 0x5f,
+ I64RemS = 0x60,
+ I64RemU = 0x61,
+ I64And = 0x62,
+ I64Ior = 0x63,
+ I64Xor = 0x64,
+ I64Shl = 0x65,
+ I64ShrU = 0x66,
+ I64ShrS = 0x67,
+ I64Eq = 0x68,
+ I64Ne = 0x69,
+ I64LtS = 0x6a,
+ I64LeS = 0x6b,
+ I64LtU = 0x6c,
+ I64LeU = 0x6d,
+ I64GtS = 0x6e,
+ I64GeS = 0x6f,
+ I64GtU = 0x70,
+ I64GeU = 0x71,
+ I64Clz = 0x72,
+ I64Ctz = 0x73,
+ I64Popcnt = 0x74,
+ F32Add = 0x75,
+ F32Sub = 0x76,
+ F32Mul = 0x77,
+ F32Div = 0x78,
+ F32Min = 0x79,
+ F32Max = 0x7a,
+ F32Abs = 0x7b,
+ F32Neg = 0x7c,
+ F32CopySign = 0x7d,
+ F32Ceil = 0x7e,
+ F32Floor = 0x7f,
+ F32Trunc = 0x80,
+ F32NearestInt = 0x81,
+ F32Sqrt = 0x82,
+ F32Eq = 0x83,
+ F32Ne = 0x84,
+ F32Lt = 0x85,
+ F32Le = 0x86,
+ F32Gt = 0x87,
+ F32Ge = 0x88,
+ F64Add = 0x89,
+ F64Sub = 0x8a,
+ F64Mul = 0x8b,
+ F64Div = 0x8c,
+ F64Min = 0x8d,
+ F64Max = 0x8e,
+ F64Abs = 0x8f,
+ F64Neg = 0x90,
+ F64CopySign = 0x91,
+ F64Ceil = 0x92,
+ F64Floor = 0x93,
+ F64Trunc = 0x94,
+ F64NearestInt = 0x95,
+ F64Sqrt = 0x96,
+ F64Eq = 0x97,
+ F64Ne = 0x98,
+ F64Lt = 0x99,
+ F64Le = 0x9a,
+ F64Gt = 0x9b,
+ F64Ge = 0x9c,
+ I32SConvertF32 = 0x9d,
+ I32SConvertF64 = 0x9e,
+ I32UConvertF32 = 0x9f,
+ I32UConvertF64 = 0xa0,
+ I32ConvertI64 = 0xa1,
+ I64SConvertF32 = 0xa2,
+ I64SConvertF64 = 0xa3,
+ I64UConvertF32 = 0xa4,
+ I64UConvertF64 = 0xa5,
+ I64SConvertI32 = 0xa6,
+ I64UConvertI32 = 0xa7,
+
+ I32LoadMem8S = 0x20,
+ I32LoadMem8U = 0x21,
+ I32LoadMem16S = 0x22,
+ I32LoadMem16U = 0x23,
+ I64LoadMem8S = 0x24,
+ I64LoadMem8U = 0x25,
+ I64LoadMem16S = 0x26,
+ I64LoadMem16U = 0x27,
+ I64LoadMem32S = 0x28,
+ I64LoadMem32U = 0x29,
+ I32LoadMem = 0x2a,
+ I64LoadMem = 0x2b,
+ F32LoadMem = 0x2c,
+ F64LoadMem = 0x2d,
+ I32StoreMem8 = 0x2e,
+ I32StoreMem16 = 0x2f,
+ I64StoreMem8 = 0x30,
+ I64StoreMem16 = 0x31,
+ I64StoreMem32 = 0x32,
+ I32StoreMem = 0x33,
+ I64StoreMem = 0x34,
+ F32StoreMem = 0x35,
+ F64StoreMem = 0x36,
+
+ I8Const = 0x09,
+ I32Const = 0x0a,
+ I64Const = 0x0b,
+ F64Const = 0x0c,
+ F32Const = 0x0d,
+ GetLocal = 0x0e,
+ SetLocal = 0x0f,
+ LoadGlobal = 0x10,
+ StoreGlobal = 0x11,
+ CallFunction = 0x12,
+ CallIndirect = 0x13,
+
+ Block = 0x01,
+ Loop = 0x02,
+ If = 0x03,
+ IfElse = 0x04,
+ Select = 0x05,
+ Br = 0x06,
+ BrIf = 0x07,
+ TableSwitch = 0x08,
+ Return = 0x14,
+ Unreachable = 0x15
+};
+
char binaryWasmType(WasmType type) {
switch (type) {
case none: return 0;
@@ -131,9 +288,6 @@ public:
}
}
- std::vector<char> encodeAST(Function* function) {
- }
-
writeFunctions() {
size_t total = wasm.imports.size() + wasm.functions.size();
o << Section::Functions << LEB128(total);
@@ -162,11 +316,9 @@ public:
<< uint16_t(numLocalsByType[f64]);
}
if (function) {
- auto ast = encodeAST(function);
- o << uint16_t(ast.size());
- for (auto c : ast) {
- o << c;
- }
+ size_t curr = o.size();
+ visit(function->body);
+ o.writeAt(curr, uint16_t(o.size() - curr));
}
}
}
@@ -202,6 +354,66 @@ public:
writeEnd() {
o << Section::End;
}
+
+ // AST writing via visitors
+
+ void visitBlock(Block *curr) {
+ o << char(ASTNodes::Block) << char(curr->list.size());
+ for (auto child : curr->list) {
+ visit(child);
+ }
+ }
+ void visitIf(If *curr) {
+ }
+ void visitLoop(Loop *curr) {
+ }
+ void visitBreak(Break *curr) {
+ }
+ void visitSwitch(Switch *curr) {
+ }
+ void visitCall(Call *curr) {
+ }
+ void visitCallImport(CallImport *curr) {
+ }
+ void visitCallIndirect(CallIndirect *curr) {
+ }
+ void visitGetLocal(GetLocal *curr) {
+ }
+ void visitSetLocal(SetLocal *curr) {
+ }
+ void visitLoad(Load *curr) {
+ }
+ void visitStore(Store *curr) {
+ }
+ void visitConst(Const *curr) {
+ }
+ void visitUnary(Unary *curr) {
+ }
+ void visitBinary(Binary *curr) {
+ }
+ void visitSelect(Select *curr) {
+ }
+ void visitHost(Host *curr) {
+ }
+ void visitNop(Nop *curr) {
+ }
+ void visitUnreachable(Unreachable *curr) {
+ }
+ // Module-level visitors
+ void visitFunctionType(FunctionType *curr) {
+ }
+ void visitImport(Import *curr) {
+ }
+ void visitExport(Export *curr) {
+ }
+ void visitFunction(Function *curr) {
+ }
+ void visitTable(Table *curr) {
+ }
+ void visitMemory(Memory *curr) {
+ }
+ void visitModule(Module *curr) {
+ }
};
class WasmBinaryBuilder {