bjorn3 commented on issue #4546:
Do we need to mark the gs register as used?
The gs register is not allocatable by regalloc, so it doesn't need to be marked as usable.
bjorn3 commented on issue #4546:
Thanks a lot for working on this!
bjorn3 commented on issue #4546:
#![feature(thread_local)] 1 ↵ bjorn@laptopbjorn-lenovo use std::cell::Cell; #[thread_local] pub static FOO: Cell<u8> = Cell::new(42); pub static mut BAR: u8 = 43; pub fn get_foo() -> u8 { FOO.get() } pub fn set_foo(foo: u8) { FOO.set(foo) }' | rustc +nightly --target x86_64-pc-windows-msvc --emit obj - --crate-type lib -Oproduces an object file for which
objdump -drgives:rust_out.o: file format pe-x86-64 Disassembly of section .text: 0000000000000000 <_ZN8rust_out7get_foo17h9e4ed845564f4123E>: 0: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 6 <_ZN8rust_out7get_foo17h9e4ed845564f4123E+0x6> 2: R_X86_64_PC32 _tls_index 6: 65 48 8b 0c 25 58 00 mov %gs:0x58,%rcx d: 00 00 f: 48 8b 04 c1 mov (%rcx,%rax,8),%rax 13: 8a 80 00 00 00 00 mov 0x0(%rax),%al 15: secrel32 _ZN8rust_out3FOO17he424d0489633cb80E 19: c3 retq Disassembly of section .text: 0000000000000000 <_ZN8rust_out7set_foo17hb5fb9735547d2b58E>: 0: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 6 <_ZN8rust_out7set_foo17hb5fb9735547d2b58E+0x6> 2: R_X86_64_PC32 _tls_index 6: 65 48 8b 14 25 58 00 mov %gs:0x58,%rdx d: 00 00 f: 48 8b 04 c2 mov (%rdx,%rax,8),%rax 13: 88 88 00 00 00 00 mov %cl,0x0(%rax) 15: secrel32 _ZN8rust_out3FOO17he424d0489633cb80E 19: c3 retqand
objdump --syms:rust_out.o: file format pe-x86-64 SYMBOL TABLE: [ 0](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .text AUX scnlen 0x0 nreloc 0 nlnno 0 checksum 0x0 assoc 1 comdat 0 [ 2](sec 2)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .data AUX scnlen 0x0 nreloc 0 nlnno 0 checksum 0x0 assoc 2 comdat 0 [ 4](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .bss AUX scnlen 0x0 nreloc 0 nlnno 0 checksum 0x0 assoc 3 comdat 0 [ 6](sec 4)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .text AUX scnlen 0x1a nreloc 2 nlnno 0 checksum 0xa84d5eee assoc 4 comdat 1 [ 8](sec 4)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x0000000000000000 _ZN8rust_out7get_foo17h9e4ed845564f4123E [ 9](sec 5)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .text AUX scnlen 0x1a nreloc 2 nlnno 0 checksum 0xac4f1caa assoc 5 comdat 1 [ 11](sec 5)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x0000000000000000 _ZN8rust_out7set_foo17hb5fb9735547d2b58E [ 12](sec 6)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .tls$ AUX scnlen 0x1 nreloc 0 nlnno 0 checksum 0xdbbbc9d6 assoc 6 comdat 1 [ 14](sec 6)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x0000000000000000 _ZN8rust_out3FOO17he424d0489633cb80E [ 15](sec 7)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .data AUX scnlen 0x1 nreloc 0 nlnno 0 checksum 0xacbcf940 assoc 7 comdat 1 [ 17](sec 7)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x0000000000000000 _ZN8rust_out3BAR17hab28e85eef212a9aE [ 18](sec 8)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .data AUX scnlen 0x8 nreloc 1 nlnno 0 checksum 0x0 assoc 8 comdat 1 [ 20](sec 8)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x0000000000000000 __imp__ZN8rust_out3FOO17he424d0489633cb80E [ 21](sec 9)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x0000000000000000 .data AUX scnlen 0x8 nreloc 1 nlnno 0 checksum 0x0 assoc 9 comdat 1 [ 23](sec 9)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x0000000000000000 __imp__ZN8rust_out3BAR17hab28e85eef212a9aE [ 24](sec -1)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x0000000000000000 @feat.00 [ 25](sec 0)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x0000000000000000 _tls_index [ 26](sec -2)(fl 0x00)(ty 0)(scl 103) (nx 2) 0x0000000000000000 rust_out.cb515bd7- File File
bjorn3 commented on issue #4546:
I managed to run a small tls example on windows! :tada:
#![feature(thread_local)] use std::cell::Cell; #[thread_local] static FOO: Cell<u8> = Cell::new(42); fn main() { assert_eq!(FOO.get(), 42); std::thread::spawn(|| { FOO.set(43); assert_eq!(FOO.get(), 43); }).join(); assert_eq!(FOO.get(), 42); }
afonso360 commented on issue #4546:
I managed to run a small tls example on windows! :tada:
That's really cool! I'm going to try an compile
cg_clifwith this, to see where it breaks next. I suspect we don't have a very complete TLS implementation.
afonso360 edited a comment on issue #4546:
I managed to run a small tls example on windows! :tada:
That's really cool! I'm going to try and compile
cg_clifwith this, to see where it breaks next. I suspect we don't have a very complete TLS implementation.
afonso360 commented on issue #4546:
Rebased this on top of
main. I've also renamed theTlsIndexsymbol toCoffTlsIndex.With this rebase we've also lost the lookup function. But we can add it later if we need it in the JIT, is this okay @bjorn3 ?
afonso360 edited a comment on issue #4546:
Rebased this on top of
main. I've also renamed theTlsIndexsymbol toCoffTlsIndex.With this rebase we've also lost the lookup function. But we can add it later when we need it in the JIT, is this okay @bjorn3 ?
bjorn3 commented on issue #4546:
Fine with me.
jameysharp commented on issue #4546:
Do you both feel this is ready for merge, then? I've glanced over it and it looks reasonable to me, but I'm not at all familiar with how thread-local storage works on any platform.
afonso360 commented on issue #4546:
Yes, this should be ready to merge!
Last updated: Dec 06 2025 at 06:05 UTC