aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xcmake/config-ix.cmake2
-rw-r--r--include/llvm/Config/config.h.cmake3
-rw-r--r--include/llvm/Support/Endian.h91
3 files changed, 38 insertions, 58 deletions
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake
index 1d64c13..83ef8e5 100755
--- a/cmake/config-ix.cmake
+++ b/cmake/config-ix.cmake
@@ -258,8 +258,6 @@ if( LLVM_ENABLE_THREADS )
endif()
endif()
-test_big_endian(LLVM_IS_HOST_BIG_ENDIAN)
-
if( ENABLE_THREADS )
message(STATUS "Threads enabled.")
else( ENABLE_THREADS )
diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake
index 73ec246..26a39b2 100644
--- a/include/llvm/Config/config.h.cmake
+++ b/include/llvm/Config/config.h.cmake
@@ -506,9 +506,6 @@
/* Define if this is Win32ish platform */
#cmakedefine LLVM_ON_WIN32 ${LLVM_ON_WIN32}
-/* Define if this is targeting a big endian system */
-#cmakedefine LLVM_IS_HOST_BIG_ENDIAN ${LLVM_IS_HOST_BIG_ENDIAN}
-
/* Added by Kevin -- Maximum path length */
#cmakedefine MAXPATHLEN ${MAXPATHLEN}
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>