diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-12-29 22:30:00 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-12-29 22:16:58 -0800 |
commit | d62b5863dc8231bfdea1b72291b7c854dec64f8c (patch) | |
tree | f6e15f99cc16cfd7fd10e5caf581867ca59be333 /src/wasm-binary.h | |
parent | 41e1551c99a8f7378e5941e684c95b615c5b120d (diff) | |
download | binaryen-d62b5863dc8231bfdea1b72291b7c854dec64f8c.tar.gz binaryen-d62b5863dc8231bfdea1b72291b7c854dec64f8c.tar.bz2 binaryen-d62b5863dc8231bfdea1b72291b7c854dec64f8c.zip |
start to emit AST nodes in binary format
Diffstat (limited to 'src/wasm-binary.h')
-rw-r--r-- | src/wasm-binary.h | 228 |
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 { |