cvs commit: src/lib/libc/gen tls.c src/lib/libc/i386/gen Makefile.inc _set_tp.c src/lib/libc/include libc_private.h src/lib/libthread_xu Makefile pthread.map src/lib/libthread_xu/arch/amd64/amd64 pthread_md.c src/lib/libthread_xu/arch/amd64/include ...
YONETANI Tomokazu
qhwt+dfly at les.ath.cx
Tue Apr 12 09:29:11 PDT 2005
On Wed, Mar 30, 2005 at 04:32:45AM +0200, Joerg Sonnenberger wrote:
> On Tue, Mar 29, 2005 at 06:25:58PM -0800, Matthew Dillon wrote:
> >
> > :
> > :On Tue, Mar 29, 2005 at 11:26:20AM -0800, Joerg Sonnenberger wrote:
> > :> joerg 2005/03/29 11:26:20 PST
> > :>
> > :> Added files:
> > :> sys/i386/include tls.h
> > :
> > :I'm open for any advice how to teach GCC to create correct assembly
> > :for the #if'd out sections.
> > :
> > :Joerg
> >
> > As far as GAS is concerned, it's a memory effective address (remove
> > the %gs: prefix and it becomes clear). So:
> >
> > __asm __volatile ("movl %%gs:%1,%0" : "=r" (self) :
> > "m" (((struct tls_tcb *)0)->self));
>
> That's what I initialy thought too. The problem is that the above statement
> is assembled to:
> .LC0:
> .long 0 /* value of ((struct tls_tcb *)0)->self */
>
> main:
> ...
> movl %gs:.LC0,%eax
>
> which is clearly something different.
No,
__asm __volatile ("movl %%gs:%1,%0" : "=r" (self) :
"m" (((struct tls_tcb *)0)->tcb_pthread));
properly assembles to
movl %gs:8, %eax
whereas
__asm __volatile ("movl %%gs:%1,%0" : "=r" (self) :
"m" __offsetof(struct tls_tcb, tcb_pthread));
doesn't. "m" expects a memory operand, but __offsetof() returns
the address of a structure member whose base address is zero casted to
size_t(which is clearly not a memory reference). It seems to me that
if the constraint "m" is given a non-memory operand, gcc sets up a
temporary storage(.LC0 above) and store the operand to that location
for consistency.
More information about the Commits
mailing list