xenium
port.hpp
1 //
2 // Copyright (c) 2018-2020 Manuel Pöter.
3 // Licensed under the MIT License. See LICENSE file in the project root for full license information.
4 //
5 
6 #ifndef XENIUM_DETAIL_PORT_HPP
7 #define XENIUM_DETAIL_PORT_HPP
8 
9 #if !defined(__SANITIZE_THREAD__) && defined(__has_feature)
10  #if __has_feature(thread_sanitizer)
11  #define __SANITIZE_THREAD__ // NOLINT
12  #endif
13 #endif
14 
15 #if defined(__SANITIZE_THREAD__)
16  #define TSAN_MEMORY_ORDER(tsan_order, _) tsan_order
17 #else
18  #define TSAN_MEMORY_ORDER(_tsan_order, normal_order) normal_order
19 #endif
20 
21 #if !defined(XENIM_FORCEINLINE)
22  #if defined(_MSC_VER)
23  #define XENIUM_FORCEINLINE __forceinline
24  #elif defined(__GNUC__) && __GNUC__ > 3
25  #define XENIUM_FORCEINLINE inline __attribute__((__always_inline__))
26  #else
27  #define XENIUM_FORCEINLINE inline
28  #endif
29 #endif
30 
31 #if !defined(XENIUM_NOINLINE)
32  #if defined(_MSC_VER)
33  #define XENIUM_NOINLINE __declspec(noinline)
34  #elif defined(__GNUC__) && __GNUC__ > 3
35  #define XENIUM_NOINLINE __attribute__((__noinline__))
36  #else
37  #define XENIUM_NOINLINE
38  #endif
39 #endif
40 
41 #if defined(__has_builtin)
42  #if __has_builtin(__builtin_expect)
43  #define XENIUM_LIKELY(x) __builtin_expect(x, 1)
44  #define XENIUM_UNLIKELY(x) __builtin_expect(x, 0)
45  #endif
46 #endif
47 
48 #if !defined(XENIUM_LIKELY) || !defined(XENIUM_UNLIKELY)
49  #define XENIUM_LIKELY(x) x
50  #define XENIUM_UNLIKELY(x) x
51 #endif
52 
53 #if !defined(XENIUM_ARCH_X86) && (defined(__x86_64__) || defined(_M_AMD64))
54  #define XENIUM_ARCH_X86
55 #endif
56 
57 #if !defined(XENIUM_ARCH_SPARC) && defined(__sparc__)
58  #define XENIUM_ARCH_SPARC
59 #endif
60 
61 #endif