Commit 6a687bda76

LemonBoy <thatlemon@gmail.com>
2019-10-06 16:45:51
Support for TLS on Win32
1 parent 93a4907
Changed files (3)
lib
test
stage1
behavior
lib/std/os/test.zig
@@ -116,7 +116,6 @@ test "AtomicFile" {
 
 test "thread local storage" {
     if (builtin.single_threaded) return error.SkipZigTest;
-    if (builtin.os == .windows) return error.SkipZigTest;
     const thread1 = try Thread.spawn({}, testTls);
     const thread2 = try Thread.spawn({}, testTls);
     testTls({});
lib/std/special/start_windows_tls.zig
@@ -1,4 +1,5 @@
 const std = @import("std");
+const builtin = @import("builtin");
 
 export var _tls_index: u32 = std.os.windows.TLS_OUT_OF_INDEXES;
 export var _tls_start: u8 linksection(".tls") = 0;
@@ -6,6 +7,17 @@ export var _tls_end: u8 linksection(".tls$ZZZ") = 0;
 export var __xl_a: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLA") = null;
 export var __xl_z: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLZ") = null;
 
+comptime {
+    if (builtin.arch == .i386) {
+        // The __tls_array is the offset of the ThreadLocalStoragePointer field
+        // in the TEB block whose base address held in the %fs segment.
+        asm (
+            \\ .global __tls_array
+            \\ __tls_array = 0x2C
+        );
+    }
+}
+
 // TODO this is how I would like it to be expressed
 // TODO also note, ReactOS has a +1 on StartAddressOfRawData and AddressOfCallBacks. Investigate
 // why they do that.
test/stage1/behavior/misc.zig
@@ -687,9 +687,6 @@ fn getNull() ?*i32 {
 }
 
 test "thread local variable" {
-    if (builtin.os == .windows and builtin.arch == .i386)
-        return error.SkipZigTest;
-
     const S = struct {
         threadlocal var t: i32 = 1234;
     };