master
1const builtin = @import("builtin");
2
3/// Elements are const_linksection, var_linksection, fn_linksection
4const linksections: ?[3][]const u8 = switch (builtin.target.ofmt) {
5 .elf => .{ ".rodata", ".data", ".text" },
6 .coff => .{ ".rdata", ".data", ".text" },
7 .macho => .{ "__TEXT,__const", "__DATA,__data", "__TEXT,__text" },
8 else => null,
9};
10const const_linksection = linksections.?[0];
11const var_linksection = linksections.?[1];
12const fn_linksection = linksections.?[2];
13
14test "addrspace on container-level const" {
15 const S = struct {
16 const a: u32 addrspace(.generic) = 123;
17 fn check(ptr: anytype) !void {
18 if (ptr.* != 123) return error.TestFailed;
19 }
20 };
21 try S.check(&S.a);
22 try comptime S.check(&S.a);
23}
24
25test "linksection on container-level const" {
26 if (linksections == null) return;
27 const S = struct {
28 const a: u32 linksection(const_linksection) = 123;
29 fn check(ptr: anytype) !void {
30 if (ptr.* != 123) return error.TestFailed;
31 }
32 };
33 try S.check(&S.a);
34 try comptime S.check(&S.a);
35}
36
37test "addrspace and linksection on container-level const" {
38 if (linksections == null) return;
39 const S = struct {
40 const a: u32 addrspace(.generic) linksection(const_linksection) = 123;
41 fn check(ptr: anytype) !void {
42 if (ptr.* != 123) return error.TestFailed;
43 }
44 };
45 try S.check(&S.a);
46 try comptime S.check(&S.a);
47}
48
49test "addrspace on container-level var" {
50 const S = struct {
51 var a: u32 addrspace(.generic) = 123;
52 fn check(ptr: anytype) !void {
53 if (ptr.* != 123) return error.TestFailed;
54 }
55 };
56 try S.check(&S.a);
57}
58
59test "linksection on container-level var" {
60 if (linksections == null) return;
61 const S = struct {
62 var a: u32 linksection(var_linksection) = 123;
63 fn check(ptr: anytype) !void {
64 if (ptr.* != 123) return error.TestFailed;
65 }
66 };
67 try S.check(&S.a);
68}
69
70test "addrspace and linksection on container-level var" {
71 if (linksections == null) return;
72 const S = struct {
73 var a: u32 addrspace(.generic) linksection(var_linksection) = 123;
74 fn check(ptr: anytype) !void {
75 if (ptr.* != 123) return error.TestFailed;
76 }
77 };
78 try S.check(&S.a);
79}
80
81test "addrspace on fn" {
82 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
83
84 const S = struct {
85 fn f() addrspace(.generic) u32 {
86 return 123;
87 }
88 fn check(fnPtr: anytype) !void {
89 if (fnPtr() != 123) return error.TestFailed;
90 }
91 };
92 try S.check(&S.f);
93 try comptime S.check(&S.f);
94}
95
96test "linksection on fn" {
97 if (linksections == null) return;
98 const S = struct {
99 fn f() linksection(fn_linksection) u32 {
100 return 123;
101 }
102 fn check(fnPtr: anytype) !void {
103 if (fnPtr() != 123) return error.TestFailed;
104 }
105 };
106 try S.check(&S.f);
107 try comptime S.check(&S.f);
108}
109
110test "addrspace and linksection on fn" {
111 if (linksections == null) return;
112 const S = struct {
113 fn f() addrspace(.generic) linksection(fn_linksection) u32 {
114 return 123;
115 }
116 fn check(fnPtr: anytype) !void {
117 if (fnPtr() != 123) return error.TestFailed;
118 }
119 };
120 try S.check(&S.f);
121 try comptime S.check(&S.f);
122}