[PATCH] D28213: [Frontend] Correct values of ATOMIC_*_LOCK_FREE to match builtin
Dimitry Andric via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 3 13:45:19 PST 2017
dim added a comment.
In https://reviews.llvm.org/D28213#666196, @mgorny wrote:
> In https://reviews.llvm.org/D28213#665967, @dim wrote:
>
> > I don't think FreeBSD has lock-free 64 bit atomic operations on 32-bit x86. IIRC we already had some trouble before with clang emitting libcalls to `__atomic_fetch_add_8` and friends, which then lead to linking errors.
> >
> > See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=216745, where this is now occurring with boost.
>
>
> Could you try to figure out what's the cause for that discrepancy?
I think the discrepancy is that many 32-bit Linuxes target at least i686 by default, and then you have CMPXCHG8B most of the time (apparently not always, but nobody seems to care):
$ uname -srm
Linux 3.16.0-4-686-pae i686
$ gcc -dM -E -x c /dev/null | grep LLONG_LOCK
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
However, 32-bit FreeBSD targets i486 by default:
$ uname -srm
FreeBSD 12.0-CURRENT i386
$ gcc -dM -E -x c /dev/null | grep LLONG_LOCK
#define __GCC_ATOMIC_LLONG_LOCK_FREE 1
$ clang-3.9.1 -dM -E -x c /dev/null | grep LLONG_LOCK
#define __GCC_ATOMIC_LLONG_LOCK_FREE 1
$ clang-4.0.0 -dM -E -x c /dev/null | grep LLONG_LOCK
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
Note that even on 32-bit Linux you get 1 for `__GCC_ATOMIC_LLONG_LOCK_FREE`, if you target i486:
$ uname -srm
Linux 3.16.0-4-686-pae i686
$ gcc -march=i486 -dM -E -x c /dev/null | grep LLONG_LOCK
#define __GCC_ATOMIC_LLONG_LOCK_FREE 1
> What's the value of `__atomic_always_lock_free(sizeof(long long), 0)` for gcc and clang?
For gcc, it is always 0, for clang (I tested 3.4.1 through 4.0.0) it is always 1. Maybe that was always incorrect on 32-bit FreeBSD, then?
Repository:
rL LLVM
https://reviews.llvm.org/D28213
More information about the cfe-commits
mailing list