diff options
| author | LemonBoy <thatlemon@gmail.com> | 2019-05-04 12:02:55 +0200 |
|---|---|---|
| committer | LemonBoy <thatlemon@gmail.com> | 2019-05-07 13:09:18 +0200 |
| commit | d8ab301aa81758a7918de446271201c044e7835f (patch) | |
| tree | 6651864a9104e691c0347e76581dfc2ce73aa2a3 /std/os.zig | |
| parent | 7432fb04d6e3c52b40e81911d6c608e4d17317df (diff) | |
| download | zig-d8ab301aa81758a7918de446271201c044e7835f.tar.gz zig-d8ab301aa81758a7918de446271201c044e7835f.zip | |
std: Implement TLS support for Linux
Tested on x86_64, i386, ARM, AARCH64
Diffstat (limited to 'std/os.zig')
| -rw-r--r-- | std/os.zig | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/std/os.zig b/std/os.zig index 3276ac2b1d..bc9d0ad4d2 100644 --- a/std/os.zig +++ b/std/os.zig @@ -3126,9 +3126,6 @@ pub const SpawnThreadError = error{ Unexpected, }; -pub var linux_tls_phdr: ?*std.elf.Phdr = null; -pub var linux_tls_img_src: [*]const u8 = undefined; // defined if linux_tls_phdr is - /// caller must call wait on the returned thread /// fn startFn(@typeOf(context)) T /// where T is u8, noreturn, void, or !void @@ -3238,12 +3235,10 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread } // Finally, the Thread Local Storage, if any. if (!Thread.use_pthreads) { - if (linux_tls_phdr) |tls_phdr| { - l = mem.alignForward(l, tls_phdr.p_align); + if (linux.tls.tls_image) |tls_img| { + l = mem.alignForward(l, @alignOf(usize)); tls_start_offset = l; - l += tls_phdr.p_memsz; - // the fs register address - l += @sizeOf(usize); + l += tls_img.alloc_size; } } break :blk l; @@ -3284,10 +3279,8 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread posix.CLONE_THREAD | posix.CLONE_SYSVSEM | posix.CLONE_PARENT_SETTID | posix.CLONE_CHILD_CLEARTID | posix.CLONE_DETACHED; var newtls: usize = undefined; - if (linux_tls_phdr) |tls_phdr| { - @memcpy(@intToPtr([*]u8, mmap_addr + tls_start_offset), linux_tls_img_src, tls_phdr.p_filesz); - newtls = mmap_addr + mmap_len - @sizeOf(usize); - @intToPtr(*usize, newtls).* = newtls; + if (linux.tls.tls_image) |tls_img| { + newtls = linux.tls.copyTLS(mmap_addr + tls_start_offset); flags |= posix.CLONE_SETTLS; } const rc = posix.clone(MainFuncs.linuxThreadMain, mmap_addr + stack_end_offset, flags, arg, &thread_ptr.data.handle, newtls, &thread_ptr.data.handle); |
