LLVM 17.0.0git
SwapByteOrder.h
Go to the documentation of this file.
1//===- SwapByteOrder.h - Generic and optimized byte swaps -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares generic and optimized functions to swap the byte order of
10// an integral type.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_SUPPORT_SWAPBYTEORDER_H
15#define LLVM_SUPPORT_SWAPBYTEORDER_H
16
17#include "llvm/ADT/bit.h"
18#include <cstddef>
19#include <cstdint>
20#include <type_traits>
21
22#if defined(__linux__) || defined(__GNU__) || defined(__HAIKU__) || \
23 defined(__Fuchsia__) || defined(__EMSCRIPTEN__)
24#include <endian.h>
25#elif defined(_AIX)
26#include <sys/machine.h>
27#elif defined(__sun)
28/* Solaris provides _BIG_ENDIAN/_LITTLE_ENDIAN selector in sys/types.h */
29#include <sys/types.h>
30#define BIG_ENDIAN 4321
31#define LITTLE_ENDIAN 1234
32#if defined(_BIG_ENDIAN)
33#define BYTE_ORDER BIG_ENDIAN
34#else
35#define BYTE_ORDER LITTLE_ENDIAN
36#endif
37#elif defined(__MVS__)
38#define BIG_ENDIAN 4321
39#define LITTLE_ENDIAN 1234
40#define BYTE_ORDER BIG_ENDIAN
41#else
42#if !defined(BYTE_ORDER) && !defined(_WIN32)
43#include <machine/endian.h>
44#endif
45#endif
46
47namespace llvm {
48
49/// ByteSwap_16 - This function returns a byte-swapped representation of
50/// the 16-bit argument.
51LLVM_DEPRECATED("use llvm::byteswap instead", "llvm::byteswap")
53
54/// This function returns a byte-swapped representation of the 32-bit argument.
55LLVM_DEPRECATED("use llvm::byteswap instead", "llvm::byteswap")
57
58/// This function returns a byte-swapped representation of the 64-bit argument.
59LLVM_DEPRECATED("use llvm::byteswap instead", "llvm::byteswap")
61
62namespace sys {
63
64#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN
65constexpr bool IsBigEndianHost = true;
66#else
67constexpr bool IsBigEndianHost = false;
68#endif
69
71
72inline unsigned char getSwappedBytes(unsigned char C) { return llvm::byteswap(C); }
73inline signed char getSwappedBytes( signed char C) { return llvm::byteswap(C); }
74inline char getSwappedBytes( char C) { return llvm::byteswap(C); }
75
76inline unsigned short getSwappedBytes(unsigned short C) { return llvm::byteswap(C); }
77inline signed short getSwappedBytes( signed short C) { return llvm::byteswap(C); }
78
79inline unsigned int getSwappedBytes(unsigned int C) { return llvm::byteswap(C); }
80inline signed int getSwappedBytes( signed int C) { return llvm::byteswap(C); }
81
82inline unsigned long getSwappedBytes(unsigned long C) { return llvm::byteswap(C); }
83inline signed long getSwappedBytes( signed long C) { return llvm::byteswap(C); }
84
85inline unsigned long long getSwappedBytes(unsigned long long C) { return llvm::byteswap(C); }
86inline signed long long getSwappedBytes( signed long long C) { return llvm::byteswap(C); }
87
88inline float getSwappedBytes(float C) {
89 union {
90 uint32_t i;
91 float f;
92 } in, out;
93 in.f = C;
94 out.i = llvm::byteswap(in.i);
95 return out.f;
96}
97
98inline double getSwappedBytes(double C) {
99 union {
100 uint64_t i;
101 double d;
102 } in, out;
103 in.d = C;
104 out.i = llvm::byteswap(in.i);
105 return out.d;
106}
107
108template <typename T>
109inline std::enable_if_t<std::is_enum_v<T>, T> getSwappedBytes(T C) {
110 return static_cast<T>(
111 llvm::byteswap(static_cast<std::underlying_type_t<T>>(C)));
112}
113
114template<typename T>
115inline void swapByteOrder(T &Value) {
117}
118
119} // end namespace sys
120} // end namespace llvm
121
122#endif
always inline
#define LLVM_DEPRECATED(MSG, FIX)
Definition: Compiler.h:145
Given that RA is a live value
This file implements the C++20 <bit> header.
LLVM Value Representation.
Definition: Value.h:74
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
static const bool IsLittleEndianHost
Definition: SwapByteOrder.h:70
unsigned char getSwappedBytes(unsigned char C)
Definition: SwapByteOrder.h:72
constexpr bool IsBigEndianHost
Definition: SwapByteOrder.h:67
void swapByteOrder(T &Value)
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
uint64_t ByteSwap_64(uint64_t value)
This function returns a byte-swapped representation of the 64-bit argument.
Definition: SwapByteOrder.h:60
constexpr T byteswap(T V) noexcept
Reverses the bytes in the given integer value V.
Definition: bit.h:65
uint32_t ByteSwap_32(uint32_t value)
This function returns a byte-swapped representation of the 32-bit argument.
Definition: SwapByteOrder.h:56
uint16_t ByteSwap_16(uint16_t value)
ByteSwap_16 - This function returns a byte-swapped representation of the 16-bit argument.
Definition: SwapByteOrder.h:52