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) || defined(__clang__) 70 # define av_pure __attribute__((pure)) 71 #else 72 # define av_pure 73 #endif 74 75 #if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__) 76 # define av_const __attribute__((const)) 77 #else 78 # define av_const 79 #endif 80 81 #if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__) 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) || defined(__clang__) 142 # define av_alias __attribute__((may_alias)) 143 #else 144 # define av_alias 145 #endif 146 147 #if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) 148 # define av_uninit(x) x=x 149 #else 150 # define av_uninit(x) x 151 #endif 152 153 #if defined(__GNUC__) || defined(__clang__) 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) || defined(__clang__) 162 # define av_noreturn __attribute__((noreturn)) 163 #else 164 # define av_noreturn 165 #endif 166 167 #endif /* AVUTIL_ATTRIBUTES_H */ 168