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) 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