diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2024-10-23 15:35:54 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-23 15:35:54 -0700 |
| commit | 78f643c46d36d296d17b332b577c966fd0dd21bb (patch) | |
| tree | daa72a84c587ed47377d6db27bf9725f95d94cb2 /src/codegen | |
| parent | 6bf52b0505ad7317b5f0d6fa77b7c41318b9c73b (diff) | |
| parent | 7edd69d8aade6da2339cb0d9a027c52b3015bc31 (diff) | |
| download | zig-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.zig | 22 | ||||
| -rw-r--r-- | src/codegen/llvm/Builder.zig | 4 |
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); } |
