From b98ecb14b2c37b9ab2f9d3b6ac13f2e425a511ee Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 9 Oct 2020 23:06:46 -0500 Subject: [PATCH] BIG CHANGES TO COMPILER ARCHITECTURE; using entity pumping system --- Makefile | 1 + include/onyxastnodes.h | 42 ++++++- include/onyxsempass.h | 10 +- include/onyxwasm.h | 5 +- onyx | Bin 497788 -> 495340 bytes src/onyx.c | 252 ++++++++++++++++++++++------------------- src/onyxchecker.c | 75 ++++++------ src/onyxentities.c | 78 +++++++++++++ src/onyxparser.c | 16 ++- src/onyxsempass.c | 23 +--- src/onyxsymres.c | 51 ++++----- src/onyxutils.c | 21 ++-- src/onyxwasm.c | 157 +++++++++++++------------ 13 files changed, 422 insertions(+), 309 deletions(-) create mode 100644 src/onyxentities.c diff --git a/Makefile b/Makefile index b073230e..65688706 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ OBJ_FILES=\ build/onyxclone.o \ build/onyxtypes.o \ build/onyxbuiltins.o \ + build/onyxentities.o \ build/onyxsempass.o \ build/onyxsymres.o \ build/onyxchecker.o \ diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index 11995de3..e3ee250f 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -608,7 +608,7 @@ struct AstTypeRawAlias { AstType_base; Type* to; }; // Top level nodes struct AstBinding { AstTyped_base; AstNode* node; }; struct AstMemRes { AstTyped_base; u64 addr; AstTyped *initial_value; }; -struct AstInclude { AstNode_base; OnyxToken *name; }; +struct AstInclude { AstNode_base; char* name; }; struct AstUsePackage { AstNode_base; @@ -691,10 +691,26 @@ struct AstPackage { Package* package; }; +typedef enum EntityState { + Entity_State_Error, + + Entity_State_Parse_Builtin, + Entity_State_Parse, + Entity_State_Resolve_Symbols, + Entity_State_Check_Types, + Entity_State_Code_Gen, + Entity_State_Finalized, + + Entity_State_Count, +} EntityState; + // NOTE: An Entity represents something will need to be // processed later down the pipeline. typedef enum EntityType { Entity_Type_Unknown, + + Entity_Type_Include_Folder, + Entity_Type_Include_File, Entity_Type_Use_Package, Entity_Type_String_Literal, Entity_Type_File_Contents, @@ -703,20 +719,25 @@ typedef enum EntityType { Entity_Type_Memory_Reservation, Entity_Type_Polymorphic_Proc, Entity_Type_Foreign_Function_Header, + Entity_Type_Foreign_Global_Header, Entity_Type_Function_Header, Entity_Type_Global_Header, Entity_Type_Expression, Entity_Type_Global, Entity_Type_Overloaded_Function, Entity_Type_Function, + + Entity_Type_Count, } EntityType; typedef struct Entity { EntityType type; + EntityState state; Package *package; Scope *scope; union { + AstInclude *include; AstUsePackage *use_package; AstFunction *function; AstOverloadedFunction *overloaded_function; @@ -731,6 +752,21 @@ typedef struct Entity { }; } Entity; +typedef struct EntityHeap { + bh_arr(Entity) entities; + + i32 state_count[Entity_State_Count]; +} EntityHeap; + +void entity_heap_insert(EntityHeap* entities, Entity e); +Entity entity_heap_top(EntityHeap* entities); +void entity_heap_change_top(EntityHeap* entities, Entity new_top); +void entity_heap_remove_top(EntityHeap* entities); + +void symres_entity(Entity* ent); +void check_entity(Entity* ent); +void emit_entity(Entity* ent); + struct Package { char *name; @@ -743,13 +779,11 @@ typedef struct ProgramInfo { Scope *global_scope; bh_table(Package *) packages; - bh_arr(Entity) entities; + EntityHeap entities; u32 foreign_global_count; } ProgramInfo; -i32 sort_entities(const void* e1, const void* e2); - // NOTE: Basic internal types constructed in the parser extern AstBasicType basic_type_void; extern AstBasicType basic_type_bool; diff --git a/include/onyxsempass.h b/include/onyxsempass.h index d5af9acf..9293353b 100644 --- a/include/onyxsempass.h +++ b/include/onyxsempass.h @@ -14,7 +14,6 @@ typedef struct SemState { // NOTE: Used wherever ProgramInfo* program; - bh_arr(Entity) other_entities; // NOTE: Used in symbol resolution phase Package* curr_package; @@ -31,21 +30,14 @@ typedef struct SemState { extern SemState semstate; -// NOTE: Resolving all symbols in the tree -void onyx_resolve_symbols(); - AstType* symres_type(AstType* type); void symres_function(AstFunction* func); -// NOTE: Inferring and checking types in the tree -void onyx_type_check(); - b32 check_expression(AstTyped** expr); b32 check_function_header(AstFunction* func); b32 check_function(AstFunction* func); -// NOTE: Full semantic pass +// TODO: This should be moved elsewhere. void onyx_sempass_init(bh_allocator alloc, bh_allocator node_alloc); -void onyx_sempass(ProgramInfo* program); #endif diff --git a/include/onyxwasm.h b/include/onyxwasm.h index e9dcdaed..a86b140a 100644 --- a/include/onyxwasm.h +++ b/include/onyxwasm.h @@ -531,9 +531,10 @@ typedef struct OnyxWasmModule { u32 next_type_idx; u32 next_func_idx; u32 next_global_idx; - u32 next_foreign_global_idx; u32 next_datum_offset; u32 next_elem_idx; + u32 foreign_function_count; + u32 foreign_global_count; i32 *stack_top_ptr; u64 stack_base_idx; @@ -542,6 +543,8 @@ typedef struct OnyxWasmModule { b32 has_stack_locals : 1; } OnyxWasmModule; +extern OnyxWasmModule global_wasm_module; + OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc); void onyx_wasm_module_compile(OnyxWasmModule* module, ProgramInfo* program); void onyx_wasm_module_free(OnyxWasmModule* module); diff --git a/onyx b/onyx index 77f2b16c3d606c74b7f55fa8039287fb7ad6ceb3..3ff6901b7c8a7deccb05300f89e0af85ac22e438 100755 GIT binary patch delta 93199 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 delta 94388 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 p=AwwXXbJQ{u2HmH`4=r$!BRTFGL%name = filename; + + return include_node; +} + static void compiler_state_init(CompilerState* compiler_state, OnyxCompileOptions* opts) { compiler_state->options = opts; @@ -180,30 +184,46 @@ static void compiler_state_init(CompilerState* compiler_state, OnyxCompileOption bh_arena_init(&compiler_state->sp_arena, opts->allocator, 16 * 1024); compiler_state->sp_alloc = bh_arena_allocator(&compiler_state->sp_arena); - bh_arr_new(opts->allocator, compiler_state->queued_files, 4); + onyx_sempass_init(compiler_state->sp_alloc, compiler_state->ast_alloc); + + // HACK + global_wasm_module = onyx_wasm_module_create(compiler_state->options->allocator); - bh_arr_push(compiler_state->queued_files, lookup_included_file(compiler_state, "core/builtin")); + entity_heap_insert(&compiler_state->prog_info.entities, ((Entity) { + .state = Entity_State_Parse_Builtin, + .type = Entity_Type_Include_File, + .package = NULL, + .include = create_include_file(compiler_state->sp_alloc, "core/builtin"), + })); // NOTE: Add all files passed by command line to the queue - bh_arr_each(const char *, filename, opts->files) - bh_arr_push(compiler_state->queued_files, (char *) *filename); + bh_arr_each(const char *, filename, opts->files) { + entity_heap_insert(&compiler_state->prog_info.entities, ((Entity) { + .state = Entity_State_Parse, + .type = Entity_Type_Include_File, + .package = NULL, + .include = create_include_file(compiler_state->sp_alloc, (char *) *filename), + })); + } } static void compiler_state_free(CompilerState* cs) { bh_arena_free(&cs->ast_arena); bh_arena_free(&cs->sp_arena); bh_table_free(cs->loaded_files); - onyx_wasm_module_free(&cs->wasm_mod); } - - +// NOTE: This should not be called until immediately before using the return value. +// This function can return a static variable which will change if this is called +// another time. -brendanfh 2020/10/09 static char* lookup_included_file(CompilerState* cs, char* filename) { static char path[256]; - fori (i, 0, 256) path[i] = 0; + fori (i, 0, 256) + path[i] = 0; static char fn[128]; fori (i, 0, 128) fn[i] = 0; + if (!bh_str_ends_with(filename, ".onyx")) { bh_snprintf(fn, 128, "%s.onyx", filename); } else { @@ -239,17 +259,16 @@ static ParseResults parse_source_file(CompilerState* compiler_state, bh_file_con static void merge_parse_results(CompilerState* compiler_state, ParseResults* results) { bh_arr_each(AstInclude *, include, results->includes) { - if ((*include)->kind == Ast_Kind_Include_File) { - token_toggle_end((*include)->name); - char* filename = lookup_included_file(compiler_state, (*include)->name->text); - token_toggle_end((*include)->name); - - char* formatted_name = bh_strdup(global_heap_allocator, filename); - bh_arr_push(compiler_state->queued_files, formatted_name); - } else if ((*include)->kind == Ast_Kind_Include_Folder) { - const char* folder = bh_aprintf(global_heap_allocator, "%b", (*include)->name->text, (*include)->name->length); - bh_arr_push(compiler_state->options->included_folders, folder); - } + EntityType et = Entity_Type_Include_File; + if ((*include)->kind == Ast_Kind_Include_Folder) + et = Entity_Type_Include_Folder; + + entity_heap_insert(&compiler_state->prog_info.entities, (Entity) { + .state = Entity_State_Parse, + .type = et, + .scope = NULL, + .include = *include, + }); } Entity ent; @@ -257,6 +276,7 @@ static void merge_parse_results(CompilerState* compiler_state, ParseResults* res AstNode* node = n->node; AstKind nkind = node->kind; + ent.state = Entity_State_Resolve_Symbols; ent.package = n->package; ent.scope = n->scope; @@ -265,16 +285,16 @@ static void merge_parse_results(CompilerState* compiler_state, ParseResults* res if ((node->flags & Ast_Flag_Foreign) != 0) { ent.type = Entity_Type_Foreign_Function_Header; ent.function = (AstFunction *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); } else { ent.type = Entity_Type_Function_Header; ent.function = (AstFunction *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); ent.type = Entity_Type_Function; ent.function = (AstFunction *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); } break; } @@ -282,32 +302,39 @@ static void merge_parse_results(CompilerState* compiler_state, ParseResults* res case Ast_Kind_Overloaded_Function: { ent.type = Entity_Type_Overloaded_Function; ent.overloaded_function = (AstOverloadedFunction *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } case Ast_Kind_Global: { - ent.type = Entity_Type_Global_Header; - ent.global = (AstGlobal *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + if ((node->flags & Ast_Flag_Foreign) != 0) { + ent.type = Entity_Type_Foreign_Global_Header; + ent.global = (AstGlobal *) node; + entity_heap_insert(&compiler_state->prog_info.entities, ent); - ent.type = Entity_Type_Global; - ent.global = (AstGlobal *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + } else { + ent.type = Entity_Type_Global_Header; + ent.global = (AstGlobal *) node; + entity_heap_insert(&compiler_state->prog_info.entities, ent); + + ent.type = Entity_Type_Global; + ent.global = (AstGlobal *) node; + entity_heap_insert(&compiler_state->prog_info.entities, ent); + } break; } case Ast_Kind_StrLit: { ent.type = Entity_Type_String_Literal; ent.strlit = (AstStrLit *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } case Ast_Kind_File_Contents: { ent.type = Entity_Type_File_Contents; ent.file_contents = (AstFileContents *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } @@ -316,42 +343,42 @@ static void merge_parse_results(CompilerState* compiler_state, ParseResults* res case Ast_Kind_Poly_Struct_Type: { ent.type = Entity_Type_Type_Alias; ent.type_alias = (AstType *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } case Ast_Kind_Enum_Type: { ent.type = Entity_Type_Enum; ent.enum_type = (AstEnumType *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } case Ast_Kind_Use_Package: { ent.type = Entity_Type_Use_Package; ent.use_package = (AstUsePackage *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } case Ast_Kind_Memres: { ent.type = Entity_Type_Memory_Reservation; ent.mem_res = (AstMemRes *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } case Ast_Kind_Polymorphic_Proc: { ent.type = Entity_Type_Polymorphic_Proc; ent.poly_proc = (AstPolyProc *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } default: { ent.type = Entity_Type_Expression; ent.expr = (AstTyped *) node; - bh_arr_push(compiler_state->prog_info.entities, ent); + entity_heap_insert(&compiler_state->prog_info.entities, ent); break; } } @@ -369,7 +396,8 @@ static CompilerProgress process_source_file(CompilerState* compiler_state, char* bh_file_error err = bh_file_open(&file, filename); if (err != BH_FILE_ERROR_NONE) { - bh_printf_err("Failed to open file %s\n", filename); + // bh_printf_err("Failed to open file %s\n", filename); + onyx_report_error((OnyxFilePos) { 0 }, "Failed to open file %s\n", filename); return ONYX_COMPILER_PROGRESS_FAILED_READ; } @@ -407,98 +435,90 @@ static CompilerProgress process_source_file(CompilerState* compiler_state, char* } } +static b32 process_include_entity(CompilerState* compiler_state, Entity* ent) { + assert(ent->type == Entity_Type_Include_File || ent->type == Entity_Type_Include_Folder); + AstInclude* include = ent->include; -static i32 onyx_compile(CompilerState* compiler_state) { + if (include->kind == Ast_Kind_Include_File) { + char* filename = lookup_included_file(compiler_state, include->name); -#ifdef REPORT_TIMES - timer_stack_push("Parsing"); -#endif + char* formatted_name = bh_strdup(global_heap_allocator, filename); + process_source_file(compiler_state, formatted_name); - // NOTE: While the queue is not empty, process the next file - while (!bh_arr_is_empty(compiler_state->queued_files)) { - CompilerProgress result = process_source_file(compiler_state, (char *) compiler_state->queued_files[0]); + } else if (include->kind == Ast_Kind_Include_Folder) { + bh_arr_push(compiler_state->options->included_folders, include->name); + } - if (result != ONYX_COMPILER_PROGRESS_SUCCESS) - return result; + return 1; +} - bh_arr_fastdelete(compiler_state->queued_files, 0); - } +static b32 process_entity(CompilerState* compiler_state, Entity* ent) { + i32 changed = 1; -#ifdef REPORT_TIMES - timer_stack_pop(); - - timer_stack_push("Checking semantics"); - timer_stack_push("Initializing builtins"); -#endif + switch (ent->state) { + case Entity_State_Parse_Builtin: + case Entity_State_Parse: + process_include_entity(compiler_state, ent); + ent->state = Entity_State_Finalized; + break; - initialize_builtins(compiler_state->ast_alloc, &compiler_state->prog_info); - if (onyx_has_errors()) { - return ONYX_COMPILER_PROGRESS_FAILED_SEMPASS; + case Entity_State_Resolve_Symbols: symres_entity(ent); break; + case Entity_State_Check_Types: check_entity(ent); break; + case Entity_State_Code_Gen: emit_entity(ent); break; + + default: + changed = 0; } - // Add builtin one-time entities - bh_arr_push(compiler_state->prog_info.entities, ((Entity) { - .type = Entity_Type_Global_Header, - .global = &builtin_stack_top - })); - bh_arr_push(compiler_state->prog_info.entities, ((Entity) { - .type = Entity_Type_Global, - .global = &builtin_stack_top - })); + return changed; +} - qsort(compiler_state->prog_info.entities, - bh_arr_length(compiler_state->prog_info.entities), - sizeof(Entity), - sort_entities); -#ifdef REPORT_TIMES - timer_stack_pop(); -#endif +static i32 onyx_compile(CompilerState* compiler_state) { + { + entity_heap_insert(&compiler_state->prog_info.entities, ((Entity) { + .state = Entity_State_Resolve_Symbols, + .type = Entity_Type_Global_Header, + .global = &builtin_stack_top + })); + entity_heap_insert(&compiler_state->prog_info.entities, ((Entity) { + .state = Entity_State_Resolve_Symbols, + .type = Entity_Type_Global, + .global = &builtin_stack_top + })); - // NOTE: Check types and semantic rules - if (compiler_state->options->verbose_output) - bh_printf("[Checking semantics]\n"); + Entity ent = entity_heap_top(&compiler_state->prog_info.entities); + assert(ent.state == Entity_State_Parse_Builtin); + DEBUG_HERE; - onyx_sempass_init(compiler_state->sp_alloc, compiler_state->ast_alloc); - onyx_sempass(&compiler_state->prog_info); + process_entity(compiler_state, &ent); -#ifdef REPORT_TIMES - timer_stack_pop(); -#endif + if (onyx_has_errors()) return ONYX_COMPILER_PROGRESS_ERROR; - if (onyx_has_errors()) { - return ONYX_COMPILER_PROGRESS_FAILED_SEMPASS; - } + entity_heap_remove_top(&compiler_state->prog_info.entities); - if (compiler_state->options->action == ONYX_COMPILE_ACTION_DOCUMENT) { - OnyxDocumentation docs = onyx_docs_generate(&compiler_state->prog_info); - docs.format = Doc_Format_Tags; - onyx_docs_emit(&docs); + initialize_builtins(compiler_state->ast_alloc, &compiler_state->prog_info); - return ONYX_COMPILER_PROGRESS_SUCCESS; + semstate.program = &compiler_state->prog_info; } - // NOTE: Generate WASM instructions - if (compiler_state->options->verbose_output) - bh_printf("[Generating WASM]\n"); + while (!bh_arr_is_empty(compiler_state->prog_info.entities.entities)) { + Entity ent = entity_heap_top(&compiler_state->prog_info.entities); + b32 changed = process_entity(compiler_state, &ent); -#ifdef REPORT_TIMES - timer_stack_push("Code generation"); - timer_stack_push("Generating WASM"); -#endif - - compiler_state->wasm_mod = onyx_wasm_module_create(compiler_state->options->allocator); - onyx_wasm_module_compile(&compiler_state->wasm_mod, &compiler_state->prog_info); + if (onyx_has_errors()) { + return ONYX_COMPILER_PROGRESS_ERROR; + } - if (onyx_has_errors()) { - return ONYX_COMPILER_PROGRESS_FAILED_BINARY_GEN; + if (changed) { + if (ent.state == Entity_State_Finalized) { + entity_heap_remove_top(&compiler_state->prog_info.entities); + } else { + entity_heap_change_top(&compiler_state->prog_info.entities, ent); + } + } } -#ifdef REPORT_TIMES - timer_stack_pop(); - timer_stack_push("Write to file"); -#endif - // NOTE: Output to file bh_file output_file; if (bh_file_create(&output_file, compiler_state->options->target_file) != BH_FILE_ERROR_NONE) { @@ -508,12 +528,7 @@ static i32 onyx_compile(CompilerState* compiler_state) { if (compiler_state->options->verbose_output) bh_printf("[Writing WASM] %s\n", output_file.filename); - onyx_wasm_module_write_to_file(&compiler_state->wasm_mod, output_file); - -#ifdef REPORT_TIMES - timer_stack_pop(); - timer_stack_pop(); -#endif + onyx_wasm_module_write_to_file(&global_wasm_module, output_file); return ONYX_COMPILER_PROGRESS_SUCCESS; } @@ -553,8 +568,7 @@ int main(int argc, char *argv[]) { break; case ONYX_COMPILER_PROGRESS_FAILED_PARSE: - case ONYX_COMPILER_PROGRESS_FAILED_SEMPASS: - case ONYX_COMPILER_PROGRESS_FAILED_BINARY_GEN: + case ONYX_COMPILER_PROGRESS_ERROR: onyx_errors_print(); break; diff --git a/src/onyxchecker.c b/src/onyxchecker.c index bbd7fcf3..1fcd0e5d 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -1468,55 +1468,44 @@ b32 check_node(AstNode* node) { } } -void onyx_type_check() { - bh_arr_each(Entity, entity, semstate.program->entities) { - switch (entity->type) { - case Entity_Type_Foreign_Function_Header: - case Entity_Type_Function_Header: - if (check_function_header(entity->function)) return; - break; - - case Entity_Type_Function: - if (check_function(entity->function)) return; - break; - - case Entity_Type_Overloaded_Function: - if (check_overloaded_function(entity->overloaded_function)) return; - break; - - case Entity_Type_Global: - if (entity->global->flags & Ast_Flag_Foreign) - semstate.program->foreign_global_count++; - - if (check_global(entity->global)) return; - break; - - case Entity_Type_Expression: - if (check_expression(&entity->expr)) return; - break; - - case Entity_Type_Type_Alias: - if (entity->type_alias->kind == Ast_Kind_Struct_Type) - if (check_struct((AstStructType *) entity->type_alias)) return; - break; +void check_entity(Entity* ent) { + switch (ent->type) { + case Entity_Type_Foreign_Function_Header: + case Entity_Type_Function_Header: + if (check_function_header(ent->function)) return; + break; - case Entity_Type_Memory_Reservation: - if (check_memres(entity->mem_res)) return; - break; + case Entity_Type_Function: + if (check_function(ent->function)) return; + break; - case Entity_Type_Enum: break; + case Entity_Type_Overloaded_Function: + if (check_overloaded_function(ent->overloaded_function)) return; + break; - case Entity_Type_String_Literal: break; + case Entity_Type_Foreign_Global_Header: + semstate.program->foreign_global_count++; + // fallthrough - case Entity_Type_File_Contents: break; + case Entity_Type_Global: + if (check_global(ent->global)) return; + break; - case Entity_Type_Global_Header: break; + case Entity_Type_Expression: + if (check_expression(&ent->expr)) return; + break; - case Entity_Type_Use_Package: break; + case Entity_Type_Type_Alias: + if (ent->type_alias->kind == Ast_Kind_Struct_Type) + if (check_struct((AstStructType *) ent->type_alias)) return; + break; - case Entity_Type_Polymorphic_Proc: break; + case Entity_Type_Memory_Reservation: + if (check_memres(ent->mem_res)) return; + break; - default: DEBUG_HERE; break; - } + default: break; } -} + + ent->state = Entity_State_Code_Gen; +} \ No newline at end of file diff --git a/src/onyxentities.c b/src/onyxentities.c new file mode 100644 index 00000000..55a5a800 --- /dev/null +++ b/src/onyxentities.c @@ -0,0 +1,78 @@ +#include "bh.h" +#include "onyxastnodes.h" +#include "onyxutils.h" + +// NOTE: Returns >0 if e1 should be processed after e2. +static i32 entity_compare(Entity* e1, Entity* e2) { + if (e1->state != e2->state) + return (i32) e1->state - (i32) e2->state; + else + return (i32) e1->type - (i32) e2->type; +} + +#define eh_parent(index) (((index) - 1) / 2) +#define eh_lchild(index) (((index) * 2) + 1) +#define eh_rchild(index) (((index) * 2) + 2) + +static void eh_shift_up(EntityHeap* entities, i32 index) { + while (index > 0 && entity_compare(&entities->entities[eh_parent(index)], &entities->entities[index]) > 0) { + Entity tmp = entities->entities[eh_parent(index)]; + entities->entities[eh_parent(index)] = entities->entities[index]; + entities->entities[index] = tmp; + + index = eh_parent(index); + } +} + +static void eh_shift_down(EntityHeap* entities, i32 index) { + i32 min_index = index; + + i32 l = eh_lchild(index); + if (l < bh_arr_length(entities->entities) + && entity_compare(&entities->entities[l], &entities->entities[min_index]) <= 0) { + min_index = l; + } + + i32 r = eh_rchild(index); + if (r < bh_arr_length(entities->entities) + && entity_compare(&entities->entities[r], &entities->entities[min_index]) <= 0) { + min_index = r; + } + + if (index != min_index) { + Entity tmp = entities->entities[min_index]; + entities->entities[min_index] = entities->entities[index]; + entities->entities[index] = tmp; + + eh_shift_down(entities, min_index); + } +} + +void entity_heap_insert(EntityHeap* entities, Entity e) { + if (entities->entities == NULL) { + bh_arr_new(global_heap_allocator, entities->entities, 128); + } + + bh_arr_push(entities->entities, e); + eh_shift_up(entities, bh_arr_length(entities->entities) - 1); + + entities->state_count[e.state]++; +} + +Entity entity_heap_top(EntityHeap* entities) { + return entities->entities[0]; +} + +void entity_heap_change_top(EntityHeap* entities, Entity new_top) { + entities->state_count[entities->entities[0].state]--; + entities->state_count[new_top.state]--; + + entities->entities[0] = new_top; + eh_shift_down(entities, 0); +} + +void entity_heap_remove_top(EntityHeap* entities) { + entities->entities[0] = entities->entities[bh_arr_length(entities->entities) - 1]; + bh_arr_pop(entities->entities); + eh_shift_down(entities, 0); +} diff --git a/src/onyxparser.c b/src/onyxparser.c index cc389240..64ebfe6c 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -1965,14 +1965,26 @@ static AstNode* parse_top_level_statement(OnyxParser* parser) { if (parse_possible_directive(parser, "include_file")) { AstInclude* include = make_node(AstInclude, Ast_Kind_Include_File); include->token = dir_token; - include->name = expect_token(parser, Token_Type_Literal_String); + + OnyxToken* str_token = expect_token(parser, Token_Type_Literal_String); + if (str_token != NULL) { + token_toggle_end(str_token); + include->name = bh_strdup(parser->allocator, str_token->text); + token_toggle_end(str_token); + } return (AstNode *) include; } else if (parse_possible_directive(parser, "include_folder")) { AstInclude* include = make_node(AstInclude, Ast_Kind_Include_Folder); include->token = dir_token; - include->name = expect_token(parser, Token_Type_Literal_String); + + OnyxToken* str_token = expect_token(parser, Token_Type_Literal_String); + if (str_token != NULL) { + token_toggle_end(str_token); + include->name = bh_strdup(parser->allocator, str_token->text); + token_toggle_end(str_token); + } return (AstNode *) include; } diff --git a/src/onyxsempass.c b/src/onyxsempass.c index 73e33595..3de8b26c 100644 --- a/src/onyxsempass.c +++ b/src/onyxsempass.c @@ -1,3 +1,5 @@ +// TODO: This file has become useless. It should be removed soon. + #define BH_DEBUG #include "onyxsempass.h" #include "onyxutils.h" @@ -13,30 +15,9 @@ void onyx_sempass_init(bh_allocator alloc, bh_allocator node_alloc) { .curr_scope = NULL, .block_stack = NULL, - .other_entities = NULL, .defer_allowed = 1, }; bh_arr_new(global_heap_allocator, semstate.block_stack, 4); - bh_arr_new(global_heap_allocator, semstate.other_entities, 4); -} - -void onyx_sempass(ProgramInfo* program) { - semstate.program = program; - - onyx_resolve_symbols(program); - if (onyx_has_errors()) return; - - onyx_type_check(program); - - if (bh_arr_length(semstate.other_entities) > 0) { - bh_arr_each(Entity, e, semstate.other_entities) - bh_arr_push(semstate.program->entities, *e); - - qsort(semstate.program->entities, bh_arr_length(semstate.program->entities), sizeof(Entity), sort_entities); - bh_arr_clear(semstate.other_entities); - } - - if (onyx_has_errors()) return; } diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 34aa440b..d75a4aae 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -774,33 +774,30 @@ static void symres_polyproc(AstPolyProc* pp) { pp->poly_scope = scope_create(semstate.node_allocator, semstate.curr_scope, pp->token->pos); } -void onyx_resolve_symbols() { +void symres_entity(Entity* ent) { + if (ent->package) { + scope_enter(ent->scope); + semstate.curr_package = ent->package; + } + + switch (ent->type) { + case Entity_Type_Foreign_Function_Header: + case Entity_Type_Function: symres_function(ent->function); break; + + case Entity_Type_Use_Package: symres_use_package(ent->use_package); break; + case Entity_Type_Overloaded_Function: symres_overloaded_function(ent->overloaded_function); break; + case Entity_Type_Global: symres_global(ent->global); break; + case Entity_Type_Expression: symres_expression(&ent->expr); break; + case Entity_Type_Type_Alias: ent->type_alias = symres_type(ent->type_alias); break; + case Entity_Type_Enum: symres_enum(ent->enum_type); break; + case Entity_Type_Memory_Reservation: symres_memres(&ent->mem_res); break; + case Entity_Type_Polymorphic_Proc: symres_polyproc(ent->poly_proc); break; + case Entity_Type_String_Literal: symres_expression(&ent->expr); break; - semstate.curr_scope = semstate.program->global_scope; + default: break; + } - bh_arr_each(Entity, entity, semstate.program->entities) { - if (entity->package) { - scope_enter(entity->scope); - semstate.curr_package = entity->package; - } + ent->state = Entity_State_Check_Types; - switch (entity->type) { - case Entity_Type_Foreign_Function_Header: - case Entity_Type_Function: symres_function(entity->function); break; - - case Entity_Type_Use_Package: symres_use_package(entity->use_package); break; - case Entity_Type_Overloaded_Function: symres_overloaded_function(entity->overloaded_function); break; - case Entity_Type_Global: symres_global(entity->global); break; - case Entity_Type_Expression: symres_expression(&entity->expr); break; - case Entity_Type_Type_Alias: entity->type_alias = symres_type(entity->type_alias); break; - case Entity_Type_Enum: symres_enum(entity->enum_type); break; - case Entity_Type_Memory_Reservation: symres_memres(&entity->mem_res); break; - case Entity_Type_Polymorphic_Proc: symres_polyproc(entity->poly_proc); break; - case Entity_Type_String_Literal: symres_expression(&entity->expr); break; - - default: break; - } - - if (entity->package) scope_leave(); - } -} + if (ent->package) scope_leave(); +} \ No newline at end of file diff --git a/src/onyxutils.c b/src/onyxutils.c index c39768d4..2aa7b5e4 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -101,8 +101,8 @@ void program_info_init(ProgramInfo* prog, bh_allocator alloc) { bh_table_init(alloc, prog->packages, 16); - prog->entities = NULL; - bh_arr_new(alloc, prog->entities, 4); + // NOTE: This will be initialized upon the first call to entity_heap_insert. + prog->entities.entities = NULL; } Package* program_info_package_lookup(ProgramInfo* prog, char* package_name) { @@ -537,8 +537,6 @@ AstFunction* polymorphic_proc_lookup(AstPolyProc* pp, PolyProcLookupMethod pp_lo if (onyx_has_errors()) goto has_error; if (check_function_header(func)) goto has_error; - if (check_function(func)) goto has_error; - if (onyx_has_errors()) goto has_error; goto no_errors; has_error: @@ -549,16 +547,19 @@ has_error: no_errors: semstate.expected_return_type = old_return_type; - bh_arr_push(semstate.other_entities, ((Entity) { + entity_heap_insert(&semstate.program->entities, (Entity) { + .state = Entity_State_Code_Gen, .type = Entity_Type_Function_Header, .function = func, .package = NULL, - })); - bh_arr_push(semstate.other_entities, ((Entity) { + }); + + entity_heap_insert(&semstate.program->entities, (Entity) { + .state = Entity_State_Check_Types, .type = Entity_Type_Function, .function = func, .package = NULL, - })); + }); return func; } @@ -641,7 +642,3 @@ no_errors: return concrete_struct; } - -i32 sort_entities(const void* e1, const void* e2) { - return ((Entity *)e1)->type - ((Entity *)e2)->type; -} diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 3d5acfc1..0a4611b8 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -2,6 +2,8 @@ #include "onyxwasm.h" #include "onyxutils.h" +OnyxWasmModule global_wasm_module; + // NOTE: Allows easier testing of types since most of the characters // corresponding to these values are not printable #if 1 @@ -2666,11 +2668,11 @@ static void emit_function(OnyxWasmModule* mod, AstFunction* fd) { bh_arr_new(mod->allocator, wasm_func.code, 4); + i32 func_idx = (i32) bh_imap_get(&mod->index_map, (u64) fd); + if (fd->flags & Ast_Flag_Exported) { token_toggle_end(fd->exported_name); - i32 func_idx = (i32) bh_imap_get(&mod->index_map, (u64) fd); - WasmExport wasm_export = { .kind = WASM_FOREIGN_FUNCTION, .idx = func_idx, @@ -2734,7 +2736,10 @@ static void emit_function(OnyxWasmModule* mod, AstFunction* fd) { bh_arr_push(wasm_func.code, ((WasmInstruction){ WI_BLOCK_END, 0x00 })); - bh_arr_push(mod->funcs, wasm_func); + // HACK: This is gross + bh_arr_grow(mod->funcs, func_idx - mod->foreign_function_count + 1); + mod->funcs[func_idx - mod->foreign_function_count] = wasm_func; + bh_arr_set_length(mod->funcs, bh_max(bh_arr_length(mod->funcs), func_idx - mod->foreign_function_count + 1)); // NOTE: Clear the local map on exit of generating this function bh_imap_clear(&mod->local_map); @@ -2759,29 +2764,17 @@ static void emit_foreign_function(OnyxWasmModule* mod, AstFunction* fd) { static void emit_global(OnyxWasmModule* module, AstGlobal* global) { WasmType global_type = onyx_type_to_wasm_type(global->type); - if (global->flags & Ast_Flag_Foreign) { - WasmImport import = { - .kind = WASM_FOREIGN_GLOBAL, - .idx = global_type, - .mod = global->foreign_module, - .name = global->foreign_name, - }; - - bh_arr_push(module->imports, import); - return; - } - WasmGlobal glob = { .type = global_type, .mutable = (global->flags & Ast_Flag_Const) == 0, .initial_value = NULL, }; + i32 global_idx = (i32) bh_imap_get(&module->index_map, (u64) global); + if ((global->flags & Ast_Flag_Exported) != 0) { token_toggle_end(global->exported_name); - i32 global_idx = (i32) bh_imap_get(&module->index_map, (u64) global); - WasmExport wasm_export = { .kind = WASM_FOREIGN_GLOBAL, .idx = global_idx, @@ -2803,11 +2796,31 @@ static void emit_global(OnyxWasmModule* module, AstGlobal* global) { default: assert(("Invalid global type", 0)); break; } - bh_arr_push(module->globals, glob); + bh_arr_grow(module->globals, global_idx + 1); + module->globals[global_idx] = glob; + bh_arr_set_length(module->globals, bh_max(bh_arr_length(module->globals), global_idx + 1)); + + bh_arr_grow(module->globals, global_idx - module->foreign_global_count + 1); + module->globals[global_idx - module->foreign_global_count] = glob; + bh_arr_set_length(module->globals, bh_max(bh_arr_length(module->globals), global_idx - module->foreign_global_count + 1)); if (global->flags & Ast_Flag_Global_Stack_Top) - module->stack_top_ptr = &bh_arr_last(module->globals).initial_value[0].data.i1; + module->stack_top_ptr = &module->globals[global_idx].initial_value[0].data.i1; +} + +static void emit_foreign_global(OnyxWasmModule* module, AstGlobal* global) { + WasmType global_type = onyx_type_to_wasm_type(global->type); + + if (global->flags & Ast_Flag_Foreign) { + WasmImport import = { + .kind = WASM_FOREIGN_GLOBAL, + .idx = global_type, + .mod = global->foreign_module, + .name = global->foreign_name, + }; + bh_arr_push(module->imports, import); + } } static void emit_string_literal(OnyxWasmModule* mod, AstStrLit* strlit) { @@ -3025,7 +3038,6 @@ OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc) { .globals = NULL, .next_global_idx = 0, - .next_foreign_global_idx = 0, .data = NULL, .next_datum_offset = 0, @@ -3037,6 +3049,9 @@ OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc) { .stack_top_ptr = NULL, .stack_base_idx = 0, + + .foreign_function_count = 0, + .foreign_global_count = 0, }; bh_arena* eid = bh_alloc(global_heap_allocator, sizeof(bh_arena)); @@ -3066,77 +3081,77 @@ OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc) { bh_arr_new(global_heap_allocator, module.deferred_stmts, 4); - return module; -} - -void onyx_wasm_module_compile(OnyxWasmModule* module, ProgramInfo* program) { - module->next_global_idx = program->foreign_global_count; - WasmExport mem_export = { .kind = WASM_FOREIGN_MEMORY, .idx = 0, }; - bh_table_put(WasmExport, module->exports, "memory", mem_export); - module->export_count++; + bh_table_put(WasmExport, module.exports, "memory", mem_export); + module.export_count++; - bh_arr_each(Entity, entity, program->entities) { + return module; +} - if (module->stack_top_ptr) { - *module->stack_top_ptr = module->next_datum_offset; +void emit_entity(Entity* ent) { + OnyxWasmModule* module = &global_wasm_module; - if (*module->stack_top_ptr % 16 != 0) { - *module->stack_top_ptr += 16 - (*module->stack_top_ptr % 16); - } + if (module->stack_top_ptr) { + *module->stack_top_ptr = module->next_datum_offset; - builtin_heap_start.value.i = *module->stack_top_ptr + (1 << 16); - if (builtin_heap_start.value.i % 16 != 0) { - builtin_heap_start.value.i += 16 - (builtin_heap_start.value.i % 16); - } + if (*module->stack_top_ptr % 16 != 0) { + *module->stack_top_ptr += 16 - (*module->stack_top_ptr % 16); } - switch (entity->type) { - case Entity_Type_Foreign_Function_Header: - emit_foreign_function(module, entity->function); - // fallthrough + builtin_heap_start.value.i = *module->stack_top_ptr + (1 << 16); + if (builtin_heap_start.value.i % 16 != 0) { + builtin_heap_start.value.i += 16 - (builtin_heap_start.value.i % 16); + } + } - case Entity_Type_Function_Header: - if (!should_emit_function(entity->function)) break; + switch (ent->type) { + case Entity_Type_Foreign_Function_Header: + if (!should_emit_function(ent->function)) break; + + module->foreign_function_count++; + emit_foreign_function(module, ent->function); + // fallthrough - bh_imap_put(&module->index_map, (u64) entity->function, module->next_func_idx++); - break; + case Entity_Type_Function_Header: + if (!should_emit_function(ent->function)) break; - case Entity_Type_Global_Header: { - u64 global_idx; - if ((entity->global->flags & Ast_Flag_Foreign) != 0) - global_idx = module->next_foreign_global_idx++; - else - global_idx = module->next_global_idx++; + bh_imap_put(&module->index_map, (u64) ent->function, module->next_func_idx++); + break; - bh_imap_put(&module->index_map, (u64) entity->global, global_idx); - break; - } + case Entity_Type_Foreign_Global_Header: + module->foreign_global_count++; + emit_foreign_global(module, ent->global); + // fallthrough - case Entity_Type_String_Literal: { - emit_string_literal(module, (AstStrLit *) entity->strlit); - break; - } - - case Entity_Type_File_Contents: { - emit_file_contents(module, (AstFileContents *) entity->file_contents); - break; - } + case Entity_Type_Global_Header: + bh_imap_put(&module->index_map, (u64) ent->global, module->next_global_idx++); + break; - case Entity_Type_Memory_Reservation: { - emit_memory_reservation(module, (AstMemRes *) entity->mem_res); - break; - } + case Entity_Type_String_Literal: { + emit_string_literal(module, (AstStrLit *) ent->strlit); + break; + } - case Entity_Type_Function: emit_function(module, entity->function); break; - case Entity_Type_Global: emit_global(module, entity->global); break; + case Entity_Type_File_Contents: { + emit_file_contents(module, (AstFileContents *) ent->file_contents); + break; + } - default: break; + case Entity_Type_Memory_Reservation: { + emit_memory_reservation(module, (AstMemRes *) ent->mem_res); + break; } + + case Entity_Type_Function: emit_function(module, ent->function); break; + case Entity_Type_Global: emit_global(module, ent->global); break; + + default: break; } + + ent->state = Entity_State_Finalized; } void onyx_wasm_module_free(OnyxWasmModule* module) { -- 2.25.1