1 1.1 christos /* A substitute for ISO C11 <stdalign.h>. 2 1.1 christos 3 1.1.1.2 christos Copyright 2011-2022 Free Software Foundation, Inc. 4 1.1 christos 5 1.1.1.2 christos This file is free software: you can redistribute it and/or modify 6 1.1.1.2 christos it under the terms of the GNU Lesser General Public License as 7 1.1.1.2 christos published by the Free Software Foundation; either version 2.1 of the 8 1.1.1.2 christos License, or (at your option) any later version. 9 1.1 christos 10 1.1.1.2 christos This file is distributed in the hope that it will be useful, 11 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 12 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 1.1.1.2 christos GNU Lesser General Public License for more details. 14 1.1 christos 15 1.1.1.2 christos You should have received a copy of the GNU Lesser General Public License 16 1.1.1.2 christos along with this program. If not, see <https://www.gnu.org/licenses/>. */ 17 1.1 christos 18 1.1 christos /* Written by Paul Eggert and Bruno Haible. */ 19 1.1 christos 20 1.1 christos #ifndef _GL_STDALIGN_H 21 1.1 christos #define _GL_STDALIGN_H 22 1.1 christos 23 1.1 christos /* ISO C11 <stdalign.h> for platforms that lack it. 24 1.1 christos 25 1.1 christos References: 26 1.1 christos ISO C11 (latest free draft 27 1.1 christos <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>) 28 1.1 christos sections 6.5.3.4, 6.7.5, 7.15. 29 1.1 christos C++11 (latest free draft 30 1.1 christos <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>) 31 1.1 christos section 18.10. */ 32 1.1 christos 33 1.1 christos /* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment 34 1.1 christos requirement of a structure member (i.e., slot or field) that is of 35 1.1 christos type TYPE, as an integer constant expression. 36 1.1 christos 37 1.1.1.2 christos This differs from GCC's and clang's __alignof__ operator, which can 38 1.1.1.2 christos yield a better-performing alignment for an object of that type. For 39 1.1.1.2 christos example, on x86 with GCC and on Linux/x86 with clang, 40 1.1.1.2 christos __alignof__ (double) and __alignof__ (long long) are 8, whereas 41 1.1.1.2 christos alignof (double) and alignof (long long) are 4 unless the option 42 1.1.1.2 christos '-malign-double' is used. 43 1.1 christos 44 1.1 christos The result cannot be used as a value for an 'enum' constant, if you 45 1.1 christos want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. 46 1.1 christos 47 1.1 christos Include <stddef.h> for offsetof. */ 48 1.1 christos #include <stddef.h> 49 1.1 christos 50 1.1 christos /* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other 51 1.1 christos standard headers, defines conflicting implementations of _Alignas 52 1.1 christos and _Alignof that are no better than ours; override them. */ 53 1.1 christos #undef _Alignas 54 1.1 christos #undef _Alignof 55 1.1 christos 56 1.1 christos /* GCC releases before GCC 4.9 had a bug in _Alignof. See GCC bug 52023 57 1.1.1.2 christos <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>. 58 1.1.1.2 christos clang versions < 8.0.0 have the same bug. */ 59 1.1 christos #if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \ 60 1.1.1.2 christos || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \ 61 1.1.1.2 christos && !defined __clang__) \ 62 1.1.1.2 christos || (defined __clang__ && __clang_major__ < 8)) 63 1.1 christos # ifdef __cplusplus 64 1.1 christos # if 201103 <= __cplusplus 65 1.1 christos # define _Alignof(type) alignof (type) 66 1.1 christos # else 67 1.1 christos template <class __t> struct __alignof_helper { char __a; __t __b; }; 68 1.1 christos # define _Alignof(type) offsetof (__alignof_helper<type>, __b) 69 1.1 christos # endif 70 1.1 christos # else 71 1.1 christos # define _Alignof(type) offsetof (struct { char __a; type __b; }, __b) 72 1.1 christos # endif 73 1.1 christos #endif 74 1.1 christos #if ! (defined __cplusplus && 201103 <= __cplusplus) 75 1.1 christos # define alignof _Alignof 76 1.1 christos #endif 77 1.1 christos #define __alignof_is_defined 1 78 1.1 christos 79 1.1 christos /* alignas (A), also known as _Alignas (A), aligns a variable or type 80 1.1 christos to the alignment A, where A is an integer constant expression. For 81 1.1 christos example: 82 1.1 christos 83 1.1 christos int alignas (8) foo; 84 1.1 christos struct s { int a; int alignas (8) bar; }; 85 1.1 christos 86 1.1 christos aligns the address of FOO and the offset of BAR to be multiples of 8. 87 1.1 christos 88 1.1 christos A should be a power of two that is at least the type's alignment 89 1.1 christos and at most the implementation's alignment limit. This limit is 90 1.1 christos 2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable 91 1.1 christos to MSVC through at least version 10.0, A should be an integer 92 1.1 christos constant, as MSVC does not support expressions such as 1 << 3. 93 1.1 christos To be portable to Sun C 5.11, do not align auto variables to 94 1.1 christos anything stricter than their default alignment. 95 1.1 christos 96 1.1 christos The following C11 requirements are not supported here: 97 1.1 christos 98 1.1 christos - If A is zero, alignas has no effect. 99 1.1 christos - alignas can be used multiple times; the strictest one wins. 100 1.1 christos - alignas (TYPE) is equivalent to alignas (alignof (TYPE)). 101 1.1 christos 102 1.1 christos */ 103 1.1 christos 104 1.1 christos #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 105 1.1 christos # if defined __cplusplus && 201103 <= __cplusplus 106 1.1 christos # define _Alignas(a) alignas (a) 107 1.1.1.2 christos # elif (!defined __attribute__ \ 108 1.1.1.2 christos && ((defined __APPLE__ && defined __MACH__ \ 109 1.1.1.2 christos ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \ 110 1.1.1.2 christos : __GNUC__ && !defined __ibmxl__) \ 111 1.1.1.2 christos || (4 <= __clang_major__) \ 112 1.1.1.2 christos || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \ 113 1.1.1.2 christos || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__)) 114 1.1 christos # define _Alignas(a) __attribute__ ((__aligned__ (a))) 115 1.1 christos # elif 1300 <= _MSC_VER 116 1.1 christos # define _Alignas(a) __declspec (align (a)) 117 1.1 christos # endif 118 1.1 christos #endif 119 1.1 christos #if ((defined _Alignas && ! (defined __cplusplus && 201103 <= __cplusplus)) \ 120 1.1 christos || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__)) 121 1.1 christos # define alignas _Alignas 122 1.1 christos #endif 123 1.1 christos #if defined alignas || (defined __cplusplus && 201103 <= __cplusplus) 124 1.1 christos # define __alignas_is_defined 1 125 1.1 christos #endif 126 1.1 christos 127 1.1 christos #endif /* _GL_STDALIGN_H */ 128