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, see <http://www.gnu.org/licenses/>. |
21 | ***/ |
22 | |
23 | /** \file |
24 | * GCC attribute macros */ |
25 | |
26 | #if defined(__GNUC__) |
27 | #ifdef __MINGW32__ |
28 | #include <stdio.h> |
29 | #define PA_GCC_PRINTF_ATTR(a,b) __attribute__ ((format (__MINGW_PRINTF_FORMAT, a, b))) |
30 | #else |
31 | #define PA_GCC_PRINTF_ATTR(a,b) __attribute__ ((format (printf, a, b))) |
32 | #endif |
33 | #else |
34 | /** If we're in GNU C, use some magic for detecting invalid format strings */ |
35 | #define PA_GCC_PRINTF_ATTR(a,b) |
36 | #endif |
37 | |
38 | #if defined(__GNUC__) && (__GNUC__ >= 4) |
39 | #define PA_GCC_SENTINEL __attribute__ ((sentinel)) |
40 | #else |
41 | /** Macro for usage of GCC's sentinel compilation warnings */ |
42 | #define PA_GCC_SENTINEL |
43 | #endif |
44 | |
45 | #ifdef __GNUC__ |
46 | #define PA_GCC_NORETURN __attribute__((noreturn)) |
47 | #else |
48 | /** Macro for no-return functions */ |
49 | #define PA_GCC_NORETURN |
50 | #endif |
51 | |
52 | #ifdef __GNUC__ |
53 | #define PA_GCC_UNUSED __attribute__ ((unused)) |
54 | #else |
55 | /** Macro for not used function, variable or parameter */ |
56 | #define PA_GCC_UNUSED |
57 | #endif |
58 | |
59 | #ifdef __GNUC__ |
60 | #define PA_GCC_DESTRUCTOR __attribute__ ((destructor)) |
61 | #else |
62 | /** Call this function when process terminates */ |
63 | #define PA_GCC_DESTRUCTOR |
64 | #endif |
65 | |
66 | #ifndef PA_GCC_PURE |
67 | #ifdef __GNUC__ |
68 | #define PA_GCC_PURE __attribute__ ((pure)) |
69 | #else |
70 | /** This function's return value depends only the arguments list and global state **/ |
71 | #define PA_GCC_PURE |
72 | #endif |
73 | #endif |
74 | |
75 | #ifndef PA_GCC_CONST |
76 | #ifdef __GNUC__ |
77 | #define PA_GCC_CONST __attribute__ ((const)) |
78 | #else |
79 | /** This function's return value depends only the arguments list (stricter version of PA_GCC_PURE) **/ |
80 | #define PA_GCC_CONST |
81 | #endif |
82 | #endif |
83 | |
84 | #ifndef PA_GCC_DEPRECATED |
85 | #ifdef __GNUC__ |
86 | #define PA_GCC_DEPRECATED __attribute__ ((deprecated)) |
87 | #else |
88 | /** This function is deprecated **/ |
89 | #define PA_GCC_DEPRECATED |
90 | #endif |
91 | #endif |
92 | |
93 | #ifndef PA_GCC_PACKED |
94 | #ifdef __GNUC__ |
95 | #define PA_GCC_PACKED __attribute__ ((packed)) |
96 | #else |
97 | /** Structure shall be packed in memory **/ |
98 | #define PA_GCC_PACKED |
99 | #endif |
100 | #endif |
101 | |
102 | #ifndef PA_GCC_ALLOC_SIZE |
103 | #if defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3) |
104 | #define PA_GCC_ALLOC_SIZE(x) __attribute__ ((__alloc_size__(x))) |
105 | #define PA_GCC_ALLOC_SIZE2(x,y) __attribute__ ((__alloc_size__(x,y))) |
106 | #else |
107 | /** Macro for usage of GCC's alloc_size attribute */ |
108 | #define PA_GCC_ALLOC_SIZE(x) |
109 | /** Macro for usage of GCC's alloc_size attribute */ |
110 | #define PA_GCC_ALLOC_SIZE2(x,y) |
111 | #endif |
112 | #endif |
113 | |
114 | #ifndef PA_GCC_MALLOC |
115 | #ifdef __GNUC__ |
116 | #define PA_GCC_MALLOC __attribute__ ((malloc)) |
117 | #else |
118 | /** Macro for usage of GCC's malloc attribute */ |
119 | #define PA_GCC_MALLOC |
120 | #endif |
121 | #endif |
122 | |
123 | #ifndef PA_GCC_WEAKREF |
124 | #if defined(__GNUC__) && defined(__ELF__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ > 1)) || (__GNUC__ > 4)) |
125 | /** Macro for usage of GCC's weakref attribute */ |
126 | #define PA_GCC_WEAKREF(x) __attribute__((weakref(#x))) |
127 | #endif |
128 | #endif |
129 | |
130 | #ifndef PA_LIKELY |
131 | #ifdef __GNUC__ |
132 | #define PA_LIKELY(x) (__builtin_expect(!!(x),1)) |
133 | #define PA_UNLIKELY(x) (__builtin_expect(!!(x),0)) |
134 | #else |
135 | #define PA_LIKELY(x) (x) |
136 | #define PA_UNLIKELY(x) (x) |
137 | #endif |
138 | #endif |
139 | |
140 | #ifdef __GNUC__ |
141 | #define PA_CLAMP(x, low, high) \ |
142 | __extension__ ({ \ |
143 | typeof(x) _x = (x); \ |
144 | typeof(low) _low = (low); \ |
145 | typeof(high) _high = (high); \ |
146 | ((_x > _high) ? _high : ((_x < _low) ? _low : _x)); \ |
147 | }) |
148 | #else |
149 | #define PA_CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) |
150 | #endif |
151 | |
152 | #ifdef __GNUC__ |
153 | #define PA_CLAMP_UNLIKELY(x, low, high) \ |
154 | __extension__ ({ \ |
155 | typeof(x) _x = (x); \ |
156 | typeof(low) _low = (low); \ |
157 | typeof(high) _high = (high); \ |
158 | (PA_UNLIKELY(_x > _high) ? _high : (PA_UNLIKELY(_x < _low) ? _low : _x)); \ |
159 | }) |
160 | #else |
161 | #define PA_CLAMP_UNLIKELY(x, low, high) (PA_UNLIKELY((x) > (high)) ? (high) : (PA_UNLIKELY((x) < (low)) ? (low) : (x))) |
162 | #endif |
163 | |
164 | /* We don't define a PA_CLAMP_LIKELY here, because it doesn't really |
165 | * make sense: we cannot know if it is more likely that the value is |
166 | * lower or greater than the boundaries. */ |
167 | |
168 | #endif |
169 | |