https://llvm.org/bugs/show_bug.cgi?id=26462
Bug ID: 26462 Summary: GCC/clang C11 _Atomic incompatibility Product: clang Version: unspecified Hardware: PC OS: Linux Status: NEW Severity: normal Priority: P Component: Frontend Assignee: unassignedclangb...@nondot.org Reporter: jykni...@google.com CC: llvm-bugs@lists.llvm.org Classification: Unclassified Clang and GCC have incompatible ABIs for _Atomic, on non-power-of-2-sized types. Simple demonstration of the difference: struct A3 { char val[3]; }; _Atomic struct A3 a3; // GCC: _Static_assert(sizeof(a3) == 3, ""); _Static_assert(_Alignof(a3) == 1, ""); // Clang: _Static_assert(sizeof(a3) == 4, ""); _Static_assert(_Alignof(a3) == 4, ""); GCC's logic for _Atomic is: For types which have a size of exactly 1, 2, 4, 8, or 16 bytes, increase the alignment to be at least the size. Never change the size of the type. libstdc++'s std::atomic uses the same logic as GCC, but it's implemented inline in the header, as GCC doesn't support C11 atomics in C++ mode. Thus, libstdc++ under clang also uses GCC's rule. Clang has the following rule: if the size of a type is less than a target-specific variable "MaxAtomicPromoteWidth" (0, 4, 8, or 16 bytes on current targets), round the size up to the next power of two, and SET the alignment to the size. libc++'s std::atomic uses clang's C11 atomics support (which clang supports as an extension in C++ mode), and thus gets the same behavior...but only when built with clang. When libc++ is built with GCC, it uses an alternative implementation which doesn't ever increase the alignment/size. So, the current situation: - C11 _Atomic is incompatible between Clang and GCC. - libstdc++'s std::atomic is compatible between Clang and GCC. - libc++'s std::atomic is incompatible between Clang and GCC. Furthermore, I believe C11 and C++ atomics are intended to be compatible with eachother. And that's not true with clang and libstdc++, nor with gcc and libc++. -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs