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