OSDN Git Service

Endian: Get rid of LLVM_IS_HOST_BIG_ENDIAN.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Fri, 22 Oct 2010 18:45:12 +0000 (18:45 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Fri, 22 Oct 2010 18:45:12 +0000 (18:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117124 91177308-0d34-0410-b5e6-96231b3b80d8

cmake/config-ix.cmake
include/llvm/Config/config.h.cmake
include/llvm/Support/Endian.h

index 1d64c13..83ef8e5 100755 (executable)
@@ -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 )
index 73ec246..26a39b2 100644 (file)
 /* 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}
 
index c98e2dc..1058bef 100644 (file)
@@ -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 {\r
+  template<typename value_type, alignment align>\r
+  static value_type read_le(const void *memory) {\r
+    value_type t =\r
+      reinterpret_cast<const detail::alignment_access_helper\r
+        <value_type, align> *>(memory)->val;\r
+    if (sys::isBigEndianHost())\r
+      return sys::SwapByteOrder(t);\r
+    return t;\r
+  }\r
+\r
+  template<typename value_type, alignment align>\r
+  static void write_le(void *memory, value_type value) {\r
+    if (sys::isBigEndianHost())\r
+      value = sys::SwapByteOrder(value);\r
+    reinterpret_cast<detail::alignment_access_helper<value_type, align> *>\r
+      (memory)->val = value;\r
+  }\r
+\r
+  template<typename value_type, alignment align>\r
+  static value_type read_be(const void *memory) {\r
+    value_type t =\r
+      reinterpret_cast<const detail::alignment_access_helper\r
+        <value_type, align> *>(memory)->val;\r
+    if (sys::isLittleEndianHost())\r
+      return sys::SwapByteOrder(t);\r
+    return t;\r
+  }\r
+\r
+  template<typename value_type, alignment align>\r
+  static void write_be(void *memory, value_type value) {\r
+    if (sys::isLittleEndianHost())\r
+      value = sys::SwapByteOrder(value);\r
+    reinterpret_cast<detail::alignment_access_helper<value_type, align> *>\r
+      (memory)->val = value;\r
   }
 };
 
 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>