int_endianness.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //===-- int_endianness.h - configuration header for compiler-rt -----------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file is a configuration header for compiler-rt.
  10. // This file is not part of the interface of this library.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #ifndef INT_ENDIANNESS_H
  14. #define INT_ENDIANNESS_H
  15. #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
  16. defined(__ORDER_LITTLE_ENDIAN__)
  17. // Clang and GCC provide built-in endianness definitions.
  18. #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
  19. #define _YUGA_LITTLE_ENDIAN 0
  20. #define _YUGA_BIG_ENDIAN 1
  21. #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  22. #define _YUGA_LITTLE_ENDIAN 1
  23. #define _YUGA_BIG_ENDIAN 0
  24. #endif // __BYTE_ORDER__
  25. #else // Compilers other than Clang or GCC.
  26. #if defined(__SVR4) && defined(__sun)
  27. #if defined(_BIG_ENDIAN)
  28. #define _YUGA_LITTLE_ENDIAN 0
  29. #define _YUGA_BIG_ENDIAN 1
  30. #elif defined(_LITTLE_ENDIAN)
  31. #define _YUGA_LITTLE_ENDIAN 1
  32. #define _YUGA_BIG_ENDIAN 0
  33. #else // !_LITTLE_ENDIAN
  34. #error "unknown endianness"
  35. #endif // !_LITTLE_ENDIAN
  36. #endif // Solaris
  37. // ..
  38. #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \
  39. defined(__minix)
  40. #include <sys/endian.h>
  41. #if _BYTE_ORDER == _BIG_ENDIAN
  42. #define _YUGA_LITTLE_ENDIAN 0
  43. #define _YUGA_BIG_ENDIAN 1
  44. #elif _BYTE_ORDER == _LITTLE_ENDIAN
  45. #define _YUGA_LITTLE_ENDIAN 1
  46. #define _YUGA_BIG_ENDIAN 0
  47. #endif // _BYTE_ORDER
  48. #endif // *BSD
  49. #if defined(__OpenBSD__)
  50. #include <machine/endian.h>
  51. #if _BYTE_ORDER == _BIG_ENDIAN
  52. #define _YUGA_LITTLE_ENDIAN 0
  53. #define _YUGA_BIG_ENDIAN 1
  54. #elif _BYTE_ORDER == _LITTLE_ENDIAN
  55. #define _YUGA_LITTLE_ENDIAN 1
  56. #define _YUGA_BIG_ENDIAN 0
  57. #endif // _BYTE_ORDER
  58. #endif // OpenBSD
  59. // ..
  60. // Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the
  61. // compiler (at least with GCC)
  62. #if defined(__APPLE__) || defined(__ellcc__)
  63. #ifdef __BIG_ENDIAN__
  64. #if __BIG_ENDIAN__
  65. #define _YUGA_LITTLE_ENDIAN 0
  66. #define _YUGA_BIG_ENDIAN 1
  67. #endif
  68. #endif // __BIG_ENDIAN__
  69. #ifdef __LITTLE_ENDIAN__
  70. #if __LITTLE_ENDIAN__
  71. #define _YUGA_LITTLE_ENDIAN 1
  72. #define _YUGA_BIG_ENDIAN 0
  73. #endif
  74. #endif // __LITTLE_ENDIAN__
  75. #endif // Mac OSX
  76. // ..
  77. #if defined(_WIN32)
  78. #define _YUGA_LITTLE_ENDIAN 1
  79. #define _YUGA_BIG_ENDIAN 0
  80. #endif // Windows
  81. #endif // Clang or GCC.
  82. // .
  83. #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
  84. #error Unable to determine endian
  85. #endif // Check we found an endianness correctly.
  86. #endif // INT_ENDIANNESS_H