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