aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/check_expr.cpp29
-rw-r--r--src/checker.cpp4
-rw-r--r--src/checker.hpp2
-rw-r--r--src/entity.cpp5
-rw-r--r--src/llvm_backend_stmt.cpp6
5 files changed, 22 insertions, 24 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 5f28504a2..bce16f304 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -366,8 +366,6 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E
GB_ASSERT(dst == nullptr);
}
- // MUTEX_GUARD(&info->gen_procs_mutex);
-
if (!src->Proc.is_polymorphic || src->Proc.is_poly_specialized) {
return false;
}
@@ -434,20 +432,21 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E
GenProcsData *gen_procs = nullptr;
- // @@GPM //////////////////////////
- mutex_lock(&info->gen_procs_mutex);
- ///////////////////////////////////
- auto *found = map_get(&info->gen_procs, base_entity->identifier.load());
- if (found) {
- gen_procs = *found;
+ GB_ASSERT(base_entity->identifier.load()->kind == Ast_Ident);
+ GB_ASSERT(base_entity->kind == Entity_Procedure);
+
+
+ mutex_lock(&base_entity->Procedure.gen_procs_mutex); // @entity-mutex
+
+ gen_procs = base_entity->Procedure.gen_procs;
+ if (gen_procs) {
rw_mutex_shared_lock(&gen_procs->mutex); // @local-mutex
+
for (Entity *other : gen_procs->procs) {
Type *pt = base_type(other->type);
if (are_types_identical(pt, final_proc_type)) {
rw_mutex_shared_unlock(&gen_procs->mutex); // @local-mutex
- // @@GPM ////////////////////////////
- mutex_unlock(&info->gen_procs_mutex);
- /////////////////////////////////////
+ mutex_unlock(&base_entity->Procedure.gen_procs_mutex); // @entity-mutex
if (poly_proc_data) {
poly_proc_data->gen_entity = other;
@@ -455,15 +454,15 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E
return true;
}
}
+
rw_mutex_shared_unlock(&gen_procs->mutex); // @local-mutex
} else {
gen_procs = gb_alloc_item(permanent_allocator(), GenProcsData);
gen_procs->procs.allocator = heap_allocator();
- map_set(&info->gen_procs, base_entity->identifier.load(), gen_procs);
+ base_entity->Procedure.gen_procs = gen_procs;
}
- // @@GPM ////////////////////////////
- mutex_unlock(&info->gen_procs_mutex);
- /////////////////////////////////////
+
+ mutex_unlock(&base_entity->Procedure.gen_procs_mutex); // @entity-mutex
{
// LEAK TODO(bill): This is technically a memory leak as it has to generate the type twice
diff --git a/src/checker.cpp b/src/checker.cpp
index 5fc9a5551..0bebce232 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -1143,7 +1143,7 @@ gb_internal void init_checker_info(CheckerInfo *i) {
array_init(&i->entities, a);
map_init(&i->global_untyped);
string_map_init(&i->foreigns);
- map_init(&i->gen_procs);
+ // map_init(&i->gen_procs);
map_init(&i->gen_types);
array_init(&i->type_info_types, a);
map_init(&i->type_info_map);
@@ -1172,7 +1172,7 @@ gb_internal void destroy_checker_info(CheckerInfo *i) {
array_free(&i->entities);
map_destroy(&i->global_untyped);
string_map_destroy(&i->foreigns);
- map_destroy(&i->gen_procs);
+ // map_destroy(&i->gen_procs);
map_destroy(&i->gen_types);
array_free(&i->type_info_types);
map_destroy(&i->type_info_map);
diff --git a/src/checker.hpp b/src/checker.hpp
index 92926689e..8b8819d97 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -368,9 +368,7 @@ struct CheckerInfo {
RecursiveMutex lazy_mutex; // Mutex required for lazy type checking of specific files
- BlockingMutex gen_procs_mutex;
RwMutex gen_types_mutex;
- PtrMap<Ast *, GenProcsData *> gen_procs; // Key: Ast * | Identifier -> Entity
PtrMap<Type *, GenTypesData > gen_types;
BlockingMutex type_info_mutex; // NOT recursive
diff --git a/src/entity.cpp b/src/entity.cpp
index f82a2fb05..b92ba825f 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -130,7 +130,7 @@ enum EntityConstantFlags : u32 {
EntityConstantFlag_ImplicitEnumValue = 1<<0,
};
-enum ProcedureOptimizationMode : u32 {
+enum ProcedureOptimizationMode : u8 {
ProcedureOptimizationMode_Default,
ProcedureOptimizationMode_None,
ProcedureOptimizationMode_Minimal,
@@ -233,6 +233,9 @@ struct Entity {
String link_name;
String link_prefix;
DeferredProcedure deferred_procedure;
+
+ struct GenProcsData *gen_procs;
+ BlockingMutex gen_procs_mutex;
ProcedureOptimizationMode optimization_mode;
bool is_foreign : 1;
bool is_export : 1;
diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp
index 1660d3487..0e6f75118 100644
--- a/src/llvm_backend_stmt.cpp
+++ b/src/llvm_backend_stmt.cpp
@@ -50,13 +50,11 @@ gb_internal void lb_build_constant_value_decl(lbProcedure *p, AstValueDecl *vd)
continue; // It's an alias
}
- CheckerInfo *info = p->module->info;
DeclInfo *decl = decl_info_of_entity(e);
ast_node(pl, ProcLit, decl->proc_lit);
if (pl->body != nullptr) {
- auto *found = map_get(&info->gen_procs, ident);
- if (found) {
- GenProcsData *gpd = *found;
+ GenProcsData *gpd = e->Procedure.gen_procs;
+ if (gpd) {
rw_mutex_shared_lock(&gpd->mutex);
for (Entity *e : gpd->procs) {
if (!ptr_set_exists(min_dep_set, e)) {