xref: /openbsd-src/sys/sys/cdefs.h (revision d13be5d47e4149db2549a9828e244d59dbc43f15)
1 /*	$OpenBSD: cdefs.h,v 1.31 2010/10/01 04:51:49 guenther Exp $	*/
2 /*	$NetBSD: cdefs.h,v 1.16 1996/04/03 20:46:39 christos Exp $	*/
3 
4 /*
5  * Copyright (c) 1991, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Berkeley Software Design, Inc.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  *	@(#)cdefs.h	8.7 (Berkeley) 1/21/94
36  */
37 
38 #ifndef	_SYS_CDEFS_H_
39 #define	_SYS_CDEFS_H_
40 
41 #include <machine/cdefs.h>
42 
43 #if defined(__cplusplus)
44 #define	__BEGIN_DECLS	extern "C" {
45 #define	__END_DECLS	}
46 #else
47 #define	__BEGIN_DECLS
48 #define	__END_DECLS
49 #endif
50 
51 /*
52  * Macro to test if we're using a specific version of gcc or later.
53  */
54 #ifdef __GNUC__
55 #define __GNUC_PREREQ__(ma, mi) \
56 	((__GNUC__ > (ma)) || (__GNUC__ == (ma) && __GNUC_MINOR__ >= (mi)))
57 #else
58 #define __GNUC_PREREQ__(ma, mi) 0
59 #endif
60 
61 /*
62  * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
63  * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
64  * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
65  * in between its arguments.  __CONCAT can also concatenate double-quoted
66  * strings produced by the __STRING macro, but this only works with ANSI C.
67  */
68 #if defined(__STDC__) || defined(__cplusplus)
69 #define	__P(protos)	protos		/* full-blown ANSI C */
70 #define	__CONCAT(x,y)	x ## y
71 #define	__STRING(x)	#x
72 
73 #define	__const		const		/* define reserved names to standard */
74 #define	__signed	signed
75 #define	__volatile	volatile
76 #if defined(__cplusplus) || defined(__PCC__)
77 #define	__inline	inline		/* convert to C++ keyword */
78 #else
79 #if !defined(__GNUC__) && !defined(lint)
80 #define	__inline			/* delete GCC keyword */
81 #endif /* !__GNUC__ && !lint */
82 #endif /* !__cplusplus */
83 
84 #else	/* !(__STDC__ || __cplusplus) */
85 #define	__P(protos)	()		/* traditional C preprocessor */
86 #define	__CONCAT(x,y)	x/**/y
87 #define	__STRING(x)	"x"
88 
89 #if !defined(__GNUC__) && !defined(lint)
90 #define	__const				/* delete pseudo-ANSI C keywords */
91 #define	__inline
92 #define	__signed
93 #define	__volatile
94 #endif	/* !__GNUC__ && !lint */
95 
96 /*
97  * In non-ANSI C environments, new programs will want ANSI-only C keywords
98  * deleted from the program and old programs will want them left alone.
99  * Programs using the ANSI C keywords const, inline etc. as normal
100  * identifiers should define -DNO_ANSI_KEYWORDS.
101  */
102 #ifndef	NO_ANSI_KEYWORDS
103 #define	const		__const		/* convert ANSI C keywords */
104 #define	inline		__inline
105 #define	signed		__signed
106 #define	volatile	__volatile
107 #endif /* !NO_ANSI_KEYWORDS */
108 #endif	/* !(__STDC__ || __cplusplus) */
109 
110 /*
111  * GCC1 and some versions of GCC2 declare dead (non-returning) and
112  * pure (no side effects) functions using "volatile" and "const";
113  * unfortunately, these then cause warnings under "-ansi -pedantic".
114  * GCC >= 2.5 uses the __attribute__((attrs)) style.  All of these
115  * work for GNU C++ (modulo a slight glitch in the C++ grammar in
116  * the distribution version of 2.5.5).
117  */
118 
119 #if !__GNUC_PREREQ__(2, 5) && !defined(__PCC__)
120 #define	__attribute__(x)	/* delete __attribute__ if non-gcc or gcc1 */
121 #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
122 #define	__dead		__volatile
123 #define	__pure		__const
124 #elif defined(lint)
125 #define __dead		/* NORETURN */
126 #endif
127 #elif !defined(__STRICT_ANSI__)
128 #define __dead		__attribute__((__noreturn__))
129 #define __pure		__attribute__((__const__))
130 #endif
131 
132 #if __GNUC_PREREQ__(2, 7)
133 #define	__unused	__attribute__((__unused__))
134 #else
135 #define	__unused	/* delete */
136 #endif
137 
138 #if __GNUC_PREREQ__(3, 1)
139 #define	__used		__attribute__((__used__))
140 #else
141 #define	__used		__unused	/* suppress -Wunused warnings */
142 #endif
143 
144 /*
145  * __returns_twice makes the compiler not assume the function
146  * only returns once.  This affects registerisation of variables:
147  * even local variables need to be in memory across such a call.
148  * Example: setjmp()
149  */
150 #if __GNUC_PREREQ__(4, 1)
151 #define __returns_twice	__attribute__((returns_twice))
152 #else
153 #define __returns_twice
154 #endif
155 
156 /*
157  * __only_inline makes the compiler only use this function definition
158  * for inlining; references that can't be inlined will be left as
159  * external references instead of generating a local copy.  The
160  * matching library should include a simple extern definition for
161  * the function to handle those references.  c.f. ctype.h
162  */
163 #ifdef __GNUC__
164 #  if __GNUC_PREREQ__(4, 2)
165 #define __only_inline	extern __inline __attribute__((__gnu_inline__))
166 #  else
167 #define __only_inline	extern __inline
168 #  endif
169 #else
170 #define __only_inline	static __inline
171 #endif
172 
173 /*
174  * GNU C version 2.96 adds explicit branch prediction so that
175  * the CPU back-end can hint the processor and also so that
176  * code blocks can be reordered such that the predicted path
177  * sees a more linear flow, thus improving cache behavior, etc.
178  *
179  * The following two macros provide us with a way to utilize this
180  * compiler feature.  Use __predict_true() if you expect the expression
181  * to evaluate to true, and __predict_false() if you expect the
182  * expression to evaluate to false.
183  *
184  * A few notes about usage:
185  *
186  *	* Generally, __predict_false() error condition checks (unless
187  *	  you have some _strong_ reason to do otherwise, in which case
188  *	  document it), and/or __predict_true() `no-error' condition
189  *	  checks, assuming you want to optimize for the no-error case.
190  *
191  *	* Other than that, if you don't know the likelihood of a test
192  *	  succeeding from empirical or other `hard' evidence, don't
193  *	  make predictions.
194  *
195  *	* These are meant to be used in places that are run `a lot'.
196  *	  It is wasteful to make predictions in code that is run
197  *	  seldomly (e.g. at subsystem initialization time) as the
198  *	  basic block reordering that this affects can often generate
199  *	  larger code.
200  */
201 #if __GNUC_PREREQ__(2, 96)
202 #define __predict_true(exp)	__builtin_expect(((exp) != 0), 1)
203 #define __predict_false(exp)	__builtin_expect(((exp) != 0), 0)
204 #else
205 #define __predict_true(exp)	((exp) != 0)
206 #define __predict_false(exp)	((exp) != 0)
207 #endif
208 
209 /* Delete pseudo-keywords wherever they are not available or needed. */
210 #ifndef __dead
211 #define	__dead
212 #define	__pure
213 #endif
214 
215 #if __GNUC_PREREQ__(2, 7) || defined(__PCC__)
216 #define	__packed	__attribute__((__packed__))
217 #elif defined(lint)
218 #define	__packed
219 #endif
220 
221 #if !__GNUC_PREREQ__(2, 8)
222 #define	__extension__
223 #endif
224 
225 #if __GNUC_PREREQ__(2, 8) || defined(__PCC__)
226 #define __statement(x)	__extension__(x)
227 #elif defined(lint)
228 #define __statement(x)	(0)
229 #else
230 #define __statement(x)	(x)
231 #endif
232 
233 #if __GNUC_PREREQ__(3, 0)
234 #define	__malloc	__attribute__((__malloc__))
235 #else
236 #define	__malloc
237 #endif
238 
239 /*
240  * "The nice thing about standards is that there are so many to choose from."
241  * There are a number of "feature test macros" specified by (different)
242  * standards that determine which interfaces and types the header files
243  * should expose.
244  *
245  * Because of inconsistencies in these macros, we define our own
246  * set in the private name space that end in _VISIBLE.  These are
247  * always defined and so headers can test their values easily.
248  * Things can get tricky when multiple feature macros are defined.
249  * We try to take the union of all the features requested.
250  *
251  * The following macros are guaranteed to have a value after cdefs.h
252  * has been included:
253  *	__POSIX_VISIBLE
254  *	__XPG_VISIBLE
255  *	__ISO_C_VISIBLE
256  *	__BSD_VISIBLE
257  */
258 
259 /*
260  * X/Open Portability Guides and Single Unix Specifications.
261  * _XOPEN_SOURCE				XPG3
262  * _XOPEN_SOURCE && _XOPEN_VERSION = 4		XPG4
263  * _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED = 1	XPG4v2
264  * _XOPEN_SOURCE == 500				XPG5
265  * _XOPEN_SOURCE == 520				XPG5v2
266  * _XOPEN_SOURCE == 600				POSIX 1003.1-2001 with XSI
267  * _XOPEN_SOURCE == 700				POSIX 1003.1-2008 with XSI
268  *
269  * The XPG spec implies a specific value for _POSIX_C_SOURCE.
270  */
271 #ifdef _XOPEN_SOURCE
272 # if (_XOPEN_SOURCE - 0 >= 700)
273 #  define __XPG_VISIBLE		700
274 #  undef _POSIX_C_SOURCE
275 #  define _POSIX_C_SOURCE	200809L
276 # elif (_XOPEN_SOURCE - 0 >= 600)
277 #  define __XPG_VISIBLE		600
278 #  undef _POSIX_C_SOURCE
279 #  define _POSIX_C_SOURCE	200112L
280 # elif (_XOPEN_SOURCE - 0 >= 520)
281 #  define __XPG_VISIBLE		520
282 #  undef _POSIX_C_SOURCE
283 #  define _POSIX_C_SOURCE	199506L
284 # elif (_XOPEN_SOURCE - 0 >= 500)
285 #  define __XPG_VISIBLE		500
286 #  undef _POSIX_C_SOURCE
287 #  define _POSIX_C_SOURCE	199506L
288 # elif (_XOPEN_SOURCE_EXTENDED - 0 == 1)
289 #  define __XPG_VISIBLE		420
290 # elif (_XOPEN_VERSION - 0 >= 4)
291 #  define __XPG_VISIBLE		400
292 # else
293 #  define __XPG_VISIBLE		300
294 # endif
295 #endif
296 
297 /*
298  * POSIX macros, these checks must follow the XOPEN ones above.
299  *
300  * _POSIX_SOURCE == 1		1003.1-1988 (superseded by _POSIX_C_SOURCE)
301  * _POSIX_C_SOURCE == 1		1003.1-1990
302  * _POSIX_C_SOURCE == 2		1003.2-1992
303  * _POSIX_C_SOURCE == 199309L	1003.1b-1993
304  * _POSIX_C_SOURCE == 199506L   1003.1c-1995, 1003.1i-1995,
305  *				and the omnibus ISO/IEC 9945-1:1996
306  * _POSIX_C_SOURCE == 200112L   1003.1-2001
307  * _POSIX_C_SOURCE == 200809L   1003.1-2008
308  *
309  * The POSIX spec implies a specific value for __ISO_C_VISIBLE, though
310  * this may be overridden by the _ISOC99_SOURCE macro later.
311  */
312 #ifdef _POSIX_C_SOURCE
313 # if (_POSIX_C_SOURCE - 0 >= 200809)
314 #  define __POSIX_VISIBLE	200809
315 #  define __ISO_C_VISIBLE	1999
316 # elif (_POSIX_C_SOURCE - 0 >= 200112)
317 #  define __POSIX_VISIBLE	200112
318 #  define __ISO_C_VISIBLE	1999
319 # elif (_POSIX_C_SOURCE - 0 >= 199506)
320 #  define __POSIX_VISIBLE	199506
321 #  define __ISO_C_VISIBLE	1990
322 # elif (_POSIX_C_SOURCE - 0 >= 199309)
323 #  define __POSIX_VISIBLE	199309
324 #  define __ISO_C_VISIBLE	1990
325 # elif (_POSIX_C_SOURCE - 0 >= 2)
326 #  define __POSIX_VISIBLE	199209
327 #  define __ISO_C_VISIBLE	1990
328 # else
329 #  define __POSIX_VISIBLE	199009
330 #  define __ISO_C_VISIBLE	1990
331 # endif
332 #elif defined(_POSIX_SOURCE)
333 # define __POSIX_VISIBLE	198808
334 #  define __ISO_C_VISIBLE	0
335 #endif
336 
337 /*
338  * _ANSI_SOURCE means to expose ANSI C89 interfaces only.
339  * If the user defines it in addition to one of the POSIX or XOPEN
340  * macros, assume the POSIX/XOPEN macro(s) should take precedence.
341  */
342 #if defined(_ANSI_SOURCE) && !defined(__POSIX_VISIBLE) && \
343     !defined(__XPG_VISIBLE)
344 # define __POSIX_VISIBLE	0
345 # define __XPG_VISIBLE		0
346 # define __ISO_C_VISIBLE	1990
347 #endif
348 
349 /*
350  * _ISOC99_SOURCE and __STDC_VERSION__ override any of the other macros since
351  * they are non-exclusive.
352  */
353 #if defined(_ISOC99_SOURCE) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
354 # undef __ISO_C_VISIBLE
355 # define __ISO_C_VISIBLE	1999
356 #endif
357 
358 /*
359  * Finally deal with BSD-specific interfaces that are not covered
360  * by any standards.  We expose these when none of the POSIX or XPG
361  * macros is defined or if the user explicitly asks for them.
362  */
363 #if !defined(_BSD_SOURCE) && \
364    (defined(_ANSI_SOURCE) || defined(__XPG_VISIBLE) || defined(__POSIX_VISIBLE))
365 # define __BSD_VISIBLE		0
366 #endif
367 
368 /*
369  * Default values.
370  */
371 #ifndef __XPG_VISIBLE
372 # define __XPG_VISIBLE		700
373 #endif
374 #ifndef __POSIX_VISIBLE
375 # define __POSIX_VISIBLE	200809
376 #endif
377 #ifndef __ISO_C_VISIBLE
378 # define __ISO_C_VISIBLE	1999
379 #endif
380 #ifndef __BSD_VISIBLE
381 # define __BSD_VISIBLE		1
382 #endif
383 
384 #endif /* !_SYS_CDEFS_H_ */
385