1 #ifndef foopulsegccmacrohfoo 2 #define foopulsegccmacrohfoo 3 4 /*** 5 This file is part of PulseAudio. 6 7 Copyright 2004-2006 Lennart Poettering 8 9 PulseAudio is free software; you can redistribute it and/or modify 10 it under the terms of the GNU Lesser General Public License as published 11 by the Free Software Foundation; either version 2.1 of the License, 12 or (at your option) any later version. 13 14 PulseAudio is distributed in the hope that it will be useful, but 15 WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 General Public License for more details. 18 19 You should have received a copy of the GNU Lesser General Public License 20 along with PulseAudio; if not, write to the Free Software 21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 22 USA. 23 ***/ 24 25 /** \file 26 * GCC attribute macros */ 27 28 #if defined(__GNUC__) 29 #ifdef __MINGW32__ 30 /* libintl overrides printf with a #define. As this breaks this attribute, 31 * it has a workaround. However the workaround isn't enabled for MINGW 32 * builds (only cygwin) */ 33 #define PA_GCC_PRINTF_ATTR(a,b) __attribute__ ((format (__printf__, a, b))) 34 #else 35 #define PA_GCC_PRINTF_ATTR(a,b) __attribute__ ((format (printf, a, b))) 36 #endif 37 #else 38 /** If we're in GNU C, use some magic for detecting invalid format strings */ 39 #define PA_GCC_PRINTF_ATTR(a,b) 40 #endif 41 42 #if defined(__GNUC__) && (__GNUC__ >= 4) 43 #define PA_GCC_SENTINEL __attribute__ ((sentinel)) 44 #else 45 /** Macro for usage of GCC's sentinel compilation warnings */ 46 #define PA_GCC_SENTINEL 47 #endif 48 49 #ifdef __GNUC__ 50 #define PA_GCC_NORETURN __attribute__((noreturn)) 51 #else 52 /** Macro for no-return functions */ 53 #define PA_GCC_NORETURN 54 #endif 55 56 #ifdef __GNUC__ 57 #define PA_GCC_UNUSED __attribute__ ((unused)) 58 #else 59 /** Macro for not used function, variable or parameter */ 60 #define PA_GCC_UNUSED 61 #endif 62 63 #ifdef __GNUC__ 64 #define PA_GCC_DESTRUCTOR __attribute__ ((destructor)) 65 #else 66 /** Call this function when process terminates */ 67 #define PA_GCC_DESTRUCTOR 68 #endif 69 70 #ifndef PA_GCC_PURE 71 #ifdef __GNUC__ 72 #define PA_GCC_PURE __attribute__ ((pure)) 73 #else 74 /** This function's return value depends only the arguments list and global state **/ 75 #define PA_GCC_PURE 76 #endif 77 #endif 78 79 #ifndef PA_GCC_CONST 80 #ifdef __GNUC__ 81 #define PA_GCC_CONST __attribute__ ((const)) 82 #else 83 /** This function's return value depends only the arguments list (stricter version of PA_GCC_PURE) **/ 84 #define PA_GCC_CONST 85 #endif 86 #endif 87 88 #ifndef PA_GCC_DEPRECATED 89 #ifdef __GNUC__ 90 #define PA_GCC_DEPRECATED __attribute__ ((deprecated)) 91 #else 92 /** This function is deprecated **/ 93 #define PA_GCC_DEPRECATED 94 #endif 95 #endif 96 97 #ifndef PA_GCC_PACKED 98 #ifdef __GNUC__ 99 #define PA_GCC_PACKED __attribute__ ((packed)) 100 #else 101 /** Structure shall be packed in memory **/ 102 #define PA_GCC_PACKED 103 #endif 104 #endif 105 106 #ifndef PA_GCC_ALLOC_SIZE 107 #if defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3) 108 #define PA_GCC_ALLOC_SIZE(x) __attribute__ ((__alloc_size__(x))) 109 #define PA_GCC_ALLOC_SIZE2(x,y) __attribute__ ((__alloc_size__(x,y))) 110 #else 111 /** Macro for usage of GCC's alloc_size attribute */ 112 #define PA_GCC_ALLOC_SIZE(x) 113 /** Macro for usage of GCC's alloc_size attribute */ 114 #define PA_GCC_ALLOC_SIZE2(x,y) 115 #endif 116 #endif 117 118 #ifndef PA_GCC_MALLOC 119 #ifdef __GNUC__ 120 #define PA_GCC_MALLOC __attribute__ ((malloc)) 121 #else 122 /** Macro for usage of GCC's malloc attribute */ 123 #define PA_GCC_MALLOC 124 #endif 125 #endif 126 127 #ifndef PA_GCC_WEAKREF 128 #if defined(__GNUC__) && defined(__ELF__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ > 1)) || (__GNUC__ > 4)) 129 /** Macro for usage of GCC's weakref attribute */ 130 #define PA_GCC_WEAKREF(x) __attribute__((weakref(#x))) 131 #endif 132 #endif 133 134 #endif 135