LLVM: include/llvm/Support/Endian.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_SUPPORT_ENDIAN_H
14#define LLVM_SUPPORT_ENDIAN_H
15
19#include
20#include
21#include
22#include
23#include <type_traits>
24
25namespace llvm {
27
28
30
32
33
34template<class T, int alignment>
36 enum { value = alignment == 0 ? alignof(T) : alignment };
37};
38
39}
40
42
43template <typename value_type>
49
50
51template <typename value_type, endianness endian>
52[[nodiscard]]
57
58
59template <typename value_type, std::size_t alignment = unaligned>
61 value_type ret;
62
63 memcpy(static_cast<void *>(&ret),
66 sizeof(value_type));
68}
69
70template <typename value_type, endianness endian, std::size_t alignment>
76
77
78
79template <typename value_type, std::size_t alignment = unaligned,
80 typename CharT>
81[[nodiscard]] inline value_type readNext(const CharT *&memory,
84 memory += sizeof(value_type);
85 return ret;
86}
87
89 std::size_t alignment = unaligned, typename CharT>
90[[nodiscard]] inline value_type readNext(const CharT *&memory) {
92}
93
94
95template <typename value_type, std::size_t alignment = unaligned>
100 &value, sizeof(value_type));
101}
102
103template <typename value_type, endianness endian, std::size_t alignment>
104LLVM_DEPRECATED("Pass endian as a function argument instead", "write")
108
109
110
111template <typename value_type, std::size_t alignment = unaligned,
112 typename CharT>
115 memory += sizeof(value_type);
116}
117
119 std::size_t alignment = unaligned, typename CharT>
120inline void writeNext(CharT *&memory, value_type value) {
122}
123
124template <typename value_type>
126
127
128
129template <typename value_type, endianness endian, std::size_t alignment>
132 assert(startBit < 8);
133 if (startBit == 0)
135 else {
136
137 value_type val[2];
138 memcpy(&val[0],
141 sizeof(value_type) * 2);
144
145
147
149 (sizeof(value_type) * 8) - startBit;
151
152
155
156 upperVal <<= numBitsFirstVal;
157
158 return lowerVal | upperVal;
159 }
160}
161
162
163
164template <typename value_type, endianness endian, std::size_t alignment>
167 assert(startBit < 8);
168 if (startBit == 0)
170 else {
171
172 value_type val[2];
173 memcpy(&val[0],
176 sizeof(value_type) * 2);
179
180
181
184 (sizeof(value_type) * 8) - startBit;
186 if (startBit > 0) {
187
188
189
191
192 lowerVal <<= startBit;
193 }
194 val[0] |= lowerVal;
195
196
197
199
201
203 val[1] |= upperVal;
204
205
210 &val[0], sizeof(value_type) * 2);
211 }
212}
213
214}
215
217
223 static constexpr std::size_t alignment = Alignment;
224
226
228
234
239
241 *this = *this + newValue;
242 return *this;
243 }
244
246 *this = *this - newValue;
247 return *this;
248 }
249
251 *this = *this | newValue;
252 return *this;
253 }
254
256 *this = *this & newValue;
257 return *this;
258 }
259
260private:
261 struct {
264
265public:
267 explicit ref(void *Ptr) : Ptr(Ptr) {}
268
272
276
277 private:
278 void *Ptr;
279 };
280};
281
282}
283
296
306
316
326
336
346
356
366
376
386
387template
391template
394
395template
399template
402
404
405template <typename T, endianness E> [[nodiscard]] inline T read(const void *P) {
407}
408
418
428
447
448template <typename T, endianness E> inline void write(void *P, T V) {
450}
451
461
471
490
491}
492
493}
494}
495
496#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_DEPRECATED(MSG, FIX)
#define LLVM_ASSUME_ALIGNED(p, a)
\macro LLVM_ASSUME_ALIGNED Returns a pointer with an assumed alignment.
This file implements the C++20 header.
LLVM Value Representation.
uint64_t read64le(const void *P)
Definition Endian.h:435
value_type byte_swap(value_type value, endianness endian)
Definition Endian.h:44
uint16_t read16le(const void *P)
Definition Endian.h:429
uint32_t read32(const void *P, endianness E)
Definition Endian.h:412
void writeNext(CharT *&memory, value_type value, endianness endian)
Write a value of a particular endianness, and increment the buffer past that value.
Definition Endian.h:113
void write16be(void *P, uint16_t V)
Definition Endian.h:481
void write64le(void *P, uint64_t V)
Definition Endian.h:478
uint64_t read64be(const void *P)
Definition Endian.h:444
void write32le(void *P, uint32_t V)
Definition Endian.h:475
void write32(void *P, uint32_t V, endianness E)
Definition Endian.h:455
void writeAtBitAlignment(void *memory, value_type value, uint64_t startBit)
Write a value to memory with a particular endianness, for a location that starts at the given bit off...
Definition Endian.h:165
value_type readAtBitAlignment(const void *memory, uint64_t startBit)
Read a value of a particular endianness from memory, for a location that starts at the given bit offs...
Definition Endian.h:130
void write32be(void *P, uint32_t V)
Definition Endian.h:484
uint64_t read64(const void *P, endianness E)
Definition Endian.h:415
uint32_t read32be(const void *P)
Definition Endian.h:441
std::make_unsigned_t< value_type > make_unsigned_t
Definition Endian.h:125
void write16(void *P, uint16_t V, endianness E)
Definition Endian.h:452
void write16le(void *P, uint16_t V)
Definition Endian.h:472
void write64be(void *P, uint64_t V)
Definition Endian.h:487
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
Definition Endian.h:60
void write64(void *P, uint64_t V, endianness E)
Definition Endian.h:458
uint16_t read16be(const void *P)
Definition Endian.h:438
void write(void *memory, value_type value, endianness endian)
Write a value to memory with a particular endianness.
Definition Endian.h:96
value_type readNext(const CharT *&memory, endianness endian)
Read a value of a particular endianness from a buffer, and increment the buffer past that value.
Definition Endian.h:81
uint32_t read32le(const void *P)
Definition Endian.h:432
uint16_t read16(const void *P, endianness E)
Definition Endian.h:409
detail::packed_endian_specific_integral< int64_t, llvm::endianness::little, aligned > aligned_little64_t
Definition Endian.h:323
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::little, unaligned > ulittle64_t
Definition Endian.h:293
detail::packed_endian_specific_integral< int16_t, llvm::endianness::little, unaligned > little16_t
Definition Endian.h:297
detail::packed_endian_specific_integral< int32_t, llvm::endianness::big, aligned > aligned_big32_t
Definition Endian.h:360
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::little, unaligned > ulittle32_t
Definition Endian.h:290
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::big, unaligned > ubig64_t
Definition Endian.h:333
detail::packed_endian_specific_integral< int16_t, llvm::endianness::little, aligned > aligned_little16_t
Definition Endian.h:317
detail::packed_endian_specific_integral< int32_t, llvm::endianness::big, unaligned > big32_t
Definition Endian.h:340
detail::packed_endian_specific_integral< int64_t, llvm::endianness::big, aligned > aligned_big64_t
Definition Endian.h:363
detail::packed_endian_specific_integral< int16_t, llvm::endianness::native, unaligned > unaligned_int16_t
Definition Endian.h:377
detail::packed_endian_specific_integral< uint8_t, llvm::endianness::little, unaligned > ulittle8_t
Definition Endian.h:284
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::big, unaligned > ubig16_t
Definition Endian.h:327
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::native, unaligned > unaligned_uint64_t
Definition Endian.h:373
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, unaligned > ulittle16_t
Definition Endian.h:287
detail::packed_endian_specific_integral< int64_t, llvm::endianness::native, unaligned > unaligned_int64_t
Definition Endian.h:383
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::little, aligned > aligned_ulittle64_t
Definition Endian.h:313
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::big, aligned > aligned_ubig64_t
Definition Endian.h:353
detail::packed_endian_specific_integral< T, llvm::endianness::big, aligned > aligned_big_t
Definition Endian.h:400
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::big, aligned > aligned_ubig16_t
Definition Endian.h:347
detail::packed_endian_specific_integral< int32_t, llvm::endianness::little, unaligned > little32_t
Definition Endian.h:300
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, aligned > aligned_ulittle16_t
Definition Endian.h:307
detail::packed_endian_specific_integral< int16_t, llvm::endianness::big, unaligned > big16_t
Definition Endian.h:337
detail::packed_endian_specific_integral< int16_t, llvm::endianness::big, aligned > aligned_big16_t
Definition Endian.h:357
detail::packed_endian_specific_integral< T, llvm::endianness::little, aligned > aligned_little_t
Definition Endian.h:396
@ aligned
Definition Endian.h:29
@ unaligned
Definition Endian.h:29
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::big, unaligned > ubig32_t
Definition Endian.h:330
detail::packed_endian_specific_integral< int64_t, llvm::endianness::little, unaligned > little64_t
Definition Endian.h:303
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::native, unaligned > unaligned_uint32_t
Definition Endian.h:370
detail::packed_endian_specific_integral< int64_t, llvm::endianness::big, unaligned > big64_t
Definition Endian.h:343
detail::packed_endian_specific_integral< int32_t, llvm::endianness::native, unaligned > unaligned_int32_t
Definition Endian.h:380
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::native, unaligned > unaligned_uint16_t
Definition Endian.h:367
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::big, aligned > aligned_ubig32_t
Definition Endian.h:350
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::little, aligned > aligned_ulittle32_t
Definition Endian.h:310
detail::packed_endian_specific_integral< T, llvm::endianness::big, unaligned > big_t
Definition Endian.h:392
detail::packed_endian_specific_integral< T, llvm::endianness::little, unaligned > little_t
Definition Endian.h:388
detail::packed_endian_specific_integral< int32_t, llvm::endianness::little, aligned > aligned_little32_t
Definition Endian.h:320
void swapByteOrder(T &Value)
This is an optimization pass for GlobalISel generic memory operations.
PointerUnion< const Value *, const PseudoSourceValue * > ValueType
value is either alignment, or alignof(T) if alignment is 0.
Definition Endian.h:35
@ value
Definition Endian.h:36
void operator=(value_type NewValue)
Definition Endian.h:273
ref(void *Ptr)
Definition Endian.h:267
packed_endian_specific_integral(value_type val)
Definition Endian.h:227
packed_endian_specific_integral()=default
packed_endian_specific_integral & operator+=(value_type newValue)
Definition Endian.h:240
T value_type
Definition Endian.h:221
value_type value() const
Definition Endian.h:229
packed_endian_specific_integral & operator&=(value_type newValue)
Definition Endian.h:255
char buffer[sizeof(value_type)]
Definition Endian.h:262
void operator=(value_type newValue)
Definition Endian.h:235
static constexpr std::size_t alignment
Definition Endian.h:223
packed_endian_specific_integral & operator|=(value_type newValue)
Definition Endian.h:250
packed_endian_specific_integral & operator-=(value_type newValue)
Definition Endian.h:245