platform.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /*
  2. * Copyright 2010-2013 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #ifndef BX_PLATFORM_H_HEADER_GUARD
  6. #define BX_PLATFORM_H_HEADER_GUARD
  7. #define BX_COMPILER_CLANG 0
  8. #define BX_COMPILER_CLANG_ANALYZER 0
  9. #define BX_COMPILER_GCC 0
  10. #define BX_COMPILER_MSVC 0
  11. #define BX_COMPILER_MSVC_COMPATIBLE 0
  12. #define BX_PLATFORM_ANDROID 0
  13. #define BX_PLATFORM_EMSCRIPTEN 0
  14. #define BX_PLATFORM_FREEBSD 0
  15. #define BX_PLATFORM_IOS 0
  16. #define BX_PLATFORM_LINUX 0
  17. #define BX_PLATFORM_NACL 0
  18. #define BX_PLATFORM_OSX 0
  19. #define BX_PLATFORM_QNX 0
  20. #define BX_PLATFORM_RPI 0
  21. #define BX_PLATFORM_WINDOWS 0
  22. #define BX_PLATFORM_WINRT 0
  23. #define BX_PLATFORM_XBOX360 0
  24. #define BX_CPU_ARM 0
  25. #define BX_CPU_JIT 0
  26. #define BX_CPU_MIPS 0
  27. #define BX_CPU_PPC 0
  28. #define BX_CPU_X86 0
  29. #define BX_ARCH_32BIT 0
  30. #define BX_ARCH_64BIT 0
  31. #define BX_CPU_ENDIAN_BIG 0
  32. #define BX_CPU_ENDIAN_LITTLE 0
  33. // http://sourceforge.net/apps/mediawiki/predef/index.php?title=Compilers
  34. #if defined(__clang__)
  35. // clang defines __GNUC__ or _MSC_VER
  36. # undef BX_COMPILER_CLANG
  37. # define BX_COMPILER_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
  38. # if defined(__clang_analyzer__)
  39. # undef BX_COMPILER_CLANG_ANALYZER
  40. # define BX_COMPILER_CLANG_ANALYZER 1
  41. # endif // defined(__clang_analyzer__)
  42. # if defined(_MSC_VER)
  43. # undef BX_COMPILER_MSVC_COMPATIBLE
  44. # define BX_COMPILER_MSVC_COMPATIBLE _MSC_VER
  45. # endif // defined(_MSC_VER)
  46. #elif defined(_MSC_VER)
  47. # undef BX_COMPILER_MSVC
  48. # define BX_COMPILER_MSVC _MSC_VER
  49. # undef BX_COMPILER_MSVC_COMPATIBLE
  50. # define BX_COMPILER_MSVC_COMPATIBLE _MSC_VER
  51. #elif defined(__GNUC__)
  52. # undef BX_COMPILER_GCC
  53. # define BX_COMPILER_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
  54. #else
  55. # error "BX_COMPILER_* is not defined!"
  56. #endif //
  57. // http://sourceforge.net/apps/mediawiki/predef/index.php?title=Architectures
  58. #if defined(__arm__) || \
  59. defined(__aarch64__) || \
  60. defined(_M_ARM)
  61. # undef BX_CPU_ARM
  62. # define BX_CPU_ARM 1
  63. # define BX_CACHE_LINE_SIZE 64
  64. #elif defined(__MIPSEL__) || \
  65. defined(__mips_isa_rev) || \
  66. defined(__mips64)
  67. # undef BX_CPU_MIPS
  68. # define BX_CPU_MIPS 1
  69. # define BX_CACHE_LINE_SIZE 64
  70. #elif defined(_M_PPC) || \
  71. defined(__powerpc__) || \
  72. defined(__powerpc64__)
  73. # undef BX_CPU_PPC
  74. # define BX_CPU_PPC 1
  75. # define BX_CACHE_LINE_SIZE 128
  76. #elif defined(_M_IX86) || \
  77. defined(_M_X64) || \
  78. defined(__i386__) || \
  79. defined(__x86_64__)
  80. # undef BX_CPU_X86
  81. # define BX_CPU_X86 1
  82. # define BX_CACHE_LINE_SIZE 64
  83. #else // PNaCl doesn't have CPU defined.
  84. # undef BX_CPU_JIT
  85. # define BX_CPU_JIT 1
  86. # define BX_CACHE_LINE_SIZE 64
  87. #endif //
  88. #if defined(__x86_64__) || \
  89. defined(_M_X64) || \
  90. defined(__aarch64__) || \
  91. defined(__64BIT__) || \
  92. defined(__mips64) || \
  93. defined(__powerpc64__) || \
  94. defined(__ppc64__)
  95. # undef BX_ARCH_64BIT
  96. # define BX_ARCH_64BIT 64
  97. #else
  98. # undef BX_ARCH_32BIT
  99. # define BX_ARCH_32BIT 32
  100. #endif //
  101. #if BX_CPU_PPC
  102. # undef BX_CPU_ENDIAN_BIG
  103. # define BX_CPU_ENDIAN_BIG 1
  104. #else
  105. # undef BX_CPU_ENDIAN_LITTLE
  106. # define BX_CPU_ENDIAN_LITTLE 1
  107. #endif // BX_PLATFORM_
  108. // http://sourceforge.net/apps/mediawiki/predef/index.php?title=Operating_Systems
  109. #if defined(_XBOX_VER)
  110. # undef BX_PLATFORM_XBOX360
  111. # define BX_PLATFORM_XBOX360 1
  112. #elif defined(_WIN32) || defined(_WIN64)
  113. // http://msdn.microsoft.com/en-us/library/6sehtctf.aspx
  114. # define NOMINMAX
  115. # include <windows.h>
  116. # if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
  117. # undef BX_PLATFORM_WINDOWS
  118. # if !defined(WINVER) && !defined(_WIN32_WINNT)
  119. # if BX_ARCH_64BIT
  120. // When building 64-bit target Win7 and above.
  121. # define WINVER 0x0601
  122. # define _WIN32_WINNT 0x0601
  123. # else
  124. // Windows Server 2003 with SP1, Windows XP with SP2 and above
  125. # define WINVER 0x0502
  126. # define _WIN32_WINNT 0x0502
  127. # endif // BX_ARCH_64BIT
  128. # endif // !defined(WINVER) && !defined(_WIN32_WINNT)
  129. # define BX_PLATFORM_WINDOWS _WIN32_WINNT
  130. # else
  131. # undef BX_PLATFORM_WINRT
  132. # define BX_PLATFORM_WINRT 1
  133. # endif
  134. #elif defined(__VCCOREVER__)
  135. // RaspberryPi compiler defines __linux__
  136. # undef BX_PLATFORM_RPI
  137. # define BX_PLATFORM_RPI 1
  138. #elif defined(__native_client__)
  139. // NaCl compiler defines __linux__
  140. # include <ppapi/c/pp_macros.h>
  141. # undef BX_PLATFORM_NACL
  142. # define BX_PLATFORM_NACL PPAPI_RELEASE
  143. #elif defined(__ANDROID__)
  144. // Android compiler defines __linux__
  145. # include <android/api-level.h>
  146. # undef BX_PLATFORM_ANDROID
  147. # define BX_PLATFORM_ANDROID __ANDROID_API__
  148. #elif defined(__linux__)
  149. # undef BX_PLATFORM_LINUX
  150. # define BX_PLATFORM_LINUX 1
  151. #elif defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__)
  152. # undef BX_PLATFORM_IOS
  153. # define BX_PLATFORM_IOS 1
  154. #elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
  155. # undef BX_PLATFORM_OSX
  156. # define BX_PLATFORM_OSX 1
  157. #elif defined(EMSCRIPTEN)
  158. # undef BX_PLATFORM_EMSCRIPTEN
  159. # define BX_PLATFORM_EMSCRIPTEN 1
  160. #elif defined(__QNX__)
  161. # undef BX_PLATFORM_QNX
  162. # define BX_PLATFORM_QNX 1
  163. #elif defined(__FreeBSD__)
  164. # undef BX_PLATFORM_FREEBSD
  165. # define BX_PLATFORM_FREEBSD 1
  166. #else
  167. # error "BX_PLATFORM_* is not defined!"
  168. #endif //
  169. #define BX_PLATFORM_POSIX (0 \
  170. || BX_PLATFORM_ANDROID \
  171. || BX_PLATFORM_EMSCRIPTEN \
  172. || BX_PLATFORM_FREEBSD \
  173. || BX_PLATFORM_IOS \
  174. || BX_PLATFORM_LINUX \
  175. || BX_PLATFORM_NACL \
  176. || BX_PLATFORM_OSX \
  177. || BX_PLATFORM_QNX \
  178. || BX_PLATFORM_RPI \
  179. )
  180. #ifndef BX_CONFIG_ENABLE_MSVC_LEVEL4_WARNINGS
  181. # define BX_CONFIG_ENABLE_MSVC_LEVEL4_WARNINGS 0
  182. #endif // BX_CONFIG_ENABLE_MSVC_LEVEL4_WARNINGS
  183. #if BX_COMPILER_GCC
  184. # define BX_COMPILER_NAME "GCC " \
  185. BX_STRINGIZE(__GNUC__) "." \
  186. BX_STRINGIZE(__GNUC_MINOR__) "." \
  187. BX_STRINGIZE(__GNUC_PATCHLEVEL__)
  188. #elif BX_COMPILER_CLANG
  189. # define BX_COMPILER_NAME "Clang " \
  190. BX_STRINGIZE(__clang_major__) "." \
  191. BX_STRINGIZE(__clang_minor__) "." \
  192. BX_STRINGIZE(__clang_patchlevel__)
  193. #elif BX_COMPILER_MSVC
  194. # if BX_COMPILER_MSVC >= 1800
  195. # define BX_COMPILER_NAME "MSVC 12.0"
  196. # elif BX_COMPILER_MSVC >= 1700
  197. # define BX_COMPILER_NAME "MSVC 11.0"
  198. # elif BX_COMPILER_MSVC >= 1600
  199. # define BX_COMPILER_NAME "MSVC 10.0"
  200. # elif BX_COMPILER_MSVC >= 1500
  201. # define BX_COMPILER_NAME "MSVC 9.0"
  202. # else
  203. # define BX_COMPILER_NAME "MSVC"
  204. # endif //
  205. #endif // BX_COMPILER_
  206. #if BX_PLATFORM_ANDROID
  207. # define BX_PLATFORM_NAME "Android " \
  208. BX_STRINGIZE(BX_PLATFORM_ANDROID)
  209. #elif BX_PLATFORM_EMSCRIPTEN
  210. # define BX_PLATFORM_NAME "asm.js " \
  211. BX_STRINGIZE(__EMSCRIPTEN_major__) "." \
  212. BX_STRINGIZE(__EMSCRIPTEN_minor__) "." \
  213. BX_STRINGIZE(__EMSCRIPTEN_tiny__)
  214. #elif BX_PLATFORM_FREEBSD
  215. # define BX_PLATFORM_NAME "FreeBSD"
  216. #elif BX_PLATFORM_IOS
  217. # define BX_PLATFORM_NAME "iOS"
  218. #elif BX_PLATFORM_LINUX
  219. # define BX_PLATFORM_NAME "Linux"
  220. #elif BX_PLATFORM_NACL
  221. # define BX_PLATFORM_NAME "NaCl " \
  222. BX_STRINGIZE(BX_PLATFORM_NACL)
  223. #elif BX_PLATFORM_OSX
  224. # define BX_PLATFORM_NAME "OSX"
  225. #elif BX_PLATFORM_QNX
  226. # define BX_PLATFORM_NAME "QNX"
  227. #elif BX_PLATFORM_RPI
  228. # define BX_PLATFORM_NAME "RaspberryPi"
  229. #elif BX_PLATFORM_WINDOWS
  230. # define BX_PLATFORM_NAME "Windows"
  231. #elif BX_PLATFORM_WINRT
  232. # define BX_PLATFORM_NAME "WinRT"
  233. #endif // BX_PLATFORM_
  234. #if BX_CPU_ARM
  235. # define BX_CPU_NAME "ARM"
  236. #elif BX_CPU_MIPS
  237. # define BX_CPU_NAME "MIPS"
  238. #elif BX_CPU_PPC
  239. # define BX_CPU_NAME "PowerPC"
  240. #elif BX_CPU_JIT
  241. # define BX_CPU_NAME "JIT-VM"
  242. #elif BX_CPU_X86
  243. # define BX_CPU_NAME "x86"
  244. #endif // BX_CPU_
  245. #if BX_ARCH_32BIT
  246. # define BX_ARCH_NAME "32-bit"
  247. #elif BX_ARCH_64BIT
  248. # define BX_ARCH_NAME "64-bit"
  249. #endif // BX_ARCH_
  250. #if BX_CONFIG_ENABLE_MSVC_LEVEL4_WARNINGS && BX_COMPILER_MSVC
  251. # pragma warning(error:4062) // ENABLE warning C4062: enumerator'...' in switch of enum '...' is not handled
  252. # pragma warning(error:4121) // ENABLE warning C4121: 'symbol' : alignment of a member was sensitive to packing
  253. //# pragma warning(error:4127) // ENABLE warning C4127: conditional expression is constant
  254. # pragma warning(error:4130) // ENABLE warning C4130: 'operator' : logical operation on address of string constant
  255. # pragma warning(error:4239) // ENABLE warning C4239: nonstandard extension used : 'argument' : conversion from '*' to '* &' A non-const reference may only be bound to an lvalue
  256. //# pragma warning(error:4244) // ENABLE warning C4244: 'argument' : conversion from 'type1' to 'type2', possible loss of data
  257. # pragma warning(error:4245) // ENABLE warning C4245: 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch
  258. # pragma warning(error:4263) // ENABLE warning C4263: 'function' : member function does not override any base class virtual member function
  259. # pragma warning(error:4265) // ENABLE warning C4265: class has virtual functions, but destructor is not virtual
  260. # pragma warning(error:4431) // ENABLE warning C4431: missing type specifier - int assumed. Note: C no longer supports default-int
  261. # pragma warning(error:4545) // ENABLE warning C4545: expression before comma evaluates to a function which is missing an argument list
  262. # pragma warning(error:4549) // ENABLE warning C4549: 'operator' : operator before comma has no effect; did you intend 'operator'?
  263. # pragma warning(error:4701) // ENABLE warning C4701: potentially uninitialized local variable 'name' used
  264. # pragma warning(error:4706) // ENABLE warning C4706: assignment within conditional expression
  265. # pragma warning(error:4100) // ENABLE warning C4100: '' : unreferenced formal parameter
  266. # pragma warning(error:4189) // ENABLE warning C4189: '' : local variable is initialized but not referenced
  267. # pragma warning(error:4505) // ENABLE warning C4505: '' : unreferenced local function has been removed
  268. #endif // BX_CONFIG_ENABLE_MSVC_LEVEL4_WARNINGS && BX_COMPILER_MSVC
  269. #endif // BX_PLATFORM_H_HEADER_GUARD