15 #ifndef LLVM_SUPPORT_ALIGNOF_H 16 #define LLVM_SUPPORT_ALIGNOF_H 18 #include "llvm/Compiler.h" 20 #include <type_traits> 28 template <typename T, bool = std::is_abstract<T>::value>
37 #pragma warning(suppress : 4324) 78 static constexpr
unsigned Alignment =
static_cast<unsigned int>(
82 Alignment =
static_cast<unsigned int>(
86 enum { Alignment_GreaterEqual_2Bytes = Alignment >= 2 ? 1 : 0 };
87 enum { Alignment_GreaterEqual_4Bytes = Alignment >= 4 ? 1 : 0 };
88 enum { Alignment_GreaterEqual_8Bytes = Alignment >= 8 ? 1 : 0 };
89 enum { Alignment_GreaterEqual_16Bytes = Alignment >= 16 ? 1 : 0 };
91 enum { Alignment_LessEqual_2Bytes = Alignment <= 2 ? 1 : 0 };
92 enum { Alignment_LessEqual_4Bytes = Alignment <= 4 ? 1 : 0 };
93 enum { Alignment_LessEqual_8Bytes = Alignment <= 8 ? 1 : 0 };
94 enum { Alignment_LessEqual_16Bytes = Alignment <= 16 ? 1 : 0 };
105 template <
typename T>
106 inline unsigned alignOf() {
return AlignOf<T>::Alignment; }
121 #if __has_feature(cxx_alignas) 122 template<std::
size_t Alignment, std::
size_t Size>
124 alignas(Alignment)
char buffer[Size];
127 #elif defined(__GNUC__) || defined(__IBM_ATTRIBUTES) 128 template<std::
size_t Alignment, std::
size_t Size>
132 #define LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \ 133 template<std::size_t Size> \ 134 struct AlignedCharArray<x, Size> { \ 135 __attribute__((aligned(x))) char buffer[Size]; \ 138 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(1)
139 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(2)
140 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(4)
141 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8)
142 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(16)
143 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(32)
144 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(64)
145 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(128)
147 #undef LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT 150 # error No supported align as directive. 156 template<std::
size_t Alignment, std::
size_t Size>
167 template<std::
size_t Size>
175 template<std::
size_t Size>
183 template<std::
size_t Size>
191 template<std::
size_t Size>
203 #define LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \ 204 template<std::size_t Size> \ 205 struct AlignedCharArray<x, Size> { \ 206 __declspec(align(x)) char buffer[Size]; \ 209 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(16)
210 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(32)
211 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(64)
212 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(128)
214 #undef LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT 219 template <
typename T1,
220 typename T2 = char,
typename T3 = char,
typename T4 = char,
221 typename T5 = char,
typename T6 = char,
typename T7 = char,
222 typename T8 = char,
typename T9 = char,
typename T10 =
char>
224 T1 t1; T2 t2; T3 t3; T4 t4; T5 t5; T6 t6; T7 t7; T8 t8; T9 t9; T10 t10;
229 template <
typename T1,
230 typename T2 = char,
typename T3 = char,
typename T4 = char,
231 typename T5 = char,
typename T6 = char,
typename T7 = char,
232 typename T8 = char,
typename T9 = char,
typename T10 =
char>
234 char arr1[
sizeof(T1)], arr2[
sizeof(T2)], arr3[
sizeof(T3)], arr4[
sizeof(T4)],
235 arr5[
sizeof(T5)], arr6[
sizeof(T6)], arr7[
sizeof(T7)], arr8[
sizeof(T8)],
236 arr9[
sizeof(T9)], arr10[
sizeof(T10)];
247 template <
typename T1,
248 typename T2 = char,
typename T3 = char,
typename T4 = char,
249 typename T5 = char,
typename T6 = char,
typename T7 = char,
250 typename T8 = char,
typename T9 = char,
typename T10 =
char>
252 AlignOf<llvm::detail::AlignerImpl<T1, T2, T3, T4, T5,
253 T6, T7, T8, T9, T10> >::Alignment,
254 sizeof(::llvm::detail::SizerImpl<T1, T2, T3, T4, T5,
255 T6, T7, T8, T9, T10>)> {
259 #endif // LLVM_SUPPORT_ALIGNOF_H AlignOf - A templated class that contains an enum value representing the alignment of the template ar...
Definition: AlignOf.h:71
Helper for building an aligned character array type.
Definition: AlignOf.h:233
This union template exposes a suitably aligned and sized character array member which can hold elemen...
Definition: AlignOf.h:251
Definition: AlignOf.h:223