• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Compiler.h : Compiler specific defines and pragmas
2 2023-04-02 : Igor Pavlov : Public domain */
3 
4 #ifndef ZIP7_INC_COMPILER_H
5 #define ZIP7_INC_COMPILER_H
6 
7 #if defined(__clang__)
8 # define Z7_CLANG_VERSION  (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
9 #endif
10 #if defined(__clang__) && defined(__apple_build_version__)
11 # define Z7_APPLE_CLANG_VERSION   Z7_CLANG_VERSION
12 #elif defined(__clang__)
13 # define Z7_LLVM_CLANG_VERSION    Z7_CLANG_VERSION
14 #elif defined(__GNUC__)
15 # define Z7_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
16 #endif
17 
18 #ifdef _MSC_VER
19 #if !defined(__clang__) && !defined(__GNUC__)
20 #define Z7_MSC_VER_ORIGINAL _MSC_VER
21 #endif
22 #endif
23 
24 #if defined(__MINGW32__) || defined(__MINGW64__)
25 #define Z7_MINGW
26 #endif
27 
28 // #pragma GCC diagnostic ignored "-Wunknown-pragmas"
29 
30 #ifdef __clang__
31 // padding size of '' with 4 bytes to alignment boundary
32 #pragma GCC diagnostic ignored "-Wpadded"
33 #endif
34 
35 
36 #ifdef _MSC_VER
37 
38   #ifdef UNDER_CE
39     #define RPC_NO_WINDOWS_H
40     /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */
41     #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
42     #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int
43   #endif
44 
45 #if defined(_MSC_VER) && _MSC_VER >= 1800
46 #pragma warning(disable : 4464) // relative include path contains '..'
47 #endif
48 
49 // == 1200 : -O1 : for __forceinline
50 // >= 1900 : -O1 : for printf
51 #pragma warning(disable : 4710) // function not inlined
52 
53 #if _MSC_VER < 1900
54 // winnt.h: 'Int64ShllMod32'
55 #pragma warning(disable : 4514) // unreferenced inline function has been removed
56 #endif
57 
58 #if _MSC_VER < 1300
59 // #pragma warning(disable : 4702) // unreachable code
60 // Bra.c : -O1:
61 #pragma warning(disable : 4714) // function marked as __forceinline not inlined
62 #endif
63 
64 /*
65 #if _MSC_VER > 1400 && _MSC_VER <= 1900
66 // strcat: This function or variable may be unsafe
67 // sysinfoapi.h: kit10: GetVersion was declared deprecated
68 #pragma warning(disable : 4996)
69 #endif
70 */
71 
72 #if _MSC_VER > 1200
73 // -Wall warnings
74 
75 #pragma warning(disable : 4711) // function selected for automatic inline expansion
76 #pragma warning(disable : 4820) // '2' bytes padding added after data member
77 
78 #if _MSC_VER >= 1400 && _MSC_VER < 1920
79 // 1400: string.h: _DBG_MEMCPY_INLINE_
80 // 1600 - 191x : smmintrin.h __cplusplus'
81 // is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
82 #pragma warning(disable : 4668)
83 
84 // 1400 - 1600 : WinDef.h : 'FARPROC' :
85 // 1900 - 191x : immintrin.h: _readfsbase_u32
86 // no function prototype given : converting '()' to '(void)'
87 #pragma warning(disable : 4255)
88 #endif
89 
90 #if _MSC_VER >= 1914
91 // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
92 #pragma warning(disable : 5045)
93 #endif
94 
95 #endif // _MSC_VER > 1200
96 #endif // _MSC_VER
97 
98 
99 #if defined(__clang__) && (__clang_major__ >= 4)
100   #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \
101     _Pragma("clang loop unroll(disable)") \
102     _Pragma("clang loop vectorize(disable)")
103   #define Z7_ATTRIB_NO_VECTORIZE
104 #elif defined(__GNUC__) && (__GNUC__ >= 5)
105   #define Z7_ATTRIB_NO_VECTORIZE __attribute__((optimize("no-tree-vectorize")))
106   // __attribute__((optimize("no-unroll-loops")));
107   #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE
108 #elif defined(_MSC_VER) && (_MSC_VER >= 1920)
109   #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \
110     _Pragma("loop( no_vector )")
111   #define Z7_ATTRIB_NO_VECTORIZE
112 #else
113   #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE
114   #define Z7_ATTRIB_NO_VECTORIZE
115 #endif
116 
117 #if defined(MY_CPU_X86_OR_AMD64) && ( \
118        defined(__clang__) && (__clang_major__ >= 4) \
119     || defined(__GNUC__) && (__GNUC__ >= 5))
120   #define Z7_ATTRIB_NO_SSE  __attribute__((__target__("no-sse")))
121 #else
122   #define Z7_ATTRIB_NO_SSE
123 #endif
124 
125 #define Z7_ATTRIB_NO_VECTOR \
126   Z7_ATTRIB_NO_VECTORIZE \
127   Z7_ATTRIB_NO_SSE
128 
129 
130 #if defined(__clang__) && (__clang_major__ >= 8) \
131   || defined(__GNUC__) && (__GNUC__ >= 1000) \
132   /* || defined(_MSC_VER) && (_MSC_VER >= 1920) */
133   // GCC is not good for __builtin_expect()
134   #define Z7_LIKELY(x)   (__builtin_expect((x), 1))
135   #define Z7_UNLIKELY(x) (__builtin_expect((x), 0))
136   // #define Z7_unlikely [[unlikely]]
137   // #define Z7_likely [[likely]]
138 #else
139   #define Z7_LIKELY(x)   (x)
140   #define Z7_UNLIKELY(x) (x)
141   // #define Z7_likely
142 #endif
143 
144 
145 #if (defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 36000))
146 #define Z7_DIAGNOSCTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \
147   _Pragma("GCC diagnostic push") \
148   _Pragma("GCC diagnostic ignored \"-Wreserved-macro-identifier\"")
149 #define Z7_DIAGNOSCTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER \
150   _Pragma("GCC diagnostic pop")
151 #else
152 #define Z7_DIAGNOSCTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER
153 #define Z7_DIAGNOSCTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER
154 #endif
155 
156 #define UNUSED_VAR(x) (void)x;
157 /* #define UNUSED_VAR(x) x=x; */
158 
159 #endif
160