OS.hpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * Copyright (c)2013-2020 ZeroTier, Inc.
  3. *
  4. * Use of this software is governed by the Business Source License included
  5. * in the LICENSE.TXT file in the project's root directory.
  6. *
  7. * Change Date: 2024-01-01
  8. *
  9. * On the date above, in accordance with the Business Source License, use
  10. * of this software will be governed by version 2.0 of the Apache License.
  11. */
  12. /****/
  13. // This include file uses various macros and other tricks to auto-detect, define, and
  14. // canonicalize a bunch of macros and types used throughout the ZeroTier core.
  15. #ifndef ZT_OS_HPP
  16. #define ZT_OS_HPP
  17. #include <cstdint>
  18. #include <cstdlib>
  19. #include <cstring>
  20. #if defined(_WIN32) || defined(_WIN64)
  21. #ifdef _MSC_VER
  22. #pragma warning(disable : 4290)
  23. #pragma warning(disable : 4996)
  24. #pragma warning(disable : 4101)
  25. #endif
  26. #ifndef __WINDOWS__
  27. #define __WINDOWS__ 1
  28. #endif
  29. #ifndef NOMINMAX
  30. #define NOMINMAX
  31. #endif
  32. #undef __UNIX_LIKE__
  33. #undef __BSD__
  34. #include <WinSock2.h>
  35. #include <Windows.h>
  36. #include <sys/param.h>
  37. #endif
  38. #if !defined(__GNUC__) && (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(__INTEL_COMPILER) || defined(__clang__))
  39. #define __GNUC__ 3
  40. #endif
  41. #if __cplusplus > 199711L
  42. #include <atomic>
  43. #ifndef __CPP11__
  44. #define __CPP11__
  45. #endif
  46. #endif
  47. #ifndef __CPP11__
  48. // Beyond that defining nullptr, constexpr, and noexcept should allow us to still build on these. So far we've
  49. // avoided deeper C++11 features like lambdas in the core until we're 100% sure all the ancient targets are gone.
  50. #error TODO: to build on pre-c++11 compilers we will need to make a subset of std::atomic for integers
  51. #define nullptr (0)
  52. #define constexpr ZT_INLINE
  53. #define noexcept throw()
  54. #endif
  55. #ifdef __GNUC__
  56. #ifndef ZT_DEBUG
  57. #define ZT_INLINE __attribute__((always_inline)) inline
  58. #endif
  59. #ifndef restrict
  60. #define restrict __restrict__
  61. #endif
  62. #ifndef likely
  63. #define likely(x) __builtin_expect((x),1)
  64. #endif
  65. #ifndef unlikely
  66. #define unlikely(x) __builtin_expect((x),0)
  67. #endif
  68. #else /* not GCC-like */
  69. #ifndef restrict
  70. #define restrict
  71. #endif
  72. #ifndef likely
  73. #define likely(x) (x)
  74. #endif
  75. #ifndef unlikely
  76. #define unlikely(x) (x)
  77. #endif
  78. #endif
  79. #if (defined(__amd64) || defined(__amd64__) || defined(__x86_64) || defined(__x86_64__) || defined(__AMD64) || defined(__AMD64__) || defined(_M_X64))
  80. #define ZT_ARCH_X64 1
  81. #endif
  82. #if defined(ZT_ARCH_X64) || defined(i386) || defined(__i386) || defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) || defined(__I86__) || defined(__INTEL__) || defined(__386)
  83. #define ZT_ARCH_X86 1
  84. #endif
  85. #if !defined(ZT_ARCH_X86)
  86. #ifndef ZT_NO_UNALIGNED_ACCESS
  87. #define ZT_NO_UNALIGNED_ACCESS 1
  88. #endif
  89. #endif
  90. #if defined(__SIZEOF_INT128__) || ((defined(ZT_ARCH_X64) || defined(__aarch64__)) && defined(__GNUC__))
  91. #ifdef __SIZEOF_INT128__
  92. #define ZT_HAVE_UINT128 1
  93. typedef unsigned __int128 uint128_t;
  94. #else
  95. #define ZT_HAVE_UINT128 1
  96. typedef unsigned uint128_t __attribute__((mode(TI)));
  97. #endif
  98. #endif
  99. #if defined(__linux__) || defined(linux) || defined(__LINUX__) || defined(__linux)
  100. #ifndef __LINUX__
  101. #define __LINUX__ 1
  102. #endif
  103. #ifndef __UNIX_LIKE__
  104. #define __UNIX_LIKE__ 1
  105. #endif
  106. #include <endian.h>
  107. #endif
  108. #ifdef __APPLE__
  109. #include <TargetConditionals.h>
  110. #include <machine/endian.h>
  111. #ifndef __UNIX_LIKE__
  112. #define __UNIX_LIKE__ 1
  113. #endif
  114. #ifndef __BSD__
  115. #define __BSD__ 1
  116. #endif
  117. #ifndef __BYTE_ORDER
  118. #define __BYTE_ORDER __DARWIN_BYTE_ORDER
  119. #define __BIG_ENDIAN __DARWIN_BIG_ENDIAN
  120. #define __LITTLE_ENDIAN __DARWIN_LITTLE_ENDIAN
  121. #endif
  122. #endif
  123. #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
  124. #ifndef __UNIX_LIKE__
  125. #define __UNIX_LIKE__ 1
  126. #endif
  127. #ifndef __BSD__
  128. #define __BSD__ 1
  129. #endif
  130. #include <sys/endian.h>
  131. #ifndef RTF_MULTICAST
  132. #define RTF_MULTICAST 0x20000000
  133. #endif
  134. #endif
  135. #ifdef __WINDOWS__
  136. #define ZT_PATH_SEPARATOR '\\'
  137. #define ZT_PATH_SEPARATOR_S "\\"
  138. #define ZT_EOL_S "\r\n"
  139. #else
  140. #define ZT_PATH_SEPARATOR '/'
  141. #define ZT_PATH_SEPARATOR_S "/"
  142. #define ZT_EOL_S "\n"
  143. #endif
  144. #if !defined(__BYTE_ORDER) && defined(__BYTE_ORDER__)
  145. #define __BYTE_ORDER __BYTE_ORDER__
  146. #define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__
  147. #define __BIG_ENDIAN __ORDER_BIG_ENDIAN__
  148. #endif
  149. #if !defined(__BYTE_ORDER) && defined(BYTE_ORDER)
  150. #define __BYTE_ORDER BYTE_ORDER
  151. #define __LITTLE_ENDIAN LITTLE_ENDIAN
  152. #define __BIG_ENDIAN BIG_ENDIAN
  153. #endif
  154. #if !defined(__BYTE_ORDER) && defined(_BYTE_ORDER)
  155. #define __BYTE_ORDER _BYTE_ORDER
  156. #define __LITTLE_ENDIAN _LITTLE_ENDIAN
  157. #define __BIG_ENDIAN _BIG_ENDIAN
  158. #endif
  159. #ifndef ZT_INLINE
  160. #ifdef ZT_DEBUG
  161. #define ZT_INLINE
  162. #else
  163. #define ZT_INLINE inline
  164. #endif
  165. #endif
  166. #endif