Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Jul 2003 09:24:06 -0700
From:      Marcel Moolenaar <marcel@xcllnt.net>
To:        Alexander Kabaev <kabaev@mail.ru>
Cc:        threads@freebsd.org
Subject:   Re: Some more on TLS
Message-ID:  <20030719162406.GA16766@dhcp01.pn.xcllnt.net>
In-Reply-To: <20030719095406.02c51beb.kabaev@mail.ru>
References:  <20030719045625.GB45759@dhcp01.pn.xcllnt.net> <20030719095406.02c51beb.kabaev@mail.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jul 19, 2003 at 09:54:06AM -0400, Alexander Kabaev wrote:
> 
> > o  There's no assembler support for TLS on i386 and amd64.
> 
> amd64 is new and TLS is probably not activated enabled in binutils yet.
> 
> i386 assebmly thing: what do you mean?
> 
> % cat test.c 
>        .section ".tdata","awT",@progbits
> foo:    .long   25
>         .text
>         movl    %gs:0, %eax
>         leal    foo@TLSGD(,%ebx,1), %eax
>         leal    foo@TLSLDM(%ebx), %eax
>         leal    foo@DTPOFF(%eax), %edx
>         movl    foo@GOTTPOFF(%ebx), %eax
>         subl    foo@GOTTPOFF(%ebx), %eax
>         addl    foo@GOTNTPOFF(%ebx), %eax
>         movl    foo@INDNTPOFF, %eax
>         movl    $foo@TPOFF, %eax
>         subl    $foo@TPOFF, %eax
>         leal    foo@NTPOFF(%ecx), %eax

Our in-tree compiler emits assembly that our assembler doesn't like.
Given the following C program:

\begin{c}
int __thread i = 3;
int x()
{
        return i;
}
\end{c}

Our compiler emits:

\begin{as}
        .file   "t.c"
.globl %li
        .section        .tdata,"awT",@progbits
        .p2align 2
        .type   %li, @object
        .size   %li, 4
%li:
        .long   3
        .text
        .p2align 2,,3
.globl x
        .type   x, @function
x:
        pushl   %ebp
        movl    %esp, %ebp
        movl    %gs:0, %eax
        movl    %li@NTPOFF(%eax), %eax
        leave
        ret
        .size   x, .-x
        .ident  "GCC: (GNU) 3.3.1 [FreeBSD] 20030711 (prerelease)"
\end{as}

And the assembler does not like that:
/var/tmp//ccVMU4H6.s: Assembler messages:
/var/tmp//ccVMU4H6.s:2: Warning: rest of line ignored; first ignored character is `%'
/var/tmp//ccVMU4H6.s:5: Error: unrecognized symbol type "li"
/var/tmp//ccVMU4H6.s:5: Warning: rest of line ignored; first ignored character is `,'
/var/tmp//ccVMU4H6.s:6: Error: expected comma after name `' in .size directive
/var/tmp//ccVMU4H6.s:6: Warning: rest of line ignored; first ignored character is `%'
/var/tmp//ccVMU4H6.s:7: Warning: rest of line ignored; first ignored character is `%'
/var/tmp//ccVMU4H6.s:17: Error: bad register name `%li@NTPOFF(%eax)'

It's probably just the %l and %G prefix, but it makes the use of the
__thread keyword rather pointless at this time.

-- 
 Marcel Moolenaar	  USPA: A-39004		 marcel@xcllnt.net



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030719162406.GA16766>