From 1711b7ce950717606dc9e104abb1fe63357f7ac2 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 9 Jun 2020 08:01:20 -0500 Subject: [PATCH] Added exports to WASM Module and other bug fixes --- include/onyxparser.h | 4 ++-- include/onyxwasm.h | 21 ++++++++++++++++--- onyx | Bin 101608 -> 103056 bytes progs/minimal.onyx | 8 ++++++-- src/onyx.c | 47 +++++++++++++++++++++++++++++++++++++++++++ src/onyxparser.c | 5 ----- src/onyxwasm.c | 38 ++++++++++++++++++++++++++++++---- 7 files changed, 107 insertions(+), 16 deletions(-) diff --git a/include/onyxparser.h b/include/onyxparser.h index d61f5b19..f210da90 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -118,7 +118,7 @@ struct OnyxAstNodeLocal { OnyxTypeInfo *type; OnyxAstNodeLocal *prev_local; OnyxAstNode *shadowed; - OnyxAstNode *unused; + ptr unused; }; // NOTE: Needs to have shadowed in the same position as OnyxAstNodeLocal @@ -129,7 +129,7 @@ struct OnyxAstNodeParam { OnyxTypeInfo *type; OnyxAstNodeParam *next; OnyxAstNode *shadowed; - u64 param_count; + ptr unused; }; struct OnyxAstNodeScope { diff --git a/include/onyxwasm.h b/include/onyxwasm.h index e7808e75..feebeddd 100644 --- a/include/onyxwasm.h +++ b/include/onyxwasm.h @@ -6,7 +6,7 @@ #include "onyxparser.h" -typedef char WasmType; +typedef u8 WasmType; extern const WasmType WASM_TYPE_INT32; extern const WasmType WASM_TYPE_INT64; @@ -21,11 +21,23 @@ typedef struct WasmFuncType { WasmType param_types[]; } WasmFuncType; + typedef struct WasmFunc { - i32 idx; i32 type_idx; } WasmFunc; +typedef enum WasmExportKind { + WASM_EXPORT_FUNCTION, + WASM_EXPORT_TABLE, + WASM_EXPORT_MEMORY, + WASM_EXPORT_GLOBAL, +} WasmExportKind; + +typedef struct WasmExport { + WasmExportKind kind; + i32 idx; +} WasmExport; + typedef struct OnyxWasmModule { bh_allocator allocator; @@ -34,10 +46,13 @@ typedef struct OnyxWasmModule { // to the function type index if it has been created. bh_hash(i32) type_map; i32 next_type_idx; - // NOTE: This have to be pointers because the type is variadic in size bh_arr(WasmFuncType*) functypes; + bh_arr(WasmFunc) funcs; + i32 next_func_idx; + + bh_hash(WasmExport) exports; } OnyxWasmModule; OnyxWasmModule onyx_wasm_generate_module(bh_allocator alloc, OnyxAstNode* program); diff --git a/onyx b/onyx index 802912fcda459d7d00a6b0b5bf66102f79dbddfe..4aeca7028e2e568d81dccda14301128053fa197c 100755 GIT binary patch delta 29101 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 delta 27371 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 i32 { return a + b; } +export foo :: proc () -> i32 { + return 10 as i32; +} + export mul :: proc (a i32, b i32) -> i64 { // Typechecked - c: const i64 = ((a as i64) - (b as i64)); + c: const = a - b; // Don't love this syntax, but it's easy to parse so whatever // Inferred type, but constant @@ -14,5 +18,5 @@ export mul :: proc (a i32, b i32) -> i64 { e: i32 = 10 as i32; - return ((c as i32) * d) as i64; + return (c * d) as i64; } diff --git a/src/onyx.c b/src/onyx.c index 20edcb87..731688bb 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -7,6 +7,7 @@ #include "onyxmsgs.h" #include "onyxparser.h" #include "onyxutils.h" +#include "onyxwasm.h" int main(int argc, char *argv[]) { bh_file source_file; @@ -59,7 +60,53 @@ int main(int argc, char *argv[]) { bh_printf("\nNo errors.\n"); } + OnyxWasmModule wasm_mod = onyx_wasm_generate_module(alloc, program); +#if 1 + // NOTE: Ensure type table made correctly + + bh_printf("Type map:\n"); + bh_hash_iterator type_map_it = bh_hash_iter_setup(i32, wasm_mod.type_map); + while (bh_hash_iter_next(&type_map_it)) { + const char* key = bh_hash_iter_key(type_map_it); + i32 value = bh_hash_iter_value(i32, type_map_it); + + bh_printf("%s -> %d\n", key, value); + } + + bh_printf("Type list:\n"); + WasmFuncType** func_type = wasm_mod.functypes; + while (!bh_arr_end(wasm_mod.functypes, func_type)) { + for (int p = 0; p < (*func_type)->param_count; p++) { + bh_printf("%c ", (*func_type)->param_types[p]); + } + bh_printf("-> "); + bh_printf("%c\n", (*func_type)->return_type); + + func_type++; + } +#endif + +#if 1 + // NOTE: Ensure the export table was built correctly + + bh_printf("Function types:\n"); + for (WasmFunc* func_it = wasm_mod.funcs; !bh_arr_end(wasm_mod.funcs, func_it); func_it++) { + bh_printf("%d\n", func_it->type_idx); + } + + bh_printf("Exports:\n"); + bh_hash_iterator export_it = bh_hash_iter_setup(WasmExport, wasm_mod.exports); + while (bh_hash_iter_next(&export_it)) { + const char* key = bh_hash_iter_key(export_it); + WasmExport value = bh_hash_iter_value(WasmExport, export_it); + + bh_printf("%s: %d %d\n", key, value.kind, value.idx); + } +#endif + + + onyx_wasm_module_free(&wasm_mod); main_exit: // NOTE: Cleanup, since C doesn't have defer bh_arena_free(&msg_arena); bh_arena_free(&ast_arena); diff --git a/src/onyxparser.c b/src/onyxparser.c index 103d8e3c..646e6e06 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -544,15 +544,12 @@ static OnyxAstNodeParam* parse_function_params(OnyxParser* parser) { } OnyxAstNodeParam* first_param = NULL; - u64 param_count = 0; - OnyxAstNodeParam* curr_param = NULL; OnyxAstNodeParam* trailer = NULL; OnyxToken* symbol; while (parser->curr_token->type != TOKEN_TYPE_CLOSE_PAREN) { if (parser->curr_token->type == TOKEN_TYPE_SYM_COMMA) parser_next_token(parser); - param_count++; symbol = expect(parser, TOKEN_TYPE_SYMBOL); @@ -568,8 +565,6 @@ static OnyxAstNodeParam* parse_function_params(OnyxParser* parser) { trailer = curr_param; } - first_param->param_count = param_count; - parser_next_token(parser); // Skip the ) return first_param; } diff --git a/src/onyxwasm.c b/src/onyxwasm.c index ab9d3497..c0b91ad2 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -1,23 +1,31 @@ #include "onyxwasm.h" +// NOTE: Allows easier testing of types since most of the characters +// corresponding to these values are not printable +#if 0 const WasmType WASM_TYPE_INT32 = 0x7F; const WasmType WASM_TYPE_INT64 = 0x7E; const WasmType WASM_TYPE_FLOAT32 = 0x7D; const WasmType WASM_TYPE_FLOAT64 = 0x7C; +#else +const WasmType WASM_TYPE_INT32 = 'A'; +const WasmType WASM_TYPE_INT64 = 'B'; +const WasmType WASM_TYPE_FLOAT32 = 'C'; +const WasmType WASM_TYPE_FLOAT64 = 'D'; +#endif static WasmType onyx_type_to_wasm_type(OnyxTypeInfo* type) { if (type->is_bool) return WASM_TYPE_INT32; - if (type->is_int) { + else if (type->is_int) { if (type->size == 4) return WASM_TYPE_INT32; if (type->size == 8) return WASM_TYPE_INT64; } - if (type->is_float) { + else if (type->is_float) { if (type->size == 4) return WASM_TYPE_FLOAT32; if (type->size == 8) return WASM_TYPE_FLOAT64; } // TODO: Should produce an error message if this isn't successful - // TODO: Also, this should be able to handle a "void" type return WASM_TYPE_INT32; } @@ -59,6 +67,24 @@ static void process_function_definition(OnyxWasmModule* mod, OnyxAstNodeFuncDef* type_idx = mod->next_type_idx; mod->next_type_idx++; } + + WasmFunc wasm_func = { + .type_idx = type_idx + }; + bh_arr_push(mod->funcs, wasm_func); + i32 func_idx = mod->next_func_idx++; + + if (fd->flags & ONYX_AST_FLAG_EXPORTED) { + onyx_token_null_toggle(*fd->token); + + WasmExport wasm_export = { + .kind = WASM_EXPORT_FUNCTION, + .idx = func_idx, + }; + bh_hash_put(WasmExport, mod->exports, fd->token->token, wasm_export); + + onyx_token_null_toggle(*fd->token); + } } OnyxWasmModule onyx_wasm_generate_module(bh_allocator alloc, OnyxAstNode* program) { @@ -67,15 +93,19 @@ OnyxWasmModule onyx_wasm_generate_module(bh_allocator alloc, OnyxAstNode* progra .type_map = NULL, .next_type_idx = 0, - .functypes = NULL, + .funcs = NULL, + .next_func_idx = 0, + + .exports = NULL, }; bh_arr_new(alloc, module.functypes, 4); bh_arr_new(alloc, module.funcs, 4); bh_hash_init(bh_heap_allocator(), module.type_map); + bh_hash_init(bh_heap_allocator(), module.exports); OnyxAstNode* walker = program; while (walker) { -- 2.25.1