aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-08-21 14:50:37 -0700
committerAndrew Kelley <andrew@ziglang.org>2020-08-21 14:50:37 -0700
commitf9bd049c89e4d2b4d3f51a937ec2114c3cac9176 (patch)
tree81bf283c8ae2e06fd3a48d18e3b4196e194392d0 /src/codegen.cpp
parent3aeeb21b82915a3d03e75a88ded93049a5c1730c (diff)
parentdad7af0b37f352c8c390438877ef1552a316ffde (diff)
downloadzig-f9bd049c89e4d2b4d3f51a937ec2114c3cac9176.tar.gz
zig-f9bd049c89e4d2b4d3f51a937ec2114c3cac9176.zip
Merge remote-tracking branch 'origin/master' into llvm11
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index fc59d6ca4e..56df26892f 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -293,13 +293,14 @@ static void add_uwtable_attr(CodeGen *g, LLVMValueRef fn_val) {
}
}
-static LLVMLinkage to_llvm_linkage(GlobalLinkageId id) {
+static LLVMLinkage to_llvm_linkage(GlobalLinkageId id, bool is_extern) {
switch (id) {
case GlobalLinkageIdInternal:
return LLVMInternalLinkage;
case GlobalLinkageIdStrong:
return LLVMExternalLinkage;
case GlobalLinkageIdWeak:
+ if (is_extern) return LLVMExternalWeakLinkage;
return LLVMWeakODRLinkage;
case GlobalLinkageIdLinkOnce:
return LLVMLinkOnceODRLinkage;
@@ -522,7 +523,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
}
- LLVMSetLinkage(llvm_fn, to_llvm_linkage(linkage));
+ LLVMSetLinkage(llvm_fn, to_llvm_linkage(linkage, fn->body_node == nullptr));
if (linkage == GlobalLinkageIdInternal) {
LLVMSetUnnamedAddr(llvm_fn, true);
@@ -7963,7 +7964,7 @@ static void do_code_gen(CodeGen *g) {
global_value = LLVMAddGlobal(g->module, get_llvm_type(g, var->var_type), symbol_name);
// TODO debug info for the extern variable
- LLVMSetLinkage(global_value, to_llvm_linkage(linkage));
+ LLVMSetLinkage(global_value, to_llvm_linkage(linkage, true));
maybe_import_dll(g, global_value, GlobalLinkageIdStrong);
LLVMSetAlignment(global_value, var->align_bytes);
LLVMSetGlobalConstant(global_value, var->gen_is_const);
@@ -7976,7 +7977,7 @@ static void do_code_gen(CodeGen *g) {
global_value = var->const_value->llvm_global;
if (exported) {
- LLVMSetLinkage(global_value, to_llvm_linkage(linkage));
+ LLVMSetLinkage(global_value, to_llvm_linkage(linkage, false));
maybe_export_dll(g, global_value, GlobalLinkageIdStrong);
}
if (var->section_name) {