authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-01-10 17:56:38-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-01-11 01:00:49-08:00
log30688c341b9bf247dd72601f760a7a98adcd55d9
treeed9952da95a692edba7eea178065f50e1d93d65d
parentaba8d4f62c5643333ca50a884c0fa1898a31dfed

LLVM: fix lowering of extern anyopaque

closes #18461

3 files changed, 21 insertions(+), 1 deletions(-)

src/codegen/llvm.zig+6-1
...@@ -3256,7 +3256,12 @@ pub const Object = struct {...@@ -3256,7 +3256,12 @@ pub const Object = struct {
3256 128 => .fp128,3256 128 => .fp128,
3257 else => unreachable,3257 else => unreachable,
3258 },3258 },
3259 .anyopaque_type => unreachable,3259 .anyopaque_type => {
3260 // This is unreachable except when used as the type for an extern global.
3261 // For example: `@extern(*anyopaque, .{ .name = "foo"})` should produce
3262 // @foo = external global i8
3263 return .i8;
3264 },
3260 .bool_type => .i1,3265 .bool_type => .i1,
3261 .void_type => .void,3266 .void_type => .void,
3262 .type_type => unreachable,3267 .type_type => unreachable,
test/behavior.zig+1
...@@ -32,6 +32,7 @@ test {...@@ -32,6 +32,7 @@ test {
32 _ = @import("behavior/eval.zig");32 _ = @import("behavior/eval.zig");
33 _ = @import("behavior/export_builtin.zig");33 _ = @import("behavior/export_builtin.zig");
34 _ = @import("behavior/export_self_referential_type_info.zig");34 _ = @import("behavior/export_self_referential_type_info.zig");
35 _ = @import("behavior/extern.zig");
35 _ = @import("behavior/field_parent_ptr.zig");36 _ = @import("behavior/field_parent_ptr.zig");
36 _ = @import("behavior/floatop.zig");37 _ = @import("behavior/floatop.zig");
37 _ = @import("behavior/fn.zig");38 _ = @import("behavior/fn.zig");
test/behavior/extern.zig created+14
...@@ -0,0 +1,14 @@
1const builtin = @import("builtin");
2const std = @import("std");
3const expect = std.testing.expect;
4
5test "anyopaque extern symbol" {
6 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
8
9 const a = @extern(*anyopaque, .{ .name = "a_mystery_symbol" });
10 const b: *i32 = @alignCast(@ptrCast(a));
11 try expect(b.* == 1234);
12}
13
14export var a_mystery_symbol: i32 = 1234;