On 7/1/06, Gary Funck <[EMAIL PROTECTED]> wrote:
...
What are the technical reasons for the front-end enforcing this restriction,
when apparently some linkers will handle the TLS linkage fine? If in fact
it is required that __thread be added to the extern, is the compiler simply
accommodating a limitation/bug in the linker?
Because the compiler has to generate different code
for accesses to __thread vs non __thread variable:
# cat -n t.c
1 extern int i1;
2 extern __thread int i2;
3
4 int func1() { return i1; }
5 int func2() { return i2; }
# gcc -O -S t.c
# cat t.s
.file "t.c"
.text
.globl func1
.type func1,@function
func1:
pushl %ebp
movl %esp, %ebp
movl i1, %eax
leave
ret
.Lfe1:
.size func1,.Lfe1-func1
.globl func2
.type func2,@function
func2:
pushl %ebp
movl %esp, %ebp
movl [EMAIL PROTECTED], %eax
movl %gs:(%eax), %eax
leave
ret
.Lfe2:
.size func2,.Lfe2-func2
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
#
--
#pragma ident "Seongbae Park, compiler, http://seongbae.blogspot.com"