add max_align_t definition for C11 and C++11
authorRich Felker <dalias@aerifal.cx>
Wed, 20 Aug 2014 21:20:14 +0000 (17:20 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 20 Aug 2014 21:20:14 +0000 (17:20 -0400)
unfortunately this needs to be able to vary by arch, because of a huge
mess GCC made: the GCC definition, which became the ABI, depends on
quirks in GCC's definition of __alignof__, which does not match the
formal alignment of the type.

GCC's __alignof__ unexpectedly exposes the an implementation detail,
its "preferred alignment" for the type, rather than the formal/ABI
alignment of the type, which it only actually uses in structures. on
most archs the two values are the same, but on some (at least i386)
the preferred alignment is greater than the ABI alignment.

I considered using _Alignas(8) unconditionally, but on at least one
arch (or1k), the alignment of max_align_t with GCC's definition is
only 4 (even the "preferred alignment" for these types is only 4).

arch/arm/bits/alltypes.h.in
arch/i386/bits/alltypes.h.in
arch/microblaze/bits/alltypes.h.in
arch/mips/bits/alltypes.h.in
arch/or1k/bits/alltypes.h.in
arch/powerpc/bits/alltypes.h.in
arch/sh/bits/alltypes.h.in
arch/x32/bits/alltypes.h.in
arch/x86_64/bits/alltypes.h.in
include/stddef.h

index 0d750cc8cdb7f7337a587e4a4627aa5e68473a05..183c4c41e6857e7e8bf60c4654d6871d74c0f36d 100644 (file)
@@ -13,6 +13,8 @@ TYPEDEF unsigned wint_t;
 TYPEDEF float float_t;
 TYPEDEF double double_t;
 
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long time_t;
 TYPEDEF long suseconds_t;
 
index 502c882265dd29a68bc8add3aa966e9f1c6ab9a5..8ba8f6f3fb0ffeb17236801acdcfb1c0b45454b6 100644 (file)
@@ -27,6 +27,8 @@ TYPEDEF long double float_t;
 TYPEDEF long double double_t;
 #endif
 
+TYPEDEF struct { _Alignas(8) long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long time_t;
 TYPEDEF long suseconds_t;
 
index 4657d14da6d59b703ef5c8b8841d198bcd40c1b3..a03e1b8956e25662d3d509f91608d6421ac90f30 100644 (file)
@@ -13,6 +13,8 @@ TYPEDEF unsigned wint_t;
 TYPEDEF float float_t;
 TYPEDEF double double_t;
 
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long time_t;
 TYPEDEF long suseconds_t;
 
index 4657d14da6d59b703ef5c8b8841d198bcd40c1b3..a03e1b8956e25662d3d509f91608d6421ac90f30 100644 (file)
@@ -13,6 +13,8 @@ TYPEDEF unsigned wint_t;
 TYPEDEF float float_t;
 TYPEDEF double double_t;
 
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long time_t;
 TYPEDEF long suseconds_t;
 
index 0d750cc8cdb7f7337a587e4a4627aa5e68473a05..183c4c41e6857e7e8bf60c4654d6871d74c0f36d 100644 (file)
@@ -13,6 +13,8 @@ TYPEDEF unsigned wint_t;
 TYPEDEF float float_t;
 TYPEDEF double double_t;
 
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long time_t;
 TYPEDEF long suseconds_t;
 
index 378124ca1dafeea7cd51ae4d250d369e784b3e7f..ee7f13734ed4b6d17a5aeb4e21673c9e6db62376 100644 (file)
@@ -13,6 +13,8 @@ TYPEDEF unsigned wint_t;
 TYPEDEF float float_t;
 TYPEDEF double double_t;
 
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long time_t;
 TYPEDEF long suseconds_t;
 
index 378124ca1dafeea7cd51ae4d250d369e784b3e7f..ee7f13734ed4b6d17a5aeb4e21673c9e6db62376 100644 (file)
@@ -13,6 +13,8 @@ TYPEDEF unsigned wint_t;
 TYPEDEF float float_t;
 TYPEDEF double double_t;
 
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long time_t;
 TYPEDEF long suseconds_t;
 
index 8930efa3c2dbde995f8f8af6e9909c3658fa5a5f..8e396c970bf9d8d8711e5e86a919e19ea51da7e3 100644 (file)
@@ -18,6 +18,8 @@ TYPEDEF float float_t;
 TYPEDEF double double_t;
 #endif
 
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long long time_t;
 TYPEDEF long long suseconds_t;
 
index 34b7d6ac2373e3ca61ecbac7302fee961b837a43..7b4f3e7208207856fda2b8d98d9af748269ded5a 100644 (file)
@@ -18,6 +18,8 @@ TYPEDEF float float_t;
 TYPEDEF double double_t;
 #endif
 
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
 TYPEDEF long time_t;
 TYPEDEF long suseconds_t;
 
index 0a329190c17c4697445cef8cd35395c27f2b9d51..bd753853503d94ca3759b2e451fffb68675e869b 100644 (file)
@@ -10,6 +10,9 @@
 #define __NEED_ptrdiff_t
 #define __NEED_size_t
 #define __NEED_wchar_t
+#if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L
+#define __NEED_max_align_t
+#endif
 
 #include <bits/alltypes.h>