Possible regression in i386 build with gcc 4.6

Tijl Coosemans tijl at coosemans.org
Sat Oct 6 16:54:59 UTC 2012

On 06-10-2012 17:39, Shane Ambler wrote:
> On 05/10/2012 23:41, Tijl Coosemans wrote:
>> On 02-10-2012 21:20, Shane Ambler wrote:
>>> I found a situation where gcc v4.2 compiles a i386 working binary and
>>> v4.6 doesn't. (Currently 4.7 and 4.8 fail to build this code) I have
>>> verified that this happens with 8.2/8.3/9.0 i386 systems. x86_64
>>> versions build without issue as does clang i386/x86_64.
>>> It appears that the x86_64 target of gcc offers gcc atomics while the
>>> i386 target doesn't - and this appears to be a freebsd specific setup,
>>> the i386 targets then fall back to using tbb atomics.
>>> inline long long
>>> atomic_exchange_and_add (volatile long long *at, long long x)
>>> {
>>> #ifdef USE_GCC_ATOMICS
>>>      return __sync_fetch_and_add (at, x);
>>> #elif USE_TBB
>>>      atomic<long long> *a = (atomic<long long> *)at;
>>>      return a->fetch_and_add (x);
>>> #elif defined(__APPLE__)
>>>    <snip>
>>> #endif
>>> }
>> Atomic operations on long long require cmpxchg8b instruction which was
>> added to the i586, so if you add -march=i586 to CFLAGS you should be
>> able to use gcc atomics on FreeBSD/i386 as well.
> The arch setting isn't the issue - gcc compiled on freebsd for 32bit
> x86 target doesn't provide gcc atomics. So __sync_fetch_and_add
> doesn't exist. While adding support for gcc atomics to the i386
> target would be good, I would assume there is a reason that it is
> disabled on FreeBSD (that reason may or may not be resolved now).

The __sync built-ins exist in both base and ports gcc, but
__sync_fetch_and_add_8 needs at least -march=i586.

> The point I wanted to make in this email is that for some reason
> gcc46 compiles the tbb alternative in a way that causes a seg fault
> when gcc42 can compile it fine. And to maybe get the gcc atomics
> support re-evaluated.
> But you did give me an idea or two - the first of adding some asm
> code is beyond me but I then went and found that go-semacquire.c from
> gcc46 source has code for __sync_fetch_and_add_4 (using pthread mutex
> locks) so I used that to create a patch that gets the gcc46 build
> working.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: OpenPGP digital signature
Url : http://lists.freebsd.org/pipermail/freebsd-ports/attachments/20121006/82666062/signature.pgp

More information about the freebsd-ports mailing list