1 | /* |
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> |
3 | * |
4 | * This file is part of FFmpeg. |
5 | * |
6 | * FFmpeg is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with FFmpeg; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | /** |
22 | * @file |
23 | * Macro definitions for various function/variable attributes |
24 | */ |
25 | |
26 | #ifndef AVUTIL_ATTRIBUTES_H |
27 | #define AVUTIL_ATTRIBUTES_H |
28 | |
29 | #ifdef __GNUC__ |
30 | # define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) |
31 | # define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) |
32 | #else |
33 | # define AV_GCC_VERSION_AT_LEAST(x,y) 0 |
34 | # define AV_GCC_VERSION_AT_MOST(x,y) 0 |
35 | #endif |
36 | |
37 | #ifdef __has_builtin |
38 | # define AV_HAS_BUILTIN(x) __has_builtin(x) |
39 | #else |
40 | # define AV_HAS_BUILTIN(x) 0 |
41 | #endif |
42 | |
43 | #ifndef av_always_inline |
44 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
45 | # define av_always_inline __attribute__((always_inline)) inline |
46 | #elif defined(_MSC_VER) |
47 | # define av_always_inline __forceinline |
48 | #else |
49 | # define av_always_inline inline |
50 | #endif |
51 | #endif |
52 | |
53 | #ifndef av_extern_inline |
54 | #if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) |
55 | # define av_extern_inline extern inline |
56 | #else |
57 | # define av_extern_inline inline |
58 | #endif |
59 | #endif |
60 | |
61 | #if AV_GCC_VERSION_AT_LEAST(3,4) |
62 | # define av_warn_unused_result __attribute__((warn_unused_result)) |
63 | #else |
64 | # define av_warn_unused_result |
65 | #endif |
66 | |
67 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
68 | # define av_noinline __attribute__((noinline)) |
69 | #elif defined(_MSC_VER) |
70 | # define av_noinline __declspec(noinline) |
71 | #else |
72 | # define av_noinline |
73 | #endif |
74 | |
75 | #if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) |
76 | # define av_pure __attribute__((pure)) |
77 | #else |
78 | # define av_pure |
79 | #endif |
80 | |
81 | #if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__) |
82 | # define av_const __attribute__((const)) |
83 | #else |
84 | # define av_const |
85 | #endif |
86 | |
87 | #if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__) |
88 | # define av_cold __attribute__((cold)) |
89 | #else |
90 | # define av_cold |
91 | #endif |
92 | |
93 | #if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) |
94 | # define av_flatten __attribute__((flatten)) |
95 | #else |
96 | # define av_flatten |
97 | #endif |
98 | |
99 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
100 | # define attribute_deprecated __attribute__((deprecated)) |
101 | #elif defined(_MSC_VER) |
102 | # define attribute_deprecated __declspec(deprecated) |
103 | #else |
104 | # define attribute_deprecated |
105 | #endif |
106 | |
107 | /** |
108 | * Disable warnings about deprecated features |
109 | * This is useful for sections of code kept for backward compatibility and |
110 | * scheduled for removal. |
111 | */ |
112 | #ifndef AV_NOWARN_DEPRECATED |
113 | #if AV_GCC_VERSION_AT_LEAST(4,6) || defined(__clang__) |
114 | # define AV_NOWARN_DEPRECATED(code) \ |
115 | _Pragma("GCC diagnostic push") \ |
116 | _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ |
117 | code \ |
118 | _Pragma("GCC diagnostic pop") |
119 | #elif defined(_MSC_VER) |
120 | # define AV_NOWARN_DEPRECATED(code) \ |
121 | __pragma(warning(push)) \ |
122 | __pragma(warning(disable : 4996)) \ |
123 | code; \ |
124 | __pragma(warning(pop)) |
125 | #else |
126 | # define AV_NOWARN_DEPRECATED(code) code |
127 | #endif |
128 | #endif |
129 | |
130 | #if defined(__GNUC__) || defined(__clang__) |
131 | # define av_unused __attribute__((unused)) |
132 | #else |
133 | # define av_unused |
134 | #endif |
135 | |
136 | /** |
137 | * Mark a variable as used and prevent the compiler from optimizing it |
138 | * away. This is useful for variables accessed only from inline |
139 | * assembler without the compiler being aware. |
140 | */ |
141 | #if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) |
142 | # define av_used __attribute__((used)) |
143 | #else |
144 | # define av_used |
145 | #endif |
146 | |
147 | #if AV_GCC_VERSION_AT_LEAST(3,3) || defined(__clang__) |
148 | # define av_alias __attribute__((may_alias)) |
149 | #else |
150 | # define av_alias |
151 | #endif |
152 | |
153 | #if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) |
154 | # define av_uninit(x) x=x |
155 | #else |
156 | # define av_uninit(x) x |
157 | #endif |
158 | |
159 | #if defined(__GNUC__) || defined(__clang__) |
160 | # define av_builtin_constant_p __builtin_constant_p |
161 | # define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) |
162 | #else |
163 | # define av_builtin_constant_p(x) 0 |
164 | # define av_printf_format(fmtpos, attrpos) |
165 | #endif |
166 | |
167 | #if AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__) |
168 | # define av_noreturn __attribute__((noreturn)) |
169 | #else |
170 | # define av_noreturn |
171 | #endif |
172 | |
173 | #endif /* AVUTIL_ATTRIBUTES_H */ |
174 | |