aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-07-15 11:49:07 +0100
committergingerBill <bill@gingerbill.org>2024-07-15 11:49:07 +0100
commitc5decd3eaecf393e1bf216b4d864fc9cfc5db0c2 (patch)
tree964ebce0f055d1a0c984290f7388adfbfddd3e8a /src/llvm_backend.cpp
parent664a71454bd2c58ab6f06f8de6d7d34c3eb397d7 (diff)
Fix possible race and correct linkage _after_ generation
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp44
1 files changed, 28 insertions, 16 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index ae46186ed..d975ac600 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -1,13 +1,11 @@
#define MULTITHREAD_OBJECT_GENERATION 1
-
-#ifndef USE_SEPARATE_MODULES
-#define USE_SEPARATE_MODULES build_context.use_separate_modules
-#endif
-
#ifndef MULTITHREAD_OBJECT_GENERATION
#define MULTITHREAD_OBJECT_GENERATION 0
#endif
+#ifndef USE_SEPARATE_MODULES
+#define USE_SEPARATE_MODULES build_context.use_separate_modules
+#endif
#ifndef LLVM_IGNORE_VERIFICATION
#define LLVM_IGNORE_VERIFICATION 0
@@ -137,17 +135,18 @@ gb_internal void lb_set_entity_from_other_modules_linkage_correctly(lbModule *ot
if (other_module == nullptr) {
return;
}
- char const *cname = alloc_cstring(temporary_allocator(), name);
-
- LLVMValueRef other_global = nullptr;
- if (e->kind == Entity_Variable) {
- other_global = LLVMGetNamedGlobal(other_module->mod, cname);
- } else if (e->kind == Entity_Procedure) {
- other_global = LLVMGetNamedFunction(other_module->mod, cname);
- }
- if (other_global) {
- LLVMSetLinkage(other_global, LLVMExternalLinkage);
- }
+ char const *cname = alloc_cstring(permanent_allocator(), name);
+ mpsc_enqueue(&other_module->gen->entities_to_correct_linkage, lbEntityCorrection{other_module, e, cname});
+
+ // LLVMValueRef other_global = nullptr;
+ // if (e->kind == Entity_Variable) {
+ // other_global = LLVMGetNamedGlobal(other_module->mod, cname);
+ // } else if (e->kind == Entity_Procedure) {
+ // other_global = LLVMGetNamedFunction(other_module->mod, cname);
+ // }
+ // if (other_global) {
+ // LLVMSetLinkage(other_global, LLVMExternalLinkage);
+ // }
}
gb_internal void lb_emit_init_context(lbProcedure *p, lbAddr addr) {
@@ -3431,6 +3430,19 @@ gb_internal bool lb_generate_code(lbGenerator *gen) {
TIME_SECTION("LLVM Add Foreign Library Paths");
lb_add_foreign_library_paths(gen);
+ TIME_SECTION("LLVM Correct Entity Linkage");
+ for (lbEntityCorrection ec = {}; mpsc_dequeue(&gen->entities_to_correct_linkage, &ec); /**/) {
+ LLVMValueRef other_global = nullptr;
+ if (ec.e->kind == Entity_Variable) {
+ other_global = LLVMGetNamedGlobal(ec.other_module->mod, ec.cname);
+ } else if (ec.e->kind == Entity_Procedure) {
+ other_global = LLVMGetNamedFunction(ec.other_module->mod, ec.cname);
+ }
+ if (other_global) {
+ LLVMSetLinkage(other_global, LLVMExternalLinkage);
+ }
+ }
+
////////////////////////////////////////////
for (auto const &entry: gen->modules) {