| /* SPDX-License-Identifier: LZMA-SDK-9.22 */ |
| /* Compiler.h : Compiler specific defines and pragmas |
| : Igor Pavlov : Public domain */ |
| |
| #ifndef ZIP7_INC_COMPILER_H |
| #define ZIP7_INC_COMPILER_H |
| |
| #if defined(__clang__) |
| # define Z7_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) |
| #endif |
| #if defined(__clang__) && defined(__apple_build_version__) |
| # define Z7_APPLE_CLANG_VERSION Z7_CLANG_VERSION |
| #elif defined(__clang__) |
| # define Z7_LLVM_CLANG_VERSION Z7_CLANG_VERSION |
| #elif defined(__GNUC__) |
| # define Z7_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) |
| #endif |
| |
| #ifdef _MSC_VER |
| #if !defined(__clang__) && !defined(__GNUC__) |
| #define Z7_MSC_VER_ORIGINAL _MSC_VER |
| #endif |
| #endif |
| |
| #if defined(__MINGW32__) || defined(__MINGW64__) |
| #define Z7_MINGW |
| #endif |
| |
| #if defined(__LCC__) && (defined(__MCST__) || defined(__e2k__)) |
| #define Z7_MCST_LCC |
| #define Z7_MCST_LCC_VERSION (__LCC__ * 100 + __LCC_MINOR__) |
| #endif |
| |
| /* |
| #if defined(__AVX2__) \ |
| || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40900) \ |
| || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 40600) \ |
| || defined(Z7_LLVM_CLANG_VERSION) && (Z7_LLVM_CLANG_VERSION >= 30100) \ |
| || defined(Z7_MSC_VER_ORIGINAL) && (Z7_MSC_VER_ORIGINAL >= 1800) \ |
| || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1400) |
| #define Z7_COMPILER_AVX2_SUPPORTED |
| #endif |
| #endif |
| */ |
| |
| // #pragma GCC diagnostic ignored "-Wunknown-pragmas" |
| |
| #ifdef __clang__ |
| // padding size of '' with 4 bytes to alignment boundary |
| #pragma GCC diagnostic ignored "-Wpadded" |
| |
| #if defined(Z7_LLVM_CLANG_VERSION) && (__clang_major__ == 13) \ |
| && defined(__FreeBSD__) |
| // freebsd: |
| #pragma GCC diagnostic ignored "-Wexcess-padding" |
| #endif |
| |
| #if __clang_major__ >= 16 |
| #pragma GCC diagnostic ignored "-Wunsafe-buffer-usage" |
| #endif |
| |
| #if __clang_major__ == 13 |
| #if defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 16) |
| // cheri |
| #pragma GCC diagnostic ignored "-Wcapability-to-integer-cast" |
| #endif |
| #endif |
| |
| #if __clang_major__ == 13 |
| // for <arm_neon.h> |
| #pragma GCC diagnostic ignored "-Wreserved-identifier" |
| #endif |
| |
| #endif // __clang__ |
| |
| #if defined(_WIN32) && defined(__clang__) && __clang_major__ >= 16 |
| // #pragma GCC diagnostic ignored "-Wcast-function-type-strict" |
| #define Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION \ |
| _Pragma("GCC diagnostic ignored \"-Wcast-function-type-strict\"") |
| #else |
| #define Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION |
| #endif |
| |
| typedef void (*Z7_void_Function)(void); |
| #if defined(__clang__) || defined(__GNUC__) |
| #define Z7_CAST_FUNC_C (Z7_void_Function) |
| #elif defined(_MSC_VER) && _MSC_VER > 1920 |
| #define Z7_CAST_FUNC_C (void *) |
| // #pragma warning(disable : 4191) // 'type cast': unsafe conversion from 'FARPROC' to 'void (__cdecl *)()' |
| #else |
| #define Z7_CAST_FUNC_C |
| #endif |
| /* |
| #if (defined(__GNUC__) && (__GNUC__ >= 8)) || defined(__clang__) |
| // #pragma GCC diagnostic ignored "-Wcast-function-type" |
| #endif |
| */ |
| #ifdef __GNUC__ |
| #if defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40000) && (Z7_GCC_VERSION < 70000) |
| #pragma GCC diagnostic ignored "-Wstrict-aliasing" |
| #endif |
| #endif |
| |
| #ifdef _MSC_VER |
| |
| #ifdef UNDER_CE |
| #define RPC_NO_WINDOWS_H |
| /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */ |
| #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union |
| #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int |
| #endif |
| |
| #if defined(_MSC_VER) && _MSC_VER >= 1800 |
| #pragma warning(disable : 4464) // relative include path contains '..' |
| #endif |
| |
| // == 1200 : -O1 : for __forceinline |
| // >= 1900 : -O1 : for printf |
| #pragma warning(disable : 4710) // function not inlined |
| |
| #if _MSC_VER < 1900 |
| // winnt.h: 'Int64ShllMod32' |
| #pragma warning(disable : 4514) // unreferenced inline function has been removed |
| #endif |
| |
| #if _MSC_VER < 1300 |
| // #pragma warning(disable : 4702) // unreachable code |
| // Bra.c : -O1: |
| #pragma warning(disable : 4714) // function marked as __forceinline not inlined |
| #endif |
| |
| /* |
| #if _MSC_VER > 1400 && _MSC_VER <= 1900 |
| // strcat: This function or variable may be unsafe |
| // sysinfoapi.h: kit10: GetVersion was declared deprecated |
| #pragma warning(disable : 4996) |
| #endif |
| */ |
| |
| #if _MSC_VER > 1200 |
| // -Wall warnings |
| |
| #pragma warning(disable : 4711) // function selected for automatic inline expansion |
| #pragma warning(disable : 4820) // '2' bytes padding added after data member |
| |
| #if _MSC_VER >= 1400 && _MSC_VER < 1920 |
| // 1400: string.h: _DBG_MEMCPY_INLINE_ |
| // 1600 - 191x : smmintrin.h __cplusplus' |
| // is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' |
| #pragma warning(disable : 4668) |
| |
| // 1400 - 1600 : WinDef.h : 'FARPROC' : |
| // 1900 - 191x : immintrin.h: _readfsbase_u32 |
| // no function prototype given : converting '()' to '(void)' |
| #pragma warning(disable : 4255) |
| #endif |
| |
| #if _MSC_VER >= 1914 |
| // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified |
| #pragma warning(disable : 5045) |
| #endif |
| |
| #endif // _MSC_VER > 1200 |
| #endif // _MSC_VER |
| |
| #if defined(__clang__) && (__clang_major__ >= 4) |
| #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \ |
| _Pragma("clang loop unroll(disable)") \ |
| _Pragma("clang loop vectorize(disable)") |
| #define Z7_ATTRIB_NO_VECTORIZE |
| #elif defined(__GNUC__) && (__GNUC__ >= 5) \ |
| && (!defined(Z7_MCST_LCC_VERSION) || (Z7_MCST_LCC_VERSION >= 12610)) |
| #define Z7_ATTRIB_NO_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) |
| // __attribute__((optimize("no-unroll-loops"))); |
| #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE |
| #elif defined(_MSC_VER) && (_MSC_VER >= 1920) |
| #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \ |
| _Pragma("loop( no_vector )") |
| #define Z7_ATTRIB_NO_VECTORIZE |
| #else |
| #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE |
| #define Z7_ATTRIB_NO_VECTORIZE |
| #endif |
| |
| #if defined(Z7_MSC_VER_ORIGINAL) && (Z7_MSC_VER_ORIGINAL >= 1920) |
| #define Z7_PRAGMA_OPTIMIZE_FOR_CODE_SIZE _Pragma("optimize ( \"s\", on )") |
| #define Z7_PRAGMA_OPTIMIZE_DEFAULT _Pragma("optimize ( \"\", on )") |
| #else |
| #define Z7_PRAGMA_OPTIMIZE_FOR_CODE_SIZE |
| #define Z7_PRAGMA_OPTIMIZE_DEFAULT |
| #endif |
| |
| #if defined(MY_CPU_X86_OR_AMD64) && ( \ |
| defined(__clang__) && (__clang_major__ >= 4) \ |
| || defined(__GNUC__) && (__GNUC__ >= 5)) |
| #define Z7_ATTRIB_NO_SSE __attribute__((__target__("no-sse"))) |
| #else |
| #define Z7_ATTRIB_NO_SSE |
| #endif |
| |
| #define Z7_ATTRIB_NO_VECTOR \ |
| Z7_ATTRIB_NO_VECTORIZE \ |
| Z7_ATTRIB_NO_SSE |
| |
| #if defined(__clang__) && (__clang_major__ >= 8) \ |
| || defined(__GNUC__) && (__GNUC__ >= 1000) \ |
| /* || defined(_MSC_VER) && (_MSC_VER >= 1920) */ |
| // GCC is not good for __builtin_expect() |
| #define Z7_LIKELY(x) (__builtin_expect((x), 1)) |
| #define Z7_UNLIKELY(x) (__builtin_expect((x), 0)) |
| // #define Z7_unlikely [[unlikely]] |
| // #define Z7_likely [[likely]] |
| #else |
| #define Z7_LIKELY(x) (x) |
| #define Z7_UNLIKELY(x) (x) |
| // #define Z7_likely |
| #endif |
| |
| #if (defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30600)) |
| |
| #if (Z7_CLANG_VERSION < 130000) |
| #define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \ |
| _Pragma("GCC diagnostic push") \ |
| _Pragma("GCC diagnostic ignored \"-Wreserved-id-macro\"") |
| #else |
| #define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \ |
| _Pragma("GCC diagnostic push") \ |
| _Pragma("GCC diagnostic ignored \"-Wreserved-macro-identifier\"") |
| #endif |
| |
| #define Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER \ |
| _Pragma("GCC diagnostic pop") |
| #else |
| #define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER |
| #define Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER |
| #endif |
| |
| #define UNUSED_VAR(x) (void)x; |
| /* #define UNUSED_VAR(x) x=x; */ |
| |
| #endif |