cdefs.h 6.79 KB
Newer Older
1
/*
Guillem Jover's avatar
Guillem Jover committed
2
 * Copyright © 2004-2006, 2009-2011 Guillem Jover <guillem@hadrons.org>
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

27
#ifndef __has_include
28
#define __has_include(x) 1
29
30
#endif
#ifndef __has_include_next
31
#define __has_include_next(x) 1
32
#endif
33
34
35
36
37
38
39
#ifndef __has_attribute
#define __has_attribute(x) 0
#endif
/* Clang expands this to 1 if an identifier is *not* reserved. */
#ifndef __is_identifier
#define __is_identifier(x) 1
#endif
40

41
#ifdef LIBBSD_OVERLAY
42
43
44
45
46
/*
 * Some libc implementations do not have a <sys/cdefs.h>, in particular
 * musl, try to handle this gracefully.
 */
#if __has_include_next(<sys/cdefs.h>)
47
#include_next <sys/cdefs.h>
48
#endif
49
#else
50
#if __has_include(<sys/cdefs.h>)
51
#include <sys/cdefs.h>
52
#endif
53
#endif
54

55
56
57
#ifndef LIBBSD_SYS_CDEFS_H
#define LIBBSD_SYS_CDEFS_H

58
59
60
61
62
63
64
65
66
67
#ifndef __BEGIN_DECLS
#ifdef __cplusplus
#define __BEGIN_DECLS	extern "C" {
#define __END_DECLS	}
#else
#define __BEGIN_DECLS
#define __END_DECLS
#endif
#endif

68
69
70
71
72
73
74
75
/*
 * On non-glibc based systems, we cannot unconditionally use the
 * __GLIBC_PREREQ macro as it gets expanded before evaluation.
 */
#ifndef __GLIBC_PREREQ
#define __GLIBC_PREREQ(maj, min) 0
#endif

76
77
78
79
80
81
82
83
84
85
/*
 * Some kFreeBSD headers expect those macros to be set for sanity checks.
 */
#ifndef _SYS_CDEFS_H_
#define _SYS_CDEFS_H_
#endif
#ifndef _SYS_CDEFS_H
#define _SYS_CDEFS_H
#endif

Guillem Jover's avatar
Guillem Jover committed
86
87
88
#define LIBBSD_CONCAT(x, y)	x ## y
#define LIBBSD_STRING(x)	#x

89
90
91
92
93
94
#ifdef __GNUC__
#define LIBBSD_GCC_VERSION (__GNUC__ << 8 | __GNUC_MINOR__)
#else
#define LIBBSD_GCC_VERSION 0
#endif

95
#if LIBBSD_GCC_VERSION >= 0x0405 || __has_attribute(__deprecated__)
96
#define LIBBSD_DEPRECATED(x) __attribute__((__deprecated__(x)))
97
#elif LIBBSD_GCC_VERSION >= 0x0301
98
#define LIBBSD_DEPRECATED(x) __attribute__((__deprecated__))
99
100
101
102
#else
#define LIBBSD_DEPRECATED(x)
#endif

103
#if LIBBSD_GCC_VERSION >= 0x0200 || defined(__clang__)
Guillem Jover's avatar
Guillem Jover committed
104
105
106
107
108
#define LIBBSD_REDIRECT(name, proto, alias) name proto __asm__(LIBBSD_ASMNAME(#alias))
#endif
#define LIBBSD_ASMNAME(cname) LIBBSD_ASMNAME_PREFIX(__USER_LABEL_PREFIX__, cname)
#define LIBBSD_ASMNAME_PREFIX(prefix, cname) LIBBSD_STRING(prefix) cname

109
#ifndef __dead2
110
# if LIBBSD_GCC_VERSION >= 0x0207 || __has_attribute(__noreturn__)
111
112
113
114
#  define __dead2 __attribute__((__noreturn__))
# else
#  define __dead2
# endif
115
116
117
#endif

#ifndef __pure2
118
# if LIBBSD_GCC_VERSION >= 0x0207 || __has_attribute(__const__)
119
120
121
122
#  define __pure2 __attribute__((__const__))
# else
#  define __pure2
# endif
123
124
#endif

125
#ifndef __packed
126
# if LIBBSD_GCC_VERSION >= 0x0207 || __has_attribute(__packed__)
127
128
129
130
131
132
133
#  define __packed __attribute__((__packed__))
# else
#  define __packed
# endif
#endif

