aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-09-19 14:15:25 +0100
committergingerBill <gingerBill@users.noreply.github.com>2025-09-19 14:15:25 +0100
commit6bca1475edb8e2aec4bcbe942835bcc54f9e837e (patch)
treef3722ed3c238c49b515b67b3723f366a020652f3 /src
parentee3b10335b09181808fd98ccf46fe9369a11db13 (diff)
Convert `procedures_to_generate` to a queue
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend.cpp54
-rw-r--r--src/llvm_backend.hpp7
-rw-r--r--src/llvm_backend_general.cpp18
-rw-r--r--src/llvm_backend_proc.cpp2
-rw-r--r--src/llvm_backend_stmt.cpp2
5 files changed, 54 insertions, 29 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index f18d4af64..3ac5970f8 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -246,26 +246,12 @@ gb_internal String lb_internal_gen_name_from_type(char const *prefix, Type *type
return proc_name;
}
-
-gb_internal lbValue lb_equal_proc_for_type(lbModule *m, Type *type) {
- type = base_type(type);
- GB_ASSERT(is_type_comparable(type));
+gb_internal void lb_equal_proc_generate_body(lbModule *m, lbProcedure *p) {
+ Type *type = p->internal_gen_type;
Type *pt = alloc_type_pointer(type);
LLVMTypeRef ptr_type = lb_type(m, pt);
- String proc_name = lb_internal_gen_name_from_type("__$equal", type);
- lbProcedure **found = string_map_get(&m->gen_procs, proc_name);
- lbProcedure *compare_proc = nullptr;
- if (found) {
- compare_proc = *found;
- GB_ASSERT(compare_proc != nullptr);
- return {compare_proc->value, compare_proc->type};
- }
-
-
- lbProcedure *p = lb_create_dummy_procedure(m, proc_name, t_equal_proc);
- string_map_set(&m->gen_procs, proc_name, p);
lb_begin_procedure_body(p);
LLVMSetLinkage(p->value, LLVMInternalLinkage);
@@ -393,9 +379,29 @@ gb_internal lbValue lb_equal_proc_for_type(lbModule *m, Type *type) {
}
lb_end_procedure_body(p);
+}
+
+gb_internal lbValue lb_equal_proc_for_type(lbModule *m, Type *type) {
+ type = base_type(type);
+ GB_ASSERT(is_type_comparable(type));
+
+ String proc_name = lb_internal_gen_name_from_type("__$equal", type);
+ lbProcedure **found = string_map_get(&m->gen_procs, proc_name);
+ if (found) {
+ lbProcedure *p = *found;
+ GB_ASSERT(p != nullptr);
+ return {p->value, p->type};
+ }
- compare_proc = p;
- return {compare_proc->value, compare_proc->type};
+ lbProcedure *p = lb_create_dummy_procedure(m, proc_name, t_equal_proc);
+ string_map_set(&m->gen_procs, proc_name, p);
+ p->internal_gen_type = type;
+ p->generate_body = lb_equal_proc_generate_body;
+
+ // p->generate_body(m, p);
+ mpsc_enqueue(&m->procedures_to_generate, p);
+
+ return {p->value, p->type};
}
gb_internal lbValue lb_simple_compare_hash(lbProcedure *p, Type *type, lbValue data, lbValue seed) {
@@ -2068,7 +2074,7 @@ gb_internal lbProcedure *lb_create_startup_runtime(lbModule *main_module, lbProc
p->global_variables = &global_variables;
p->objc_names = objc_names;
- array_add(&main_module->procedures_to_generate, p);
+ mpsc_enqueue(&main_module->procedures_to_generate, p);
return p;
}
@@ -2110,7 +2116,7 @@ gb_internal WORKER_TASK_PROC(lb_generate_procedures_and_types_per_module) {
for (Entity *e : m->global_procedures_to_create) {
(void)lb_get_entity_name(m, e);
- array_add(&m->procedures_to_generate, lb_create_procedure(m, e));
+ mpsc_enqueue(&m->procedures_to_generate, lb_create_procedure(m, e));
}
return 0;
}
@@ -2298,7 +2304,7 @@ gb_internal WORKER_TASK_PROC(lb_llvm_function_pass_per_module) {
lb_llvm_function_pass_per_function_internal(m, m->gen->objc_names);
}
- for (lbProcedure *p : m->procedures_to_generate) {
+ MUTEX_GUARD_BLOCK(&m->generated_procedures_mutex) for (lbProcedure *p : m->generated_procedures) {
if (p->body != nullptr) { // Build Procedure
lbFunctionPassManagerKind pass_manager_kind = lbFunctionPassManager_default;
if (p->flags & lbProcedureFlag_WithoutMemcpyPass) {
@@ -2447,8 +2453,7 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) {
gb_internal WORKER_TASK_PROC(lb_generate_procedures_worker_proc) {
lbModule *m = cast(lbModule *)data;
- for (isize i = 0; i < m->procedures_to_generate.count; i++) {
- lbProcedure *p = m->procedures_to_generate[i];
+ for (lbProcedure *p = nullptr; mpsc_dequeue(&m->procedures_to_generate, &p); /**/) {
lb_generate_procedure(p->module, p);
}
return 0;
@@ -2876,6 +2881,9 @@ gb_internal void lb_generate_procedure(lbModule *m, lbProcedure *p) {
}
lb_verify_function(m, p, true);
+
+ MUTEX_GUARD(&m->generated_procedures_mutex);
+ array_add(&m->generated_procedures, p);
}
diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp
index 7fe4651bb..6d94df399 100644
--- a/src/llvm_backend.hpp
+++ b/src/llvm_backend.hpp
@@ -186,10 +186,13 @@ struct lbModule {
StringMap<lbProcedure *> gen_procs; // key is the canonicalized name
- Array<lbProcedure *> procedures_to_generate;
+ MPSCQueue<lbProcedure *> procedures_to_generate;
Array<Entity *> global_procedures_to_create;
Array<Entity *> global_types_to_create;
+ BlockingMutex generated_procedures_mutex;
+ Array<lbProcedure *> generated_procedures;
+
lbProcedure *curr_procedure;
LLVMBuilderRef const_dummy_builder;
@@ -238,6 +241,8 @@ struct lbGenerator : LinkerData {
PtrMap<LLVMContextRef, lbModule *> modules_through_ctx;
lbModule default_module;
+ lbModule *equal_module;
+
isize used_module_count;
lbProcedure *startup_runtime;
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index 49a7fb13f..c84edc178 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -97,12 +97,16 @@ gb_internal WORKER_TASK_PROC(lb_init_module_worker_proc) {
map_init(&m->function_type_map);
string_map_init(&m->gen_procs);
if (USE_SEPARATE_MODULES) {
- array_init(&m->procedures_to_generate, a, 0, 1<<10);
+ mpsc_init(&m->procedures_to_generate, a);
map_init(&m->procedure_values, 1<<11);
+ array_init(&m->generated_procedures, a, 0, 1<<10);
} else {
- array_init(&m->procedures_to_generate, a, 0, c->info.all_procedures.count);
+ mpsc_init(&m->procedures_to_generate, a);
map_init(&m->procedure_values, c->info.all_procedures.count*2);
+ array_init(&m->generated_procedures, a, 0, c->info.all_procedures.count*2);
}
+
+
array_init(&m->global_procedures_to_create, a, 0, 1024);
array_init(&m->global_types_to_create, a, 0, 1024);
array_init(&m->missing_procedures_to_check, a, 0, 16);
@@ -213,6 +217,14 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) {
}
}
}
+
+ if (LLVM_WEAK_MONOMORPHIZATION) {
+ lbModule *m = gb_alloc_item(permanent_allocator(), lbModule);
+ gen->equal_module = m;
+ m->checker = c;
+ map_set(&gen->modules, cast(void *)m, m); // point to itself just add it to the list
+ lb_init_module(m, do_threading);
+ }
}
gen->default_module.gen = gen;
@@ -3169,7 +3181,7 @@ gb_internal lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &pr
value.value = p->value;
value.type = p->type;
- array_add(&m->procedures_to_generate, p);
+ mpsc_enqueue(&m->procedures_to_generate, p);
if (parent != nullptr) {
array_add(&parent->children, p);
} else {
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index f71b693eb..3b8a829b7 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -835,7 +835,7 @@ gb_internal void lb_build_nested_proc(lbProcedure *p, AstProcLit *pd, Entity *e)
lb_add_entity(m, e, value);
array_add(&p->children, nested_proc);
- array_add(&m->procedures_to_generate, nested_proc);
+ mpsc_enqueue(&m->procedures_to_generate, nested_proc);
}
diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp
index 590920b59..f247fa2a7 100644
--- a/src/llvm_backend_stmt.cpp
+++ b/src/llvm_backend_stmt.cpp
@@ -92,7 +92,7 @@ gb_internal void lb_build_constant_value_decl(lbProcedure *p, AstValueDecl *vd)
value.value = nested_proc->value;
value.type = nested_proc->type;
- array_add(&p->module->procedures_to_generate, nested_proc);
+ mpsc_enqueue(&p->module->procedures_to_generate, nested_proc);
array_add(&p->children, nested_proc);
string_map_set(&p->module->members, name, value);
}