aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-10-23 15:35:54 -0700
committerGitHub <noreply@github.com>2024-10-23 15:35:54 -0700
commit78f643c46d36d296d17b332b577c966fd0dd21bb (patch)
treedaa72a84c587ed47377d6db27bf9725f95d94cb2 /src/codegen
parent6bf52b0505ad7317b5f0d6fa77b7c41318b9c73b (diff)
parent7edd69d8aade6da2339cb0d9a027c52b3015bc31 (diff)
downloadzig-78f643c46d36d296d17b332b577c966fd0dd21bb.tar.gz
zig-78f643c46d36d296d17b332b577c966fd0dd21bb.zip
Merge pull request #21758 from kcbanner/dll_storage_class
Add `is_dll_import` to @extern, to support `__declspec(dllimport)` with the MSVC ABI
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig22
-rw-r--r--src/codegen/llvm/Builder.zig4
2 files changed, 17 insertions, 9 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index d83e5b4e0a..f19577cac8 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -3260,10 +3260,10 @@ pub const Object = struct {
const ip = &zcu.intern_pool;
const nav = ip.getNav(nav_index);
const resolved = nav.status.resolved;
- const is_extern, const is_threadlocal, const is_weak_linkage = switch (ip.indexToKey(resolved.val)) {
- .variable => |variable| .{ false, variable.is_threadlocal, variable.is_weak_linkage },
- .@"extern" => |@"extern"| .{ true, @"extern".is_threadlocal, @"extern".is_weak_linkage },
- else => .{ false, false, false },
+ const is_extern, const is_threadlocal, const is_weak_linkage, const is_dll_import = switch (ip.indexToKey(resolved.val)) {
+ .variable => |variable| .{ false, variable.is_threadlocal, variable.is_weak_linkage, false },
+ .@"extern" => |@"extern"| .{ true, @"extern".is_threadlocal, @"extern".is_weak_linkage, @"extern".is_dll_import },
+ else => .{ false, false, false, false },
};
const variable_index = try o.builder.addVariable(
@@ -3280,6 +3280,7 @@ pub const Object = struct {
if (is_threadlocal and !zcu.navFileScope(nav_index).mod.single_threaded)
variable_index.setThreadLocal(.generaldynamic, &o.builder);
if (is_weak_linkage) variable_index.setLinkage(.extern_weak, &o.builder);
+ if (is_dll_import) variable_index.setDllStorageClass(.dllimport, &o.builder);
} else {
variable_index.setLinkage(.internal, &o.builder);
variable_index.setUnnamedAddr(.unnamed_addr, &o.builder);
@@ -4810,10 +4811,10 @@ pub const NavGen = struct {
const nav = ip.getNav(nav_index);
const resolved = nav.status.resolved;
- const is_extern, const lib_name, const is_threadlocal, const is_weak_linkage, const is_const, const init_val, const owner_nav = switch (ip.indexToKey(resolved.val)) {
- .variable => |variable| .{ false, variable.lib_name, variable.is_threadlocal, variable.is_weak_linkage, false, variable.init, variable.owner_nav },
- .@"extern" => |@"extern"| .{ true, @"extern".lib_name, @"extern".is_threadlocal, @"extern".is_weak_linkage, @"extern".is_const, .none, @"extern".owner_nav },
- else => .{ false, .none, false, false, true, resolved.val, nav_index },
+ const is_extern, const lib_name, const is_threadlocal, const is_weak_linkage, const is_dll_import, const is_const, const init_val, const owner_nav = switch (ip.indexToKey(resolved.val)) {
+ .variable => |variable| .{ false, variable.lib_name, variable.is_threadlocal, variable.is_weak_linkage, false, false, variable.init, variable.owner_nav },
+ .@"extern" => |@"extern"| .{ true, @"extern".lib_name, @"extern".is_threadlocal, @"extern".is_weak_linkage, @"extern".is_dll_import, @"extern".is_const, .none, @"extern".owner_nav },
+ else => .{ false, .none, false, false, false, true, resolved.val, nav_index },
};
const ty = Type.fromInterned(nav.typeOf(ip));
@@ -4888,8 +4889,11 @@ pub const NavGen = struct {
try global_index.rename(decl_name, &o.builder);
global_index.setLinkage(.external, &o.builder);
global_index.setUnnamedAddr(.default, &o.builder);
- if (zcu.comp.config.dll_export_fns)
+ if (is_dll_import) {
+ global_index.setDllStorageClass(.dllimport, &o.builder);
+ } else if (zcu.comp.config.dll_export_fns) {
global_index.setDllStorageClass(.default, &o.builder);
+ }
if (is_weak_linkage) global_index.setLinkage(.extern_weak, &o.builder);
}
diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig
index bcc93d79b9..ce4040c127 100644
--- a/src/codegen/llvm/Builder.zig
+++ b/src/codegen/llvm/Builder.zig
@@ -2541,6 +2541,10 @@ pub const Variable = struct {
return self.ptrConst(builder).global.setLinkage(linkage, builder);
}
+ pub fn setDllStorageClass(self: Index, class: DllStorageClass, builder: *Builder) void {
+ return self.ptrConst(builder).global.setDllStorageClass(class, builder);
+ }
+
pub fn setUnnamedAddr(self: Index, unnamed_addr: UnnamedAddr, builder: *Builder) void {
return self.ptrConst(builder).global.setUnnamedAddr(unnamed_addr, builder);
}