On 26/02/18 04:00, Ruslan Nikolaev via gcc wrote:
1. Not consistent with clang/llvm which completely supports double-width
atomics for arm32, arm64, x86 and x86-64 making it possible to write portable
code (w/o specific extensions or assembly code) across all these architectures
(which is finally possible with C11!)
this should be reported as a bug against clang.
there is no abi guarantee that double-width atomics
will be able to synchronize with code in other modules,
you have to introduce a new abi to do this whatever
that takes (new elf flag, new dynamic linker name,..).
4. atomic_load can be implemented using read-modify-write as it is the only
option for x86-64 and arm64 (see below).
no, it can't be.
[..] The actual nature of read-only memory and how it can be used are
outside the scope of the standard, so there is nothing to prevent atomic_load
from being implemented as a read-modify-write operation.
rmw load is only valid if the implementation can
guarantee that atomic objects are never read-only.
current implementations on linux (including clang)
don't do that, so an rmw load can observably break
conforming c code: a static global const object is
placed in .rodata section and thus rmw on it is a
crash at runtime contrary to c standard requirements.
on an aarch64 machine clang miscompiles this code:
$ cat a.c
#include <stdatomic.h>
static const _Atomic struct S {long i,j;} x;
int f(const _Atomic struct S *p)
{
struct S y = *p;
return y.i;
}
int main()
{
return f(&x);
}
$ gcc a.c -latomic
$ ./a.out
$ clang a.c -latomic
$ ./a.out
Segmentation fault (core dumped)