1/* Copyright 2016 Google Inc. All Rights Reserved.
2
3 Distributed under MIT license.
4 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5*/
6
7/* Macros for compiler / platform specific features and build options. */
8
9#ifndef BROTLI_COMMON_PORT_H_
10#define BROTLI_COMMON_PORT_H_
11
12/* Compatibility with non-clang compilers. */
13#ifndef __has_builtin
14#define __has_builtin(x) 0
15#endif
16
17#ifndef __has_attribute
18#define __has_attribute(x) 0
19#endif
20
21#ifndef __has_feature
22#define __has_feature(x) 0
23#endif
24
25#if defined(__GNUC__) && defined(__GNUC_MINOR__)
26#define BROTLI_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
27#else
28#define BROTLI_GCC_VERSION 0
29#endif
30
31#if defined(__ICC)
32#define BROTLI_ICC_VERSION __ICC
33#else
34#define BROTLI_ICC_VERSION 0
35#endif
36
37#if defined(BROTLI_BUILD_MODERN_COMPILER)
38#define BROTLI_MODERN_COMPILER 1
39#elif BROTLI_GCC_VERSION >= 304 || BROTLI_ICC_VERSION >= 1600
40#define BROTLI_MODERN_COMPILER 1
41#else
42#define BROTLI_MODERN_COMPILER 0
43#endif
44
45/* Define "BROTLI_PREDICT_TRUE" and "BROTLI_PREDICT_FALSE" macros for capable
46 compilers.
47
48To apply compiler hint, enclose the branching condition into macros, like this:
49
50 if (BROTLI_PREDICT_TRUE(zero == 0)) {
51 // main execution path
52 } else {
53 // compiler should place this code outside of main execution path
54 }
55
56OR:
57
58 if (BROTLI_PREDICT_FALSE(something_rare_or_unexpected_happens)) {
59 // compiler should place this code outside of main execution path
60 }
61
62*/
63#if BROTLI_MODERN_COMPILER || __has_builtin(__builtin_expect)
64#define BROTLI_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
65#define BROTLI_PREDICT_FALSE(x) (__builtin_expect(x, 0))
66#else
67#define BROTLI_PREDICT_FALSE(x) (x)
68#define BROTLI_PREDICT_TRUE(x) (x)
69#endif
70
71#if BROTLI_MODERN_COMPILER || __has_attribute(always_inline)
72#define BROTLI_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline))
73#else
74#define BROTLI_ATTRIBUTE_ALWAYS_INLINE
75#endif
76
77#if defined(_WIN32) || defined(__CYGWIN__)
78#define BROTLI_ATTRIBUTE_VISIBILITY_HIDDEN
79#elif BROTLI_MODERN_COMPILER || __has_attribute(visibility)
80#define BROTLI_ATTRIBUTE_VISIBILITY_HIDDEN \
81 __attribute__ ((visibility ("hidden")))
82#else
83#define BROTLI_ATTRIBUTE_VISIBILITY_HIDDEN
84#endif
85
86#ifndef BROTLI_INTERNAL
87#define BROTLI_INTERNAL BROTLI_ATTRIBUTE_VISIBILITY_HIDDEN
88#endif
89
90#if defined(BROTLI_SHARED_COMPILATION) && defined(_WIN32)
91#if defined(BROTLICOMMON_SHARED_COMPILATION)
92#define BROTLI_COMMON_API __declspec(dllexport)
93#else
94#define BROTLI_COMMON_API __declspec(dllimport)
95#endif /* BROTLICOMMON_SHARED_COMPILATION */
96#if defined(BROTLIDEC_SHARED_COMPILATION)
97#define BROTLI_DEC_API __declspec(dllexport)
98#else
99#define BROTLI_DEC_API __declspec(dllimport)
100#endif /* BROTLIDEC_SHARED_COMPILATION */
101#if defined(BROTLIENC_SHARED_COMPILATION)
102#define BROTLI_ENC_API __declspec(dllexport)
103#else
104#define BROTLI_ENC_API __declspec(dllimport)
105#endif /* BROTLIENC_SHARED_COMPILATION */
106#else /* BROTLI_SHARED_COMPILATION && _WIN32 */
107#define BROTLI_COMMON_API
108#define BROTLI_DEC_API
109#define BROTLI_ENC_API
110#endif
111
112#ifndef _MSC_VER
113#if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \
114 (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
115#define BROTLI_INLINE inline BROTLI_ATTRIBUTE_ALWAYS_INLINE
116#else
117#define BROTLI_INLINE
118#endif
119#else /* _MSC_VER */
120#define BROTLI_INLINE __forceinline
121#endif /* _MSC_VER */
122
123#if !defined(__cplusplus) && !defined(c_plusplus) && \
124 (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
125#define BROTLI_RESTRICT restrict
126#elif BROTLI_GCC_VERSION > 295 || defined(__llvm__)
127#define BROTLI_RESTRICT __restrict
128#else
129#define BROTLI_RESTRICT
130#endif
131
132#if BROTLI_MODERN_COMPILER || __has_attribute(noinline)
133#define BROTLI_NOINLINE __attribute__((noinline))
134#else
135#define BROTLI_NOINLINE
136#endif
137
138#if BROTLI_MODERN_COMPILER || __has_attribute(deprecated)
139#define BROTLI_DEPRECATED __attribute__((deprecated))
140#else
141#define BROTLI_DEPRECATED
142#endif
143
144#define BROTLI_UNUSED(X) (void)(X)
145
146#endif /* BROTLI_COMMON_PORT_H_ */
147