From 09fee2aa4b62e1bd60d05500f74aabc4f279e2e4 Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Fri, 11 Oct 2024 17:13:56 +0200 Subject: [PATCH] - Standard library is now correctly weakly linked, fixing the use of C3 .so together with executable. #1549, #1107. --- releasenotes.md | 1 + src/compiler/llvm_codegen.c | 7 +++++++ src/compiler/llvm_codegen_function.c | 1 + src/compiler/llvm_codegen_internal.h | 1 + 4 files changed, 10 insertions(+) diff --git a/releasenotes.md b/releasenotes.md index e0dad6690..30398d54d 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -31,6 +31,7 @@ - Cannot use void as a generic parameter #1546 - Interfaces not correctly copied with generics #1545 - Memory leak in keys.new_list fixed. +- Standard library is now correctly weakly linked, fixing the use of C3 .so together with executable. #1549, #1107. ### Stdlib changes - Remove unintended print of `char[]` as String diff --git a/src/compiler/llvm_codegen.c b/src/compiler/llvm_codegen.c index 64d72b65a..ad810aa67 100644 --- a/src/compiler/llvm_codegen.c +++ b/src/compiler/llvm_codegen.c @@ -53,6 +53,12 @@ static void gencontext_init(GenContext *context, Module *module, LLVMContextRef { assert(LLVMIsMultithreaded()); memset(context, 0, sizeof(GenContext)); + if ((module->name->len == 3 && str_eq("std", module->name->module)) + || (module->name->len > 5 && memcmp("std::", module->name->module, 5) == 0)) + { + context->weaken = true; + } + if (shared_context) { context->shared_context = true; @@ -586,6 +592,7 @@ void llvm_emit_global_variable_init(GenContext *c, Decl *decl) { LLVMSetVisibility(global_ref, LLVMDefaultVisibility); if (optional_ref) LLVMSetVisibility(optional_ref, LLVMDefaultVisibility); + if (c->weaken) llvm_set_linkonce(c, global_ref); } else { diff --git a/src/compiler/llvm_codegen_function.c b/src/compiler/llvm_codegen_function.c index 2709c4f1c..bd6311d47 100644 --- a/src/compiler/llvm_codegen_function.c +++ b/src/compiler/llvm_codegen_function.c @@ -665,6 +665,7 @@ void llvm_emit_function_decl(GenContext *c, Decl *decl) LLVMSetVisibility(function, LLVMDefaultVisibility); return; } + if (c->weaken) llvm_set_linkonce(c, function); if (decl->is_weak) llvm_set_weak(c, function); } diff --git a/src/compiler/llvm_codegen_internal.h b/src/compiler/llvm_codegen_internal.h index cef69f56f..26f936540 100644 --- a/src/compiler/llvm_codegen_internal.h +++ b/src/compiler/llvm_codegen_internal.h @@ -83,6 +83,7 @@ typedef struct GenContext_ { bool shared_context; bool in_init_ref; + bool weaken; LLVMModuleRef module; LLVMBuilderRef global_builder; LLVMTargetMachineRef machine;