blob: 54d1901116912bd95de74918e1cfe47b9bd47610
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 | #ifndef av_always_inline |
38 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
39 | # define av_always_inline __attribute__((always_inline)) inline |
40 | #elif defined(_MSC_VER) |
41 | # define av_always_inline __forceinline |
42 | #else |
43 | # define av_always_inline inline |
44 | #endif |
45 | #endif |
46 | |
47 | #ifndef av_extern_inline |
48 | #if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) |
49 | # define av_extern_inline extern inline |
50 | #else |
51 | # define av_extern_inline inline |
52 | #endif |
53 | #endif |
54 | |
55 | #if AV_GCC_VERSION_AT_LEAST(3,4) |
56 | # define av_warn_unused_result __attribute__((warn_unused_result)) |
57 | #else |
58 | # define av_warn_unused_result |
59 | #endif |
60 | |
61 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
62 | # define av_noinline __attribute__((noinline)) |
63 | #elif defined(_MSC_VER) |
64 | # define av_noinline __declspec(noinline) |
65 | #else |
66 | # define av_noinline |
67 | #endif |
68 | |
69 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
70 | # define av_pure __attribute__((pure)) |
71 | #else |
72 | # define av_pure |
73 | #endif |
74 | |
75 | #if AV_GCC_VERSION_AT_LEAST(2,6) |
76 | # define av_const __attribute__((const)) |
77 | #else |
78 | # define av_const |
79 | #endif |
80 | |
81 | #if AV_GCC_VERSION_AT_LEAST(4,3) |
82 | # define av_cold __attribute__((cold)) |
83 | #else |
84 | # define av_cold |
85 | #endif |
86 | |
87 | #if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) |
88 | # define av_flatten __attribute__((flatten)) |
89 | #else |
90 | # define av_flatten |
91 | #endif |
92 | |
93 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
94 | # define attribute_deprecated __attribute__((deprecated)) |
95 | #elif defined(_MSC_VER) |
96 | # define attribute_deprecated __declspec(deprecated) |
97 | #else |
98 | # define attribute_deprecated |
99 | #endif |
100 | |
101 | /** |
102 | * Disable warnings about deprecated features |
103 | * This is useful for sections of code kept for backward compatibility and |
104 | * scheduled for removal. |
105 | */ |
106 | #ifndef AV_NOWARN_DEPRECATED |
107 | #if AV_GCC_VERSION_AT_LEAST(4,6) |
108 | # define AV_NOWARN_DEPRECATED(code) \ |
109 | _Pragma("GCC diagnostic push") \ |
110 | _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ |
111 | code \ |
112 | _Pragma("GCC diagnostic pop") |
113 | #elif defined(_MSC_VER) |
114 | # define AV_NOWARN_DEPRECATED(code) \ |
115 | __pragma(warning(push)) \ |
116 | __pragma(warning(disable : 4996)) \ |
117 | code; \ |
118 | __pragma(warning(pop)) |
119 | #else |
120 | # define AV_NOWARN_DEPRECATED(code) code |
121 | #endif |
122 | #endif |
123 | |
124 | #if defined(__GNUC__) || defined(__clang__) |
125 | # define av_unused __attribute__((unused)) |
126 | #else |
127 | # define av_unused |
128 | #endif |
129 | |
130 | /** |
131 | * Mark a variable as used and prevent the compiler from optimizing it |
132 | * away. This is useful for variables accessed only from inline |
133 | * assembler without the compiler being aware. |
134 | */ |
135 | #if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) |
136 | # define av_used __attribute__((used)) |
137 | #else |
138 | # define av_used |
139 | #endif |
140 | |
141 | #if AV_GCC_VERSION_AT_LEAST(3,3) |
142 | # define av_alias __attribute__((may_alias)) |
143 | #else |
144 | # define av_alias |
145 | #endif |
146 | |
147 | #if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) |
148 | # define av_uninit(x) x=x |
149 | #else |
150 | # define av_uninit(x) x |
151 | #endif |
152 | |
153 | #ifdef __GNUC__ |
154 | # define av_builtin_constant_p __builtin_constant_p |
155 | # define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) |
156 | #else |
157 | # define av_builtin_constant_p(x) 0 |
158 | # define av_printf_format(fmtpos, attrpos) |
159 | #endif |
160 | |
161 | #if AV_GCC_VERSION_AT_LEAST(2,5) |
162 | # define av_noreturn __attribute__((noreturn)) |
163 | #else |
164 | # define av_noreturn |
165 | #endif |
166 | |
167 | #endif /* AVUTIL_ATTRIBUTES_H */ |
168 |