Re: asm problem with and without -fPIC on x86

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Tim Blechmann writes:
 > hi all,
 > 
 > i've got the following problem:
 > i am using the atomic_ops library to use the cmpxchg8b opcode. the
 > specific section for x86 machines looks like this:
 > 
 >   __asm__ __volatile__("lock; cmpxchg8b %0; setz %1"
 >                    : "=m"(*addr), "=q"(result)
 >                    : "m"(*addr), "d" (old_val1), "a" (old_val2),
 >                      "c" (new_val1), "b" (new_val2) : "memory");
 > 
 > unfortunately, this doesn't compile, when building as a shared library
 > with the -fPIC flag, as the `b` register can't be used.
 > so i wrote a workaround:
 > 
 >   __asm__ __volatile__("push %%ebx; movl %6,%%ebx; lock; cmpxchg8b %0; setz %1; pop %%ebx"
 >                    : "=m"(*addr), "=q"(result)
 >                    : "m"(*addr), "d" (old_val1), "a" (old_val2),
 >                      "c" (new_val1), "m" (new_val2) : "memory");
 > 
 > this piece of code works fine if the -fPIC flag is enabled. but when
 > compiling this without -fPIC and switching on optimization (-O), the
 > code compiles, but doesn't work correctly anymore. without optimization
 > it works fine, though.
 > 
 > is this a compiler bug or a user bug?

You know, this would have been *so* much easier to figure out it you'd
provided a test case.

Andrew.

-- 
Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SL4 1TE, UK
Registered in England and Wales No. 3798903

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux