15 #ifndef LLVM_SUPPORT_ALIGNOF_H
16 #define LLVM_SUPPORT_ALIGNOF_H
21 # define __has_feature(x) 0
34 #pragma warning(suppress : 4324)
56 static constexpr
unsigned Alignment =
62 enum { Alignment_GreaterEqual_2Bytes = Alignment >= 2 ? 1 : 0 };
63 enum { Alignment_GreaterEqual_4Bytes = Alignment >= 4 ? 1 : 0 };
64 enum { Alignment_GreaterEqual_8Bytes = Alignment >= 8 ? 1 : 0 };
65 enum { Alignment_GreaterEqual_16Bytes = Alignment >= 16 ? 1 : 0 };
67 enum { Alignment_LessEqual_2Bytes = Alignment <= 2 ? 1 : 0 };
68 enum { Alignment_LessEqual_4Bytes = Alignment <= 4 ? 1 : 0 };
69 enum { Alignment_LessEqual_8Bytes = Alignment <= 8 ? 1 : 0 };
70 enum { Alignment_LessEqual_16Bytes = Alignment <= 16 ? 1 : 0 };
97 #if __has_feature(cxx_alignas)
98 template<std::
size_t Alignment, std::
size_t Size>
100 alignas(Alignment)
char buffer[Size];
103 #elif defined(__GNUC__) || defined(__IBM_ATTRIBUTES)
104 template<std::
size_t Alignment, std::
size_t Size>
108 #define LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
109 template<std::size_t Size> \
110 struct AlignedCharArray<x, Size> { \
111 __attribute__((aligned(x))) char buffer[Size]; \
114 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(1)
115 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(2)
116 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(4)
117 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8)
118 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(16)
119 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(32)
120 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(64)
121 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(128)
123 #undef LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
126 # error No supported align as directive.
132 template<std::
size_t Alignment, std::
size_t Size>
143 template<std::
size_t Size>
151 template<std::
size_t Size>
159 template<std::
size_t Size>
167 template<std::
size_t Size>
179 #define LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
180 template<std::size_t Size> \
181 struct AlignedCharArray<x, Size> { \
182 __declspec(align(x)) char buffer[Size]; \
185 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(16)
186 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(32)
187 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(64)
188 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(128)
190 #undef LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
195 template <
typename T1,
196 typename T2 = char,
typename T3 = char,
typename T4 = char,
197 typename T5 = char,
typename T6 = char,
typename T7 = char,
198 typename T8 = char,
typename T9 = char,
typename T10 =
char>
200 T1 t1; T2 t2; T3 t3; T4 t4; T5 t5; T6 t6; T7 t7; T8 t8; T9 t9; T10 t10;
205 template <
typename T1,
206 typename T2 = char,
typename T3 = char,
typename T4 = char,
207 typename T5 = char,
typename T6 = char,
typename T7 = char,
208 typename T8 = char,
typename T9 = char,
typename T10 =
char>
210 char arr1[
sizeof(T1)], arr2[
sizeof(T2)], arr3[
sizeof(T3)], arr4[
sizeof(T4)],
211 arr5[
sizeof(T5)], arr6[
sizeof(T6)], arr7[
sizeof(T7)], arr8[
sizeof(T8)],
212 arr9[
sizeof(T9)], arr10[
sizeof(T10)];
223 template <
typename T1,
224 typename T2 = char,
typename T3 = char,
typename T4 = char,
225 typename T5 = char,
typename T6 = char,
typename T7 = char,
226 typename T8 = char,
typename T9 = char,
typename T10 =
char>
228 AlignOf<detail::AlignerImpl<T1, T2, T3, T4, T5,
229 T6, T7, T8, T9, T10> >::Alignment,
230 sizeof(detail::SizerImpl<T1, T2, T3, T4, T5,
231 T6, T7, T8, T9, T10>)> {
AlignOf - A templated class that contains an enum value representing the alignment of the template ar...
Definition: AlignOf.h:49
Helper for building an aligned character array type.
Definition: AlignOf.h:209
This union template exposes a suitably aligned and sized character array member which can hold elemen...
Definition: AlignOf.h:227
Definition: AlignOf.h:199