#ifndef __aligned
134
# if LIBBSD_GCC_VERSION >= 0x0207 || __has_attribute(__aligned__)
135
136
137
138
139
140
#  define __aligned(x) __attribute__((__aligned__(x)))
# else
#  define __aligned(x)
# endif
#endif

141
/* Linux headers define a struct with a member names __unused.
142
 * Debian bugs: #522773 (linux), #522774 (libc).
143
144
145
 * Disable for now. */
#if 0
#ifndef __unused
146
# if LIBBSD_GCC_VERSION >= 0x0300
147
#  define __unused __attribute__((__unused__))
148
149
150
151
152
153
154
# else
#  define __unused
# endif
#endif
#endif

#ifndef __printflike
155
# if LIBBSD_GCC_VERSION >= 0x0300 || __has_attribute(__format__)
156
#  define __printflike(x, y) __attribute((__format__(__printf__, (x), (y))))
157
158
159
160
161
# else
#  define __printflike(x, y)
# endif
#endif

162
#ifndef __nonnull
163
# if LIBBSD_GCC_VERSION >= 0x0302 || __has_attribute(__nonnull__)
164
165
166
167
168
169
#  define __nonnull(x) __attribute__((__nonnull__(x)))
# else
#  define __nonnull(x)
# endif
#endif

170
171
172
173
#ifndef __bounded__
# define __bounded__(x, y, z)
#endif

174
175
176
177
178
179
/*
 * Return the number of elements in a statically-allocated array,
 * __x.
 */
#define	__arraycount(__x)	(sizeof(__x) / sizeof(__x[0]))

180
181
182
183
184
/*
 * We define this here since <stddef.h>, <sys/queue.h>, and <sys/types.h>
 * require it.
 */
#ifndef __offsetof
185
# if LIBBSD_GCC_VERSION >= 0x0401 || !__is_identifier(__builtin_offsetof)
186
187
188
189
#  define __offsetof(type, field)	__builtin_offsetof(type, field)
# else
#  ifndef __cplusplus
#   define __offsetof(type, field) \
190
           ((size_t)(uintptr_t)((const volatile void *)&((type *)0)->field))
191
192
#  else
#   define __offsetof(type, field) \
193
	(__offsetof__ (reinterpret_cast <size_t> \
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
	               (&reinterpret_cast <const volatile char &> \
	                (static_cast<type *> (0)->field))))
#  endif
# endif
#endif

#define __rangeof(type, start, end) \
        (__offsetof(type, end) - __offsetof(type, start))

/*
 * Given the pointer x to the member m of the struct s, return
 * a pointer to the containing structure.  When using GCC, we first
 * assign pointer x to a local variable, to check that its type is
 * compatible with member m.
 */
#ifndef __containerof
210
# if LIBBSD_GCC_VERSION >= 0x0301 || !__is_identifier(__typeof__)
211
#  define __containerof(x, s, m) ({ \
212
	const volatile __typeof__(((s *)0)->m) *__x = (x); \
213
214
215
216
217
218
219
220
	__DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m)); \
})
# else
#  define __containerof(x, s, m) \
          __DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m))
# endif
#endif

221
222
223
224
225
226
227
228
229
230
231
232
233
#ifndef __RCSID
# define __RCSID(x)
#endif

#ifndef __FBSDID
# define __FBSDID(x)
#endif

#ifndef __RCSID
# define __RCSID(x)
#endif

#ifndef __RCSID_SOURCE
mirabilos's avatar
mirabilos committed
234
# define __RCSID_SOURCE(x)
235
236
237
#endif

#ifndef __SCCSID
mirabilos's avatar
mirabilos committed
238
# define __SCCSID(x)
239
240
241
#endif

#ifndef __COPYRIGHT
mirabilos's avatar
mirabilos committed
242
# define __COPYRIGHT(x)
243
244
#endif

245
#ifndef __DECONST
246
#define __DECONST(type, var)	((type)(uintptr_t)(const void *)(var))
247
248
249
#endif

#ifndef __DEVOLATILE
250
#define __DEVOLATILE(type, var)	((type)(uintptr_t)(volatile void *)(var))
251
252
253
#endif

#ifndef __DEQUALIFY
254
#define __DEQUALIFY(type, var)	((type)(uintptr_t)(const volatile void *)(var))
255
256
#endif

257
#endif