authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-08-03 19:40:12+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-08-03 20:35:08+02:00
log8056a851517cd92590ddb9a4b76ce7b1f4aeb242
tree7a8ba08089eafc505878379d6e486bcc96293601
parenta931bfada5e358ace980b2f8fbc50ce424ced526
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std: Move start_windows_tls.zig to os/windows/tls.zig.

Just to be consistent with Linux.

3 files changed, 51 insertions(+), 51 deletions(-)

lib/std/os/windows/tls.zig created+48
......@@ -0,0 +1,48 @@
1const std = @import("std");
2const builtin = @import("builtin");
3
4export var _tls_index: u32 = std.os.windows.TLS_OUT_OF_INDEXES;
5export var _tls_start: u8 linksection(".tls") = 0;
6export var _tls_end: u8 linksection(".tls$ZZZ") = 0;
7export var __xl_a: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLA") = null;
8export var __xl_z: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLZ") = null;
9
10comptime {
11 if (builtin.target.cpu.arch == .x86 and builtin.zig_backend != .stage2_c) {
12 // The __tls_array is the offset of the ThreadLocalStoragePointer field
13 // in the TEB block whose base address held in the %fs segment.
14 asm (
15 \\ .global __tls_array
16 \\ __tls_array = 0x2C
17 );
18 }
19}
20
21// TODO this is how I would like it to be expressed
22// TODO also note, ReactOS has a +1 on StartAddressOfRawData and AddressOfCallBacks. Investigate
23// why they do that.
24//export const _tls_used linksection(".rdata$T") = std.os.windows.IMAGE_TLS_DIRECTORY {
25// .StartAddressOfRawData = @intFromPtr(&_tls_start),
26// .EndAddressOfRawData = @intFromPtr(&_tls_end),
27// .AddressOfIndex = @intFromPtr(&_tls_index),
28// .AddressOfCallBacks = @intFromPtr(__xl_a),
29// .SizeOfZeroFill = 0,
30// .Characteristics = 0,
31//};
32// This is the workaround because we can't do @intFromPtr at comptime like that.
33pub const IMAGE_TLS_DIRECTORY = extern struct {
34 StartAddressOfRawData: *anyopaque,
35 EndAddressOfRawData: *anyopaque,
36 AddressOfIndex: *anyopaque,
37 AddressOfCallBacks: *anyopaque,
38 SizeOfZeroFill: u32,
39 Characteristics: u32,
40};
41export const _tls_used linksection(".rdata$T") = IMAGE_TLS_DIRECTORY{
42 .StartAddressOfRawData = &_tls_start,
43 .EndAddressOfRawData = &_tls_end,
44 .AddressOfIndex = &_tls_index,
45 .AddressOfCallBacks = @as(*anyopaque, @ptrCast(&__xl_a)),
46 .SizeOfZeroFill = 0,
47 .Characteristics = 0,
48};
lib/std/start.zig+3-3
......@@ -176,7 +176,7 @@ fn _DllMainCRTStartup(
176176 lpReserved: std.os.windows.LPVOID,
177177) callconv(std.os.windows.WINAPI) std.os.windows.BOOL {
178178 if (!builtin.single_threaded and !builtin.link_libc) {
179 _ = @import("start_windows_tls.zig");
179 _ = @import("os/windows/tls.zig");
180180 }
181181
182182 if (@hasDecl(root, "DllMain")) {
......@@ -427,7 +427,7 @@ fn _start() callconv(.Naked) noreturn {
427427fn WinStartup() callconv(std.os.windows.WINAPI) noreturn {
428428 @setAlignStack(16);
429429 if (!builtin.single_threaded and !builtin.link_libc) {
430 _ = @import("start_windows_tls.zig");
430 _ = @import("os/windows/tls.zig");
431431 }
432432
433433 std.debug.maybeEnableSegfaultHandler();
......@@ -438,7 +438,7 @@ fn WinStartup() callconv(std.os.windows.WINAPI) noreturn {
438438fn wWinMainCRTStartup() callconv(std.os.windows.WINAPI) noreturn {
439439 @setAlignStack(16);
440440 if (!builtin.single_threaded and !builtin.link_libc) {
441 _ = @import("start_windows_tls.zig");
441 _ = @import("os/windows/tls.zig");
442442 }
443443
444444 std.debug.maybeEnableSegfaultHandler();
lib/std/start_windows_tls.zig deleted-48
......@@ -1,48 +0,0 @@
1const std = @import("std");
2const builtin = @import("builtin");
3
4export var _tls_index: u32 = std.os.windows.TLS_OUT_OF_INDEXES;
5export var _tls_start: u8 linksection(".tls") = 0;
6export var _tls_end: u8 linksection(".tls$ZZZ") = 0;
7export var __xl_a: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLA") = null;
8export var __xl_z: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLZ") = null;
9
10comptime {
11 if (builtin.target.cpu.arch == .x86 and builtin.zig_backend != .stage2_c) {
12 // The __tls_array is the offset of the ThreadLocalStoragePointer field
13 // in the TEB block whose base address held in the %fs segment.
14 asm (
15 \\ .global __tls_array
16 \\ __tls_array = 0x2C
17 );
18 }
19}
20
21// TODO this is how I would like it to be expressed
22// TODO also note, ReactOS has a +1 on StartAddressOfRawData and AddressOfCallBacks. Investigate
23// why they do that.
24//export const _tls_used linksection(".rdata$T") = std.os.windows.IMAGE_TLS_DIRECTORY {
25// .StartAddressOfRawData = @intFromPtr(&_tls_start),
26// .EndAddressOfRawData = @intFromPtr(&_tls_end),
27// .AddressOfIndex = @intFromPtr(&_tls_index),
28// .AddressOfCallBacks = @intFromPtr(__xl_a),
29// .SizeOfZeroFill = 0,
30// .Characteristics = 0,
31//};
32// This is the workaround because we can't do @intFromPtr at comptime like that.
33pub const IMAGE_TLS_DIRECTORY = extern struct {
34 StartAddressOfRawData: *anyopaque,
35 EndAddressOfRawData: *anyopaque,
36 AddressOfIndex: *anyopaque,
37 AddressOfCallBacks: *anyopaque,
38 SizeOfZeroFill: u32,
39 Characteristics: u32,
40};
41export const _tls_used linksection(".rdata$T") = IMAGE_TLS_DIRECTORY{
42 .StartAddressOfRawData = &_tls_start,
43 .EndAddressOfRawData = &_tls_end,
44 .AddressOfIndex = &_tls_index,
45 .AddressOfCallBacks = @as(*anyopaque, @ptrCast(&__xl_a)),
46 .SizeOfZeroFill = 0,
47 .Characteristics = 0,
48};