authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-08-20 14:19:11+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-08-20 17:12:26+03:00
log717e2a365d9b5103f855668e4765cc154203a2bf
tree5e391201b3ce57dd28ab995a9c97284a88b5eb0d
parentd25674a51ec09640b0140a541a156869b3e03f81
signaturelock-open Commit is signed but in an unrecognized format.

correct llvm linkage conversion

when weakly exporting external declaration we need to pass LLVMExternalWeakLinkage

2 files changed, 8 insertions(+), 6 deletions(-)

lib/std/c/darwin.zig+3-2
...@@ -41,10 +41,11 @@ const mach_hdr = if (@sizeOf(usize) == 8) mach_header_64 else mach_header;...@@ -41,10 +41,11 @@ const mach_hdr = if (@sizeOf(usize) == 8) mach_header_64 else mach_header;
41/// on this operating system. However when building object files or libraries,41/// on this operating system. However when building object files or libraries,
42/// the system libc won't be linked until the final executable. So we42/// the system libc won't be linked until the final executable. So we
43/// export a weak symbol here, to be overridden by the real one.43/// export a weak symbol here, to be overridden by the real one.
44pub extern "c" var _mh_execute_header: mach_hdr;44var dummy_execute_header: mach_hdr = undefined;
45pub extern var _mh_execute_header: mach_hdr;
45comptime {46comptime {
46 if (std.Target.current.isDarwin()) {47 if (std.Target.current.isDarwin()) {
47 @export(_mh_execute_header, .{ .name = "_mh_execute_header", .linkage = .Weak });48 @export(dummy_execute_header, .{ .name = "_mh_execute_header", .linkage = .Weak });
48 }49 }
49}50}
5051
src/codegen.cpp+5-4
...@@ -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}
294294
295static LLVMLinkage to_llvm_linkage(GlobalLinkageId id) {295static 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 }
522523
523524
524 LLVMSetLinkage(llvm_fn, to_llvm_linkage(linkage));525 LLVMSetLinkage(llvm_fn, to_llvm_linkage(linkage, fn->body_node == nullptr));
525526
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 variable7964 // TODO debug info for the extern variable
79647965
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;
79767977
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) {