This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/64843] New: miscompilation of atomic_fetch_add on atomic pointer type
- From: "richard-gccbugzilla at metafoo dot co.uk" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 28 Jan 2015 19:38:40 +0000
- Subject: [Bug c/64843] New: miscompilation of atomic_fetch_add on atomic pointer type
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64843
Bug ID: 64843
Summary: miscompilation of atomic_fetch_add on atomic pointer
type
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: richard-gccbugzilla at metafoo dot co.uk
#include <stdatomic.h>
int *_Atomic p;
void f() { atomic_fetch_add(&p, 1); }
gives
pushq %rbp
movq %rsp, %rbp
lock addq $1, p(%rip)
popq %rbp
ret
... which is wrong; gcc should add 4 to p, not 1.
C11's atomic_fetch_add seems very difficult to implement with GCC's current set
of builtins (you could in principle use _Generic to detect whether you have an
atomic integer type).
To this end, Clang adds a __c11_atomic_fetch_add builtin which provides the
correct C11 semantics (premultiply by sizeof(*x) for an atomic pointer type) of
atomic_fetch_add_explicit. Clang's __c11_... builtins also enforce some of the
other C11 rules; for instance, only pointers to _Atomic types are permitted, so
they may be valuable to add to GCC independent of this bug.