From 8398213ca500d2d707ab0d263f593bfc5363096c Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 15 Jun 2020 11:02:31 -0500 Subject: [PATCH] GENERATING A WORKING BINARY! --- onyx | Bin 136304 -> 141488 bytes progs/minimal.onyx | 6 +-- src/onyxparser.c | 10 ++-- src/onyxwasm.c | 128 ++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 130 insertions(+), 14 deletions(-) diff --git a/onyx b/onyx index eb95d4a86bb1df2067243c148fd329359f830082..532e9c8dca6cd6f33c97a34c8a62fb2c9bacbc7a 100755 GIT binary patch delta 40880 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 SE-{NLf9zq2cDRn1&HM-TgE7kh delta 38002 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 diff --git a/progs/minimal.onyx b/progs/minimal.onyx index 1f1f75f5..ba83edb0 100644 --- a/progs/minimal.onyx +++ b/progs/minimal.onyx @@ -7,7 +7,7 @@ export foo :: proc (foo i32, bar i32) -> i32 { return 10 as i32; } -export diff_square :: proc (a i32, b i32) -> i64 { +export diff_square :: proc (a i32, b i32) -> i32 { // Typechecked c := a - b; // Mutable d :: a + b; // Constant @@ -16,7 +16,7 @@ export diff_square :: proc (a i32, b i32) -> i64 { f :: 10; }; - return (c * d) as i64; + return (c * d) as i32; } -export dummy :: proc () -> void { } +export dummy :: proc () { } diff --git a/src/onyxparser.c b/src/onyxparser.c index c271c0f6..00530182 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -583,10 +583,14 @@ static OnyxAstNodeFuncDef* parse_function_definition(OnyxParser* parser) { OnyxAstNodeParam* params = parse_function_params(parser); func_def->params = params; - expect(parser, TOKEN_TYPE_RIGHT_ARROW); + if (parser->curr_token->type == TOKEN_TYPE_RIGHT_ARROW) { + expect(parser, TOKEN_TYPE_RIGHT_ARROW); - OnyxTypeInfo* return_type = parse_type(parser); - func_def->return_type = return_type; + OnyxTypeInfo* return_type = parse_type(parser); + func_def->return_type = return_type; + } else { + func_def->return_type = &builtin_types[ONYX_TYPE_INFO_KIND_VOID]; + } for (OnyxAstNodeParam* p = func_def->params; p != NULL; p = p->next) { insert_identifier(parser, (OnyxAstNode *) p, 0); diff --git a/src/onyxwasm.c b/src/onyxwasm.c index b719acbe..35aabd43 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -205,7 +205,6 @@ static WasmType onyx_type_to_wasm_type(OnyxTypeInfo* type) { if (type->size == 8) return WASM_TYPE_FLOAT64; } - // TODO: Should produce an error message if this isn't successful return WASM_TYPE_VOID; } @@ -458,9 +457,14 @@ static void process_function_definition(OnyxWasmModule* mod, OnyxAstNodeFuncDef* WasmFunc wasm_func = { .type_idx = type_idx, + .locals = { + .i32_count = 0, + .i64_count = 0, + .f32_count = 0, + .f64_count = 0, + }, .code = NULL, }; - bh_arr_push(mod->funcs, wasm_func); i32 func_idx = mod->next_func_idx++; if (fd->flags & ONYX_AST_FLAG_EXPORTED) { @@ -487,13 +491,31 @@ static void process_function_definition(OnyxWasmModule* mod, OnyxAstNodeFuncDef* onyx_token_null_toggle(*param->token); } - forll (OnyxAstNodeLocal, local, fd->body->scope->last_local, prev_local) { - onyx_token_null_toggle(*local->token); - bh_hash_put(i32, mod->local_map, local->token->token, localidx++); - onyx_token_null_toggle(*local->token); + static const WasmType local_types[4] = { WASM_TYPE_INT32, WASM_TYPE_INT64, WASM_TYPE_FLOAT32, WASM_TYPE_FLOAT64 }; + + // HACK: This assumes that the order of the count members + // is the same as the order of the local_types above + u8* count = &wasm_func.locals.i32_count; + fori (ti, 0, 3) { + forll (OnyxAstNodeLocal, local, fd->body->scope->last_local, prev_local) { + if (onyx_type_to_wasm_type(local->type) == local_types[ti]) { + onyx_token_null_toggle(*local->token); + bh_hash_put(i32, mod->local_map, local->token->token, localidx++); + onyx_token_null_toggle(*local->token); + + (*count)++; + } + } + + count++; } + bh_printf("\nLocals for function: %b\n", fd->token->token, fd->token->length); + bh_printf("\tI32 count: %d\n", wasm_func.locals.i32_count); + bh_printf("\tI64 count: %d\n", wasm_func.locals.i64_count); + bh_printf("\tF32 count: %d\n", wasm_func.locals.f32_count); + bh_printf("\tF64 count: %d\n", wasm_func.locals.f64_count); bh_hash_each_start(i32, mod->local_map); bh_printf("\t%s -> %d\n", key, value); bh_hash_each_end; @@ -506,6 +528,8 @@ static void process_function_definition(OnyxWasmModule* mod, OnyxAstNodeFuncDef* bh_printf("\t%s\t%xd\n", wi_string(instr->type), instr->data.i1); } + bh_arr_push(mod->funcs, wasm_func); + // NOTE: Clear the local map on exit of generating this function bh_hash_clear(mod->local_map); } @@ -695,6 +719,93 @@ static i32 output_exportsection(OnyxWasmModule* module, bh_buffer* buff) { return buff->length - prev_len; } +static i32 output_locals(WasmFunc* func, bh_buffer* buff) { + i32 prev_len = buff->length; + + // NOTE: Output vector length + i32 total_locals = + (i32) (func->locals.i32_count != 0) + + (i32) (func->locals.i64_count != 0) + + (i32) (func->locals.f32_count != 0) + + (i32) (func->locals.f64_count != 0); + + i32 leb_len; + u8* leb = uint_to_uleb128((u64) total_locals, &leb_len); + bh_buffer_append(buff, leb, leb_len); + + if (func->locals.i32_count != 0) { + leb = uint_to_uleb128((u64) func->locals.i32_count, &leb_len); + bh_buffer_append(buff, leb, leb_len); + bh_buffer_write_byte(buff, WASM_TYPE_INT32); + } + if (func->locals.i64_count != 0) { + leb = uint_to_uleb128((u64) func->locals.i64_count, &leb_len); + bh_buffer_append(buff, leb, leb_len); + bh_buffer_write_byte(buff, WASM_TYPE_INT64); + } + if (func->locals.f32_count != 0) { + leb = uint_to_uleb128((u64) func->locals.f32_count, &leb_len); + bh_buffer_append(buff, leb, leb_len); + bh_buffer_write_byte(buff, WASM_TYPE_FLOAT32); + } + if (func->locals.f64_count != 0) { + leb = uint_to_uleb128((u64) func->locals.f64_count, &leb_len); + bh_buffer_append(buff, leb, leb_len); + bh_buffer_write_byte(buff, WASM_TYPE_FLOAT64); + } + + return buff->length - prev_len; +} + +static void output_instruction(WasmInstruction* instr, bh_buffer* buff) { + i32 leb_len; + u8* leb; + switch (instr->type) { + case WI_LOCAL_GET: + case WI_LOCAL_SET: + bh_buffer_write_byte(buff, (u8) instr->type); + leb = uint_to_uleb128((u64) instr->data.i1, &leb_len); + bh_buffer_append(buff, leb, leb_len); + break; + + case WI_BLOCK_START: + bh_buffer_write_byte(buff, (u8) instr->type); + leb = uint_to_uleb128((u64) instr->data.i1, &leb_len); + bh_buffer_append(buff, leb, leb_len); + break; + + case WI_I32_CONST: + case WI_I64_CONST: + bh_buffer_write_byte(buff, (u8) instr->type); + bh_buffer_write_byte(buff, 0); // TODO: Actually output the literal + break; + + default: + bh_buffer_write_byte(buff, (u8) instr->type); + } +} + +static i32 output_code(WasmFunc* func, bh_buffer* buff) { + + bh_buffer code_buff; + bh_buffer_init(&code_buff, buff->allocator, 128); + + // Output locals + output_locals(func, &code_buff); + + // Output code + bh_arr_each(WasmInstruction, instr, func->code) output_instruction(instr, &code_buff); + + i32 leb_len; + u8* leb = uint_to_uleb128((u64) code_buff.length, &leb_len); + bh_buffer_append(buff, leb, leb_len); + + bh_buffer_concat(buff, code_buff); + bh_buffer_free(&code_buff); + + return 0; +} + static i32 output_codesection(OnyxWasmModule* module, bh_buffer* buff) { i32 prev_len = buff->length; @@ -707,8 +818,9 @@ static i32 output_codesection(OnyxWasmModule* module, bh_buffer* buff) { u8* leb = uint_to_uleb128((u64) bh_arr_length(module->funcs), &leb_len); bh_buffer_append(&vec_buff, leb, leb_len); - bh_arr_each(WasmFunc, func, module->funcs) { - } + // DEBUG_HERE; + + bh_arr_each(WasmFunc, func, module->funcs) output_code(func, &vec_buff); leb = uint_to_uleb128((u64) (vec_buff.length), &leb_len); bh_buffer_append(buff, leb, leb_len); -- 2.25.1