From 1709f01e2be854338d9010e8b972fd432b693e0d Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 9 Jul 2021 14:00:53 -0500 Subject: [PATCH] added wasm code decoder --- bin/onyx | Bin 409176 -> 409176 bytes core/conv.onyx | 10 +- modules/wasm_utils/instructions.onyx | 430 +++++++++++++++++++++++++++ modules/wasm_utils/module.onyx | 2 + modules/wasm_utils/parser.onyx | 22 +- modules/wasm_utils/types.onyx | 22 +- src/onyxchecker.c | 2 + 7 files changed, 472 insertions(+), 16 deletions(-) create mode 100644 modules/wasm_utils/instructions.onyx diff --git a/bin/onyx b/bin/onyx index a0ce0b3f2ce665d1fa3d8b719a717020dafa42c2..c1f9235bc1b169e725cfb36a3912e3d492a8ad83 100755 GIT binary patch delta 61345 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 str { digits_after_decimal := cast(u32) 4; indentation := cast(u32) 0; + base := cast(u64) 10; } vararg_index := 0; @@ -297,6 +298,11 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { formatting.pretty_printing = true; } + case #char "x" { + i += 1; + formatting.base = 16; + } + case #default do break break; } } @@ -349,7 +355,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { value := *(cast(^i32) v.data); ibuf : [128] u8; - istr := i64_to_str(~~value, 10, ~~ibuf); + istr := i64_to_str(~~value, formatting.base, ~~ibuf); output->write(istr); } @@ -357,7 +363,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { value := *(cast(^i64) v.data); ibuf : [128] u8; - istr := i64_to_str(~~value, 10, ~~ibuf); + istr := i64_to_str(~~value, formatting.base, ~~ibuf); output->write(istr); } diff --git a/modules/wasm_utils/instructions.onyx b/modules/wasm_utils/instructions.onyx new file mode 100644 index 00000000..aae6f8dd --- /dev/null +++ b/modules/wasm_utils/instructions.onyx @@ -0,0 +1,430 @@ +package wasm_utils + +Z :: (package core.intrinsics.onyx).__zero_value + +WasmCodeParser :: struct { + +} + +WasmInstructionCode :: enum { + unreachable :: 0x00; + nop :: 0x01; + block :: 0x02; + loop :: 0x03; + if_ :: 0x04; + else_ :: 0x05; + end :: 0x0B; + branch :: 0x0C; + branch_if :: 0x0D; + branch_table :: 0x0E; + return_ :: 0x0F; + call :: 0x10; + call_indirect :: 0x11; + + ref_null :: 0xD0; + ref_is_null :: 0xD1; + ref_func :: 0xD2; + + drop :: 0x1A; + select :: 0x1B; + + local_get :: 0x20; + local_set :: 0x21; + local_tee :: 0x22; + global_get :: 0x23; + global_set :: 0x24; + + table_get :: 0x25; + table_set :: 0x26; + table_init :: 0xFC0C; + elem_drop :: 0xFC0D; + table_copy :: 0xFC0E; + table_grow :: 0xFC0F; + table_size :: 0xFC10; + table_fill :: 0xFC11; + + i32_load :: 0x28; + i64_load :: 0x29; + f32_load :: 0x2A; + f64_load :: 0x2B; + + i32_load8_s :: 0x2C; + i32_load8_u :: 0x2D; + i32_load16_s :: 0x2E; + i32_load16_u :: 0x2F; + i64_load8_s :: 0x30; + i64_load8_u :: 0x31; + i64_load16_s :: 0x32; + i64_load16_u :: 0x33; + i64_load32_s :: 0x34; + i64_load32_u :: 0x35; + + i32_store :: 0x36; + i64_store :: 0x37; + f32_store :: 0x38; + f64_store :: 0x39; + + i32_store8 :: 0x3A; + i32_store16 :: 0x3B; + i64_store8 :: 0x3C; + i64_store16 :: 0x3D; + i64_store32 :: 0x3E; + + memory_size :: 0x3F; + memory_grow :: 0x40; + memory_init :: 0xFC08; + data_drop :: 0xFC09; + memory_copy :: 0xFC0A; + memory_fill :: 0xFC0B; + + i32_const :: 0x41; + i64_const :: 0x42; + f32_const :: 0x43; + f64_const :: 0x44; + + i32_eqz :: 0x45; + i32_eq :: 0x46; + i32_ne :: 0x47; + i32_lt_s :: 0x48; + i32_lt_u :: 0x49; + i32_gt_s :: 0x4A; + i32_gt_u :: 0x4B; + i32_le_s :: 0x4C; + i32_le_u :: 0x4D; + i32_ge_s :: 0x4E; + i32_ge_u :: 0x4F; + + i64_eqz :: 0x50; + i64_eq :: 0x51; + i64_ne :: 0x52; + i64_lt_s :: 0x53; + i64_lt_u :: 0x54; + i64_gt_s :: 0x55; + i64_gt_u :: 0x56; + i64_le_s :: 0x57; + i64_le_u :: 0x58; + i64_ge_s :: 0x59; + i64_ge_u :: 0x5A; + + f32_eq :: 0x5B; + f32_ne :: 0x5C; + f32_lt :: 0x5D; + f32_gt :: 0x5E; + f32_le :: 0x5F; + f32_ge :: 0x60; + + f64_eq :: 0x61; + f64_ne :: 0x62; + f64_lt :: 0x63; + f64_gt :: 0x64; + f64_le :: 0x65; + f64_ge :: 0x66; + + i32_clz :: 0x67; + i32_ctz :: 0x68; + i32_popcnt :: 0x69; + i32_add :: 0x6A; + i32_sub :: 0x6B; + i32_mul :: 0x6C; + i32_div_s :: 0x6D; + i32_div_u :: 0x6E; + i32_rem_s :: 0x6F; + i32_rem_u :: 0x70; + i32_and :: 0x71; + i32_or :: 0x72; + i32_xor :: 0x73; + i32_shl :: 0x74; + i32_shr_s :: 0x75; + i32_shr_u :: 0x76; + i32_rotl :: 0x77; + i32_rotr :: 0x78; + + i64_clz :: 0x79; + i64_ctz :: 0x7A; + i64_popcnt :: 0x7B; + i64_add :: 0x7C; + i64_sub :: 0x7D; + i64_mul :: 0x7E; + i64_div_s :: 0x7F; + i64_div_u :: 0x80; + i64_rem_s :: 0x81; + i64_rem_u :: 0x82; + i64_and :: 0x83; + i64_or :: 0x84; + i64_xor :: 0x85; + i64_shl :: 0x86; + i64_shr_s :: 0x87; + i64_shr_u :: 0x88; + i64_rotl :: 0x89; + i64_rotr :: 0x8A; + + f32_abs :: 0x8B; + f32_neg :: 0x8C; + f32_ceil :: 0x8D; + f32_floor :: 0x8E; + f32_trunc :: 0x8F; + f32_nearest :: 0x90; + f32_sqrt :: 0x91; + f32_add :: 0x92; + f32_sub :: 0x93; + f32_mul :: 0x94; + f32_div :: 0x95; + f32_min :: 0x96; + f32_max :: 0x97; + f32_copysign :: 0x98; + + f64_abs :: 0x99; + f64_neg :: 0x9A; + f64_ceil :: 0x9B; + f64_floor :: 0x9C; + f64_trunc :: 0x9D; + f64_nearest :: 0x9E; + f64_sqrt :: 0x9F; + f64_add :: 0xA0; + f64_sub :: 0xA1; + f64_mul :: 0xA2; + f64_div :: 0xA3; + f64_min :: 0xA4; + f64_max :: 0xA5; + f64_copysign :: 0xA6; + + i32_from_i64 :: 0xA7; + i32_from_f32_s :: 0xA8; + i32_from_f32_u :: 0xA9; + i32_from_f64_s :: 0xAA; + i32_from_f64_u :: 0xAB; + i64_from_i32_s :: 0xAC; + i64_from_i32_u :: 0xAD; + i64_from_f32_s :: 0xAE; + i64_from_f32_u :: 0xAF; + i64_from_f64_s :: 0xB0; + i64_from_f64_u :: 0xB1; + f32_from_i32_s :: 0xB2; + f32_from_i32_u :: 0xB3; + f32_from_i64_s :: 0xB4; + f32_from_i64_u :: 0xB5; + f32_from_f64 :: 0xB6; + f64_from_i32_s :: 0xB7; + f64_from_i32_u :: 0xB8; + f64_from_i64_s :: 0xB9; + f64_from_i64_u :: 0xBA; + f64_from_f32 :: 0xBB; + + i32_transmute_f32 :: 0xBC; + i64_transmute_f64 :: 0xBD; + f32_transmute_i32 :: 0xBE; + f64_transmute_i64 :: 0xBF; + + i32_trunc_sat_f32_s :: 0xFC00; + i32_trunc_sat_f32_u :: 0xFC01; + i32_trunc_sat_f64_s :: 0xFC02; + i32_trunc_sat_f64_u :: 0xFC03; + i64_trunc_sat_f32_s :: 0xFC04; + i64_trunc_sat_f32_u :: 0xFC05; + i64_trunc_sat_f64_s :: 0xFC06; + i64_trunc_sat_f64_u :: 0xFC07; +} + +WasmInstruction :: struct { + code : WasmInstructionCode; + + // Offset to the immediates after the instruction. + data : u32; +} + +instruction_iterator :: (binary: ^WasmBinary, code: ^WasmCode, allocator := context.allocator) -> Iterator(WasmInstruction) { + + CodeContext :: struct { + allocator : Allocator; + binary : ^WasmBinary; + + code : ^WasmCode; + + stream : io.StringStream; + reader : io.Reader; + + current_block_depth : u32; + } + + data := make(CodeContext, allocator=allocator); + data.allocator = allocator; + data.binary = binary; + data.code = code; + data.current_block_depth = 1; + + data.stream = io.string_stream_make(binary.data.data[code.code_offset .. (code.code_offset + code.size)]); + data.reader = io.reader_make(^data.stream); + + next :: (use c: ^CodeContext) -> (WasmInstruction, bool) { + if current_block_depth == 0 do return Z(WasmInstruction), false; + + return parse_instruction(^reader, binary, code.code_offset, ^current_block_depth), true; + } + + close :: (use c: ^CodeContext) { + raw_free(allocator, c); + } + + return .{ data, next, close }; +} + +instructions_as_array :: (binary: ^WasmBinary, code: ^WasmCode, allocator := context.allocator) -> [..] WasmInstruction { + return instruction_iterator(binary, code, allocator) + |> iter.to_array(allocator=allocator); +} + +#private +parse_instruction :: (reader: ^io.Reader, binary: ^WasmBinary, code_offset := 0, current_block_depth: ^i32 = null) -> WasmInstruction { + + Parse_After :: enum { + None; + Block_Type; + Index; + Zero_Byte; + Memory_Arg; + Index_Then_Zero_Byte; + Two_Zero_Bytes; + Two_Indicies; + + Signed_Leb; + Unsigned_Leb; + Float32; + Float64; + + Branch_Table; + } + + instr: WasmInstruction; + instr.data = 0; + + parse_after := Parse_After.None; + block_depth := (*current_block_depth) if current_block_depth != null else 0; + + ib := io.read_byte(reader); + switch cast(u32) ib { + case 0x00 do instr.code = .unreachable; + case 0x01 do instr.code = .nop; + case 0x02 { instr.code = .block; block_depth += 1; parse_after = .Block_Type; } + case 0x03 { instr.code = .loop; block_depth += 1; parse_after = .Block_Type; } + case 0x04 { instr.code = .if_; block_depth += 1; parse_after = .Block_Type; } + case 0x05 { instr.code = .else_; } + case 0x0B { instr.code = .end; block_depth -= 1; } + + case 0x0C { instr.code = .branch; parse_after = .Index; } + case 0x0D { instr.code = .branch_if; parse_after = .Index; } + case 0x0E { instr.code = .branch_table; parse_after = .Branch_Table; } + + case 0x0F { instr.code = .return_; } + case 0x10 { instr.code = .call; parse_after = .Index; } + case 0x11 { instr.code = .call_indirect; parse_after = .Two_Indicies; } + case 0x1A { instr.code = .drop; } + case 0x1B { instr.code = .select; } + + case 0x20 { instr.code = .local_get; parse_after = .Index; } + case 0x21 { instr.code = .local_set; parse_after = .Index; } + case 0x22 { instr.code = .local_tee; parse_after = .Index; } + case 0x23 { instr.code = .global_get; parse_after = .Index; } + case 0x24 { instr.code = .global_set; parse_after = .Index; } + + case 0x28 { instr.code = .i32_load; parse_after = .Memory_Arg; } + case 0x29 { instr.code = .i64_load; parse_after = .Memory_Arg; } + case 0x2A { instr.code = .f32_load; parse_after = .Memory_Arg; } + case 0x2B { instr.code = .f64_load; parse_after = .Memory_Arg; } + + case 0x2C { instr.code = .i32_load8_s; parse_after = .Memory_Arg; } + case 0x2D { instr.code = .i32_load8_u; parse_after = .Memory_Arg; } + case 0x2E { instr.code = .i32_load16_s; parse_after = .Memory_Arg; } + case 0x2F { instr.code = .i32_load16_u; parse_after = .Memory_Arg; } + + case 0x30 { instr.code = .i64_load8_s; parse_after = .Memory_Arg; } + case 0x31 { instr.code = .i64_load8_u; parse_after = .Memory_Arg; } + case 0x32 { instr.code = .i64_load16_s; parse_after = .Memory_Arg; } + case 0x33 { instr.code = .i64_load16_u; parse_after = .Memory_Arg; } + case 0x34 { instr.code = .i64_load32_s; parse_after = .Memory_Arg; } + case 0x35 { instr.code = .i64_load32_u; parse_after = .Memory_Arg; } + + case 0x36 { instr.code = .i32_store; parse_after = .Memory_Arg; } + case 0x37 { instr.code = .i64_store; parse_after = .Memory_Arg; } + case 0x38 { instr.code = .f32_store; parse_after = .Memory_Arg; } + case 0x39 { instr.code = .f64_store; parse_after = .Memory_Arg; } + + case 0x3A { instr.code = .i32_store8; parse_after = .Memory_Arg; } + case 0x3B { instr.code = .i32_store16; parse_after = .Memory_Arg; } + case 0x3C { instr.code = .i64_store8; parse_after = .Memory_Arg; } + case 0x3D { instr.code = .i64_store16; parse_after = .Memory_Arg; } + case 0x3E { instr.code = .i64_store32; parse_after = .Memory_Arg; } + + case 0x3F { instr.code = .memory_size; parse_after = .Zero_Byte; } + case 0x40 { instr.code = .memory_copy; parse_after = .Zero_Byte; } + + case 0x41 { instr.code = .i32_const; parse_after = .Signed_Leb; } + case 0x42 { instr.code = .i64_const; parse_after = .Signed_Leb; } + case 0x43 { instr.code = .f32_const; parse_after = .Float32; } + case 0x44 { instr.code = .f64_const; parse_after = .Float64; } + + case #default { + // Special instructions + if ~~ib == 0xFC { + instr_num := cast(u32) read_uleb128(reader); + switch instr_num { + case 0x00 do instr.code = .i32_trunc_sat_f32_s; + case 0x01 do instr.code = .i32_trunc_sat_f32_u; + case 0x02 do instr.code = .i32_trunc_sat_f64_s; + case 0x03 do instr.code = .i32_trunc_sat_f64_u; + case 0x04 do instr.code = .i64_trunc_sat_f32_s; + case 0x05 do instr.code = .i64_trunc_sat_f32_u; + case 0x06 do instr.code = .i64_trunc_sat_f64_s; + case 0x07 do instr.code = .i64_trunc_sat_f64_u; + + case 0x08 { instr.code = .memory_init; parse_after = .Index_Then_Zero_Byte; } + case 0x09 { instr.code = .data_drop; parse_after = .Index; } + case 0x0a { instr.code = .memory_copy; parse_after = .Two_Zero_Bytes; } + case 0x0b { instr.code = .memory_fill; parse_after = .Zero_Byte; } + } + } else { + instr.code = ~~ ib; + } + } + } + + _, data_offset := io.stream_tell(reader.stream); + instr.data = code_offset + data_offset; + + switch parse_after { + case .Block_Type do io.read_byte(reader); + case .Index do read_uleb128(reader); + case .Zero_Byte do io.read_byte(reader); + case .Memory_Arg { + read_uleb128(reader); + read_uleb128(reader); + } + case .Index_Then_Zero_Byte { + read_uleb128(reader); + io.read_byte(reader); + } + case .Two_Zero_Bytes { + io.read_byte(reader); + io.read_byte(reader); + } + case .Two_Indicies { + read_uleb128(reader); + read_uleb128(reader); + } + case .Signed_Leb do read_sleb128(reader); + case .Unsigned_Leb do read_uleb128(reader); + case .Float32 do io.skip_bytes(reader, 4); + case .Float64 do io.skip_bytes(reader, 8); + case .Branch_Table { + parse_vector(reader, binary, read_label); + read_label(reader, binary); + + read_label :: (reader: ^io.Reader, binary: ^WasmBinary) -> u32 { + return cast(u32) read_uleb128(reader); + } + } + } + + if current_block_depth != null do *current_block_depth = block_depth; + + return instr; +} \ No newline at end of file diff --git a/modules/wasm_utils/module.onyx b/modules/wasm_utils/module.onyx index e9111c91..cfb1361b 100644 --- a/modules/wasm_utils/module.onyx +++ b/modules/wasm_utils/module.onyx @@ -9,8 +9,10 @@ package wasm_utils #load "./types" #load "./utils" #load "./parser" +#load "./instructions" #private map :: package core.map #private io :: package core.io #private hash :: package core.hash #private memory :: package core.memory +#private iter :: package core.iter \ No newline at end of file diff --git a/modules/wasm_utils/parser.onyx b/modules/wasm_utils/parser.onyx index 8f3b5a9a..de69c652 100644 --- a/modules/wasm_utils/parser.onyx +++ b/modules/wasm_utils/parser.onyx @@ -174,6 +174,10 @@ parse_global_section :: (use bin: ^WasmBinary, allocator := context.allocator) - read_global :: (reader: ^io.Reader, bin: ^WasmBinary) -> WasmGlobal { type := read_val_type(reader, bin); mutable := io.read_byte(reader) == 1; + + initial_value := parse_instruction(reader, bin); + assert(io.read_byte(reader) == ~~0x0B, "Expected '0x0B' after constant expression"); + return .{ type, mutable }; } } @@ -193,7 +197,10 @@ parse_element_section :: (use bin: ^WasmBinary, allocator := context.allocator) read_element :: (reader: ^io.Reader, bin: ^WasmBinary) -> WasmElement { table_index := read_uleb128(reader); - offset := parse_const_uint32(reader, bin); + + offset := parse_instruction(reader, bin); + assert(io.read_byte(reader) == ~~0x0B, "Expected '0x0B' after constant expression"); + funcs := parse_vector(reader, bin, read_function_index); return .{ ~~table_index, offset, funcs }; } @@ -218,7 +225,9 @@ parse_data_section :: (use bin: ^WasmBinary, allocator := context.allocator) -> read_data :: (reader: ^io.Reader, bin: ^WasmBinary) -> WasmData { memory_index := read_uleb128(reader); - offset := parse_const_uint32(reader, bin); + + offset := parse_instruction(reader, bin); + assert(io.read_byte(reader) == ~~0x0B, "Expected '0x0B' after constant expression"); size := read_uleb128(reader); _, pos := io.stream_tell(reader.stream); @@ -328,7 +337,14 @@ read_val_type :: (reader: ^io.Reader, binary: ^WasmBinary) -> WasmValueType { case 125 do return .F32; case 124 do return .F64; case 123 do return .V128; - case #default do assert(false, "Bad wasm value type"); + case #default { + conv :: package core.conv + + buf : [256] u8; + _, loc := io.stream_tell(reader.stream); + s := conv.str_format("Bad wasm value type {} at {x}", ~~buf, cast(i32) byte, loc); + assert(false, s); + } } return ~~0; diff --git a/modules/wasm_utils/types.onyx b/modules/wasm_utils/types.onyx index d9cc4279..dfe66578 100644 --- a/modules/wasm_utils/types.onyx +++ b/modules/wasm_utils/types.onyx @@ -102,13 +102,13 @@ WasmGlobal :: struct { WasmElement :: struct { table_index : u32; - offset : u32; + offset : WasmInstruction; funcs : [] u32; } WasmData :: struct { memory_index : u32; - offset : u32; + offset : WasmInstruction; data : [] u8; } @@ -176,15 +176,15 @@ parse_sections :: (use bin: ^WasmBinary, allocator := context.allocator) -> Wasm } free_sections :: (use sections: ^WasmSections) { - raw_free(allocator, type_section.data); - raw_free(allocator, import_section.data); - raw_free(allocator, export_section.data); - raw_free(allocator, function_section.data); - raw_free(allocator, memory_section.data); - raw_free(allocator, table_section.data); - raw_free(allocator, global_section.data); - raw_free(allocator, code_section.data); - raw_free(allocator, data_section.data); + if type_section.data != null do raw_free(allocator, type_section.data); + if import_section.data != null do raw_free(allocator, import_section.data); + if export_section.data != null do raw_free(allocator, export_section.data); + if function_section.data != null do raw_free(allocator, function_section.data); + if memory_section.data != null do raw_free(allocator, memory_section.data); + if table_section.data != null do raw_free(allocator, table_section.data); + if global_section.data != null do raw_free(allocator, global_section.data); + if code_section.data != null do raw_free(allocator, code_section.data); + if data_section.data != null do raw_free(allocator, data_section.data); } diff --git a/src/onyxchecker.c b/src/onyxchecker.c index 7476fc32..b3087ed8 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -430,6 +430,8 @@ CheckStatus check_call(AstCall* call) { // which can be multiple if we have to yield on a callee's type. arguments_clone(&call->original_args, &call->args); + while (call->callee->kind == Ast_Kind_Alias) call->callee = ((AstAlias *) call->callee)->alias; + if (call->callee->kind == Ast_Kind_Overloaded_Function) { AstTyped* new_callee = find_matching_overload_by_arguments(((AstOverloadedFunction *) call->callee)->overloads, &call->args); if (new_callee == NULL) { -- 2.25.1