14 #ifndef LLVM_SUPPORT_ENDIAN_H
15 #define LLVM_SUPPORT_ENDIAN_H
30 template<
class T,
int alignment>
38 template<
typename value_type, endianness endian>
46 template<
typename value_type,
48 std::size_t alignment>
49 inline value_type
read(
const void *memory) {
56 return byte_swap<value_type, endian>(ret);
61 template<
typename value_type,
endianness endian, std::size_t alignment,
63 inline value_type
readNext(
const CharT *&memory) {
64 value_type ret = read<value_type, endian, alignment>(memory);
65 memory +=
sizeof(value_type);
70 template<
typename value_type,
72 std::size_t alignment>
73 inline void write(
void *memory, value_type value) {
74 value = byte_swap<value_type, endian>(value);
83 template<
typename value_type,
85 std::size_t alignment>
87 operator value_type()
const {
88 return endian::read<value_type, endian, alignment>(
89 (
const void*)
Value.buffer);
93 endian::write<value_type, endian, alignment>(
94 (
void*)
Value.buffer, newValue);
98 *
this = *
this + newValue;
103 *
this = *
this - newValue;
108 *
this = *
this | newValue;
113 *
this = *
this & newValue;
119 sizeof(value_type)>
Value;
123 explicit ref(
void *Ptr) : Ptr(Ptr) {}
125 operator value_type()
const {
126 return endian::read<value_type, endian, alignment>(Ptr);
130 endian::write<value_type, endian, alignment>(Ptr, NewValue);
140 typedef detail::packed_endian_specific_integral
detail::packed_endian_specific_integral< uint16_t, native, unaligned > unaligned_uint16_t
packed_endian_specific_integral & operator+=(value_type newValue)
detail::packed_endian_specific_integral< int64_t, native, unaligned > unaligned_int64_t
#define LLVM_ASSUME_ALIGNED(p, a)
LLVM_ASSUME_ALIGNED
void swapByteOrder(T &Value)
AlignOf - A templated class that contains an enum value representing the alignment of the template ar...
value_type read(const void *memory)
Read a value of a particular endianness from memory.
void write64le(void *p, uint64_t v)
detail::packed_endian_specific_integral< uint64_t, big, aligned > aligned_ubig64_t
Helper for building an aligned character array type.
detail::packed_endian_specific_integral< int16_t, little, aligned > aligned_little16_t
detail::packed_endian_specific_integral< uint64_t, big, unaligned > ubig64_t
uint64_t read64be(const void *p)
void write32be(void *p, uint32_t v)
void write16le(void *p, uint16_t v)
detail::packed_endian_specific_integral< uint32_t, big, unaligned > ubig32_t
uint64_t read64le(const void *p)
void operator=(value_type NewValue)
detail::packed_endian_specific_integral< uint16_t, big, aligned > aligned_ubig16_t
detail::packed_endian_specific_integral< int64_t, little, unaligned > little64_t
detail::packed_endian_specific_integral< int32_t, big, aligned > aligned_big32_t
value_type byte_swap(value_type value)
Swap the bytes of value to match the given endianness.
detail::packed_endian_specific_integral< int16_t, big, aligned > aligned_big16_t
uint32_t read32le(const void *p)
detail::packed_endian_specific_integral< int64_t, little, aligned > aligned_little64_t
uint32_t read32be(const void *p)
detail::packed_endian_specific_integral< int16_t, native, unaligned > unaligned_int16_t
detail::packed_endian_specific_integral< uint32_t, big, aligned > aligned_ubig32_t
void write16be(void *p, uint16_t v)
void write32le(void *p, uint32_t v)
detail::packed_endian_specific_integral< int32_t, little, aligned > aligned_little32_t
packed_endian_specific_integral & operator|=(value_type newValue)
detail::packed_endian_specific_integral< uint32_t, little, aligned > aligned_ulittle32_t
detail::packed_endian_specific_integral< uint64_t, little, aligned > aligned_ulittle64_t
value_type readNext(const CharT *&memory)
Read a value of a particular endianness from a buffer, and increment the buffer past that value...
detail::packed_endian_specific_integral< int32_t, little, unaligned > little32_t
detail::packed_endian_specific_integral< int32_t, big, unaligned > big32_t
packed_endian_specific_integral & operator-=(value_type newValue)
detail::packed_endian_specific_integral< int16_t, little, unaligned > little16_t
packed_endian_specific_integral & operator&=(value_type newValue)
detail::packed_endian_specific_integral< uint64_t, native, unaligned > unaligned_uint64_t
detail::packed_endian_specific_integral< uint16_t, little, unaligned > ulittle16_t
void write(void *memory, value_type value)
Write a value to memory with a particular endianness.
uint16_t read16be(const void *p)
uint16_t read16le(const void *p)
static const bool IsBigEndianHost
detail::packed_endian_specific_integral< uint64_t, little, unaligned > ulittle64_t
void operator=(value_type newValue)
detail::packed_endian_specific_integral< uint16_t, big, unaligned > ubig16_t
detail::packed_endian_specific_integral< int16_t, big, unaligned > big16_t
detail::packed_endian_specific_integral< int64_t, big, aligned > aligned_big64_t
detail::packed_endian_specific_integral< uint32_t, little, unaligned > ulittle32_t
LLVM Value Representation.
detail::packed_endian_specific_integral< int64_t, big, unaligned > big64_t
detail::packed_endian_specific_integral< int32_t, native, unaligned > unaligned_int32_t
detail::packed_endian_specific_integral< uint32_t, native, unaligned > unaligned_uint32_t
::value is either alignment, or alignof(T) if alignment is 0.
detail::packed_endian_specific_integral< uint16_t, little, aligned > aligned_ulittle16_t
void write64be(void *p, uint64_t v)