| author | |
| committer | |
| log | 8056a851517cd92590ddb9a4b76ce7b1f4aeb242 |
| tree | 7a8ba08089eafc505878379d6e486bcc96293601 |
| parent | a931bfada5e358ace980b2f8fbc50ce424ced526 |
| signature |
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 | 176 | lpReserved: std.os.windows.LPVOID, |
| 177 | 177 | ) callconv(std.os.windows.WINAPI) std.os.windows.BOOL { |
| 178 | 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 | 182 | if (@hasDecl(root, "DllMain")) { |
| ... | ... | @@ -427,7 +427,7 @@ fn _start() callconv(.Naked) noreturn { |
| 427 | 427 | fn WinStartup() callconv(std.os.windows.WINAPI) noreturn { |
| 428 | 428 | @setAlignStack(16); |
| 429 | 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 | 433 | std.debug.maybeEnableSegfaultHandler(); |
| ... | ... | @@ -438,7 +438,7 @@ fn WinStartup() callconv(std.os.windows.WINAPI) noreturn { |
| 438 | 438 | fn wWinMainCRTStartup() callconv(std.os.windows.WINAPI) noreturn { |
| 439 | 439 | @setAlignStack(16); |
| 440 | 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 | 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 | }; |