diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-10-22 18:45:12 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-10-22 18:45:12 +0000 |
commit | fd7c230c85dbc9b1c5145319a0d5eaeb99f61176 (patch) | |
tree | 1cf9269d992dd3735a244e918de807065e562f61 /include/llvm/Support/Endian.h | |
parent | ef4fc2cd6d9e1c04a13ff69ae1fd9d23f5c79d1c (diff) | |
download | external_llvm-fd7c230c85dbc9b1c5145319a0d5eaeb99f61176.zip external_llvm-fd7c230c85dbc9b1c5145319a0d5eaeb99f61176.tar.gz external_llvm-fd7c230c85dbc9b1c5145319a0d5eaeb99f61176.tar.bz2 |
Endian: Get rid of LLVM_IS_HOST_BIG_ENDIAN.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117124 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support/Endian.h')
-rw-r--r-- | include/llvm/Support/Endian.h | 91 |
1 files changed, 38 insertions, 53 deletions
diff --git a/include/llvm/Support/Endian.h b/include/llvm/Support/Endian.h index c98e2dc..1058bef 100644 --- a/include/llvm/Support/Endian.h +++ b/include/llvm/Support/Endian.h @@ -15,6 +15,7 @@ #define LLVM_SUPPORT_ENDIAN_H #include "llvm/Config/config.h" +#include "llvm/System/Host.h" #include "llvm/System/SwapByteOrder.h" #include "llvm/Support/type_traits.h" @@ -24,19 +25,6 @@ namespace support { enum endianness {big, little}; enum alignment {unaligned, aligned}; -template<typename value_type, int host, int target> -static typename enable_if_c<host == target, value_type>::type -SwapByteOrderIfDifferent(value_type value) { - // Target endianess is the same as the host. Just pass the value through. - return value; -} - -template<typename value_type, int host, int target> -static typename enable_if_c<host != target, value_type>::type -SwapByteOrderIfDifferent(value_type value) { - return sys::SwapByteOrder<value_type>(value); -} - namespace detail { template<typename value_type, alignment align> @@ -60,52 +48,49 @@ struct alignment_access_helper<value_type, unaligned> } // end namespace detail -#if defined(LLVM_IS_HOST_BIG_ENDIAN) \ - || defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__) -static const endianness host_endianness = big; -#else -static const endianness host_endianness = little; -#endif - -struct endian { - template<typename value_type, alignment align> - static value_type read_le(const void *memory) { - return SwapByteOrderIfDifferent<value_type, host_endianness, little>( - reinterpret_cast<const detail::alignment_access_helper - <value_type, align> *>(memory)->val); - } - - template<typename value_type, alignment align> - static void write_le(void *memory, value_type value) { - reinterpret_cast<detail::alignment_access_helper<value_type, align> *> - (memory)->val = - SwapByteOrderIfDifferent< value_type - , host_endianness - , little>(value); - } - - template<typename value_type, alignment align> - static value_type read_be(const void *memory) { - return SwapByteOrderIfDifferent<value_type, host_endianness, big>( - reinterpret_cast<const detail::alignment_access_helper - <value_type, align> *>(memory)->val); - } - - template<typename value_type, alignment align> - static void write_be(void *memory, value_type value) { - reinterpret_cast<detail::alignment_access_helper - <value_type, align> *>(memory)->val = - SwapByteOrderIfDifferent< value_type - , host_endianness - , big>(value); +namespace endian {
+ template<typename value_type, alignment align>
+ static value_type read_le(const void *memory) {
+ value_type t =
+ reinterpret_cast<const detail::alignment_access_helper
+ <value_type, align> *>(memory)->val;
+ if (sys::isBigEndianHost())
+ return sys::SwapByteOrder(t);
+ return t;
+ }
+
+ template<typename value_type, alignment align>
+ static void write_le(void *memory, value_type value) {
+ if (sys::isBigEndianHost())
+ value = sys::SwapByteOrder(value);
+ reinterpret_cast<detail::alignment_access_helper<value_type, align> *>
+ (memory)->val = value;
+ }
+
+ template<typename value_type, alignment align>
+ static value_type read_be(const void *memory) {
+ value_type t =
+ reinterpret_cast<const detail::alignment_access_helper
+ <value_type, align> *>(memory)->val;
+ if (sys::isLittleEndianHost())
+ return sys::SwapByteOrder(t);
+ return t;
+ }
+
+ template<typename value_type, alignment align>
+ static void write_be(void *memory, value_type value) {
+ if (sys::isLittleEndianHost())
+ value = sys::SwapByteOrder(value);
+ reinterpret_cast<detail::alignment_access_helper<value_type, align> *>
+ (memory)->val = value;
} }; namespace detail { template<typename value_type, - endianness target_endianness, - alignment target_alignment> + endianness endian, + alignment align> class packed_endian_specific_integral; template<typename value_type> |