Fix signedness warning in mprotect call, Clean up and improve endianness.h header.

git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@78451 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/endianness.h b/lib/endianness.h
index 9e192c1..8069bac 100644
--- a/lib/endianness.h
+++ b/lib/endianness.h
@@ -16,50 +16,79 @@
 #ifndef ENDIANNESS_H
 #define ENDIANNESS_H
 
-/* TODO: Improve this to minimal pre-processor hackish'ness. */
-/* config.h build via CMake. */
-/* #include <config.h> */
-/* Solaris header for endian and byte swap */
-/* #if defined HAVE_SYS_BYTEORDER_H */
+/*
+ * Known limitations:
+ *   Middle endian systems are not handled currently.
+ */
 
-#if defined (__SVR4) && defined (__sun)
+#if defined(__SVR4) && defined(__sun)
 #include <sys/byteorder.h>
-#if _BYTE_ORDER == _BIG_ENDIAN
-#define __BIG_ENDIAN__ 1
-#define __LITTLE_ENDIAN__ 0
-#else /* _BYTE_ORDER == _LITTLE_ENDIAN */
-#define __BIG_ENDIAN__ 0
-#define __LITTLE_ENDIAN__ 1
-#endif /* _BYTE_ORDER */
-#endif /* Solaris and AuroraUX. */
 
-#if defined (__FreeBSD__)
-#include <sys/endian.h>
 #if _BYTE_ORDER == _BIG_ENDIAN
-#define __BIG_ENDIAN__ 1
-#define __LITTLE_ENDIAN__ 0
-#else /* _BYTE_ORDER == _LITTLE_ENDIAN */
-#define __BIG_ENDIAN__ 0
-#define __LITTLE_ENDIAN__ 1
-#endif /* _BYTE_ORDER */
-#endif /* FreeBSD */
-
-#ifdef __LITTLE_ENDIAN__
-#if __LITTLE_ENDIAN__
+#define _YUGA_LITTLE_ENDIAN 0
+#define _YUGA_BIG_ENDIAN    1
+#elif _BYTE_ORDER == _LITTLE_ENDIAN 
 #define _YUGA_LITTLE_ENDIAN 1
 #define _YUGA_BIG_ENDIAN    0
-#endif
-#endif
+#endif /* _BYTE_ORDER */
+
+#endif /* Solaris and AuroraUX. */
+
+/* .. */
+
+#if defined(__FreeBSD__) && defined(__NetBSD__) && defined(__OpenBSD__) && defined(__DragonflyBSD__)
+#include <sys/endian.h>
+
+#if _BYTE_ORDER == _BIG_ENDIAN
+#define _YUGA_LITTLE_ENDIAN 0
+#define _YUGA_BIG_ENDIAN    1
+#elif _BYTE_ORDER == _LITTLE_ENDIAN
+#define _YUGA_LITTLE_ENDIAN 1
+#define _YUGA_BIG_ENDIAN    0
+#endif /* _BYTE_ORDER */
+
+#endif /* *BSD */
+
+/* .. */
+
+/* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the compiler (at least with GCC) */
+#if defined(__APPLE__) && defined(__MACH__)
 
 #ifdef __BIG_ENDIAN__
 #if __BIG_ENDIAN__
 #define _YUGA_LITTLE_ENDIAN 0
 #define _YUGA_BIG_ENDIAN    1
 #endif
+#endif /* __BIG_ENDIAN__ */
+
+#ifdef __LITTLE_ENDIAN__
+#if __LITTLE_ENDIAN__
+#define _YUGA_LITTLE_ENDIAN 1
+#define _YUGA_BIG_ENDIAN    0
 #endif
+#endif /* __LITTLE_ENDIAN__ */
+
+#endif /* Mac OSX */
+
+/* .. */
+
+#if defined(__Linux__)
+#include <endian.h>
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define _YUGA_LITTLE_ENDIAN 0
+#define _YUGA_BIG_ENDIAN    1
+#elif __BYTE_ORDER == __LITTLE_ENDIAN
+#define _YUGA_LITTLE_ENDIAN 1
+#define _YUGA_BIG_ENDIAN    0
+#endif /* __BYTE_ORDER */
+
+#endif /* GNU/Linux */
+
+/* . */
 
 #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
-#error unable to determine endian
-#endif
+#error Unable to determine endian
+#endif /* Check we found an endianness correctly. */
 
 #endif /* ENDIANNESS_H */