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