diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index beb9a99b6..8237b880f 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -143,7 +143,7 @@ struct lbModule { PtrMap struct_field_remapping; // Key: LLVMTypeRef or Type * i32 internal_type_level; - RecursiveMutex values_mutex; + BlockingMutex values_mutex; PtrMap values; PtrMap soa_values; diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 83f6da04e..fc9e63274 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -495,15 +495,14 @@ gb_internal LLVMMetadataRef lb_get_base_scope_metadata(lbModule *m, Scope *scope } gb_internal LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) { - mutex_lock(&m->debug_values_mutex); - defer (mutex_unlock(&m->debug_values_mutex)); - GB_ASSERT(type != nullptr); LLVMMetadataRef found = lb_get_llvm_metadata(m, type); if (found != nullptr) { return found; } + MUTEX_GUARD(&m->debug_values_mutex); + if (type->kind == Type_Named) { LLVMMetadataRef file = nullptr; unsigned line = 0; diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 7846c302a..5bee5d32c 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -2547,11 +2547,14 @@ gb_internal lbValue lb_find_ident(lbProcedure *p, lbModule *m, Entity *e, Ast *e return *found; } } - mutex_lock(&m->values_mutex); - defer (mutex_unlock(&m->values_mutex)); - auto *found = map_get(&m->values, e); + lbValue *found = nullptr; + mutex_lock(&m->values_mutex); + found = map_get(&m->values, e); + mutex_unlock(&m->values_mutex); + if (found) { + auto v = *found; // NOTE(bill): This is because pointers are already pointers in LLVM if (is_type_proc(v.type)) { @@ -2598,10 +2601,10 @@ gb_internal lbValue lb_find_procedure_value_from_entity(lbModule *m, Entity *e) e = strip_entity_wrapping(e); GB_ASSERT(e != nullptr); + lbValue *found = nullptr; mutex_lock(&m->values_mutex); - defer (mutex_unlock(&m->values_mutex)); - - auto *found = map_get(&m->values, e); + found = map_get(&m->values, e); + mutex_unlock(&m->values_mutex); if (found) { return *found; } @@ -2698,11 +2701,10 @@ gb_internal lbValue lb_find_value_from_entity(lbModule *m, Entity *e) { return lb_find_procedure_value_from_entity(m, e); } + lbValue *found = nullptr; mutex_lock(&m->values_mutex); - defer (mutex_unlock(&m->values_mutex)); - - - auto *found = map_get(&m->values, e); + found = map_get(&m->values, e); + mutex_unlock(&m->values_mutex); if (found) { return *found; }