| author | |
| committer | |
| log | 8056a851517cd92590ddb9a4b76ce7b1f4aeb242 |
| tree | 7a8ba08089eafc505878379d6e486bcc96293601 |
| parent | a931bfada5e358ace980b2f8fbc50ce424ced526 |
| signature | Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM |
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 @@ | ||
| 1 | const std = @import("std"); | ||
| 2 | const builtin = @import("builtin"); | ||
| 3 | |||
| 4 | export var _tls_index: u32 = std.os.windows.TLS_OUT_OF_INDEXES; | ||
| 5 | export var _tls_start: u8 linksection(".tls") = 0; | ||
| 6 | export var _tls_end: u8 linksection(".tls$ZZZ") = 0; | ||
| 7 | export var __xl_a: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLA") = null; | ||
| 8 | export var __xl_z: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLZ") = null; | ||
| 9 | |||
| 10 | comptime { | ||
| 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. | ||
| 33 | pub 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 | }; | ||
| 41 | export 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( | ... | @@ -176,7 +176,7 @@ fn _DllMainCRTStartup( |
| 176 | lpReserved: std.os.windows.LPVOID, | 176 | lpReserved: std.os.windows.LPVOID, |
| 177 | ) callconv(std.os.windows.WINAPI) std.os.windows.BOOL { | 177 | ) callconv(std.os.windows.WINAPI) std.os.windows.BOOL { |
| 178 | if (!builtin.single_threaded and !builtin.link_libc) { | 178 | if (!builtin.single_threaded and !builtin.link_libc) { |
| 179 | _ = @import("start_windows_tls.zig"); | 179 | _ = @import("os/windows/tls.zig"); |
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | if (@hasDecl(root, "DllMain")) { | 182 | if (@hasDecl(root, "DllMain")) { |
| ... | @@ -427,7 +427,7 @@ fn _start() callconv(.Naked) noreturn { | ... | @@ -427,7 +427,7 @@ fn _start() callconv(.Naked) noreturn { |
| 427 | fn WinStartup() callconv(std.os.windows.WINAPI) noreturn { | 427 | fn WinStartup() callconv(std.os.windows.WINAPI) noreturn { |
| 428 | @setAlignStack(16); | 428 | @setAlignStack(16); |
| 429 | if (!builtin.single_threaded and !builtin.link_libc) { | 429 | if (!builtin.single_threaded and !builtin.link_libc) { |
| 430 | _ = @import("start_windows_tls.zig"); | 430 | _ = @import("os/windows/tls.zig"); |
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | std.debug.maybeEnableSegfaultHandler(); | 433 | std.debug.maybeEnableSegfaultHandler(); |
| ... | @@ -438,7 +438,7 @@ fn WinStartup() callconv(std.os.windows.WINAPI) noreturn { | ... | @@ -438,7 +438,7 @@ fn WinStartup() callconv(std.os.windows.WINAPI) noreturn { |
| 438 | fn wWinMainCRTStartup() callconv(std.os.windows.WINAPI) noreturn { | 438 | fn wWinMainCRTStartup() callconv(std.os.windows.WINAPI) noreturn { |
| 439 | @setAlignStack(16); | 439 | @setAlignStack(16); |
| 440 | if (!builtin.single_threaded and !builtin.link_libc) { | 440 | if (!builtin.single_threaded and !builtin.link_libc) { |
| 441 | _ = @import("start_windows_tls.zig"); | 441 | _ = @import("os/windows/tls.zig"); |
| 442 | } | 442 | } |
| 443 | 443 | ||
| 444 | std.debug.maybeEnableSegfaultHandler(); | 444 | std.debug.maybeEnableSegfaultHandler(); |
lib/std/start_windows_tls.zig deleted-48| ... | @@ -1,48 +0,0 @@ | ||
| 1 | const std = @import("std"); | ||
| 2 | const builtin = @import("builtin"); | ||
| 3 | |||
| 4 | export var _tls_index: u32 = std.os.windows.TLS_OUT_OF_INDEXES; | ||
| 5 | export var _tls_start: u8 linksection(".tls") = 0; | ||
| 6 | export var _tls_end: u8 linksection(".tls$ZZZ") = 0; | ||
| 7 | export var __xl_a: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLA") = null; | ||
| 8 | export var __xl_z: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLZ") = null; | ||
| 9 | |||
| 10 | comptime { | ||
| 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. | ||
| 33 | pub 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 | }; | ||
| 41 | export 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 | }; | ||