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: releng/11.0/sys/sys/cdefs.h 300967 2016-05-29 17:32:19Z dim $
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	__section(x)
217#define	__weak_symbol
218#else
219#define	__weak_symbol	__attribute__((__weak__))
220#if !__GNUC_PREREQ__(2, 5) && !defined(__INTEL_COMPILER)
221#define	__dead2
222#define	__pure2
223#define	__unused
224#endif
225#if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 && !defined(__INTEL_COMPILER)
226#define	__dead2		__attribute__((__noreturn__))
227#define	__pure2		__attribute__((__const__))
228#define	__unused
229/* XXX Find out what to do for __packed, __aligned and __section */
230#endif
231#if __GNUC_PREREQ__(2, 7) || defined(__INTEL_COMPILER)
232#define	__dead2		__attribute__((__noreturn__))
233#define	__pure2		__attribute__((__const__))
234#define	__unused	__attribute__((__unused__))
235#define	__used		__attribute__((__used__))
236#define	__packed	__attribute__((__packed__))
237#define	__aligned(x)	__attribute__((__aligned__(x)))
238#define	__section(x)	__attribute__((__section__(x)))
239#endif
240#if __GNUC_PREREQ__(4, 3) || __has_attribute(__alloc_size__)
241#define	__alloc_size(x)	__attribute__((__alloc_size__(x)))
242#else
243#define	__alloc_size(x)
244#endif
245#if __GNUC_PREREQ__(4, 9) || __has_attribute(__alloc_align__)
246#define	__alloc_align(x)	__attribute__((__alloc_align__(x)))
247#else
248#define	__alloc_align(x)
249#endif
250#endif /* lint */
251
252#if !__GNUC_PREREQ__(2, 95)
253#define	__alignof(x)	__offsetof(struct { char __a; x __b; }, __b)
254#endif
255
256/*
257 * Keywords added in C11.
258 */
259
260#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L || defined(lint)
261
262#if !__has_extension(c_alignas)
263#if (defined(__cplusplus) && __cplusplus >= 201103L) || \
264    __has_extension(cxx_alignas)
265#define	_Alignas(x)		alignas(x)
266#else
267/* XXX: Only emulates _Alignas(constant-expression); not _Alignas(type-name). */
268#define	_Alignas(x)		__aligned(x)
269#endif
270#endif
271
272#if defined(__cplusplus) && __cplusplus >= 201103L
273#define	_Alignof(x)		alignof(x)
274#else
275#define	_Alignof(x)		__alignof(x)
276#endif
277
278#if !defined(__cplusplus) && !__has_extension(c_atomic) && \
279    !__has_extension(cxx_atomic)
280/*
281 * No native support for _Atomic(). Place object in structure to prevent
282 * most forms of direct non-atomic access.
283 */
284#define	_Atomic(T)		struct { T volatile __val; }
285#endif
286
287#if defined(__cplusplus) && __cplusplus >= 201103L
288#define	_Noreturn		[[noreturn]]
289#else
290#define	_Noreturn		__dead2
291#endif
292
293#if !__has_extension(c_static_assert)
294#if (defined(__cplusplus) && __cplusplus >= 201103L) || \
295    __has_extension(cxx_static_assert)
296#define	_Static_assert(x, y)	static_assert(x, y)
297#elif __GNUC_PREREQ__(4,6)
298/* Nothing, gcc 4.6 and higher has _Static_assert built-in */
299#elif defined(__COUNTER__)
300#define	_Static_assert(x, y)	__Static_assert(x, __COUNTER__)
301#define	__Static_assert(x, y)	___Static_assert(x, y)
302#define	___Static_assert(x, y)	typedef char __assert_ ## y[(x) ? 1 : -1] \
303				__unused
304#else
305#define	_Static_assert(x, y)	struct __hack
306#endif
307#endif
308
309#if !__has_extension(c_thread_local)
310/*
311 * XXX: Some compilers (Clang 3.3, GCC 4.7) falsely announce C++11 mode
312 * without actually supporting the thread_local keyword. Don't check for
313 * the presence of C++11 when defining _Thread_local.
314 */
315#if /* (defined(__cplusplus) && __cplusplus >= 201103L) || */ \
316    __has_extension(cxx_thread_local)
317#define	_Thread_local		thread_local
318#else
319#define	_Thread_local		__thread
320#endif
321#endif
322
323#endif /* __STDC_VERSION__ || __STDC_VERSION__ < 201112L */
324
325/*
326 * Emulation of C11 _Generic().  Unlike the previously defined C11
327 * keywords, it is not possible to implement this using exactly the same
328 * syntax.  Therefore implement something similar under the name
329 * __generic().  Unlike _Generic(), this macro can only distinguish
330 * between a single type, so it requires nested invocations to
331 * distinguish multiple cases.
332 */
333
334#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
335    __has_extension(c_generic_selections)
336#define	__generic(expr, t, yes, no)					\
337	_Generic(expr, t: yes, default: no)
338#elif __GNUC_PREREQ__(3, 1) && !defined(__cplusplus)
339#define	__generic(expr, t, yes, no)					\
340	__builtin_choose_expr(						\
341	    __builtin_types_compatible_p(__typeof(expr), t), yes, no)
342#endif
343
344#if __GNUC_PREREQ__(2, 96)
345#define	__malloc_like	__attribute__((__malloc__))
346#define	__pure		__attribute__((__pure__))
347#else
348#define	__malloc_like
349#define	__pure
350#endif
351
352#if __GNUC_PREREQ__(3, 1) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800)
353#define	__always_inline	__attribute__((__always_inline__))
354#else
355#define	__always_inline
356#endif
357
358#if __GNUC_PREREQ__(3, 1)
359#define	__noinline	__attribute__ ((__noinline__))
360#else
361#define	__noinline
362#endif
363
364#if __GNUC_PREREQ__(3, 3)
365#define	__nonnull(x)	__attribute__((__nonnull__(x)))
366#define	__nonnull_all	__attribute__((__nonnull__))
367#else
368#define	__nonnull(x)
369#define	__nonnull_all
370#endif
371
372#if __GNUC_PREREQ__(3, 4)
373#define	__fastcall	__attribute__((__fastcall__))
374#define	__result_use_check	__attribute__((__warn_unused_result__))
375#else
376#define	__fastcall
377#define	__result_use_check
378#endif
379
380#if __GNUC_PREREQ__(4, 1)
381#define	__returns_twice	__attribute__((__returns_twice__))
382#else
383#define	__returns_twice
384#endif
385
386#if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable)
387#define	__unreachable()	__builtin_unreachable()
388#else
389#define	__unreachable()	((void)0)
390#endif
391
392/* XXX: should use `#if __STDC_VERSION__ < 199901'. */
393#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
394#define	__func__	NULL
395#endif
396
397#if (defined(__INTEL_COMPILER) || (defined(__GNUC__) && __GNUC__ >= 2)) && !defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901
398#define	__LONG_LONG_SUPPORTED
399#endif
400
401/* C++11 exposes a load of C99 stuff */
402#if defined(__cplusplus) && __cplusplus >= 201103L
403#define	__LONG_LONG_SUPPORTED
404#ifndef	__STDC_LIMIT_MACROS
405#define	__STDC_LIMIT_MACROS
406#endif
407#ifndef	__STDC_CONSTANT_MACROS
408#define	__STDC_CONSTANT_MACROS
409#endif
410#endif
411
412/*
413 * GCC 2.95 provides `__restrict' as an extension to C90 to support the
414 * C99-specific `restrict' type qualifier.  We happen to use `__restrict' as
415 * a way to define the `restrict' type qualifier without disturbing older
416 * software that is unaware of C99 keywords.
417 */
418#if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95)
419#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901 || defined(lint)
420#define	__restrict
421#else
422#define	__restrict	restrict
423#endif
424#endif
425
426/*
427 * GNU C version 2.96 adds explicit branch prediction so that
428 * the CPU back-end can hint the processor and also so that
429 * code blocks can be reordered such that the predicted path
430 * sees a more linear flow, thus improving cache behavior, etc.
431 *
432 * The following two macros provide us with a way to utilize this
433 * compiler feature.  Use __predict_true() if you expect the expression
434 * to evaluate to true, and __predict_false() if you expect the
435 * expression to evaluate to false.
436 *
437 * A few notes about usage:
438 *
439 *	* Generally, __predict_false() error condition checks (unless
440 *	  you have some _strong_ reason to do otherwise, in which case
441 *	  document it), and/or __predict_true() `no-error' condition
442 *	  checks, assuming you want to optimize for the no-error case.
443 *
444 *	* Other than that, if you don't know the likelihood of a test
445 *	  succeeding from empirical or other `hard' evidence, don't
446 *	  make predictions.
447 *
448 *	* These are meant to be used in places that are run `a lot'.
449 *	  It is wasteful to make predictions in code that is run
450 *	  seldomly (e.g. at subsystem initialization time) as the
451 *	  basic block reordering that this affects can often generate
452 *	  larger code.
453 */
454#if __GNUC_PREREQ__(2, 96)
455#define	__predict_true(exp)     __builtin_expect((exp), 1)
456#define	__predict_false(exp)    __builtin_expect((exp), 0)
457#else
458#define	__predict_true(exp)     (exp)
459#define	__predict_false(exp)    (exp)
460#endif
461
462#if __GNUC_PREREQ__(4, 0)
463#define	__null_sentinel	__attribute__((__sentinel__))
464#define	__exported	__attribute__((__visibility__("default")))
465#define	__hidden	__attribute__((__visibility__("hidden")))
466#else
467#define	__null_sentinel
468#define	__exported
469#define	__hidden
470#endif
471
472/*
473 * We define this here since <stddef.h>, <sys/queue.h>, and <sys/types.h>
474 * require it.
475 */
476#if __GNUC_PREREQ__(4, 1)
477#define	__offsetof(type, field)	 __builtin_offsetof(type, field)
478#else
479#ifndef __cplusplus
480#define	__offsetof(type, field) \
481	((__size_t)(__uintptr_t)((const volatile void *)&((type *)0)->field))
482#else
483#define	__offsetof(type, field)					\
484  (__offsetof__ (reinterpret_cast <__size_t>			\
485                 (&reinterpret_cast <const volatile char &>	\
486                  (static_cast<type *> (0)->field))))
487#endif
488#endif
489#define	__rangeof(type, start, end) \
490	(__offsetof(type, end) - __offsetof(type, start))
491
492/*
493 * Given the pointer x to the member m of the struct s, return
494 * a pointer to the containing structure.  When using GCC, we first
495 * assign pointer x to a local variable, to check that its type is
496 * compatible with member m.
497 */
498#if __GNUC_PREREQ__(3, 1)
499#define	__containerof(x, s, m) ({					\
500	const volatile __typeof(((s *)0)->m) *__x = (x);		\
501	__DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m));\
502})
503#else
504#define	__containerof(x, s, m)						\
505	__DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m))
506#endif
507
508/*
509 * Compiler-dependent macros to declare that functions take printf-like
510 * or scanf-like arguments.  They are null except for versions of gcc
511 * that are known to support the features properly (old versions of gcc-2
512 * didn't permit keeping the keywords out of the application namespace).
513 */
514#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
515#define	__printflike(fmtarg, firstvararg)
516#define	__scanflike(fmtarg, firstvararg)
517#define	__format_arg(fmtarg)
518#define	__strfmonlike(fmtarg, firstvararg)
519#define	__strftimelike(fmtarg, firstvararg)
520#else
521#define	__printflike(fmtarg, firstvararg) \
522	    __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
523#define	__scanflike(fmtarg, firstvararg) \
524	    __attribute__((__format__ (__scanf__, fmtarg, firstvararg)))
525#define	__format_arg(fmtarg)	__attribute__((__format_arg__ (fmtarg)))
526#define	__strfmonlike(fmtarg, firstvararg) \
527	    __attribute__((__format__ (__strfmon__, fmtarg, firstvararg)))
528#define	__strftimelike(fmtarg, firstvararg) \
529	    __attribute__((__format__ (__strftime__, fmtarg, firstvararg)))
530#endif
531
532/*
533 * FORTIFY_SOURCE, and perhaps other compiler-specific features, require
534 * the use of non-standard inlining.  In general we should try to avoid
535 * using these but GCC-compatible compilers tend to support the extensions
536 * well enough to use them in limited cases.
537 */
538#if defined(__GNUC_GNU_INLINE__) || defined(__GNUC_STDC_INLINE__)
539#if __GNUC_PREREQ__(4, 3) || __has_attribute(__artificial__)
540#define	__gnu_inline	__attribute__((__gnu_inline__, __artificial__))
541#else
542#define	__gnu_inline	__attribute__((__gnu_inline__))
543#endif /* artificial */
544#else
545#define	__gnu_inline
546#endif
547
548/* Compiler-dependent macros that rely on FreeBSD-specific extensions. */
549#if defined(__FreeBSD_cc_version) && __FreeBSD_cc_version >= 300001 && \
550    defined(__GNUC__) && !defined(__INTEL_COMPILER)
551#define	__printf0like(fmtarg, firstvararg) \
552	    __attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
553#else
554#define	__printf0like(fmtarg, firstvararg)
555#endif
556
557#if defined(__GNUC__) || defined(__INTEL_COMPILER)
558#ifndef __INTEL_COMPILER
559#define	__strong_reference(sym,aliassym)	\
560	extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym)))
561#endif
562#ifdef __STDC__
563#define	__weak_reference(sym,alias)	\
564	__asm__(".weak " #alias);	\
565	__asm__(".equ "  #alias ", " #sym)
566#define	__warn_references(sym,msg)	\
567	__asm__(".section .gnu.warning." #sym);	\
568	__asm__(".asciz \"" msg "\"");	\
569	__asm__(".previous")
570#define	__sym_compat(sym,impl,verid)	\
571	__asm__(".symver " #impl ", " #sym "@" #verid)
572#define	__sym_default(sym,impl,verid)	\
573	__asm__(".symver " #impl ", " #sym "@@" #verid)
574#else
575#define	__weak_reference(sym,alias)	\
576	__asm__(".weak alias");		\
577	__asm__(".equ alias, sym")
578#define	__warn_references(sym,msg)	\
579	__asm__(".section .gnu.warning.sym"); \
580	__asm__(".asciz \"msg\"");	\
581	__asm__(".previous")
582#define	__sym_compat(sym,impl,verid)	\
583	__asm__(".symver impl, sym@verid")
584#define	__sym_default(impl,sym,verid)	\
585	__asm__(".symver impl, sym@@verid")
586#endif	/* __STDC__ */
587#endif	/* __GNUC__ || __INTEL_COMPILER */
588
589#define	__GLOBL1(sym)	__asm__(".globl " #sym)
590#define	__GLOBL(sym)	__GLOBL1(sym)
591
592#if defined(__GNUC__) || defined(__INTEL_COMPILER)
593#define	__IDSTRING(name,string)	__asm__(".ident\t\"" string "\"")
594#else
595/*
596 * The following definition might not work well if used in header files,
597 * but it should be better than nothing.  If you want a "do nothing"
598 * version, then it should generate some harmless declaration, such as:
599 *    #define	__IDSTRING(name,string)	struct __hack
600 */
601#define	__IDSTRING(name,string)	static const char name[] __unused = string
602#endif
603
604/*
605 * Embed the rcs id of a source file in the resulting library.  Note that in
606 * more recent ELF binutils, we use .ident allowing the ID to be stripped.
607 * Usage:
608 *	__FBSDID("$FreeBSD: releng/11.0/sys/sys/cdefs.h 300967 2016-05-29 17:32:19Z dim $");
609 */
610#ifndef	__FBSDID
611#if !defined(lint) && !defined(STRIP_FBSDID)
612#define	__FBSDID(s)	__IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
613#else
614#define	__FBSDID(s)	struct __hack
615#endif
616#endif
617
618#ifndef	__RCSID
619#ifndef	NO__RCSID
620#define	__RCSID(s)	__IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
621#else
622#define	__RCSID(s)	struct __hack
623#endif
624#endif
625
626#ifndef	__RCSID_SOURCE
627#ifndef	NO__RCSID_SOURCE
628#define	__RCSID_SOURCE(s)	__IDSTRING(__CONCAT(__rcsid_source_,__LINE__),s)
629#else
630#define	__RCSID_SOURCE(s)	struct __hack
631#endif
632#endif
633
634#ifndef	__SCCSID
635#ifndef	NO__SCCSID
636#define	__SCCSID(s)	__IDSTRING(__CONCAT(__sccsid_,__LINE__),s)
637#else
638#define	__SCCSID(s)	struct __hack
639#endif
640#endif
641
642#ifndef	__COPYRIGHT
643#ifndef	NO__COPYRIGHT
644#define	__COPYRIGHT(s)	__IDSTRING(__CONCAT(__copyright_,__LINE__),s)
645#else
646#define	__COPYRIGHT(s)	struct __hack
647#endif
648#endif
649
650#ifndef	__DECONST
651#define	__DECONST(type, var)	((type)(__uintptr_t)(const void *)(var))
652#endif
653
654#ifndef	__DEVOLATILE
655#define	__DEVOLATILE(type, var)	((type)(__uintptr_t)(volatile void *)(var))
656#endif
657
658#ifndef	__DEQUALIFY
659#define	__DEQUALIFY(type, var)	((type)(__uintptr_t)(const volatile void *)(var))
660#endif
661
662/*-
663 * The following definitions are an extension of the behavior originally
664 * implemented in <sys/_posix.h>, but with a different level of granularity.
665 * POSIX.1 requires that the macros we test be defined before any standard
666 * header file is included.
667 *
668 * Here's a quick run-down of the versions:
669 *  defined(_POSIX_SOURCE)		1003.1-1988
670 *  _POSIX_C_SOURCE == 1		1003.1-1990
671 *  _POSIX_C_SOURCE == 2		1003.2-1992 C Language Binding Option
672 *  _POSIX_C_SOURCE == 199309		1003.1b-1993
673 *  _POSIX_C_SOURCE == 199506		1003.1c-1995, 1003.1i-1995,
674 *					and the omnibus ISO/IEC 9945-1: 1996
675 *  _POSIX_C_SOURCE == 200112		1003.1-2001
676 *  _POSIX_C_SOURCE == 200809		1003.1-2008
677 *
678 * In addition, the X/Open Portability Guide, which is now the Single UNIX
679 * Specification, defines a feature-test macro which indicates the version of
680 * that specification, and which subsumes _POSIX_C_SOURCE.
681 *
682 * Our macros begin with two underscores to avoid namespace screwage.
683 */
684
685/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */
686#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1
687#undef _POSIX_C_SOURCE		/* Probably illegal, but beyond caring now. */
688#define	_POSIX_C_SOURCE		199009
689#endif
690
691/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */
692#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2
693#undef _POSIX_C_SOURCE
694#define	_POSIX_C_SOURCE		199209
695#endif
696
697/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
698#ifdef _XOPEN_SOURCE
699#if _XOPEN_SOURCE - 0 >= 700
700#define	__XSI_VISIBLE		700
701#undef _POSIX_C_SOURCE
702#define	_POSIX_C_SOURCE		200809
703#elif _XOPEN_SOURCE - 0 >= 600
704#define	__XSI_VISIBLE		600
705#undef _POSIX_C_SOURCE
706#define	_POSIX_C_SOURCE		200112
707#elif _XOPEN_SOURCE - 0 >= 500
708#define	__XSI_VISIBLE		500
709#undef _POSIX_C_SOURCE
710#define	_POSIX_C_SOURCE		199506
711#endif
712#endif
713
714/*
715 * Deal with all versions of POSIX.  The ordering relative to the tests above is
716 * important.
717 */
718#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
719#define	_POSIX_C_SOURCE		198808
720#endif
721#ifdef _POSIX_C_SOURCE
722#if _POSIX_C_SOURCE >= 200809
723#define	__POSIX_VISIBLE		200809
724#define	__ISO_C_VISIBLE		1999
725#elif _POSIX_C_SOURCE >= 200112
726#define	__POSIX_VISIBLE		200112
727#define	__ISO_C_VISIBLE		1999
728#elif _POSIX_C_SOURCE >= 199506
729#define	__POSIX_VISIBLE		199506
730#define	__ISO_C_VISIBLE		1990
731#elif _POSIX_C_SOURCE >= 199309
732#define	__POSIX_VISIBLE		199309
733#define	__ISO_C_VISIBLE		1990
734#elif _POSIX_C_SOURCE >= 199209
735#define	__POSIX_VISIBLE		199209
736#define	__ISO_C_VISIBLE		1990
737#elif _POSIX_C_SOURCE >= 199009
738#define	__POSIX_VISIBLE		199009
739#define	__ISO_C_VISIBLE		1990
740#else
741#define	__POSIX_VISIBLE		198808
742#define	__ISO_C_VISIBLE		0
743#endif /* _POSIX_C_SOURCE */
744#else
745/*-
746 * Deal with _ANSI_SOURCE:
747 * If it is defined, and no other compilation environment is explicitly
748 * requested, then define our internal feature-test macros to zero.  This
749 * makes no difference to the preprocessor (undefined symbols in preprocessing
750 * expressions are defined to have value zero), but makes it more convenient for
751 * a test program to print out the values.
752 *
753 * If a program mistakenly defines _ANSI_SOURCE and some other macro such as
754 * _POSIX_C_SOURCE, we will assume that it wants the broader compilation
755 * environment (and in fact we will never get here).
756 */
757#if defined(_ANSI_SOURCE)	/* Hide almost everything. */
758#define	__POSIX_VISIBLE		0
759#define	__XSI_VISIBLE		0
760#define	__BSD_VISIBLE		0
761#define	__ISO_C_VISIBLE		1990
762#elif defined(_C99_SOURCE)	/* Localism to specify strict C99 env. */
763#define	__POSIX_VISIBLE		0
764#define	__XSI_VISIBLE		0
765#define	__BSD_VISIBLE		0
766#define	__ISO_C_VISIBLE		1999
767#elif defined(_C11_SOURCE)	/* Localism to specify strict C11 env. */
768#define	__POSIX_VISIBLE		0
769#define	__XSI_VISIBLE		0
770#define	__BSD_VISIBLE		0
771#define	__ISO_C_VISIBLE		2011
772#else				/* Default environment: show everything. */
773#define	__POSIX_VISIBLE		200809
774#define	__XSI_VISIBLE		700
775#define	__BSD_VISIBLE		1
776#define	__ISO_C_VISIBLE		2011
777#endif
778#endif
779
780#if defined(__mips) || defined(__powerpc64__) || defined(__riscv__)
781#define	__NO_TLS 1
782#endif
783
784/*
785 * Old versions of GCC use non-standard ARM arch symbols; acle-compat.h
786 * translates them to __ARM_ARCH and the modern feature symbols defined by ARM.
787 */
788#if defined(__arm__) && !defined(__ARM_ARCH)
789#include <machine/acle-compat.h>
790#endif
791
792/*
793 * Type Safety Checking
794 *
795 * Clang provides additional attributes to enable checking type safety
796 * properties that cannot be enforced by the C type system.
797 */
798
799#if __has_attribute(__argument_with_type_tag__) && \
800    __has_attribute(__type_tag_for_datatype__) && !defined(lint)
801#define	__arg_type_tag(arg_kind, arg_idx, type_tag_idx) \
802	    __attribute__((__argument_with_type_tag__(arg_kind, arg_idx, type_tag_idx)))
803#define	__datatype_type_tag(kind, type) \
804	    __attribute__((__type_tag_for_datatype__(kind, type)))
805#else
806#define	__arg_type_tag(arg_kind, arg_idx, type_tag_idx)
807#define	__datatype_type_tag(kind, type)
808#endif
809
810/*
811 * Lock annotations.
812 *
813 * Clang provides support for doing basic thread-safety tests at
814 * compile-time, by marking which locks will/should be held when
815 * entering/leaving a functions.
816 *
817 * Furthermore, it is also possible to annotate variables and structure
818 * members to enforce that they are only accessed when certain locks are
819 * held.
820 */
821
822#if __has_extension(c_thread_safety_attributes)
823#define	__lock_annotate(x)	__attribute__((x))
824#else
825#define	__lock_annotate(x)
826#endif
827
828/* Structure implements a lock. */
829#define	__lockable		__lock_annotate(lockable)
830
831/* Function acquires an exclusive or shared lock. */
832#define	__locks_exclusive(...) \
833	__lock_annotate(exclusive_lock_function(__VA_ARGS__))
834#define	__locks_shared(...) \
835	__lock_annotate(shared_lock_function(__VA_ARGS__))
836
837/* Function attempts to acquire an exclusive or shared lock. */
838#define	__trylocks_exclusive(...) \
839	__lock_annotate(exclusive_trylock_function(__VA_ARGS__))
840#define	__trylocks_shared(...) \
841	__lock_annotate(shared_trylock_function(__VA_ARGS__))
842
843/* Function releases a lock. */
844#define	__unlocks(...)		__lock_annotate(unlock_function(__VA_ARGS__))
845
846/* Function asserts that an exclusive or shared lock is held. */
847#define	__asserts_exclusive(...) \
848	__lock_annotate(assert_exclusive_lock(__VA_ARGS__))
849#define	__asserts_shared(...) \
850	__lock_annotate(assert_shared_lock(__VA_ARGS__))
851
852/* Function requires that an exclusive or shared lock is or is not held. */
853#define	__requires_exclusive(...) \
854	__lock_annotate(exclusive_locks_required(__VA_ARGS__))
855#define	__requires_shared(...) \
856	__lock_annotate(shared_locks_required(__VA_ARGS__))
857#define	__requires_unlocked(...) \
858	__lock_annotate(locks_excluded(__VA_ARGS__))
859
860/* Function should not be analyzed. */
861#define	__no_lock_analysis	__lock_annotate(no_thread_safety_analysis)
862
863/* Guard variables and structure members by lock. */
864#define	__guarded_by(x)		__lock_annotate(guarded_by(x))
865#define	__pt_guarded_by(x)	__lock_annotate(pt_guarded_by(x))
866
867#endif /* !_SYS_CDEFS_H_ */
868