aboutsummaryrefslogtreecommitdiffstats
path: root/util/system/platform.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/system/platform.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/system/platform.h')
-rw-r--r--util/system/platform.h246
1 files changed, 246 insertions, 0 deletions
diff --git a/util/system/platform.h b/util/system/platform.h
new file mode 100644
index 0000000000..58f310ab34
--- /dev/null
+++ b/util/system/platform.h
@@ -0,0 +1,246 @@
+#pragma once
+
+// ya style breaks indentation in ifdef's and code becomes unreadable
+// clang-format off
+
+// What OS ?
+// our definition has the form _{osname}_
+
+#if defined(_WIN64)
+ #define _win64_
+ #define _win32_
+#elif defined(__WIN32__) || defined(_WIN32) // _WIN32 is also defined by the 64-bit compiler for backward compatibility
+ #define _win32_
+#else
+ #define _unix_
+
+ #if defined(__sun__) || defined(sun) || defined(sparc) || defined(__sparc)
+ #define _sun_
+ #endif
+
+ #if defined(__hpux__)
+ #define _hpux_
+ #endif
+
+ #if defined(__linux__)
+ // Stands for "Linux" in the means of Linux kernel (i. e. Android is included)
+ #define _linux_
+ #endif
+
+ #if defined(__FreeBSD__)
+ #define _freebsd_
+ #endif
+
+ #if defined(__CYGWIN__)
+ #define _cygwin_
+ #endif
+
+ #if defined(__APPLE__)
+ #define _darwin_
+ #endif
+
+ #if defined(__ANDROID__)
+ #define _android_
+ #endif
+#endif
+
+#if defined(__IOS__)
+ #define _ios_
+#endif
+
+#if defined(_linux_)
+ #if defined(_musl_)
+ // nothing to do
+ #elif defined(_android_)
+ // Please do not mix with android-based systems.
+ // This definition describes Standard Library (libc) type.
+ #define _bionic_
+ #else
+ #define _glibc_
+ #endif
+#endif
+
+#if defined(_darwin_)
+ #define unix
+ #define __unix__
+#endif
+
+#if defined(_win32_) || defined(_win64_)
+ #define _win_
+#endif
+
+#if defined(__arm__) || defined(__ARM__) || defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM)
+ #if defined(__arm64) || defined(__arm64__) || defined(__aarch64__)
+ #define _arm64_
+ #else
+ #define _arm32_
+ #endif
+#endif
+
+#if defined(_arm64_) || defined(_arm32_)
+ #define _arm_
+#endif
+
+/* __ia64__ and __x86_64__ - defined by GNU C.
+ * _M_IA64, _M_X64, _M_AMD64 - defined by Visual Studio.
+ *
+ * Microsoft can define _M_IX86, _M_AMD64 (before Visual Studio 8)
+ * or _M_X64 (starting in Visual Studio 8).
+ */
+#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)
+ #define _x86_64_
+#endif
+
+#if defined(__i386__) || defined(_M_IX86)
+ #define _i386_
+#endif
+
+#if defined(__ia64__) || defined(_M_IA64)
+ #define _ia64_
+#endif
+
+#if defined(__powerpc__)
+ #define _ppc_
+#endif
+
+#if defined(__powerpc64__)
+ #define _ppc64_
+#endif
+
+#if !defined(sparc) && !defined(__sparc) && !defined(__hpux__) && !defined(__alpha__) && !defined(_ia64_) && !defined(_x86_64_) && !defined(_arm_) && !defined(_i386_) && !defined(_ppc_) && !defined(_ppc64_)
+ #error "platform not defined, please, define one"
+#endif
+
+#if defined(_x86_64_) || defined(_i386_)
+ #define _x86_
+#endif
+
+#if defined(__MIC__)
+ #define _mic_
+ #define _k1om_
+#endif
+
+// stdio or MessageBox
+#if defined(__CONSOLE__) || defined(_CONSOLE)
+ #define _console_
+#endif
+#if (defined(_win_) && !defined(_console_))
+ #define _windows_
+#elif !defined(_console_)
+ #define _console_
+#endif
+
+#if defined(__SSE__) || defined(SSE_ENABLED)
+ #define _sse_
+#endif
+
+#if defined(__SSE2__) || defined(SSE2_ENABLED)
+ #define _sse2_
+#endif
+
+#if defined(__SSE3__) || defined(SSE3_ENABLED)
+ #define _sse3_
+#endif
+
+#if defined(__SSSE3__) || defined(SSSE3_ENABLED)
+ #define _ssse3_
+#endif
+
+#if defined(__SSE4_1__) || defined(SSE41_ENABLED)
+ #define _sse4_1_
+#endif
+
+#if defined(__SSE4_2__) || defined(SSE42_ENABLED)
+ #define _sse4_2_
+#endif
+
+#if defined(__POPCNT__) || defined(POPCNT_ENABLED)
+ #define _popcnt_
+#endif
+
+#if defined(__PCLMUL__) || defined(PCLMUL_ENABLED)
+ #define _pclmul_
+#endif
+
+#if defined(__AES__) || defined(AES_ENABLED)
+ #define _aes_
+#endif
+
+#if defined(__AVX__) || defined(AVX_ENABLED)
+ #define _avx_
+#endif
+
+#if defined(__AVX2__) || defined(AVX2_ENABLED)
+ #define _avx2_
+#endif
+
+#if defined(__FMA__) || defined(FMA_ENABLED)
+ #define _fma_
+#endif
+
+#if defined(__DLL__) || defined(_DLL)
+ #define _dll_
+#endif
+
+// 16, 32 or 64
+#if defined(__sparc_v9__) || defined(_x86_64_) || defined(_ia64_) || defined(_arm64_) || defined(_ppc64_)
+ #define _64_
+#else
+ #define _32_
+#endif
+
+/* All modern 64-bit Unix systems use scheme LP64 (long, pointers are 64-bit).
+ * Microsoft uses a different scheme: LLP64 (long long, pointers are 64-bit).
+ *
+ * Scheme LP64 LLP64
+ * char 8 8
+ * short 16 16
+ * int 32 32
+ * long 64 32
+ * long long 64 64
+ * pointer 64 64
+ */
+
+#if defined(_32_)
+ #define SIZEOF_PTR 4
+#elif defined(_64_)
+ #define SIZEOF_PTR 8
+#endif
+
+#define PLATFORM_DATA_ALIGN SIZEOF_PTR
+
+#if !defined(SIZEOF_PTR)
+ #error todo
+#endif
+
+#define SIZEOF_CHAR 1
+#define SIZEOF_UNSIGNED_CHAR 1
+#define SIZEOF_SHORT 2
+#define SIZEOF_UNSIGNED_SHORT 2
+#define SIZEOF_INT 4
+#define SIZEOF_UNSIGNED_INT 4
+
+#if defined(_32_)
+ #define SIZEOF_LONG 4
+ #define SIZEOF_UNSIGNED_LONG 4
+#elif defined(_64_)
+ #if defined(_win_)
+ #define SIZEOF_LONG 4
+ #define SIZEOF_UNSIGNED_LONG 4
+ #else
+ #define SIZEOF_LONG 8
+ #define SIZEOF_UNSIGNED_LONG 8
+ #endif // _win_
+#endif // _32_
+
+#if !defined(SIZEOF_LONG)
+ #error todo
+#endif
+
+#define SIZEOF_LONG_LONG 8
+#define SIZEOF_UNSIGNED_LONG_LONG 8
+
+#undef SIZEOF_SIZE_T // in case we include <Python.h> which defines it, too
+#define SIZEOF_SIZE_T SIZEOF_PTR
+
+// clang-format on