Compiler.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /* Compiler.h : Compiler specific defines and pragmas
  2. : Igor Pavlov : Public domain */
  3. #ifndef ZIP7_INC_COMPILER_H
  4. #define ZIP7_INC_COMPILER_H
  5. #if defined(__clang__)
  6. # define Z7_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
  7. #endif
  8. #if defined(__clang__) && defined(__apple_build_version__)
  9. # define Z7_APPLE_CLANG_VERSION Z7_CLANG_VERSION
  10. #elif defined(__clang__)
  11. # define Z7_LLVM_CLANG_VERSION Z7_CLANG_VERSION
  12. #elif defined(__GNUC__)
  13. # define Z7_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
  14. #endif
  15. #ifdef _MSC_VER
  16. #if !defined(__clang__) && !defined(__GNUC__)
  17. #define Z7_MSC_VER_ORIGINAL _MSC_VER
  18. #endif
  19. #endif
  20. #if defined(__MINGW32__) || defined(__MINGW64__)
  21. #define Z7_MINGW
  22. #endif
  23. #if defined(__LCC__) && (defined(__MCST__) || defined(__e2k__))
  24. #define Z7_MCST_LCC
  25. #define Z7_MCST_LCC_VERSION (__LCC__ * 100 + __LCC_MINOR__)
  26. #endif
  27. /*
  28. #if defined(__AVX2__) \
  29. || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40900) \
  30. || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 40600) \
  31. || defined(Z7_LLVM_CLANG_VERSION) && (Z7_LLVM_CLANG_VERSION >= 30100) \
  32. || defined(Z7_MSC_VER_ORIGINAL) && (Z7_MSC_VER_ORIGINAL >= 1800) \
  33. || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1400)
  34. #define Z7_COMPILER_AVX2_SUPPORTED
  35. #endif
  36. #endif
  37. */
  38. // #pragma GCC diagnostic ignored "-Wunknown-pragmas"
  39. #ifdef __clang__
  40. // padding size of '' with 4 bytes to alignment boundary
  41. #pragma GCC diagnostic ignored "-Wpadded"
  42. #if defined(Z7_LLVM_CLANG_VERSION) && (__clang_major__ == 13) \
  43. && defined(__FreeBSD__)
  44. // freebsd:
  45. #pragma GCC diagnostic ignored "-Wexcess-padding"
  46. #endif
  47. #if __clang_major__ >= 16
  48. #pragma GCC diagnostic ignored "-Wunsafe-buffer-usage"
  49. #endif
  50. #if __clang_major__ == 13
  51. #if defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 16)
  52. // cheri
  53. #pragma GCC diagnostic ignored "-Wcapability-to-integer-cast"
  54. #endif
  55. #endif
  56. #if __clang_major__ == 13
  57. // for <arm_neon.h>
  58. #pragma GCC diagnostic ignored "-Wreserved-identifier"
  59. #endif
  60. #endif // __clang__
  61. #if defined(_WIN32) && defined(__clang__) && __clang_major__ >= 16
  62. // #pragma GCC diagnostic ignored "-Wcast-function-type-strict"
  63. #define Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION \
  64. _Pragma("GCC diagnostic ignored \"-Wcast-function-type-strict\"")
  65. #else
  66. #define Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
  67. #endif
  68. typedef void (*Z7_void_Function)(void);
  69. #if defined(__clang__) || defined(__GNUC__)
  70. #define Z7_CAST_FUNC_C (Z7_void_Function)
  71. #elif defined(_MSC_VER) && _MSC_VER > 1920
  72. #define Z7_CAST_FUNC_C (void *)
  73. // #pragma warning(disable : 4191) // 'type cast': unsafe conversion from 'FARPROC' to 'void (__cdecl *)()'
  74. #else
  75. #define Z7_CAST_FUNC_C
  76. #endif
  77. /*
  78. #if (defined(__GNUC__) && (__GNUC__ >= 8)) || defined(__clang__)
  79. // #pragma GCC diagnostic ignored "-Wcast-function-type"
  80. #endif
  81. */
  82. #ifdef __GNUC__
  83. #if defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40000) && (Z7_GCC_VERSION < 70000)
  84. #pragma GCC diagnostic ignored "-Wstrict-aliasing"
  85. #endif
  86. #endif
  87. #ifdef _MSC_VER
  88. #ifdef UNDER_CE
  89. #define RPC_NO_WINDOWS_H
  90. /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */
  91. #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
  92. #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int
  93. #endif
  94. #if defined(_MSC_VER) && _MSC_VER >= 1800
  95. #pragma warning(disable : 4464) // relative include path contains '..'
  96. #endif
  97. // == 1200 : -O1 : for __forceinline
  98. // >= 1900 : -O1 : for printf
  99. #pragma warning(disable : 4710) // function not inlined
  100. #if _MSC_VER < 1900
  101. // winnt.h: 'Int64ShllMod32'
  102. #pragma warning(disable : 4514) // unreferenced inline function has been removed
  103. #endif
  104. #if _MSC_VER < 1300
  105. // #pragma warning(disable : 4702) // unreachable code
  106. // Bra.c : -O1:
  107. #pragma warning(disable : 4714) // function marked as __forceinline not inlined
  108. #endif
  109. /*
  110. #if _MSC_VER > 1400 && _MSC_VER <= 1900
  111. // strcat: This function or variable may be unsafe
  112. // sysinfoapi.h: kit10: GetVersion was declared deprecated
  113. #pragma warning(disable : 4996)
  114. #endif
  115. */
  116. #if _MSC_VER > 1200
  117. // -Wall warnings
  118. #pragma warning(disable : 4711) // function selected for automatic inline expansion
  119. #pragma warning(disable : 4820) // '2' bytes padding added after data member
  120. #if _MSC_VER >= 1400 && _MSC_VER < 1920
  121. // 1400: string.h: _DBG_MEMCPY_INLINE_
  122. // 1600 - 191x : smmintrin.h __cplusplus'
  123. // is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
  124. #pragma warning(disable : 4668)
  125. // 1400 - 1600 : WinDef.h : 'FARPROC' :
  126. // 1900 - 191x : immintrin.h: _readfsbase_u32
  127. // no function prototype given : converting '()' to '(void)'
  128. #pragma warning(disable : 4255)
  129. #endif
  130. #if _MSC_VER >= 1914
  131. // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
  132. #pragma warning(disable : 5045)
  133. #endif
  134. #endif // _MSC_VER > 1200
  135. #endif // _MSC_VER
  136. #if defined(__clang__) && (__clang_major__ >= 4)
  137. #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \
  138. _Pragma("clang loop unroll(disable)") \
  139. _Pragma("clang loop vectorize(disable)")
  140. #define Z7_ATTRIB_NO_VECTORIZE
  141. #elif defined(__GNUC__) && (__GNUC__ >= 5) \
  142. && (!defined(Z7_MCST_LCC_VERSION) || (Z7_MCST_LCC_VERSION >= 12610))
  143. #define Z7_ATTRIB_NO_VECTORIZE __attribute__((optimize("no-tree-vectorize")))
  144. // __attribute__((optimize("no-unroll-loops")));
  145. #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE
  146. #elif defined(_MSC_VER) && (_MSC_VER >= 1920)
  147. #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \
  148. _Pragma("loop( no_vector )")
  149. #define Z7_ATTRIB_NO_VECTORIZE
  150. #else
  151. #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE
  152. #define Z7_ATTRIB_NO_VECTORIZE
  153. #endif
  154. #if defined(Z7_MSC_VER_ORIGINAL) && (Z7_MSC_VER_ORIGINAL >= 1920)
  155. #define Z7_PRAGMA_OPTIMIZE_FOR_CODE_SIZE _Pragma("optimize ( \"s\", on )")
  156. #define Z7_PRAGMA_OPTIMIZE_DEFAULT _Pragma("optimize ( \"\", on )")
  157. #else
  158. #define Z7_PRAGMA_OPTIMIZE_FOR_CODE_SIZE
  159. #define Z7_PRAGMA_OPTIMIZE_DEFAULT
  160. #endif
  161. #if defined(MY_CPU_X86_OR_AMD64) && ( \
  162. defined(__clang__) && (__clang_major__ >= 4) \
  163. || defined(__GNUC__) && (__GNUC__ >= 5))
  164. #define Z7_ATTRIB_NO_SSE __attribute__((__target__("no-sse")))
  165. #else
  166. #define Z7_ATTRIB_NO_SSE
  167. #endif
  168. #define Z7_ATTRIB_NO_VECTOR \
  169. Z7_ATTRIB_NO_VECTORIZE \
  170. Z7_ATTRIB_NO_SSE
  171. #if defined(__clang__) && (__clang_major__ >= 8) \
  172. || defined(__GNUC__) && (__GNUC__ >= 1000) \
  173. /* || defined(_MSC_VER) && (_MSC_VER >= 1920) */
  174. // GCC is not good for __builtin_expect()
  175. #define Z7_LIKELY(x) (__builtin_expect((x), 1))
  176. #define Z7_UNLIKELY(x) (__builtin_expect((x), 0))
  177. // #define Z7_unlikely [[unlikely]]
  178. // #define Z7_likely [[likely]]
  179. #else
  180. #define Z7_LIKELY(x) (x)
  181. #define Z7_UNLIKELY(x) (x)
  182. // #define Z7_likely
  183. #endif
  184. #if (defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30600))
  185. #if (Z7_CLANG_VERSION < 130000)
  186. #define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \
  187. _Pragma("GCC diagnostic push") \
  188. _Pragma("GCC diagnostic ignored \"-Wreserved-id-macro\"")
  189. #else
  190. #define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \
  191. _Pragma("GCC diagnostic push") \
  192. _Pragma("GCC diagnostic ignored \"-Wreserved-macro-identifier\"")
  193. #endif
  194. #define Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER \
  195. _Pragma("GCC diagnostic pop")
  196. #else
  197. #define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER
  198. #define Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER
  199. #endif
  200. #define UNUSED_VAR(x) (void)x;
  201. /* #define UNUSED_VAR(x) x=x; */
  202. #endif