| ... | ... | @@ -898,7 +898,7 @@ pub const DeclGen = struct { |
| 898 | 898 | const llvm_fn = dg.llvmModule().addFunctionInAddressSpace(fqn, fn_type, llvm_addrspace); |
| 899 | 899 | gop.value_ptr.* = llvm_fn; |
| 900 | 900 | |
| 901 | | const is_extern = decl.val.tag() == .extern_fn; |
| 901 | const is_extern = decl.isExtern(); |
| 902 | 902 | if (!is_extern) { |
| 903 | 903 | llvm_fn.setLinkage(.Internal); |
| 904 | 904 | llvm_fn.setUnnamedAddr(.True); |
| ... | ... | @@ -997,6 +997,25 @@ pub const DeclGen = struct { |
| 997 | 997 | const llvm_global = dg.object.llvm_module.addGlobalInAddressSpace(llvm_type, fqn, llvm_addrspace); |
| 998 | 998 | gop.value_ptr.* = llvm_global; |
| 999 | 999 | |
| 1000 | // This is needed for declarations created by `@extern`. |
| 1001 | if (decl.isExtern()) { |
| 1002 | llvm_global.setValueName(decl.name); |
| 1003 | llvm_global.setUnnamedAddr(.False); |
| 1004 | llvm_global.setLinkage(.External); |
| 1005 | if (decl.val.castTag(.variable)) |variable| { |
| 1006 | const single_threaded = dg.module.comp.bin_file.options.single_threaded; |
| 1007 | if (variable.data.is_threadlocal and !single_threaded) { |
| 1008 | llvm_global.setThreadLocalMode(.GeneralDynamicTLSModel); |
| 1009 | } else { |
| 1010 | llvm_global.setThreadLocalMode(.NotThreadLocal); |
| 1011 | } |
| 1012 | if (variable.data.is_weak_linkage) llvm_global.setLinkage(.ExternalWeak); |
| 1013 | } |
| 1014 | } else { |
| 1015 | llvm_global.setLinkage(.Internal); |
| 1016 | llvm_global.setUnnamedAddr(.True); |
| 1017 | } |
| 1018 | |
| 1000 | 1019 | return llvm_global; |
| 1001 | 1020 | } |
| 1002 | 1021 | |