X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FEndian.h;h=8d5649dc1f91ec3ab130d168b1a1422d81daef02;hb=536a88ad5bf160232205192a7ce72e50bfadbded;hp=985c5870dd47fd6954f5a171fbdd433539cc5be9;hpb=5e0b2bf657dd8b6b3bb58439e6cb293f3116687f;p=oota-llvm.git diff --git a/include/llvm/Support/Endian.h b/include/llvm/Support/Endian.h index 985c5870dd4..8d5649dc1f9 100644 --- a/include/llvm/Support/Endian.h +++ b/include/llvm/Support/Endian.h @@ -14,8 +14,8 @@ #ifndef LLVM_SUPPORT_ENDIAN_H #define LLVM_SUPPORT_ENDIAN_H -#include "llvm/Config/config.h" -#include "llvm/System/SwapByteOrder.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/SwapByteOrder.h" #include "llvm/Support/type_traits.h" namespace llvm { @@ -24,19 +24,6 @@ namespace support { enum endianness {big, little}; enum alignment {unaligned, aligned}; -template -static typename enable_if_c::type -SwapByteOrderIfDifferent(value_type value) { - // Target endianess is the same as the host. Just pass the value through. - return value; -} - -template -static typename enable_if_c::type -SwapByteOrderIfDifferent(value_type value) { - return sys::SwapByteOrder(value); -} - namespace detail { template @@ -60,52 +47,49 @@ struct alignment_access_helper } // end namespace detail -#if defined(LLVM_IS_TARGET_BIG_ENDIAN) \ - || defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__) -static const endianness host_endianness = big; -#else -static const endianness host_endianness = little; -#endif - -struct endian { +namespace endian { template - static value_type read_le(const void *memory) { - return SwapByteOrderIfDifferent( + inline value_type read_le(const void *memory) { + value_type t = reinterpret_cast *>(memory)->val); + *>(memory)->val; + if (sys::isBigEndianHost()) + return sys::SwapByteOrder(t); + return t; } template - static void write_le(void *memory, value_type value) { + inline void write_le(void *memory, value_type value) { + if (sys::isBigEndianHost()) + value = sys::SwapByteOrder(value); reinterpret_cast *> - (memory)->val = - SwapByteOrderIfDifferent< value_type - , host_endianness - , little>(value); + (memory)->val = value; } template - static value_type read_be(const void *memory) { - return SwapByteOrderIfDifferent( + inline value_type read_be(const void *memory) { + value_type t = reinterpret_cast *>(memory)->val); + *>(memory)->val; + if (sys::isLittleEndianHost()) + return sys::SwapByteOrder(t); + return t; } template - static void write_be(void *memory, value_type value) { - reinterpret_cast *>(memory)->val = - SwapByteOrderIfDifferent< value_type - , host_endianness - , big>(value); + inline void write_be(void *memory, value_type value) { + if (sys::isLittleEndianHost()) + value = sys::SwapByteOrder(value); + reinterpret_cast *> + (memory)->val = value; } -}; +} namespace detail { template + endianness endian, + alignment align> class packed_endian_specific_integral; template @@ -114,6 +98,9 @@ public: operator value_type() const { return endian::read_le(Value); } + void operator=(value_type newValue) { + endian::write_le((void *)&Value, newValue); + } private: uint8_t Value[sizeof(value_type)]; }; @@ -124,6 +111,9 @@ public: operator value_type() const { return endian::read_be(Value); } + void operator=(value_type newValue) { + endian::write_be((void *)&Value, newValue); + } private: uint8_t Value[sizeof(value_type)]; }; @@ -134,6 +124,9 @@ public: operator value_type() const { return endian::read_le(&Value); } + void operator=(value_type newValue) { + endian::write_le((void *)&Value, newValue); + } private: value_type Value; }; @@ -144,6 +137,9 @@ public: operator value_type() const { return endian::read_be(&Value); } + void operator=(value_type newValue) { + endian::write_be((void *)&Value, newValue); + } private: value_type Value; };