wanting to implement Thread Local Storage on windows and am looking for pointers into the GCC codebase
Jonathan Wilson
jonwil@tpgi.com.au
Wed Oct 15 14:38:00 GMT 2003
just posted patch for binutils support of TLS to binutils list.
Anyway, the gist of what GCC needs to do:
1.anytime it sees a variable marked with __declspec(thread) it should mark
it as "thread local" somehow
2.all variable marked "thread local" need to go into a segment called .tls$
instead of wherver else they would go
3.when the variable is accessed, the folowing must be output: (or something
similar)
mov eax, ds:__tls_index
mov ecx, dword ptr fs:__tls_array
mov edx, edx, [ecx+eax*4]
then you do something like:
mov ds:_x[edx], 0 (in this case it sets it to 0)
Thats what it looks like in the obj file.
__tis_index and __tls_array should be marked external (they come from the
tlssup.c and atlssup.s respectivly, see my post to the binutils list for
details)
if the variable is local to this file, it should be defined as a SEGEF that
points to the .tls$ segment.
if the variable is in another file, the same ASM as above is used but it
points to an extern not a SEGDEF.
BTW, you cant access a variable thats Thread Local across DLL boundries.
Would like to get all of this stuff into GCC, Binutils and MingW-Runtime
for the next release of each (in particular, I want to get it into GCC 3.4
because if I miss the boat, GCC 3.5 is a very long way off)
More information about the Gcc
mailing list