aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-03-12 21:41:53 +0200
committerAndrew Kelley <andrew@ziglang.org>2022-03-16 00:09:00 -0700
commit2583be7585d66ff6962434c7861db9b50aa64154 (patch)
tree6ea71c46cef634f1f9fe1c92e5dde5241bcb1a28 /src/codegen/llvm.zig
parent394252c9db6ae82a2cddf49b986a4e6b72cadb70 (diff)
downloadzig-2583be7585d66ff6962434c7861db9b50aa64154.tar.gz
zig-2583be7585d66ff6962434c7861db9b50aa64154.zip
stage2 llvm: fix `@extern`
Diffstat (limited to 'src/codegen/llvm.zig')
-rw-r--r--src/codegen/llvm.zig21
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;
}