| ... | @@ -292,13 +292,14 @@ static void add_uwtable_attr(CodeGen *g, LLVMValueRef fn_val) { | ... | @@ -292,13 +292,14 @@ static void add_uwtable_attr(CodeGen *g, LLVMValueRef fn_val) { |
| 292 | } | 292 | } |
| 293 | } | 293 | } |
| 294 | | 294 | |
| 295 | static LLVMLinkage to_llvm_linkage(GlobalLinkageId id) { | 295 | static LLVMLinkage to_llvm_linkage(GlobalLinkageId id, bool is_extern) { |
| 296 | switch (id) { | 296 | switch (id) { |
| 297 | case GlobalLinkageIdInternal: | 297 | case GlobalLinkageIdInternal: |
| 298 | return LLVMInternalLinkage; | 298 | return LLVMInternalLinkage; |
| 299 | case GlobalLinkageIdStrong: | 299 | case GlobalLinkageIdStrong: |
| 300 | return LLVMExternalLinkage; | 300 | return LLVMExternalLinkage; |
| 301 | case GlobalLinkageIdWeak: | 301 | case GlobalLinkageIdWeak: |
| | 302 | if (is_extern) return LLVMExternalWeakLinkage; |
| 302 | return LLVMWeakODRLinkage; | 303 | return LLVMWeakODRLinkage; |
| 303 | case GlobalLinkageIdLinkOnce: | 304 | case GlobalLinkageIdLinkOnce: |
| 304 | return LLVMLinkOnceODRLinkage; | 305 | return LLVMLinkOnceODRLinkage; |
| ... | @@ -521,7 +522,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -521,7 +522,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 521 | } | 522 | } |
| 522 | | 523 | |
| 523 | | 524 | |
| 524 | LLVMSetLinkage(llvm_fn, to_llvm_linkage(linkage)); | 525 | LLVMSetLinkage(llvm_fn, to_llvm_linkage(linkage, fn->body_node == nullptr)); |
| 525 | | 526 | |
| 526 | if (linkage == GlobalLinkageIdInternal) { | 527 | if (linkage == GlobalLinkageIdInternal) { |
| 527 | LLVMSetUnnamedAddr(llvm_fn, true); | 528 | LLVMSetUnnamedAddr(llvm_fn, true); |
| ... | @@ -7962,7 +7963,7 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -7962,7 +7963,7 @@ static void do_code_gen(CodeGen *g) { |
| 7962 | global_value = LLVMAddGlobal(g->module, get_llvm_type(g, var->var_type), symbol_name); | 7963 | global_value = LLVMAddGlobal(g->module, get_llvm_type(g, var->var_type), symbol_name); |
| 7963 | // TODO debug info for the extern variable | 7964 | // TODO debug info for the extern variable |
| 7964 | | 7965 | |
| 7965 | LLVMSetLinkage(global_value, to_llvm_linkage(linkage)); | 7966 | LLVMSetLinkage(global_value, to_llvm_linkage(linkage, true)); |
| 7966 | maybe_import_dll(g, global_value, GlobalLinkageIdStrong); | 7967 | maybe_import_dll(g, global_value, GlobalLinkageIdStrong); |
| 7967 | LLVMSetAlignment(global_value, var->align_bytes); | 7968 | LLVMSetAlignment(global_value, var->align_bytes); |
| 7968 | LLVMSetGlobalConstant(global_value, var->gen_is_const); | 7969 | LLVMSetGlobalConstant(global_value, var->gen_is_const); |
| ... | @@ -7975,7 +7976,7 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -7975,7 +7976,7 @@ static void do_code_gen(CodeGen *g) { |
| 7975 | global_value = var->const_value->llvm_global; | 7976 | global_value = var->const_value->llvm_global; |
| 7976 | | 7977 | |
| 7977 | if (exported) { | 7978 | if (exported) { |
| 7978 | LLVMSetLinkage(global_value, to_llvm_linkage(linkage)); | 7979 | LLVMSetLinkage(global_value, to_llvm_linkage(linkage, false)); |
| 7979 | maybe_export_dll(g, global_value, GlobalLinkageIdStrong); | 7980 | maybe_export_dll(g, global_value, GlobalLinkageIdStrong); |
| 7980 | } | 7981 | } |
| 7981 | if (var->section_name) { | 7982 | if (var->section_name) { |