cdefs.h revision 331722
1/*-
2 * Copyright (c) 1991, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Berkeley Software Design, Inc.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 4. Neither the name of the University nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 *
32 *	@(#)cdefs.h	8.8 (Berkeley) 1/9/95
33 * $FreeBSD: stable/11/sys/sys/cdefs.h 331722 2018-03-29 02:50:57Z eadler $
34 */
35
36#ifndef	_SYS_CDEFS_H_
37#define	_SYS_CDEFS_H_
38
39/*
40 * Testing against Clang-specific extensions.
41 */
42#ifndef	__has_attribute
43#define	__has_attribute(x)	0
44#endif
45#ifndef	__has_extension
46#define	__has_extension		__has_feature
47#endif
48#ifndef	__has_feature
49#define	__has_feature(x)	0
50#endif
51#ifndef	__has_include
52#define	__has_include(x)	0
53#endif
54#ifndef	__has_builtin
55#define	__has_builtin(x)	0
56#endif
57
58#if defined(__cplusplus)
59#define	__BEGIN_DECLS	extern "C" {
60#define	__END_DECLS	}
61#else
62#define	__BEGIN_DECLS
63#define	__END_DECLS
64#endif
65
66/*
67 * This code has been put in place to help reduce the addition of
68 * compiler specific defines in FreeBSD code.  It helps to aid in
69 * having a compiler-agnostic source tree.
70 */
71
72#if defined(__GNUC__) || defined(__INTEL_COMPILER)
73
74#if __GNUC__ >= 3 || defined(__INTEL_COMPILER)
75#define	__GNUCLIKE_ASM 3
76#define	__GNUCLIKE_MATH_BUILTIN_CONSTANTS
77#else
78#define	__GNUCLIKE_ASM 2
79#endif
80#define	__GNUCLIKE___TYPEOF 1
81#define	__GNUCLIKE___OFFSETOF 1
82#define	__GNUCLIKE___SECTION 1
83
84#ifndef __INTEL_COMPILER
85#define	__GNUCLIKE_CTOR_SECTION_HANDLING 1
86#endif
87
88#define	__GNUCLIKE_BUILTIN_CONSTANT_P 1
89#if defined(__INTEL_COMPILER) && defined(__cplusplus) && \
90   __INTEL_COMPILER < 800
91#undef __GNUCLIKE_BUILTIN_CONSTANT_P
92#endif
93
94#if (__GNUC_MINOR__ > 95 || __GNUC__ >= 3)
95#define	__GNUCLIKE_BUILTIN_VARARGS 1
96#define	__GNUCLIKE_BUILTIN_STDARG 1
97#define	__GNUCLIKE_BUILTIN_VAALIST 1
98#endif
99
100#if defined(__GNUC__)
101#define	__GNUC_VA_LIST_COMPATIBILITY 1
102#endif
103
104/*
105 * Compiler memory barriers, specific to gcc and clang.
106 */
107#if defined(__GNUC__)
108#define	__compiler_membar()	__asm __volatile(" " : : : "memory")
109#endif
110
111#ifndef __INTEL_COMPILER
112#define	__GNUCLIKE_BUILTIN_NEXT_ARG 1
113#define	__GNUCLIKE_MATH_BUILTIN_RELOPS
114#endif
115
116#define	__GNUCLIKE_BUILTIN_MEMCPY 1
117
118/* XXX: if __GNUC__ >= 2: not tested everywhere originally, where replaced */
119#define	__CC_SUPPORTS_INLINE 1
120#define	__CC_SUPPORTS___INLINE 1
121#define	__CC_SUPPORTS___INLINE__ 1
122
123#define	__CC_SUPPORTS___FUNC__ 1
124#define	__CC_SUPPORTS_WARNING 1
125
126#define	__CC_SUPPORTS_VARADIC_XXX 1 /* see varargs.h */
127
128#define	__CC_SUPPORTS_DYNAMIC_ARRAY_INIT 1
129
130#endif /* __GNUC__ || __INTEL_COMPILER */
131
132/*
133 * Macro to test if we're using a specific version of gcc or later.
134 */
135#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
136#define	__GNUC_PREREQ__(ma, mi)	\
137	(__GNUC__ > (ma) || __GNUC__ == (ma) && __GNUC_MINOR__ >= (mi))
138#else
139#define	__GNUC_PREREQ__(ma, mi)	0
140#endif
141
142/*
143 * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
144 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
145 * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI
146 * mode -- there must be no spaces between its arguments, and for nested
147 * __CONCAT's, all the __CONCAT's must be at the left.  __CONCAT can also
148 * concatenate double-quoted strings produced by the __STRING macro, but
149 * this only works with ANSI C.
150 *
151 * __XSTRING is like __STRING, but it expands any macros in its argument
152 * first.  It is only available with ANSI C.
153 */
154#if defined(__STDC__) || defined(__cplusplus)
155#define	__P(protos)	protos		/* full-blown ANSI C */
156#define	__CONCAT1(x,y)	x ## y
157#define	__CONCAT(x,y)	__CONCAT1(x,y)
158#define	__STRING(x)	#x		/* stringify without expanding x */
159#define	__XSTRING(x)	__STRING(x)	/* expand x, then stringify */
160
161#define	__const		const		/* define reserved names to standard */
162#define	__signed	signed
163#define	__volatile	volatile
164#if defined(__cplusplus)
165#define	__inline	inline		/* convert to C++ keyword */
166#else
167#if !(defined(__CC_SUPPORTS___INLINE))
168#define	__inline			/* delete GCC keyword */
169#endif /* ! __CC_SUPPORTS___INLINE */
170#endif /* !__cplusplus */
171
172#else	/* !(__STDC__ || __cplusplus) */
173#define	__P(protos)	()		/* traditional C preprocessor */
174#define	__CONCAT(x,y)	x/**/y
175#define	__STRING(x)	"x"
176
177#if !defined(__CC_SUPPORTS___INLINE)
178#define	__const				/* delete pseudo-ANSI C keywords */
179#define	__inline
180#define	__signed
181#define	__volatile
182/*
183 * In non-ANSI C environments, new programs will want ANSI-only C keywords
184 * deleted from the program and old programs will want them left alone.
185 * When using a compiler other than gcc, programs using the ANSI C keywords
186 * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS.
187 * When using "gcc -traditional", we assume that this is the intent; if
188 * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone.
189 */
190#ifndef	NO_ANSI_KEYWORDS
191#define	const				/* delete ANSI C keywords */
192#define	inline
193#define	signed
194#define	volatile
195#endif	/* !NO_ANSI_KEYWORDS */
196#endif	/* !__CC_SUPPORTS___INLINE */
197#endif	/* !(__STDC__ || __cplusplus) */
198
199/*
200 * Compiler-dependent macros to help declare dead (non-returning) and
201 * pure (no side effects) functions, and unused variables.  They are
202 * null except for versions of gcc that are known to support the features
203 * properly (old versions of gcc-2 supported the dead and pure features
204 * in a different (wrong) way).  If we do not provide an implementation
205 * for a given compiler, let the compile fail if it is told to use
206 * a feature that we cannot live without.
207 */
208#ifdef lint
209#define	__dead2
210#define	__pure2
211#define	__unused
212#define	__packed
213#define	__aligned(x)
214#define	__alloc_align(x)
215#define	__alloc_size(x)
216#define	__alloc_size2(n, x)
217#define	__section(x)
218#define	__weak_symbol
219#else
220#define	__weak_symbol	__attribute__((__weak__))
221#if !__GNUC_PREREQ__(2, 5) && !defined(__INTEL_COMPILER)
222#define	__dead2
223#define	__pure2
224#define	__unused
225#endif
226#if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 && !defined(__INTEL_COMPILER)
227#define	__dead2		__attribute__((__noreturn__))
228#define	__pure2		__attribute__((__const__))
229#define	__unused
230/* XXX Find out what to do for __packed, __aligned and __section */
231#endif
232#if __GNUC_PREREQ__(2, 7) || defined(__INTEL_COMPILER)
233#define	__dead2		__attribute__((__noreturn__))
234#define	__pure2		__attribute__((__const__))
235#define	__unused	__attribute__((__unused__))
236#define	__used		__attribute__((__used__))
237#define	__packed	__attribute__((__packed__))
238#define	__aligned(x)	__attribute__((__aligned__(x)))
239#define	__section(x)	__attribute__((__section__(x)))
240#endif
241#if __GNUC_PREREQ__(4, 3) || __has_attribute(__alloc_size__)
242#define	__alloc_size(x)	__attribute__((__alloc_size__(x)))
243#define	__alloc_size2(n, x)	__attribute__((__alloc_size__(n, x)))
244#else
245#define	__alloc_size(x)
246#define	__alloc_size2(n, x)
247#endif
248#if __GNUC_PREREQ__(4, 9) || __has_attribute(__alloc_align__)
249#define	__alloc_align(x)	__attribute__((__alloc_align__(x)))
250#else
251#define	__alloc_align(x)
252#endif
253#endif /* lint */
254
255#if !__GNUC_PREREQ__(2, 95)
256#define	__alignof(x)	__offsetof(struct { char __a; x __b; }, __b)
257#endif
258
259/*
260 * Keywords added in C11.
261 */
262
263#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L || defined(lint)
264
265#if !__has_extension(c_alignas)
266#if (defined(__cplusplus) && __cplusplus >= 201103L) || \
267    __has_extension(cxx_alignas)
268#define	_Alignas(x)		alignas(x)
269#else
270/* XXX: Only emulates _Alignas(constant-expression); not _Alignas(type-name). */
271#define	_Alignas(x)		__aligned(x)
272#endif
273#endif
274
275#if defined(__cplusplus) && __cplusplus >= 201103L
276#define	_Alignof(x)		alignof(x)
277#else
278#define	_Alignof(x)		__alignof(x)
279#endif
280
281#if !defined(__cplusplus) && !__has_extension(c_atomic) && \
282    !__has_extension(cxx_atomic)
283/*
284 * No native support for _Atomic(). Place object in structure to prevent
285 * most forms of direct non-atomic access.
286 */
287#define	_Atomic(T)		struct { T volatile __val; }
288#endif
289
290#if defined(__cplusplus) && __cplusplus >= 201103L
291#define	_Noreturn		[[noreturn]]
292#else
293#define	_Noreturn		__dead2
294#endif
295
296#if !__has_extension(c_static_assert)
297#if (defined(__cplusplus) && __cplusplus >= 201103L) || \
298    __has_extension(cxx_static_assert)
299#define	_Static_assert(x, y)	static_assert(x, y)
300#elif __GNUC_PREREQ__(4,6) && !defined(__cplusplus)
301/* Nothing, gcc 4.6 and higher has _Static_assert built-in */
302#elif defined(__COUNTER__)
303#define	_Static_assert(x, y)	__Static_assert(x, __COUNTER__)
304#define	__Static_assert(x, y)	___Static_assert(x, y)
305#define	___Static_assert(x, y)	typedef char __assert_ ## y[(x) ? 1 : -1] \
306				__unused
307#else
308#define	_Static_assert(x, y)	struct __hack
309#endif
310#endif
311
312#if !__has_extension(c_thread_local)
313/*
314 * XXX: Some compilers (Clang 3.3, GCC 4.7) falsely announce C++11 mode
315 * without actually supporting the thread_local keyword. Don't check for
316 * the presence of C++11 when defining _Thread_local.
317 */
318#if /* (defined(__cplusplus) && __cplusplus >= 201103L) || */ \
319    __has_extension(cxx_thread_local)
320#define	_Thread_local		thread_local
321#else
322#define	_Thread_local		__thread
323#endif
324#endif
325
326#endif /* __STDC_VERSION__ || __STDC_VERSION__ < 201112L */
327
328/*
329 * Emulation of C11 _Generic().  Unlike the previously defined C11
330 * keywords, it is not possible to implement this using exactly the same
331 * syntax.  Therefore implement something similar under the name
332 * __generic().  Unlike _Generic(), this macro can only distinguish
333 * between a single type, so it requires nested invocations to
334 * distinguish multiple cases.
335 */
336
337#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
338    __has_extension(c_generic_selections)
339#define	__generic(expr, t, yes, no)					\
340	_Generic(expr, t: yes, default: no)
341#elif __GNUC_PREREQ__(3, 1) && !defined(__cplusplus)
342#define	__generic(expr, t, yes, no)					\
343	__builtin_choose_expr(						\
344	    __builtin_types_compatible_p(__typeof(expr), t), yes, no)
345#endif
346
347/*
348 * C99 Static array indices in function parameter declarations.  Syntax such as:
349 * void bar(int myArray[static 10]);
350 * is allowed in C99 but not in C++.  Define __min_size appropriately so
351 * headers using it can be compiled in either language.  Use like this:
352 * void bar(int myArray[__min_size(10)]);
353 */
354#if !defined(__cplusplus) && \
355    (defined(__clang__) || __GNUC_PREREQ__(4, 6)) && \
356    (!defined(__STDC_VERSION__) || (__STDC_VERSION__ >= 199901))
357#define __min_size(x)	static (x)
358#else
359#define __min_size(x)	(x)
360#endif
361
362#if __GNUC_PREREQ__(2, 96)
363#define	__malloc_like	__attribute__((__malloc__))
364#define	__pure		__attribute__((__pure__))
365#else
366#define	__malloc_like
367#define	__pure
368#endif
369
370#if __GNUC_PREREQ__(3, 1) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800)
371#define	__always_inline	__attribute__((__always_inline__))
372#else
373#define	__always_inline
374#endif
375
376#if __GNUC_PREREQ__(3, 1)
377#define	__noinline	__attribute__ ((__noinline__))
378#else
379#define	__noinline
380#endif
381
382#if __GNUC_PREREQ__(3, 4)
383#define	__fastcall	__attribute__((__fastcall__))
384#define	__result_use_check	__attribute__((__warn_unused_result__))
385#else
386#define	__fastcall
387#define	__result_use_check
388#endif
389
390#if __GNUC_PREREQ__(4, 1)
391#define	__returns_twice	__attribute__((__returns_twice__))
392#else
393#define	__returns_twice
394#endif
395
396#if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable)
397#define	__unreachable()	__builtin_unreachable()
398#else
399#define	__unreachable()	((void)0)
400#endif
401
402/* XXX: should use `#if __STDC_VERSION__ < 199901'. */
403#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
404#define	__func__	NULL
405#endif
406
407#if (defined(__INTEL_COMPILER) || (defined(__GNUC__) && __GNUC__ >= 2)) && !defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901
408#define	__LONG_LONG_SUPPORTED
409#endif
410
411/* C++11 exposes a load of C99 stuff */
412#if defined(__cplusplus) && __cplusplus >= 201103L
413#define	__LONG_LONG_SUPPORTED
414#ifndef	__STDC_LIMIT_MACROS
415#define	__STDC_LIMIT_MACROS
416#endif
417#ifndef	__STDC_CONSTANT_MACROS
418#define	__STDC_CONSTANT_MACROS
419#endif
420#endif
421
422/*
423 * GCC 2.95 provides `__restrict' as an extension to C90 to support the
424 * C99-specific `restrict' type qualifier.  We happen to use `__restrict' as
425 * a way to define the `restrict' type qualifier without disturbing older
426 * software that is unaware of C99 keywords.
427 */
428#if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95)
429#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901 || defined(lint)
430#define	__restrict
431#else
432#define	__restrict	restrict
433#endif
434#endif
435
436/*
437 * GNU C version 2.96 adds explicit branch prediction so that
438 * the CPU back-end can hint the processor and also so that
439 * code blocks can be reordered such that the predicted path
440 * sees a more linear flow, thus improving cache behavior, etc.
441 *
442 * The following two macros provide us with a way to utilize this
443 * compiler feature.  Use __predict_true() if you expect the expression
444 * to evaluate to true, and __predict_false() if you expect the
445 * expression to evaluate to false.
446 *
447 * A few notes about usage:
448 *
449 *	* Generally, __predict_false() error condition checks (unless
450 *	  you have some _strong_ reason to do otherwise, in which case
451 *	  document it), and/or __predict_true() `no-error' condition
452 *	  checks, assuming you want to optimize for the no-error case.
453 *
454 *	* Other than that, if you don't know the likelihood of a test
455 *	  succeeding from empirical or other `hard' evidence, don't
456 *	  make predictions.
457 *
458 *	* These are meant to be used in places that are run `a lot'.
459 *	  It is wasteful to make predictions in code that is run
460 *	  seldomly (e.g. at subsystem initialization time) as the
461 *	  basic block reordering that this affects can often generate
462 *	  larger code.
463 */
464#if __GNUC_PREREQ__(2, 96)
465#define	__predict_true(exp)     __builtin_expect((exp), 1)
466#define	__predict_false(exp)    __builtin_expect((exp), 0)
467#else
468#define	__predict_true(exp)     (exp)
469#define	__predict_false(exp)    (exp)
470#endif
471
472#if __GNUC_PREREQ__(4, 0)
473#define	__null_sentinel	__attribute__((__sentinel__))
474#define	__exported	__attribute__((__visibility__("default")))
475#define	__hidden	__attribute__((__visibility__("hidden")))
476#else
477#define	__null_sentinel
478#define	__exported
479#define	__hidden
480#endif
481
482/*
483 * We define this here since <stddef.h>, <sys/queue.h>, and <sys/types.h>
484 * require it.
485 */
486#if __GNUC_PREREQ__(4, 1)
487#define	__offsetof(type, field)	 __builtin_offsetof(type, field)
488#else
489#ifndef __cplusplus
490#define	__offsetof(type, field) \
491	((__size_t)(__uintptr_t)((const volatile void *)&((type *)0)->field))
492#else
493#define	__offsetof(type, field)					\
494  (__offsetof__ (reinterpret_cast <__size_t>			\
495                 (&reinterpret_cast <const volatile char &>	\
496                  (static_cast<type *> (0)->field))))
497#endif
498#endif
499#define	__rangeof(type, start, end) \
500	(__offsetof(type, end) - __offsetof(type, start))
501
502/*
503 * Given the pointer x to the member m of the struct s, return
504 * a pointer to the containing structure.  When using GCC, we first
505 * assign pointer x to a local variable, to check that its type is
506 * compatible with member m.
507 */
508#if __GNUC_PREREQ__(3, 1)
509#define	__containerof(x, s, m) ({					\
510	const volatile __typeof(((s *)0)->m) *__x = (x);		\
511	__DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m));\
512})
513#else
514#define	__containerof(x, s, m)						\
515	__DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m))
516#endif
517
518/*
519 * Compiler-dependent macros to declare that functions take printf-like
520 * or scanf-like arguments.  They are null except for versions of gcc
521 * that are known to support the features properly (old versions of gcc-2
522 * didn't permit keeping the keywords out of the application namespace).
523 */
524#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
525#define	__printflike(fmtarg, firstvararg)
526#define	__scanflike(fmtarg, firstvararg)
527#define	__format_arg(fmtarg)
528#define	__strfmonlike(fmtarg, firstvararg)
529#define	__strftimelike(fmtarg, firstvararg)
530#else
531#define	__printflike(fmtarg, firstvararg) \
532	    __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
533#define	__scanflike(fmtarg, firstvararg) \
534	    __attribute__((__format__ (__scanf__, fmtarg, firstvararg)))
535#define	__format_arg(fmtarg)	__attribute__((__format_arg__ (fmtarg)))
536#define	__strfmonlike(fmtarg, firstvararg) \
537	    __attribute__((__format__ (__strfmon__, fmtarg, firstvararg)))
538#define	__strftimelike(fmtarg, firstvararg) \
539	    __attribute__((__format__ (__strftime__, fmtarg, firstvararg)))
540#endif
541
542/* Compiler-dependent macros that rely on FreeBSD-specific extensions. */
543#if defined(__FreeBSD_cc_version) && __FreeBSD_cc_version >= 300001 && \
544    defined(__GNUC__) && !defined(__INTEL_COMPILER)
545#define	__printf0like(fmtarg, firstvararg) \
546	    __attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
547#else
548#define	__printf0like(fmtarg, firstvararg)
549#endif
550
551#if defined(__GNUC__) || defined(__INTEL_COMPILER)
552#ifndef __INTEL_COMPILER
553#define	__strong_reference(sym,aliassym)	\
554	extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym)))
555#endif
556#ifdef __STDC__
557#define	__weak_reference(sym,alias)	\
558	__asm__(".weak " #alias);	\
559	__asm__(".equ "  #alias ", " #sym)
560#define	__warn_references(sym,msg)	\
561	__asm__(".section .gnu.warning." #sym);	\
562	__asm__(".asciz \"" msg "\"");	\
563	__asm__(".previous")
564#define	__sym_compat(sym,impl,verid)	\
565	__asm__(".symver " #impl ", " #sym "@" #verid)
566#define	__sym_default(sym,impl,verid)	\
567	__asm__(".symver " #impl ", " #sym "@@" #verid)
568#else
569#define	__weak_reference(sym,alias)	\
570	__asm__(".weak alias");		\
571	__asm__(".equ alias, sym")
572#define	__warn_references(sym,msg)	\
573	__asm__(".section .gnu.warning.sym"); \
574	__asm__(".asciz \"msg\"");	\
575	__asm__(".previous")
576#define	__sym_compat(sym,impl,verid)	\
577	__asm__(".symver impl, sym@verid")
578#define	__sym_default(impl,sym,verid)	\
579	__asm__(".symver impl, sym@@verid")
580#endif	/* __STDC__ */
581#endif	/* __GNUC__ || __INTEL_COMPILER */
582
583#define	__GLOBL1(sym)	__asm__(".globl " #sym)
584#define	__GLOBL(sym)	__GLOBL1(sym)
585
586#if defined(__GNUC__) || defined(__INTEL_COMPILER)
587#define	__IDSTRING(name,string)	__asm__(".ident\t\"" string "\"")
588#else
589/*
590 * The following definition might not work well if used in header files,
591 * but it should be better than nothing.  If you want a "do nothing"
592 * version, then it should generate some harmless declaration, such as:
593 *    #define	__IDSTRING(name,string)	struct __hack
594 */
595#define	__IDSTRING(name,string)	static const char name[] __unused = string
596#endif
597
598/*
599 * Embed the rcs id of a source file in the resulting library.  Note that in
600 * more recent ELF binutils, we use .ident allowing the ID to be stripped.
601 * Usage:
602 *	__FBSDID("$FreeBSD: stable/11/sys/sys/cdefs.h 331722 2018-03-29 02:50:57Z eadler $");
603 */
604#ifndef	__FBSDID
605#if !defined(lint) && !defined(STRIP_FBSDID)
606#define	__FBSDID(s)	__IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
607#else
608#define	__FBSDID(s)	struct __hack
609#endif
610#endif
611
612#ifndef	__RCSID
613#ifndef	NO__RCSID
614#define	__RCSID(s)	__IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
615#else
616#define	__RCSID(s)	struct __hack
617#endif
618#endif
619
620#ifndef	__RCSID_SOURCE
621#ifndef	NO__RCSID_SOURCE
622#define	__RCSID_SOURCE(s)	__IDSTRING(__CONCAT(__rcsid_source_,__LINE__),s)
623#else
624#define	__RCSID_SOURCE(s)	struct __hack
625#endif
626#endif
627
628#ifndef	__SCCSID
629#ifndef	NO__SCCSID
630#define	__SCCSID(s)	__IDSTRING(__CONCAT(__sccsid_,__LINE__),s)
631#else
632#define	__SCCSID(s)	struct __hack
633#endif
634#endif
635
636#ifndef	__COPYRIGHT
637#ifndef	NO__COPYRIGHT
638#define	__COPYRIGHT(s)	__IDSTRING(__CONCAT(__copyright_,__LINE__),s)
639#else
640#define	__COPYRIGHT(s)	struct __hack
641#endif
642#endif
643
644#ifndef	__DECONST
645#define	__DECONST(type, var)	((type)(__uintptr_t)(const void *)(var))
646#endif
647
648#ifndef	__DEVOLATILE
649#define	__DEVOLATILE(type, var)	((type)(__uintptr_t)(volatile void *)(var))
650#endif
651
652#ifndef	__DEQUALIFY
653#define	__DEQUALIFY(type, var)	((type)(__uintptr_t)(const volatile void *)(var))
654#endif
655
656/*-
657 * The following definitions are an extension of the behavior originally
658 * implemented in <sys/_posix.h>, but with a different level of granularity.
659 * POSIX.1 requires that the macros we test be defined before any standard
660 * header file is included.
661 *
662 * Here's a quick run-down of the versions:
663 *  defined(_POSIX_SOURCE)		1003.1-1988
664 *  _POSIX_C_SOURCE == 1		1003.1-1990
665 *  _POSIX_C_SOURCE == 2		1003.2-1992 C Language Binding Option
666 *  _POSIX_C_SOURCE == 199309		1003.1b-1993
667 *  _POSIX_C_SOURCE == 199506		1003.1c-1995, 1003.1i-1995,
668 *					and the omnibus ISO/IEC 9945-1: 1996
669 *  _POSIX_C_SOURCE == 200112		1003.1-2001
670 *  _POSIX_C_SOURCE == 200809		1003.1-2008
671 *
672 * In addition, the X/Open Portability Guide, which is now the Single UNIX
673 * Specification, defines a feature-test macro which indicates the version of
674 * that specification, and which subsumes _POSIX_C_SOURCE.
675 *
676 * Our macros begin with two underscores to avoid namespace screwage.
677 */
678
679/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */
680#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1
681#undef _POSIX_C_SOURCE		/* Probably illegal, but beyond caring now. */
682#define	_POSIX_C_SOURCE		199009
683#endif
684
685/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */
686#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2
687#undef _POSIX_C_SOURCE
688#define	_POSIX_C_SOURCE		199209
689#endif
690
691/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
692#ifdef _XOPEN_SOURCE
693#if _XOPEN_SOURCE - 0 >= 700
694#define	__XSI_VISIBLE		700
695#undef _POSIX_C_SOURCE
696#define	_POSIX_C_SOURCE		200809
697#elif _XOPEN_SOURCE - 0 >= 600
698#define	__XSI_VISIBLE		600
699#undef _POSIX_C_SOURCE
700#define	_POSIX_C_SOURCE		200112
701#elif _XOPEN_SOURCE - 0 >= 500
702#define	__XSI_VISIBLE		500
703#undef _POSIX_C_SOURCE
704#define	_POSIX_C_SOURCE		199506
705#endif
706#endif
707
708/*
709 * Deal with all versions of POSIX.  The ordering relative to the tests above is
710 * important.
711 */
712#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
713#define	_POSIX_C_SOURCE		198808
714#endif
715#ifdef _POSIX_C_SOURCE
716#if _POSIX_C_SOURCE >= 200809
717#define	__POSIX_VISIBLE		200809
718#define	__ISO_C_VISIBLE		1999
719#elif _POSIX_C_SOURCE >= 200112
720#define	__POSIX_VISIBLE		200112
721#define	__ISO_C_VISIBLE		1999
722#elif _POSIX_C_SOURCE >= 199506
723#define	__POSIX_VISIBLE		199506
724#define	__ISO_C_VISIBLE		1990
725#elif _POSIX_C_SOURCE >= 199309
726#define	__POSIX_VISIBLE		199309
727#define	__ISO_C_VISIBLE		1990
728#elif _POSIX_C_SOURCE >= 199209
729#define	__POSIX_VISIBLE		199209
730#define	__ISO_C_VISIBLE		1990
731#elif _POSIX_C_SOURCE >= 199009
732#define	__POSIX_VISIBLE		199009
733#define	__ISO_C_VISIBLE		1990
734#else
735#define	__POSIX_VISIBLE		198808
736#define	__ISO_C_VISIBLE		0
737#endif /* _POSIX_C_SOURCE */
738#else
739/*-
740 * Deal with _ANSI_SOURCE:
741 * If it is defined, and no other compilation environment is explicitly
742 * requested, then define our internal feature-test macros to zero.  This
743 * makes no difference to the preprocessor (undefined symbols in preprocessing
744 * expressions are defined to have value zero), but makes it more convenient for
745 * a test program to print out the values.
746 *
747 * If a program mistakenly defines _ANSI_SOURCE and some other macro such as
748 * _POSIX_C_SOURCE, we will assume that it wants the broader compilation
749 * environment (and in fact we will never get here).
750 */
751#if defined(_ANSI_SOURCE)	/* Hide almost everything. */
752#define	__POSIX_VISIBLE		0
753#define	__XSI_VISIBLE		0
754#define	__BSD_VISIBLE		0
755#define	__ISO_C_VISIBLE		1990
756#define	__EXT1_VISIBLE		0
757#elif defined(_C99_SOURCE)	/* Localism to specify strict C99 env. */
758#define	__POSIX_VISIBLE		0
759#define	__XSI_VISIBLE		0
760#define	__BSD_VISIBLE		0
761#define	__ISO_C_VISIBLE		1999
762#define	__EXT1_VISIBLE		0
763#elif defined(_C11_SOURCE)	/* Localism to specify strict C11 env. */
764#define	__POSIX_VISIBLE		0
765#define	__XSI_VISIBLE		0
766#define	__BSD_VISIBLE		0
767#define	__ISO_C_VISIBLE		2011
768#define	__EXT1_VISIBLE		0
769#else				/* Default environment: show everything. */
770#define	__POSIX_VISIBLE		200809
771#define	__XSI_VISIBLE		700
772#define	__BSD_VISIBLE		1
773#define	__ISO_C_VISIBLE		2011
774#define	__EXT1_VISIBLE		1
775#endif
776#endif
777
778/* User override __EXT1_VISIBLE */
779#if defined(__STDC_WANT_LIB_EXT1__)
780#undef	__EXT1_VISIBLE
781#if __STDC_WANT_LIB_EXT1__
782#define	__EXT1_VISIBLE		1
783#else
784#define	__EXT1_VISIBLE		0
785#endif
786#endif /* __STDC_WANT_LIB_EXT1__ */
787
788#if defined(__mips) || defined(__powerpc64__) || defined(__riscv__)
789#define	__NO_TLS 1
790#endif
791
792/*
793 * Old versions of GCC use non-standard ARM arch symbols; acle-compat.h
794 * translates them to __ARM_ARCH and the modern feature symbols defined by ARM.
795 */
796#if defined(__arm__) && !defined(__ARM_ARCH)
797#include <machine/acle-compat.h>
798#endif
799
800/*
801 * Nullability qualifiers: currently only supported by Clang.
802 */
803#if !(defined(__clang__) && __has_feature(nullability))
804#define	_Nonnull
805#define	_Nullable
806#define	_Null_unspecified
807#define	__NULLABILITY_PRAGMA_PUSH
808#define	__NULLABILITY_PRAGMA_POP
809#else
810#define	__NULLABILITY_PRAGMA_PUSH _Pragma("clang diagnostic push")	\
811	_Pragma("clang diagnostic ignored \"-Wnullability-completeness\"")
812#define	__NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop")
813#endif
814
815/*
816 * Type Safety Checking
817 *
818 * Clang provides additional attributes to enable checking type safety
819 * properties that cannot be enforced by the C type system.
820 */
821
822#if __has_attribute(__argument_with_type_tag__) && \
823    __has_attribute(__type_tag_for_datatype__) && !defined(lint)
824#define	__arg_type_tag(arg_kind, arg_idx, type_tag_idx) \
825	    __attribute__((__argument_with_type_tag__(arg_kind, arg_idx, type_tag_idx)))
826#define	__datatype_type_tag(kind, type) \
827	    __attribute__((__type_tag_for_datatype__(kind, type)))
828#else
829#define	__arg_type_tag(arg_kind, arg_idx, type_tag_idx)
830#define	__datatype_type_tag(kind, type)
831#endif
832
833/*
834 * Lock annotations.
835 *
836 * Clang provides support for doing basic thread-safety tests at
837 * compile-time, by marking which locks will/should be held when
838 * entering/leaving a functions.
839 *
840 * Furthermore, it is also possible to annotate variables and structure
841 * members to enforce that they are only accessed when certain locks are
842 * held.
843 */
844
845#if __has_extension(c_thread_safety_attributes)
846#define	__lock_annotate(x)	__attribute__((x))
847#else
848#define	__lock_annotate(x)
849#endif
850
851/* Structure implements a lock. */
852#define	__lockable		__lock_annotate(lockable)
853
854/* Function acquires an exclusive or shared lock. */
855#define	__locks_exclusive(...) \
856	__lock_annotate(exclusive_lock_function(__VA_ARGS__))
857#define	__locks_shared(...) \
858	__lock_annotate(shared_lock_function(__VA_ARGS__))
859
860/* Function attempts to acquire an exclusive or shared lock. */
861#define	__trylocks_exclusive(...) \
862	__lock_annotate(exclusive_trylock_function(__VA_ARGS__))
863#define	__trylocks_shared(...) \
864	__lock_annotate(shared_trylock_function(__VA_ARGS__))
865
866/* Function releases a lock. */
867#define	__unlocks(...)		__lock_annotate(unlock_function(__VA_ARGS__))
868
869/* Function asserts that an exclusive or shared lock is held. */
870#define	__asserts_exclusive(...) \
871	__lock_annotate(assert_exclusive_lock(__VA_ARGS__))
872#define	__asserts_shared(...) \
873	__lock_annotate(assert_shared_lock(__VA_ARGS__))
874
875/* Function requires that an exclusive or shared lock is or is not held. */
876#define	__requires_exclusive(...) \
877	__lock_annotate(exclusive_locks_required(__VA_ARGS__))
878#define	__requires_shared(...) \
879	__lock_annotate(shared_locks_required(__VA_ARGS__))
880#define	__requires_unlocked(...) \
881	__lock_annotate(locks_excluded(__VA_ARGS__))
882
883/* Function should not be analyzed. */
884#define	__no_lock_analysis	__lock_annotate(no_thread_safety_analysis)
885
886/* Guard variables and structure members by lock. */
887#define	__guarded_by(x)		__lock_annotate(guarded_by(x))
888#define	__pt_guarded_by(x)	__lock_annotate(pt_guarded_by(x))
889
890#endif /* !_SYS_CDEFS_H_ */
891