diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-03-12 21:41:53 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-03-16 00:09:00 -0700 |
| commit | 2583be7585d66ff6962434c7861db9b50aa64154 (patch) | |
| tree | 6ea71c46cef634f1f9fe1c92e5dde5241bcb1a28 /src/codegen/llvm.zig | |
| parent | 394252c9db6ae82a2cddf49b986a4e6b72cadb70 (diff) | |
| download | zig-2583be7585d66ff6962434c7861db9b50aa64154.tar.gz zig-2583be7585d66ff6962434c7861db9b50aa64154.zip | |
stage2 llvm: fix `@extern`
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 343e503aea..186109d471 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -898,7 +898,7 @@ pub const DeclGen = struct { const llvm_fn = dg.llvmModule().addFunctionInAddressSpace(fqn, fn_type, llvm_addrspace); gop.value_ptr.* = llvm_fn; - const is_extern = decl.val.tag() == .extern_fn; + const is_extern = decl.isExtern(); if (!is_extern) { llvm_fn.setLinkage(.Internal); llvm_fn.setUnnamedAddr(.True); @@ -997,6 +997,25 @@ pub const DeclGen = struct { const llvm_global = dg.object.llvm_module.addGlobalInAddressSpace(llvm_type, fqn, llvm_addrspace); gop.value_ptr.* = llvm_global; + // This is needed for declarations created by `@extern`. + if (decl.isExtern()) { + llvm_global.setValueName(decl.name); + llvm_global.setUnnamedAddr(.False); + llvm_global.setLinkage(.External); + if (decl.val.castTag(.variable)) |variable| { + const single_threaded = dg.module.comp.bin_file.options.single_threaded; + if (variable.data.is_threadlocal and !single_threaded) { + llvm_global.setThreadLocalMode(.GeneralDynamicTLSModel); + } else { + llvm_global.setThreadLocalMode(.NotThreadLocal); + } + if (variable.data.is_weak_linkage) llvm_global.setLinkage(.ExternalWeak); + } + } else { + llvm_global.setLinkage(.Internal); + llvm_global.setUnnamedAddr(.True); + } + return llvm_global; } |
