aboutsummaryrefslogtreecommitdiff
path: root/src/checker.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-02-26 15:09:32 +0000
committergingerBill <bill@gingerbill.org>2021-02-26 15:09:32 +0000
commit575c7ff031f67ec4c479fa1cd6e22491e2b7a79e (patch)
treed30c6d1dc0c141937d86f4385161b79f06af30a8 /src/checker.cpp
parentac155d90368214e2625230055573fdd17578c6e6 (diff)
Patch issue with minimum dependency system and how it interacts with para poly procedures
Diffstat (limited to 'src/checker.cpp')
-rw-r--r--src/checker.cpp49
1 files changed, 45 insertions, 4 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index cc2d28dc8..bf3469fde 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -646,6 +646,7 @@ void add_package_dependency(CheckerContext *c, char const *package_name, char co
String n = make_string_c(name);
AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name));
Entity *e = scope_lookup(p->scope, n);
+ e->flags |= EntityFlag_Used;
GB_ASSERT_MSG(e != nullptr, "%s", name);
GB_ASSERT(c->decl != nullptr);
ptr_set_add(&c->decl->deps, e);
@@ -1721,6 +1722,13 @@ void add_dependency_to_set(Checker *c, Entity *entity) {
}
}
+void force_add_dependency_entity(Checker *c, Scope *scope, String const &name) {
+ Entity *e = scope_lookup(scope, name);
+ e->flags |= EntityFlag_Used;
+ add_dependency_to_set(c, e);
+}
+
+
void generate_minimum_dependency_set(Checker *c, Entity *start) {
isize entity_count = c->info.entities.count;
@@ -1775,7 +1783,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) {
str_lit("bswap_f64"),
};
for (isize i = 0; i < gb_count_of(required_runtime_entities); i++) {
- add_dependency_to_set(c, scope_lookup(c->info.runtime_package->scope, required_runtime_entities[i]));
+ force_add_dependency_entity(c, c->info.runtime_package->scope, required_runtime_entities[i]);
}
if (build_context.no_crt) {
@@ -1787,7 +1795,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) {
str_lit("_fltused"),
};
for (isize i = 0; i < gb_count_of(required_no_crt_entities); i++) {
- add_dependency_to_set(c, scope_lookup(c->info.runtime_package->scope, required_no_crt_entities[i]));
+ force_add_dependency_entity(c, c->info.runtime_package->scope, required_no_crt_entities[i]);
}
}
@@ -1796,7 +1804,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) {
str_lit("heap_allocator"),
};
for (isize i = 0; i < gb_count_of(required_os_entities); i++) {
- add_dependency_to_set(c, scope_lookup(os->scope, required_os_entities[i]));
+ force_add_dependency_entity(c, os->scope, required_os_entities[i]);
}
@@ -1808,7 +1816,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) {
str_lit("dynamic_array_expr_error"),
};
for (isize i = 0; i < gb_count_of(bounds_check_entities); i++) {
- add_dependency_to_set(c, scope_lookup(c->info.runtime_package->scope, bounds_check_entities[i]));
+ force_add_dependency_entity(c, c->info.runtime_package->scope, bounds_check_entities[i]);
}
}
@@ -1896,6 +1904,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) {
}
}
} else {
+ start->flags |= EntityFlag_Used;
add_dependency_to_set(c, start);
}
}
@@ -4358,6 +4367,9 @@ void check_proc_info(Checker *c, ProcInfo pi) {
}
check_proc_body(&ctx, pi.token, pi.decl, pi.type, pi.body);
+ if (pi.body != nullptr && pi.decl->entity != nullptr) {
+ pi.decl->entity->flags |= EntityFlag_ProcBodyChecked;
+ }
}
GB_THREAD_PROC(check_proc_info_worker_proc) {
@@ -4368,6 +4380,33 @@ GB_THREAD_PROC(check_proc_info_worker_proc) {
return 0;
}
+void check_unchecked_bodies(Checker *c) {
+ // NOTE(2021-02-26, bill): Sanity checker
+ // This is a partial hack to make sure all procedure bodies have been checked
+ // even ones which should not exist, due to the multithreaded nature of the parser
+ // NOTE(2021-02-26, bill): Actually fix this race condition
+ for_array(i, c->info.minimum_dependency_set.entries) {
+ Entity *e = c->info.minimum_dependency_set.entries[i].ptr;
+ if (e != nullptr && e->kind == Entity_Procedure) {
+ if (!e->Procedure.is_foreign && (e->flags & EntityFlag_ProcBodyChecked) == 0) {
+ GB_ASSERT(e->decl_info != nullptr);
+
+ ProcInfo pi = {};
+ pi.file = e->file;
+ pi.token = e->token;
+ pi.decl = e->decl_info;
+ pi.type = e->type;
+
+ Ast *pl = e->decl_info->proc_lit;
+ GB_ASSERT(pl != nullptr);
+ pi.body = pl->ProcLit.body;
+ pi.tags = pl->ProcLit.tags;
+
+ check_proc_info(c, pi);
+ }
+ }
+ }
+}
void check_parsed_files(Checker *c) {
#define TIME_SECTION(str) do { if (build_context.show_more_timings) timings_start_section(&global_timings, str_lit(str)); } while (0)
@@ -4447,6 +4486,8 @@ void check_parsed_files(Checker *c) {
// Calculate initialization order of global variables
calculate_global_init_order(c);
+ TIME_SECTION("check bodies have all been checked");
+ check_unchecked_bodies(c);
TIME_SECTION("add untyped expression values");
// Add untyped expression values