OpenWrt – Blame information for rev 4
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
4 | office | 1 | /* Copyright (C) 1992-2002, 2004, 2005, 2006, 2007, 2009, 2011, 2012 |
2 | Free Software Foundation, Inc. |
||
3 | This file is part of the GNU C Library. |
||
4 | |||
5 | The GNU C Library is free software; you can redistribute it and/or |
||
6 | modify it under the terms of the GNU Lesser General Public |
||
7 | License as published by the Free Software Foundation; either |
||
8 | version 2.1 of the License, or (at your option) any later version. |
||
9 | |||
10 | The GNU C Library is distributed in the hope that it will be useful, |
||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||
13 | Lesser General Public License for more details. |
||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public |
||
16 | License along with the GNU C Library; if not, see |
||
17 | <http://www.gnu.org/licenses/>. */ |
||
18 | |||
19 | #ifndef _SYS_CDEFS_H |
||
20 | #define _SYS_CDEFS_H 1 |
||
21 | |||
22 | /* We are almost always included from features.h. */ |
||
23 | #ifndef _FEATURES_H |
||
24 | # include <features.h> |
||
25 | #endif |
||
26 | |||
27 | /* The GNU libc does not support any K&R compilers or the traditional mode |
||
28 | of ISO C compilers anymore. Check for some of the combinations not |
||
29 | anymore supported. */ |
||
30 | #if defined __GNUC__ && !defined __STDC__ |
||
31 | # error "You need a ISO C conforming compiler to use the glibc headers" |
||
32 | #endif |
||
33 | |||
34 | /* Some user header file might have defined this before. */ |
||
35 | #undef __P |
||
36 | #undef __PMT |
||
37 | |||
38 | #ifdef __GNUC__ |
||
39 | |||
40 | /* All functions, except those with callbacks or those that |
||
41 | synchronize memory, are leaf functions. */ |
||
42 | # if __GNUC_PREREQ (4, 6) && !defined _LIBC |
||
43 | # define __LEAF , __leaf__ |
||
44 | # define __LEAF_ATTR __attribute__ ((__leaf__)) |
||
45 | # else |
||
46 | # define __LEAF |
||
47 | # define __LEAF_ATTR |
||
48 | # endif |
||
49 | |||
50 | /* GCC can always grok prototypes. For C++ programs we add throw() |
||
51 | to help it optimize the function calls. But this works only with |
||
52 | gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions |
||
53 | as non-throwing using a function attribute since programs can use |
||
54 | the -fexceptions options for C code as well. */ |
||
55 | # if !defined __cplusplus && __GNUC_PREREQ (3, 3) |
||
56 | # define __THROW __attribute__ ((__nothrow__ __LEAF)) |
||
57 | # define __THROWNL __attribute__ ((__nothrow__)) |
||
58 | # define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct |
||
59 | # else |
||
60 | # if defined __cplusplus && __GNUC_PREREQ (2,8) |
||
61 | # define __THROW throw () |
||
62 | # define __THROWNL throw () |
||
63 | # define __NTH(fct) __LEAF_ATTR fct throw () |
||
64 | # else |
||
65 | # define __THROW |
||
66 | # define __THROWNL |
||
67 | # define __NTH(fct) fct |
||
68 | # endif |
||
69 | # endif |
||
70 | |||
71 | #else /* Not GCC. */ |
||
72 | |||
73 | # define __inline /* No inline functions. */ |
||
74 | |||
75 | # define __THROW |
||
76 | # define __THROWNL |
||
77 | # define __NTH(fct) fct |
||
78 | |||
79 | #endif /* GCC. */ |
||
80 | |||
81 | /* These two macros are not used in glibc anymore. They are kept here |
||
82 | only because some other projects expect the macros to be defined. */ |
||
83 | #define __P(args) args |
||
84 | #define __PMT(args) args |
||
85 | |||
86 | /* For these things, GCC behaves the ANSI way normally, |
||
87 | and the non-ANSI way under -traditional. */ |
||
88 | |||
89 | #define __CONCAT(x,y) x ## y |
||
90 | #define __STRING(x) #x |
||
91 | |||
92 | /* This is not a typedef so `const __ptr_t' does the right thing. */ |
||
93 | #define __ptr_t void * |
||
94 | #define __long_double_t long double |
||
95 | |||
96 | |||
97 | /* C++ needs to know that types and declarations are C, not C++. */ |
||
98 | #ifdef __cplusplus |
||
99 | # define __BEGIN_DECLS extern "C" { |
||
100 | # define __END_DECLS } |
||
101 | #else |
||
102 | # define __BEGIN_DECLS |
||
103 | # define __END_DECLS |
||
104 | #endif |
||
105 | |||
106 | |||
107 | /* The standard library needs the functions from the ISO C90 standard |
||
108 | in the std namespace. At the same time we want to be safe for |
||
109 | future changes and we include the ISO C99 code in the non-standard |
||
110 | namespace __c99. The C++ wrapper header take case of adding the |
||
111 | definitions to the global namespace. */ |
||
112 | #if defined __cplusplus && defined _GLIBCPP_USE_NAMESPACES |
||
113 | # define __BEGIN_NAMESPACE_STD namespace std { |
||
114 | # define __END_NAMESPACE_STD } |
||
115 | # define __USING_NAMESPACE_STD(name) using std::name; |
||
116 | # define __BEGIN_NAMESPACE_C99 namespace __c99 { |
||
117 | # define __END_NAMESPACE_C99 } |
||
118 | # define __USING_NAMESPACE_C99(name) using __c99::name; |
||
119 | #else |
||
120 | /* For compatibility we do not add the declarations into any |
||
121 | namespace. They will end up in the global namespace which is what |
||
122 | old code expects. */ |
||
123 | # define __BEGIN_NAMESPACE_STD |
||
124 | # define __END_NAMESPACE_STD |
||
125 | # define __USING_NAMESPACE_STD(name) |
||
126 | # define __BEGIN_NAMESPACE_C99 |
||
127 | # define __END_NAMESPACE_C99 |
||
128 | # define __USING_NAMESPACE_C99(name) |
||
129 | #endif |
||
130 | |||
131 | |||
132 | /* Support for bounded pointers. */ |
||
133 | #ifndef __BOUNDED_POINTERS__ |
||
134 | # define __bounded /* nothing */ |
||
135 | # define __unbounded /* nothing */ |
||
136 | # define __ptrvalue /* nothing */ |
||
137 | #endif |
||
138 | |||
139 | |||
140 | /* Fortify support. */ |
||
141 | #define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1) |
||
142 | #define __bos0(ptr) __builtin_object_size (ptr, 0) |
||
143 | #define __fortify_function __extern_always_inline __attribute_artificial__ |
||
144 | |||
145 | #if __GNUC_PREREQ (4,3) |
||
146 | # define __warndecl(name, msg) \ |
||
147 | extern void name (void) __attribute__((__warning__ (msg))) |
||
148 | # define __warnattr(msg) __attribute__((__warning__ (msg))) |
||
149 | # define __errordecl(name, msg) \ |
||
150 | extern void name (void) __attribute__((__error__ (msg))) |
||
151 | #else |
||
152 | # define __warndecl(name, msg) extern void name (void) |
||
153 | # define __warnattr(msg) |
||
154 | # define __errordecl(name, msg) extern void name (void) |
||
155 | #endif |
||
156 | |||
157 | /* Support for flexible arrays. */ |
||
158 | #if __GNUC_PREREQ (2,97) |
||
159 | /* GCC 2.97 supports C99 flexible array members. */ |
||
160 | # define __flexarr [] |
||
161 | #else |
||
162 | # ifdef __GNUC__ |
||
163 | # define __flexarr [0] |
||
164 | # else |
||
165 | # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L |
||
166 | # define __flexarr [] |
||
167 | # else |
||
168 | /* Some other non-C99 compiler. Approximate with [1]. */ |
||
169 | # define __flexarr [1] |
||
170 | # endif |
||
171 | # endif |
||
172 | #endif |
||
173 | |||
174 | |||
175 | /* __asm__ ("xyz") is used throughout the headers to rename functions |
||
176 | at the assembly language level. This is wrapped by the __REDIRECT |
||
177 | macro, in order to support compilers that can do this some other |
||
178 | way. When compilers don't support asm-names at all, we have to do |
||
179 | preprocessor tricks instead (which don't have exactly the right |
||
180 | semantics, but it's the best we can do). |
||
181 | |||
182 | Example: |
||
183 | int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */ |
||
184 | |||
185 | #if defined __GNUC__ && __GNUC__ >= 2 |
||
186 | |||
187 | # define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias)) |
||
188 | # ifdef __cplusplus |
||
189 | # define __REDIRECT_NTH(name, proto, alias) \ |
||
190 | name proto __THROW __asm__ (__ASMNAME (#alias)) |
||
191 | # define __REDIRECT_NTHNL(name, proto, alias) \ |
||
192 | name proto __THROWNL __asm__ (__ASMNAME (#alias)) |
||
193 | # else |
||
194 | # define __REDIRECT_NTH(name, proto, alias) \ |
||
195 | name proto __asm__ (__ASMNAME (#alias)) __THROW |
||
196 | # define __REDIRECT_NTHNL(name, proto, alias) \ |
||
197 | name proto __asm__ (__ASMNAME (#alias)) __THROWNL |
||
198 | # endif |
||
199 | # define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname) |
||
200 | # define __ASMNAME2(prefix, cname) __STRING (prefix) cname |
||
201 | |||
202 | /* |
||
203 | #elif __SOME_OTHER_COMPILER__ |
||
204 | |||
205 | # define __REDIRECT(name, proto, alias) name proto; \ |
||
206 | _Pragma("let " #name " = " #alias) |
||
207 | */ |
||
208 | #endif |
||
209 | |||
210 | /* GCC has various useful declarations that can be made with the |
||
211 | `__attribute__' syntax. All of the ways we use this do fine if |
||
212 | they are omitted for compilers that don't understand it. */ |
||
213 | #if !defined __GNUC__ || __GNUC__ < 2 |
||
214 | # define __attribute__(xyz) /* Ignore */ |
||
215 | #endif |
||
216 | |||
217 | /* At some point during the gcc 2.96 development the `malloc' attribute |
||
218 | for functions was introduced. We don't want to use it unconditionally |
||
219 | (although this would be possible) since it generates warnings. */ |
||
220 | #if __GNUC_PREREQ (2,96) |
||
221 | # define __attribute_malloc__ __attribute__ ((__malloc__)) |
||
222 | #else |
||
223 | # define __attribute_malloc__ /* Ignore */ |
||
224 | #endif |
||
225 | |||
226 | /* At some point during the gcc 2.96 development the `pure' attribute |
||
227 | for functions was introduced. We don't want to use it unconditionally |
||
228 | (although this would be possible) since it generates warnings. */ |
||
229 | #if __GNUC_PREREQ (2,96) |
||
230 | # define __attribute_pure__ __attribute__ ((__pure__)) |
||
231 | #else |
||
232 | # define __attribute_pure__ /* Ignore */ |
||
233 | #endif |
||
234 | |||
235 | /* This declaration tells the compiler that the value is constant. */ |
||
236 | #if __GNUC_PREREQ (2,5) |
||
237 | # define __attribute_const__ __attribute__ ((__const__)) |
||
238 | #else |
||
239 | # define __attribute_const__ /* Ignore */ |
||
240 | #endif |
||
241 | |||
242 | /* At some point during the gcc 3.1 development the `used' attribute |
||
243 | for functions was introduced. We don't want to use it unconditionally |
||
244 | (although this would be possible) since it generates warnings. */ |
||
245 | #if __GNUC_PREREQ (3,1) |
||
246 | # define __attribute_used__ __attribute__ ((__used__)) |
||
247 | # define __attribute_noinline__ __attribute__ ((__noinline__)) |
||
248 | #else |
||
249 | # define __attribute_used__ __attribute__ ((__unused__)) |
||
250 | # define __attribute_noinline__ /* Ignore */ |
||
251 | #endif |
||
252 | |||
253 | /* gcc allows marking deprecated functions. */ |
||
254 | #if __GNUC_PREREQ (3,2) |
||
255 | # define __attribute_deprecated__ __attribute__ ((__deprecated__)) |
||
256 | #else |
||
257 | # define __attribute_deprecated__ /* Ignore */ |
||
258 | #endif |
||
259 | |||
260 | /* At some point during the gcc 2.8 development the `format_arg' attribute |
||
261 | for functions was introduced. We don't want to use it unconditionally |
||
262 | (although this would be possible) since it generates warnings. |
||
263 | If several `format_arg' attributes are given for the same function, in |
||
264 | gcc-3.0 and older, all but the last one are ignored. In newer gccs, |
||
265 | all designated arguments are considered. */ |
||
266 | #if __GNUC_PREREQ (2,8) |
||
267 | # define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x))) |
||
268 | #else |
||
269 | # define __attribute_format_arg__(x) /* Ignore */ |
||
270 | #endif |
||
271 | |||
272 | /* At some point during the gcc 2.97 development the `strfmon' format |
||
273 | attribute for functions was introduced. We don't want to use it |
||
274 | unconditionally (although this would be possible) since it |
||
275 | generates warnings. */ |
||
276 | #if __GNUC_PREREQ (2,97) |
||
277 | # define __attribute_format_strfmon__(a,b) \ |
||
278 | __attribute__ ((__format__ (__strfmon__, a, b))) |
||
279 | #else |
||
280 | # define __attribute_format_strfmon__(a,b) /* Ignore */ |
||
281 | #endif |
||
282 | |||
283 | /* The nonull function attribute allows to mark pointer parameters which |
||
284 | must not be NULL. */ |
||
285 | #if __GNUC_PREREQ (3,3) |
||
286 | # define __nonnull(params) __attribute__ ((__nonnull__ params)) |
||
287 | #else |
||
288 | # define __nonnull(params) |
||
289 | #endif |
||
290 | |||
291 | /* If fortification mode, we warn about unused results of certain |
||
292 | function calls which can lead to problems. */ |
||
293 | #if __GNUC_PREREQ (3,4) |
||
294 | # define __attribute_warn_unused_result__ \ |
||
295 | __attribute__ ((__warn_unused_result__)) |
||
296 | # if __USE_FORTIFY_LEVEL > 0 |
||
297 | # define __wur __attribute_warn_unused_result__ |
||
298 | # endif |
||
299 | #else |
||
300 | # define __attribute_warn_unused_result__ /* empty */ |
||
301 | #endif |
||
302 | #ifndef __wur |
||
303 | # define __wur /* Ignore */ |
||
304 | #endif |
||
305 | |||
306 | /* Forces a function to be always inlined. */ |
||
307 | #if __GNUC_PREREQ (3,2) |
||
308 | # define __always_inline __inline __attribute__ ((__always_inline__)) |
||
309 | #else |
||
310 | # define __always_inline __inline |
||
311 | #endif |
||
312 | |||
313 | /* Associate error messages with the source location of the call site rather |
||
314 | than with the source location inside the function. */ |
||
315 | #if __GNUC_PREREQ (4,3) |
||
316 | # define __attribute_artificial__ __attribute__ ((__artificial__)) |
||
317 | #else |
||
318 | # define __attribute_artificial__ /* Ignore */ |
||
319 | #endif |
||
320 | |||
321 | /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 |
||
322 | inline semantics, unless -fgnu89-inline is used. */ |
||
323 | #if !defined __cplusplus || __GNUC_PREREQ (4,3) |
||
324 | # if defined __GNUC_STDC_INLINE__ || defined __cplusplus |
||
325 | # define __extern_inline extern __inline __attribute__ ((__gnu_inline__)) |
||
326 | # define __extern_always_inline \ |
||
327 | extern __always_inline __attribute__ ((__gnu_inline__)) |
||
328 | # else |
||
329 | # define __extern_inline extern __inline |
||
330 | # define __extern_always_inline extern __always_inline |
||
331 | # endif |
||
332 | #endif |
||
333 | |||
334 | /* GCC 4.3 and above allow passing all anonymous arguments of an |
||
335 | __extern_always_inline function to some other vararg function. */ |
||
336 | #if __GNUC_PREREQ (4,3) |
||
337 | # define __va_arg_pack() __builtin_va_arg_pack () |
||
338 | # define __va_arg_pack_len() __builtin_va_arg_pack_len () |
||
339 | #endif |
||
340 | |||
341 | /* It is possible to compile containing GCC extensions even if GCC is |
||
342 | run in pedantic mode if the uses are carefully marked using the |
||
343 | `__extension__' keyword. But this is not generally available before |
||
344 | version 2.8. */ |
||
345 | #if !__GNUC_PREREQ (2,8) |
||
346 | # define __extension__ /* Ignore */ |
||
347 | #endif |
||
348 | |||
349 | /* __restrict is known in EGCS 1.2 and above. */ |
||
350 | #if !__GNUC_PREREQ (2,92) |
||
351 | # define __restrict /* Ignore */ |
||
352 | #endif |
||
353 | |||
354 | /* ISO C99 also allows to declare arrays as non-overlapping. The syntax is |
||
355 | array_name[restrict] |
||
356 | GCC 3.1 supports this. */ |
||
357 | #if __GNUC_PREREQ (3,1) && !defined __GNUG__ |
||
358 | # define __restrict_arr __restrict |
||
359 | #else |
||
360 | # ifdef __GNUC__ |
||
361 | # define __restrict_arr /* Not supported in old GCC. */ |
||
362 | # else |
||
363 | # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L |
||
364 | # define __restrict_arr restrict |
||
365 | # else |
||
366 | /* Some other non-C99 compiler. */ |
||
367 | # define __restrict_arr /* Not supported. */ |
||
368 | # endif |
||
369 | # endif |
||
370 | #endif |
||
371 | |||
372 | #if __GNUC__ >= 3 |
||
373 | # define __glibc_unlikely(cond) __builtin_expect((cond), 0) |
||
374 | #else |
||
375 | # define __glibc_unlikely(cond) (cond) |
||
376 | #endif |
||
377 | |||
378 | #endif /* sys/cdefs.h */ |