15 #ifndef LLVM_SUPPORT_ALIGNOF_H
16 #define LLVM_SUPPORT_ALIGNOF_H
42 enum { Alignment_GreaterEqual_2Bytes =
Alignment >= 2 ? 1 : 0 };
43 enum { Alignment_GreaterEqual_4Bytes =
Alignment >= 4 ? 1 : 0 };
44 enum { Alignment_GreaterEqual_8Bytes =
Alignment >= 8 ? 1 : 0 };
45 enum { Alignment_GreaterEqual_16Bytes =
Alignment >= 16 ? 1 : 0 };
47 enum { Alignment_LessEqual_2Bytes =
Alignment <= 2 ? 1 : 0 };
48 enum { Alignment_LessEqual_4Bytes =
Alignment <= 4 ? 1 : 0 };
49 enum { Alignment_LessEqual_8Bytes =
Alignment <= 8 ? 1 : 0 };
50 enum { Alignment_LessEqual_16Bytes =
Alignment <= 16 ? 1 : 0 };
73 #if __has_feature(cxx_alignas)
74 template<std::
size_t Alignment, std::
size_t Size>
79 #elif defined(__GNUC__) || defined(__IBM_ATTRIBUTES)
81 template<std::
size_t Alignment, std::
size_t Size>
84 #define LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
85 template<std::size_t Size> \
86 struct AlignedCharArray<x, Size> { \
87 __attribute__((aligned(x))) char buffer[Size]; \
90 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(1)
91 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(2)
92 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(4)
93 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8)
94 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(16)
95 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(32)
96 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(64)
97 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(128)
99 #undef LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
102 # error No supported align as directive.
108 template<std::
size_t Alignment, std::
size_t Size>
119 template<std::
size_t Size>
127 template<std::
size_t Size>
135 template<std::
size_t Size>
143 template<std::
size_t Size>
155 #define LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
156 template<std::size_t Size> \
157 struct AlignedCharArray<x, Size> { \
158 __declspec(align(x)) char buffer[Size]; \
161 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(16)
162 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(32)
163 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(64)
164 LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(128)
166 #undef LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
171 template <
typename T1,
172 typename T2 = char,
typename T3 = char,
typename T4 = char,
173 typename T5 = char,
typename T6 = char,
typename T7 =
char>
175 T1 t1; T2 t2; T3 t3; T4 t4; T5 t5; T6 t6; T7 t7;
180 template <
typename T1,
181 typename T2 = char,
typename T3 = char,
typename T4 = char,
182 typename T5 = char,
typename T6 = char,
typename T7 =
char>
184 char arr1[
sizeof(
T1)], arr2[
sizeof(T2)], arr3[
sizeof(T3)], arr4[
sizeof(T4)],
185 arr5[
sizeof(T5)], arr6[
sizeof(T6)], arr7[
sizeof(T7)];
196 template <
typename T1,
197 typename T2 = char,
typename T3 = char,
typename T4 = char,
198 typename T5 = char,
typename T6 = char,
typename T7 =
char>
200 AlignOf<detail::AlignerImpl<T1, T2, T3, T4, T5, T6, T7> >::Alignment,
201 sizeof(detail::SizerImpl<T1, T2, T3, T4, T5, T6, T7>)> {
Helper for building an aligned character array type.
This union template exposes a suitably aligned and sized character array member which can hold elemen...