diff options
| author | gingerBill <bill@gingerbill.org> | 2019-12-31 12:15:19 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2019-12-31 12:15:19 +0000 |
| commit | ab52f8d795ca836925162b8ba92d0a77ea7db50a (patch) | |
| tree | 467d59e7ebb3f71523b6fc2041409654cd9cdcde /src/checker.cpp | |
| parent | 7e271310ff7a844270a981bb8fc1f961bb45f319 (diff) | |
Move definition of mem.Allocator and log.Logger to `package runtime`, to reduce import cycle magic
Diffstat (limited to 'src/checker.cpp')
| -rw-r--r-- | src/checker.cpp | 102 |
1 files changed, 59 insertions, 43 deletions
diff --git a/src/checker.cpp b/src/checker.cpp index bc98837d1..9db6b94e9 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1660,13 +1660,21 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { ptr_set_init(&c->info.minimum_dependency_type_info_set, heap_allocator()); String required_runtime_entities[] = { + str_lit("Allocator"), + str_lit("Logger"), + str_lit("mem_zero"), + str_lit("__init_context"), str_lit("default_assertion_failure_proc"), str_lit("args__"), str_lit("type_table"), str_lit("__type_info_of"), - str_lit("global_scratch_allocator"), + str_lit("global_default_temp_allocator_data"), + str_lit("default_temp_allocator"), + str_lit("default_temp_allocator_init"), + str_lit("default_temp_allocator_destroy"), + str_lit("default_temp_allocator_proc"), str_lit("Type_Info"), str_lit("Source_Code_Location"), @@ -1683,6 +1691,8 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { str_lit("umodti3"), str_lit("udivti3"), + str_lit("memset"), + str_lit("memory_compare"), str_lit("memory_compare_zero"), }; @@ -1695,7 +1705,6 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { // NOTE(bill): Only if these exist str_lit("memcpy"), str_lit("memmove"), - str_lit("memset"), str_lit("_tls_index"), str_lit("_fltused"), }; @@ -1704,15 +1713,6 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { } } - AstPackage *mem = get_core_package(&c->info, str_lit("mem")); - String required_mem_entities[] = { - str_lit("zero"), - str_lit("Allocator"), - }; - for (isize i = 0; i < gb_count_of(required_mem_entities); i++) { - add_dependency_to_set(c, scope_lookup(mem->scope, required_mem_entities[i])); - } - AstPackage *os = get_core_package(&c->info, str_lit("os")); String required_os_entities[] = { str_lit("heap_allocator"), @@ -1863,6 +1863,7 @@ Array<EntityGraphNode *> generate_entity_dependency_graph(CheckerInfo *info) { } +void check_single_global_entity(Checker *c, Entity *e, DeclInfo *d); Entity *find_core_entity(Checker *c, String name) { @@ -1882,6 +1883,10 @@ Type *find_core_type(Checker *c, String name) { , LIT(name)); // NOTE(bill): This will exit the program as it's cannot continue without it! } + if (e->type == nullptr) { + check_single_global_entity(c, e, e->decl_info); + } + GB_ASSERT(e->type != nullptr); return e->type; } @@ -2031,7 +2036,7 @@ void init_mem_allocator(Checker *c) { if (t_allocator != nullptr) { return; } - AstPackage *pkg = get_core_package(&c->info, str_lit("mem")); + AstPackage *pkg = get_core_package(&c->info, str_lit("runtime")); String name = str_lit("Allocator"); Entity *e = scope_lookup_current(pkg->scope, name); @@ -2049,6 +2054,7 @@ void init_core_context(Checker *c) { return; } t_context = find_core_type(c, str_lit("Context")); + GB_ASSERT(t_context != nullptr); t_context_ptr = alloc_type_pointer(t_context); } @@ -2905,46 +2911,56 @@ void check_collect_entities(CheckerContext *c, Array<Ast *> const &nodes) { } -void check_all_global_entities(Checker *c) { - Scope *prev_file = nullptr; +void check_single_global_entity(Checker *c, Entity *e, DeclInfo *d) { + GB_ASSERT(e != nullptr); + GB_ASSERT(d != nullptr); - for_array(i, c->info.entities) { - Entity *e = c->info.entities[i]; - DeclInfo *d = e->decl_info; + if (d->scope != e->scope) { + return; + } + if (e->state == EntityState_Resolved) { + return; + } - if (d->scope != e->scope) { - continue; - } + CheckerContext ctx = c->init_ctx; - CheckerContext ctx = c->init_ctx; + GB_ASSERT(d->scope->flags&ScopeFlag_File); + AstFile *file = d->scope->file; + add_curr_ast_file(&ctx, file); + AstPackage *pkg = file->pkg; - GB_ASSERT(d->scope->flags&ScopeFlag_File); - AstFile *file = d->scope->file; - add_curr_ast_file(&ctx, file); - AstPackage *pkg = file->pkg; + GB_ASSERT(ctx.pkg != nullptr); + GB_ASSERT(e->pkg != nullptr); - GB_ASSERT(ctx.pkg != nullptr); - GB_ASSERT(e->pkg != nullptr); + if (!e->pkg->used) { + return; + } - if (!e->pkg->used) { - continue; - } - if (pkg->kind == Package_Init) { - if (e->kind != Entity_Procedure && e->token.string == "main") { - error(e->token, "'main' is reserved as the entry point procedure in the initial scope"); - continue; - } - } else if (pkg->kind == Package_Runtime) { - if (e->token.string == "main") { - error(e->token, "'main' is reserved as the entry point procedure in the initial scope"); - continue; - } + if (pkg->kind == Package_Init) { + if (e->kind != Entity_Procedure && e->token.string == "main") { + error(e->token, "'main' is reserved as the entry point procedure in the initial scope"); + return; + } + } else if (pkg->kind == Package_Runtime) { + if (e->token.string == "main") { + error(e->token, "'main' is reserved as the entry point procedure in the initial scope"); + return; } + } + + ctx.decl = d; + ctx.scope = d->scope; + check_entity_decl(&ctx, e, d, nullptr); +} + +void check_all_global_entities(Checker *c) { + Scope *prev_file = nullptr; - ctx.decl = d; - ctx.scope = d->scope; - check_entity_decl(&ctx, e, d, nullptr); + for_array(i, c->info.entities) { + Entity *e = c->info.entities[i]; + DeclInfo *d = e->decl_info; + check_single_global_entity(c, e, d); } } |