aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-02-28 16:12:01 +0200
committerVeikka Tuominen <git@vexu.eu>2022-03-02 12:15:50 +0200
commitef4aca2dc4224d0de1ab15112097fd48930476db (patch)
treedabd0a2f1f63db29e97a052b514cc992bbfb01cb /src/codegen/llvm.zig
parent7cfc3f0cfa626abe25c8318a7852977cbc1c723b (diff)
downloadzig-ef4aca2dc4224d0de1ab15112097fd48930476db.tar.gz
zig-ef4aca2dc4224d0de1ab15112097fd48930476db.zip
stage2: implement `@extern`
Diffstat (limited to 'src/codegen/llvm.zig')
-rw-r--r--src/codegen/llvm.zig18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index fa29a1aae3..5ef62aadcb 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -548,6 +548,10 @@ pub const Object = struct {
llvm_global.setValueName(decl.name);
llvm_global.setUnnamedAddr(.False);
llvm_global.setLinkage(.External);
+ if (decl.val.castTag(.variable)) |variable| {
+ if (variable.data.is_threadlocal) llvm_global.setThreadLocalMode(.GeneralDynamicTLSModel);
+ if (variable.data.is_weak_linkage) llvm_global.setLinkage(.ExternalWeak);
+ }
} else if (exports.len != 0) {
const exp_name = exports[0].options.name;
llvm_global.setValueName2(exp_name.ptr, exp_name.len);
@@ -558,6 +562,9 @@ pub const Object = struct {
.Weak => llvm_global.setLinkage(.WeakODR),
.LinkOnce => llvm_global.setLinkage(.LinkOnceODR),
}
+ if (decl.val.castTag(.variable)) |variable| {
+ if (variable.data.is_threadlocal) llvm_global.setThreadLocalMode(.GeneralDynamicTLSModel);
+ }
// If a Decl is exported more than one time (which is rare),
// we add aliases for all but the first export.
// TODO LLVM C API does not support deleting aliases. We need to
@@ -788,8 +795,15 @@ pub const DeclGen = struct {
const llvm_global = dg.object.llvm_module.addGlobalInAddressSpace(llvm_type, fqn, llvm_addrspace);
gop.value_ptr.* = llvm_global;
- const is_extern = decl.val.tag() == .unreachable_value;
- if (!is_extern) {
+ if (decl.isExtern()) {
+ llvm_global.setValueName(decl.name);
+ llvm_global.setUnnamedAddr(.False);
+ llvm_global.setLinkage(.External);
+ if (decl.val.castTag(.variable)) |variable| {
+ if (variable.data.is_threadlocal) llvm_global.setThreadLocalMode(.GeneralDynamicTLSModel);
+ if (variable.data.is_weak_linkage) llvm_global.setLinkage(.ExternalWeak);
+ }
+ } else {
llvm_global.setLinkage(.Internal);
llvm_global.setUnnamedAddr(.True);
}