]> git.ipfire.org Git - thirdparty/glibc.git/blame - misc/sys/cdefs.h
Move string/testcopy.c to test-driver.c and xmalloc (bug 19667).
[thirdparty/glibc.git] / misc / sys / cdefs.h
CommitLineData
688903eb 1/* Copyright (C) 1992-2018 Free Software Foundation, Inc.
54d79e99 2 This file is part of the GNU C Library.
28f540f4 3
54d79e99 4 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
28f540f4 8
54d79e99
UD
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
28f540f4 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>. */
28f540f4
RM
17
18#ifndef _SYS_CDEFS_H
28f540f4 19#define _SYS_CDEFS_H 1
5107cf1d 20
a6ff34d7
UD
21/* We are almost always included from features.h. */
22#ifndef _FEATURES_H
7688db91
UD
23# include <features.h>
24#endif
25
26/* The GNU libc does not support any K&R compilers or the traditional mode
27 of ISO C compilers anymore. Check for some of the combinations not
28 anymore supported. */
29#if defined __GNUC__ && !defined __STDC__
30# error "You need a ISO C conforming compiler to use the glibc headers"
a6ff34d7 31#endif
28f540f4
RM
32
33/* Some user header file might have defined this before. */
34#undef __P
d112ae30 35#undef __PMT
28f540f4
RM
36
37#ifdef __GNUC__
38
3871f58f
AS
39/* All functions, except those with callbacks or those that
40 synchronize memory, are leaf functions. */
aa78043a
UD
41# if __GNUC_PREREQ (4, 6) && !defined _LIBC
42# define __LEAF , __leaf__
43# define __LEAF_ATTR __attribute__ ((__leaf__))
44# else
45# define __LEAF
46# define __LEAF_ATTR
47# endif
48
dff14448
UD
49/* GCC can always grok prototypes. For C++ programs we add throw()
50 to help it optimize the function calls. But this works only with
f377d022
UD
51 gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions
52 as non-throwing using a function attribute since programs can use
53 the -fexceptions options for C code as well. */
e071493f 54# if !defined __cplusplus && __GNUC_PREREQ (3, 3)
49a43d80 55# define __THROW __attribute__ ((__nothrow__ __LEAF))
3871f58f 56# define __THROWNL __attribute__ ((__nothrow__))
49a43d80 57# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct
7c3018f9 58# define __NTHNL(fct) __attribute__ ((__nothrow__)) fct
dff14448 59# else
f377d022
UD
60# if defined __cplusplus && __GNUC_PREREQ (2,8)
61# define __THROW throw ()
3871f58f 62# define __THROWNL throw ()
aa78043a 63# define __NTH(fct) __LEAF_ATTR fct throw ()
7c3018f9 64# define __NTHNL(fct) fct throw ()
f377d022
UD
65# else
66# define __THROW
3871f58f 67# define __THROWNL
f377d022 68# define __NTH(fct) fct
7c3018f9 69# define __NTHNL(fct) fct
f377d022 70# endif
dff14448 71# endif
4360eafd 72
28f540f4
RM
73#else /* Not GCC. */
74
dfd2257a 75# define __inline /* No inline functions. */
28f540f4 76
9b767d19 77# define __THROW
3871f58f 78# define __THROWNL
f377d022 79# define __NTH(fct) fct
28f540f4
RM
80
81#endif /* GCC. */
82
cab4d74b
ZW
83/* Compilers that are not clang may object to
84 #if defined __clang__ && __has_extension(...)
85 even though they do not need to evaluate the right-hand side of the &&. */
86#if defined __clang__ && defined __has_extension
87# define __glibc_clang_has_extension(ext) __has_extension (ext)
88#else
89# define __glibc_clang_has_extension(ext) 0
90#endif
91
d19687d6
UD
92/* These two macros are not used in glibc anymore. They are kept here
93 only because some other projects expect the macros to be defined. */
94#define __P(args) args
95#define __PMT(args) args
96
28f540f4
RM
97/* For these things, GCC behaves the ANSI way normally,
98 and the non-ANSI way under -traditional. */
99
7f4e0e58
UD
100#define __CONCAT(x,y) x ## y
101#define __STRING(x) #x
28f540f4
RM
102
103/* This is not a typedef so `const __ptr_t' does the right thing. */
7f4e0e58 104#define __ptr_t void *
857fa1b8
RM
105
106
28f540f4
RM
107/* C++ needs to know that types and declarations are C, not C++. */
108#ifdef __cplusplus
dfd2257a
UD
109# define __BEGIN_DECLS extern "C" {
110# define __END_DECLS }
28f540f4 111#else
dfd2257a
UD
112# define __BEGIN_DECLS
113# define __END_DECLS
28f540f4
RM
114#endif
115
ab95290c 116
b5cc329c
UD
117/* Fortify support. */
118#define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
119#define __bos0(ptr) __builtin_object_size (ptr, 0)
120
d6cd6bf4
UD
121#if __GNUC_PREREQ (4,3)
122# define __warndecl(name, msg) \
123 extern void name (void) __attribute__((__warning__ (msg)))
124# define __warnattr(msg) __attribute__((__warning__ (msg)))
125# define __errordecl(name, msg) \
126 extern void name (void) __attribute__((__error__ (msg)))
127#else
128# define __warndecl(name, msg) extern void name (void)
129# define __warnattr(msg)
130# define __errordecl(name, msg) extern void name (void)
131#endif
b5cc329c 132
cb765808
ZW
133/* Support for flexible arrays.
134 Headers that should use flexible arrays only if they're "real"
135 (e.g. only if they won't affect sizeof()) should test
136 #if __glibc_c99_flexarr_available. */
137#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
a1620a4c 138# define __flexarr []
cb765808
ZW
139# define __glibc_c99_flexarr_available 1
140#elif __GNUC_PREREQ (2,97)
141/* GCC 2.97 supports C99 flexible array members as an extension,
142 even when in C89 mode or compiling C++ (any version). */
143# define __flexarr []
144# define __glibc_c99_flexarr_available 1
145#elif defined __GNUC__
146/* Pre-2.97 GCC did not support C99 flexible arrays but did have
147 an equivalent extension with slightly different notation. */
148# define __flexarr [0]
149# define __glibc_c99_flexarr_available 1
a1620a4c 150#else
a1620a4c 151/* Some other non-C99 compiler. Approximate with [1]. */
cb765808
ZW
152# define __flexarr [1]
153# define __glibc_c99_flexarr_available 0
a1620a4c
UD
154#endif
155
156
01cad722
UD
157/* __asm__ ("xyz") is used throughout the headers to rename functions
158 at the assembly language level. This is wrapped by the __REDIRECT
159 macro, in order to support compilers that can do this some other
160 way. When compilers don't support asm-names at all, we have to do
161 preprocessor tricks instead (which don't have exactly the right
162 semantics, but it's the best we can do).
163
164 Example:
fbedbe9d 165 int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
01cad722
UD
166
167#if defined __GNUC__ && __GNUC__ >= 2
168
5408c757 169# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
05f4d5cd
UD
170# ifdef __cplusplus
171# define __REDIRECT_NTH(name, proto, alias) \
172 name proto __THROW __asm__ (__ASMNAME (#alias))
edc5984d
AS
173# define __REDIRECT_NTHNL(name, proto, alias) \
174 name proto __THROWNL __asm__ (__ASMNAME (#alias))
05f4d5cd
UD
175# else
176# define __REDIRECT_NTH(name, proto, alias) \
f377d022 177 name proto __asm__ (__ASMNAME (#alias)) __THROW
edc5984d
AS
178# define __REDIRECT_NTHNL(name, proto, alias) \
179 name proto __asm__ (__ASMNAME (#alias)) __THROWNL
05f4d5cd 180# endif
5408c757
UD
181# define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
182# define __ASMNAME2(prefix, cname) __STRING (prefix) cname
01cad722
UD
183
184/*
185#elif __SOME_OTHER_COMPILER__
186
5408c757
UD
187# define __REDIRECT(name, proto, alias) name proto; \
188 _Pragma("let " #name " = " #alias)
01cad722
UD
189*/
190#endif
191
192/* GCC has various useful declarations that can be made with the
28f540f4 193 `__attribute__' syntax. All of the ways we use this do fine if
01cad722 194 they are omitted for compilers that don't understand it. */
dfd2257a 195#if !defined __GNUC__ || __GNUC__ < 2
e9e9b245 196# define __attribute__(xyz) /* Ignore */
ae177b9c
UD
197#endif
198
e9e9b245
UD
199/* At some point during the gcc 2.96 development the `malloc' attribute
200 for functions was introduced. We don't want to use it unconditionally
201 (although this would be possible) since it generates warnings. */
ae177b9c
UD
202#if __GNUC_PREREQ (2,96)
203# define __attribute_malloc__ __attribute__ ((__malloc__))
204#else
205# define __attribute_malloc__ /* Ignore */
01cad722 206#endif
2f6d1f1b 207
2f62b9ee
MF
208/* Tell the compiler which arguments to an allocation function
209 indicate the size of the allocation. */
210#if __GNUC_PREREQ (4, 3)
211# define __attribute_alloc_size__(params) \
212 __attribute__ ((__alloc_size__ params))
213#else
214# define __attribute_alloc_size__(params) /* Ignore. */
215#endif
216
ca5a4c3c
AJ
217/* At some point during the gcc 2.96 development the `pure' 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_pure__ __attribute__ ((__pure__))
222#else
223# define __attribute_pure__ /* Ignore */
224#endif
225
295e904f
MP
226/* This declaration tells the compiler that the value is constant. */
227#if __GNUC_PREREQ (2,5)
228# define __attribute_const__ __attribute__ ((__const__))
229#else
230# define __attribute_const__ /* Ignore */
231#endif
232
d3640b91
UD
233/* At some point during the gcc 3.1 development the `used' attribute
234 for functions was introduced. We don't want to use it unconditionally
235 (although this would be possible) since it generates warnings. */
236#if __GNUC_PREREQ (3,1)
237# define __attribute_used__ __attribute__ ((__used__))
fb23eb25 238# define __attribute_noinline__ __attribute__ ((__noinline__))
d3640b91
UD
239#else
240# define __attribute_used__ __attribute__ ((__unused__))
fb23eb25 241# define __attribute_noinline__ /* Ignore */
d3640b91
UD
242#endif
243
cab4d74b 244/* Since version 3.2, gcc allows marking deprecated functions. */
3b7ed871
UD
245#if __GNUC_PREREQ (3,2)
246# define __attribute_deprecated__ __attribute__ ((__deprecated__))
247#else
248# define __attribute_deprecated__ /* Ignore */
249#endif
250
cab4d74b
ZW
251/* Since version 4.5, gcc also allows one to specify the message printed
252 when a deprecated function is used. clang claims to be gcc 4.2, but
253 may also support this feature. */
254#if __GNUC_PREREQ (4,5) || \
255 __glibc_clang_has_extension (__attribute_deprecated_with_message__)
256# define __attribute_deprecated_msg__(msg) \
257 __attribute__ ((__deprecated__ (msg)))
258#else
259# define __attribute_deprecated_msg__(msg) __attribute_deprecated__
260#endif
261
ca8d5a5f
UD
262/* At some point during the gcc 2.8 development the `format_arg' attribute
263 for functions was introduced. We don't want to use it unconditionally
f369623d
UD
264 (although this would be possible) since it generates warnings.
265 If several `format_arg' attributes are given for the same function, in
266 gcc-3.0 and older, all but the last one are ignored. In newer gccs,
267 all designated arguments are considered. */
ca8d5a5f
UD
268#if __GNUC_PREREQ (2,8)
269# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
270#else
271# define __attribute_format_arg__(x) /* Ignore */
272#endif
273
66e23ba1
UD
274/* At some point during the gcc 2.97 development the `strfmon' format
275 attribute for functions was introduced. We don't want to use it
276 unconditionally (although this would be possible) since it
277 generates warnings. */
278#if __GNUC_PREREQ (2,97)
279# define __attribute_format_strfmon__(a,b) \
280 __attribute__ ((__format__ (__strfmon__, a, b)))
281#else
282# define __attribute_format_strfmon__(a,b) /* Ignore */
283#endif
284
8a1f658b
UD
285/* The nonull function attribute allows to mark pointer parameters which
286 must not be NULL. */
287#if __GNUC_PREREQ (3,3)
288# define __nonnull(params) __attribute__ ((__nonnull__ params))
289#else
290# define __nonnull(params)
291#endif
292
5cf53cc2
UD
293/* If fortification mode, we warn about unused results of certain
294 function calls which can lead to problems. */
9ee4c017
UD
295#if __GNUC_PREREQ (3,4)
296# define __attribute_warn_unused_result__ \
297 __attribute__ ((__warn_unused_result__))
298# if __USE_FORTIFY_LEVEL > 0
299# define __wur __attribute_warn_unused_result__
300# endif
5cf53cc2 301#else
9ee4c017
UD
302# define __attribute_warn_unused_result__ /* empty */
303#endif
304#ifndef __wur
5cf53cc2
UD
305# define __wur /* Ignore */
306#endif
307
88764ae2
UD
308/* Forces a function to be always inlined. */
309#if __GNUC_PREREQ (3,2)
e0835a53
CD
310/* The Linux kernel defines __always_inline in stddef.h (283d7573), and
311 it conflicts with this definition. Therefore undefine it first to
312 allow either header to be included first. */
313# undef __always_inline
88764ae2
UD
314# define __always_inline __inline __attribute__ ((__always_inline__))
315#else
e0835a53 316# undef __always_inline
88764ae2
UD
317# define __always_inline __inline
318#endif
319
5ac3ea17
MP
320/* Associate error messages with the source location of the call site rather
321 than with the source location inside the function. */
322#if __GNUC_PREREQ (4,3)
323# define __attribute_artificial__ __attribute__ ((__artificial__))
324#else
325# define __attribute_artificial__ /* Ignore */
326#endif
327
884ddc50
SP
328/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
329 inline semantics, unless -fgnu89-inline is used. Using __GNUC_STDC_INLINE__
330 or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions
331 older than 4.3 may define these macros and still not guarantee GNU inlining
602f80ec
SP
332 semantics.
333
334 clang++ identifies itself as gcc-4.2, but has support for GNU inlining
335 semantics, that can be checked fot by using the __GNUC_STDC_INLINE_ and
336 __GNUC_GNU_INLINE__ macro definitions. */
337#if (!defined __cplusplus || __GNUC_PREREQ (4,3) \
338 || (defined __clang__ && (defined __GNUC_STDC_INLINE__ \
339 || defined __GNUC_GNU_INLINE__)))
884ddc50 340# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
de1c3ebb 341# define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
5ac3ea17 342# define __extern_always_inline \
b037a293 343 extern __always_inline __attribute__ ((__gnu_inline__))
de1c3ebb
UD
344# else
345# define __extern_inline extern __inline
5ac3ea17 346# define __extern_always_inline extern __always_inline
de1c3ebb 347# endif
884ddc50
SP
348#endif
349
350#ifdef __extern_always_inline
351# define __fortify_function __extern_always_inline __attribute_artificial__
de1c3ebb
UD
352#endif
353
354/* GCC 4.3 and above allow passing all anonymous arguments of an
355 __extern_always_inline function to some other vararg function. */
3dd79d63 356#if __GNUC_PREREQ (4,3)
de1c3ebb 357# define __va_arg_pack() __builtin_va_arg_pack ()
3a50811c 358# define __va_arg_pack_len() __builtin_va_arg_pack_len ()
b037a293
UD
359#endif
360
8325d82c
UD
361/* It is possible to compile containing GCC extensions even if GCC is
362 run in pedantic mode if the uses are carefully marked using the
363 `__extension__' keyword. But this is not generally available before
364 version 2.8. */
4360eafd 365#if !__GNUC_PREREQ (2,8)
8325d82c 366# define __extension__ /* Ignore */
8325d82c
UD
367#endif
368
a6ff34d7 369/* __restrict is known in EGCS 1.2 and above. */
4360eafd 370#if !__GNUC_PREREQ (2,92)
a6ff34d7 371# define __restrict /* Ignore */
a6ff34d7 372#endif
2f6d1f1b 373
98cbe360
UD
374/* ISO C99 also allows to declare arrays as non-overlapping. The syntax is
375 array_name[restrict]
b912ca11 376 GCC 3.1 supports this. */
852d75f9 377#if __GNUC_PREREQ (3,1) && !defined __GNUG__
b912ca11
UD
378# define __restrict_arr __restrict
379#else
380# ifdef __GNUC__
381# define __restrict_arr /* Not supported in old GCC. */
382# else
383# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
384# define __restrict_arr restrict
385# else
386/* Some other non-C99 compiler. */
387# define __restrict_arr /* Not supported. */
388# endif
389# endif
390#endif
98cbe360 391
4af3879c 392#if __GNUC__ >= 3
4858fa2a
RM
393# define __glibc_unlikely(cond) __builtin_expect ((cond), 0)
394# define __glibc_likely(cond) __builtin_expect ((cond), 1)
4af3879c 395#else
4858fa2a
RM
396# define __glibc_unlikely(cond) (cond)
397# define __glibc_likely(cond) (cond)
4af3879c
SP
398#endif
399
d12704c7
SP
400#if (!defined _Noreturn \
401 && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
402 && !__GNUC_PREREQ (4,7))
c4c41244
PE
403# if __GNUC_PREREQ (2,8)
404# define _Noreturn __attribute__ ((__noreturn__))
405# else
406# define _Noreturn
407# endif
408#endif
409
7532837d
MS
410#if __GNUC_PREREQ (8, 0)
411/* Describes a char array whose address can safely be passed as the first
412 argument to strncpy and strncat, as the char array is not necessarily
413 a NUL-terminated string. */
414# define __attribute_nonstring__ __attribute__ ((__nonstring__))
415#else
416# define __attribute_nonstring__
417#endif
418
3999d26e
PE
419#if (!defined _Static_assert && !defined __cplusplus \
420 && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
421 && (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__))
422# define _Static_assert(expr, diagnostic) \
423 extern int (*__Static_assert_function (void)) \
424 [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
425#endif
426
c6251f03 427#include <bits/wordsize.h>
0acb8a2a 428#include <bits/long-double.h>
c6251f03
RM
429
430#if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
431# define __LDBL_COMPAT 1
432# ifdef __REDIRECT
433# define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
434# define __LDBL_REDIR(name, proto) \
435 __LDBL_REDIR1 (name, proto, __nldbl_##name)
436# define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
437# define __LDBL_REDIR_NTH(name, proto) \
438 __LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
54e98f69
RM
439# define __LDBL_REDIR1_DECL(name, alias) \
440 extern __typeof (name) name __asm (__ASMNAME (#alias));
c6251f03 441# define __LDBL_REDIR_DECL(name) \
54e98f69 442 extern __typeof (name) name __asm (__ASMNAME ("__nldbl_" #name));
ac97dec1
UD
443# define __REDIRECT_LDBL(name, proto, alias) \
444 __LDBL_REDIR1 (name, proto, __nldbl_##alias)
445# define __REDIRECT_NTH_LDBL(name, proto, alias) \
446 __LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
c6251f03
RM
447# endif
448#endif
449#if !defined __LDBL_COMPAT || !defined __REDIRECT
450# define __LDBL_REDIR1(name, proto, alias) name proto
451# define __LDBL_REDIR(name, proto) name proto
452# define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
453# define __LDBL_REDIR_NTH(name, proto) name proto __THROW
454# define __LDBL_REDIR_DECL(name)
ac97dec1
UD
455# ifdef __REDIRECT
456# define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
457# define __REDIRECT_NTH_LDBL(name, proto, alias) \
458 __REDIRECT_NTH (name, proto, alias)
459# endif
c6251f03
RM
460#endif
461
bfbd1de1 462/* __glibc_macro_warning (MESSAGE) issues warning MESSAGE. This is
809b72df
ZW
463 intended for use in preprocessor macros.
464
465 Note: MESSAGE must be a _single_ string; concatenation of string
466 literals is not supported. */
467#if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5)
bfbd1de1
FW
468# define __glibc_macro_warning1(message) _Pragma (#message)
469# define __glibc_macro_warning(message) \
470 __glibc_macro_warning1 (GCC warning message)
471#else
472# define __glibc_macro_warning(msg)
473#endif
474
6913ad65
GG
475/* Generic selection (ISO C11) is a C-only feature, available in GCC
476 since version 4.9. Previous versions do not provide generic
477 selection, even though they might set __STDC_VERSION__ to 201112L,
478 when in -std=c11 mode. Thus, we must check for !defined __GNUC__
479 when testing __STDC_VERSION__ for generic selection support.
477bf19a
GG
480 On the other hand, Clang also defines __GNUC__, so a clang-specific
481 check is required to enable the use of generic selection. */
6913ad65
GG
482#if !defined __cplusplus \
483 && (__GNUC_PREREQ (4, 9) \
484 || __glibc_clang_has_extension (c_generic_selections) \
485 || (!defined __GNUC__ && defined __STDC_VERSION__ \
486 && __STDC_VERSION__ >= 201112L))
477bf19a
GG
487# define __HAVE_GENERIC_SELECTION 1
488#else
489# define __HAVE_GENERIC_SELECTION 0
490#endif
491
28f540f4 492#endif /* sys/cdefs.h */