Am Freitag, den 26.11.2021, 09:24 +0000 schrieb Jonathan Wakely: > On Fri, 26 Nov 2021 at 09:00, Martin Uecker via Gcc <gcc@gcc.gnu.org> wrote: > > Am Freitag, den 26.11.2021, 09:29 +0100 schrieb Eric Botcazou: > > > > This is a silent and dangerous incorrect code generation issue. > > > > > > Let's avoid this kind of FUD, please, builtins are low-level devices and > > > people must know what they are doing and be prepared for caveats. > > > > Sorry, I do not think this FUD. One needs to look at the assembly > > and know *very specific* details about the platform and atomics > > to understand that it does not work and silently (!) breaks on > > GCC (and not clang) in very rare cases. This with no indication > > about this in the documentation which clearly implies that > > this works for "all types". > > It does. Two objects of type T are still the same type whether or not > they are both aligned to sizeof(T).
Yes, but only under special circumstances which are not automatically fulfilled for all types. > > > > If these functions are not meant to be used to exising > > > > data, then at least the documentation needs to be changed > > > > and include a big warning that this only happens to work > > > > corectly if the data has sufficient alignment for the > > > > specific architecture (which of course makes it impossible > > > > to use this in a portable way). > > > > > > The last part of the sentence is again a blatant overstatement > > > > Then please explain how one is supposed to use in a portable way if > > it sometimes work or not based on platform-specific alignment > > properties. > > Either align your variable to its size, or don't use non-portable > compiler built-ins, use _Atomic. > > If you want to be able to perform atomic operations on non-_Atomic > objects portably, that seems like a useful addition to the C standard > library (like std::atomic_ref in C++20). The problem is that atomic_ref also only works if the alignment fulfills special requirements. So it can not always be used on existing data structures. I think it would be helpful if a compiler supports this by providing suitable builtins, which it could easily do. Since the existing builtins are already documented in a way that implies that they allow exactly this, it would be better and safer to just make this work. Martin