aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_general.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-01-05 12:29:16 +0000
committergingerBill <bill@gingerbill.org>2023-01-05 12:29:16 +0000
commit213a0499a1964e0bc5d2c48cd3b4450b45f59314 (patch)
tree0343fd1f2fdee38cdf0bff07e15ddcaab34832a3 /src/llvm_backend_general.cpp
parent1517f1d7793c8985664600a820e3434dfdf83810 (diff)
Begin multithreading the llvm backend when `-use-separate-modules` is enabled
Diffstat (limited to 'src/llvm_backend_general.cpp')
-rw-r--r--src/llvm_backend_general.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index a849929f0..c09648825 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -316,6 +316,7 @@ gb_internal bool lb_is_instr_terminating(LLVMValueRef instr) {
gb_internal lbModule *lb_pkg_module(lbGenerator *gen, AstPackage *pkg) {
+ // NOTE(bill): no need for a mutex since it's immutable
auto *found = map_get(&gen->modules, pkg);
if (found) {
return *found;
@@ -1354,7 +1355,7 @@ gb_internal String lb_mangle_name(lbModule *m, Entity *e) {
return mangled_name;
}
-gb_internal String lb_set_nested_type_name_ir_mangled_name(Entity *e, lbProcedure *p) {
+gb_internal String lb_set_nested_type_name_ir_mangled_name(Entity *e, lbProcedure *p, lbModule *module) {
// NOTE(bill, 2020-03-08): A polymorphic procedure may take a nested type declaration
// and as a result, the declaration does not have time to determine what it should be
@@ -1421,7 +1422,7 @@ gb_internal String lb_get_entity_name(lbModule *m, Entity *e, String default_nam
}
if (e->kind == Entity_TypeName && (e->scope->flags & ScopeFlag_File) == 0) {
- return lb_set_nested_type_name_ir_mangled_name(e, nullptr);
+ return lb_set_nested_type_name_ir_mangled_name(e, nullptr, m);
}
String name = {};
@@ -2164,19 +2165,25 @@ gb_internal void lb_ensure_abi_function_type(lbModule *m, lbProcedure *p) {
gb_internal void lb_add_entity(lbModule *m, Entity *e, lbValue val) {
if (e != nullptr) {
+ mutex_lock(&m->values_mutex);
map_set(&m->values, e, val);
+ mutex_unlock(&m->values_mutex);
}
}
gb_internal void lb_add_member(lbModule *m, String const &name, lbValue val) {
if (name.len > 0) {
+ mutex_lock(&m->values_mutex);
string_map_set(&m->members, name, val);
+ mutex_unlock(&m->values_mutex);
}
}
gb_internal void lb_add_procedure_value(lbModule *m, lbProcedure *p) {
+ mutex_lock(&m->values_mutex);
if (p->entity != nullptr) {
map_set(&m->procedure_values, p->value, p->entity);
}
string_map_set(&m->procedures, p->name, p);
+ mutex_unlock(&m->values_mutex);
}
@@ -2519,6 +2526,8 @@ 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);
if (found) {
@@ -2538,7 +2547,6 @@ gb_internal lbValue lb_find_ident(lbProcedure *p, lbModule *m, Entity *e, Ast *e
if (USE_SEPARATE_MODULES) {
lbModule *other_module = lb_pkg_module(m->gen, e->pkg);
if (other_module != m) {
-
String name = lb_get_entity_name(other_module, e);
lb_set_entity_from_other_modules_linkage_correctly(other_module, e, name);
@@ -2569,6 +2577,9 @@ gb_internal lbValue lb_find_procedure_value_from_entity(lbModule *m, Entity *e)
e = strip_entity_wrapping(e);
GB_ASSERT(e != nullptr);
+ mutex_lock(&m->values_mutex);
+ defer (mutex_unlock(&m->values_mutex));
+
auto *found = map_get(&m->values, e);
if (found) {
return *found;
@@ -2657,6 +2668,10 @@ gb_internal lbValue lb_find_value_from_entity(lbModule *m, Entity *e) {
return lb_find_procedure_value_from_entity(m, e);
}
+ mutex_lock(&m->values_mutex);
+ defer (mutex_unlock(&m->values_mutex));
+
+
auto *found = map_get(&m->values, e);
if (found) {
return *found;