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$
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/*
366    the nonnull attribute caused some problems with the posixcompat library
367    as null-checks in the function will trigger an error. -RA 2017-07-22
368#define	__nonnull(x)	__attribute__((__nonnull__(x)))
369#define	__nonnull_all	__attribute__((__nonnull__))
370*/
371#define	__nonnull(x)
372#define	__nonnull_all
373#else
374#define	__nonnull(x)
375#define	__nonnull_all
376#endif
377
378#if __GNUC_PREREQ__(3, 4)
379#define	__fastcall	__attribute__((__fastcall__))
380#define	__result_use_check	__attribute__((__warn_unused_result__))
381#else
382#define	__fastcall
383#define	__result_use_check
384#endif
385
386#if __GNUC_PREREQ__(4, 1)
387#define	__returns_twice	__attribute__((__returns_twice__))
388#else
389#define	__returns_twice
390#endif
391
392#if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable)
393#define	__unreachable()	__builtin_unreachable()
394#else
395#define	__unreachable()	((void)0)
396#endif
397
398/* XXX: should use `#if __STDC_VERSION__ < 199901'. */
399#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
400#define	__func__	NULL
401#endif
402
403#if (defined(__INTEL_COMPILER) || (defined(__GNUC__) && __GNUC__ >= 2)) && !defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901
404#define	__LONG_LONG_SUPPORTED
405#endif
406
407/* C++11 exposes a load of C99 stuff */
408#if defined(__cplusplus) && __cplusplus >= 201103L
409#define	__LONG_LONG_SUPPORTED
410#ifndef	__STDC_LIMIT_MACROS
411#define	__STDC_LIMIT_MACROS
412#endif
413#ifndef	__STDC_CONSTANT_MACROS
414#define	__STDC_CONSTANT_MACROS
415#endif
416#endif
417
418/*
419 * GCC 2.95 provides `__restrict' as an extension to C90 to support the
420 * C99-specific `restrict' type qualifier.  We happen to use `__restrict' as
421 * a way to define the `restrict' type qualifier without disturbing older
422 * software that is unaware of C99 keywords.
423 */
424#if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95)
425#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901 || defined(lint)
426#define	__restrict
427#else
428#define	__restrict	restrict
429#endif
430#endif
431
432/*
433 * GNU C version 2.96 adds explicit branch prediction so that
434 * the CPU back-end can hint the processor and also so that
435 * code blocks can be reordered such that the predicted path
436 * sees a more linear flow, thus improving cache behavior, etc.
437 *
438 * The following two macros provide us with a way to utilize this
439 * compiler feature.  Use __predict_true() if you expect the expression
440 * to evaluate to true, and __predict_false() if you expect the
441 * expression to evaluate to false.
442 *
443 * A few notes about usage:
444 *
445 *	* Generally, __predict_false() error condition checks (unless
446 *	  you have some _strong_ reason to do otherwise, in which case
447 *	  document it), and/or __predict_true() `no-error' condition
448 *	  checks, assuming you want to optimize for the no-error case.
449 *
450 *	* Other than that, if you don't know the likelihood of a test
451 *	  succeeding from empirical or other `hard' evidence, don't
452 *	  make predictions.
453 *
454 *	* These are meant to be used in places that are run `a lot'.
455 *	  It is wasteful to make predictions in code that is run
456 *	  seldomly (e.g. at subsystem initialization time) as the
457 *	  basic block reordering that this affects can often generate
458 *	  larger code.
459 */
460#if __GNUC_PREREQ__(2, 96)
461#define	__predict_true(exp)     __builtin_expect((exp), 1)
462#define	__predict_false(exp)    __builtin_expect((exp), 0)
463#else
464#define	__predict_true(exp)     (exp)
465#define	__predict_false(exp)    (exp)
466#endif
467
468#if __GNUC_PREREQ__(4, 0)
469#define	__null_sentinel	__attribute__((__sentinel__))
470#define	__exported	__attribute__((__visibility__("default")))
471#define	__hidden	__attribute__((__visibility__("hidden")))
472#else
473#define	__null_sentinel
474#define	__exported
475#define	__hidden
476#endif
477
478/*
479 * We define this here since <stddef.h>, <sys/queue.h>, and <sys/types.h>
480 * require it.
481 */
482#if __GNUC_PREREQ__(4, 1)
483#define	__offsetof(type, field)	 __builtin_offsetof(type, field)
484#else
485#ifndef __cplusplus
486#define	__offsetof(type, field) \
487	((__size_t)(__uintptr_t)((const volatile void *)&((type *)0)->field))
488#else
489#define	__offsetof(type, field)					\
490  (__offsetof__ (reinterpret_cast <__size_t>			\
491                 (&reinterpret_cast <const volatile char &>	\
492                  (static_cast<type *> (0)->field))))
493#endif
494#endif
495#define	__rangeof(type, start, end) \
496	(__offsetof(type, end) - __offsetof(type, start))
497
498/*
499 * Given the pointer x to the member m of the struct s, return
500 * a pointer to the containing structure.  When using GCC, we first
501 * assign pointer x to a local variable, to check that its type is
502 * compatible with member m.
503 */
504#if __GNUC_PREREQ__(3, 1)
505#define	__containerof(x, s, m) ({					\
506	const volatile __typeof(((s *)0)->m) *__x = (x);		\
507	__DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m));\
508})
509#else
510#define	__containerof(x, s, m)						\
511	__DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m))
512#endif
513
514/*
515 * Compiler-dependent macros to declare that functions take printf-like
516 * or scanf-like arguments.  They are null except for versions of gcc
517 * that are known to support the features properly (old versions of gcc-2
518 * didn't permit keeping the keywords out of the application namespace).
519 */
520#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
521#define	__printflike(fmtarg, firstvararg)
522#define	__scanflike(fmtarg, firstvararg)
523#define	__format_arg(fmtarg)
524#define	__strfmonlike(fmtarg, firstvararg)
525#define	__strftimelike(fmtarg, firstvararg)
526#else
527#define	__printflike(fmtarg, firstvararg) \
528	    __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
529#define	__scanflike(fmtarg, firstvararg) \
530	    __attribute__((__format__ (__scanf__, fmtarg, firstvararg)))
531#define	__format_arg(fmtarg)	__attribute__((__format_arg__ (fmtarg)))
532#define	__strfmonlike(fmtarg, firstvararg) \
533	    __attribute__((__format__ (__strfmon__, fmtarg, firstvararg)))
534#define	__strftimelike(fmtarg, firstvararg) \
535	    __attribute__((__format__ (__strftime__, fmtarg, firstvararg)))
536#endif
537
538/*
539 * FORTIFY_SOURCE, and perhaps other compiler-specific features, require
540 * the use of non-standard inlining.  In general we should try to avoid
541 * using these but GCC-compatible compilers tend to support the extensions
542 * well enough to use them in limited cases.
543 */
544#if defined(__GNUC_GNU_INLINE__) || defined(__GNUC_STDC_INLINE__)
545#if __GNUC_PREREQ__(4, 3) || __has_attribute(__artificial__)
546#define	__gnu_inline	__attribute__((__gnu_inline__, __artificial__))
547#else
548#define	__gnu_inline	__attribute__((__gnu_inline__))
549#endif /* artificial */
550#else
551#define	__gnu_inline
552#endif
553
554/* Compiler-dependent macros that rely on FreeBSD-specific extensions. */
555#if defined(__FreeBSD_cc_version) && __FreeBSD_cc_version >= 300001 && \
556    defined(__GNUC__) && !defined(__INTEL_COMPILER)
557#define	__printf0like(fmtarg, firstvararg) \
558	    __attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
559#else
560#define	__printf0like(fmtarg, firstvararg)
561#endif
562
563#if defined(__GNUC__) || defined(__INTEL_COMPILER)
564#ifndef __INTEL_COMPILER
565#define	__strong_reference(sym,aliassym)	\
566	extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym)))
567#endif
568#ifdef __STDC__
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(sym,impl,verid)	\
579	__asm__(".symver " #impl ", " #sym "@@" #verid)
580#else
581#define	__weak_reference(sym,alias)	\
582	__asm__(".weak alias");		\
583	__asm__(".equ alias, sym")
584#define	__warn_references(sym,msg)	\
585	__asm__(".section .gnu.warning.sym"); \
586	__asm__(".asciz \"msg\"");	\
587	__asm__(".previous")
588#define	__sym_compat(sym,impl,verid)	\
589	__asm__(".symver impl, sym@verid")
590#define	__sym_default(impl,sym,verid)	\
591	__asm__(".symver impl, sym@@verid")
592#endif	/* __STDC__ */
593#endif	/* __GNUC__ || __INTEL_COMPILER */
594
595#define	__GLOBL1(sym)	__asm__(".globl " #sym)
596#define	__GLOBL(sym)	__GLOBL1(sym)
597
598#if defined(__GNUC__) || defined(__INTEL_COMPILER)
599#define	__IDSTRING(name,string)	__asm__(".ident\t\"" string "\"")
600#else
601/*
602 * The following definition might not work well if used in header files,
603 * but it should be better than nothing.  If you want a "do nothing"
604 * version, then it should generate some harmless declaration, such as:
605 *    #define	__IDSTRING(name,string)	struct __hack
606 */
607#define	__IDSTRING(name,string)	static const char name[] __unused = string
608#endif
609
610/*
611 * Embed the rcs id of a source file in the resulting library.  Note that in
612 * more recent ELF binutils, we use .ident allowing the ID to be stripped.
613 * Usage:
614 *	__FBSDID("$FreeBSD$");
615 */
616#ifndef	__FBSDID
617#if !defined(lint) && !defined(STRIP_FBSDID)
618#define	__FBSDID(s)	__IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
619#else
620#define	__FBSDID(s)	struct __hack
621#endif
622#endif
623
624#ifndef	__RCSID
625#ifndef	NO__RCSID
626#define	__RCSID(s)	__IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
627#else
628#define	__RCSID(s)	struct __hack
629#endif
630#endif
631
632#ifndef	__RCSID_SOURCE
633#ifndef	NO__RCSID_SOURCE
634#define	__RCSID_SOURCE(s)	__IDSTRING(__CONCAT(__rcsid_source_,__LINE__),s)
635#else
636#define	__RCSID_SOURCE(s)	struct __hack
637#endif
638#endif
639
640#ifndef	__SCCSID
641#ifndef	NO__SCCSID
642#define	__SCCSID(s)	__IDSTRING(__CONCAT(__sccsid_,__LINE__),s)
643#else
644#define	__SCCSID(s)	struct __hack
645#endif
646#endif
647
648#ifndef	__COPYRIGHT
649#ifndef	NO__COPYRIGHT
650#define	__COPYRIGHT(s)	__IDSTRING(__CONCAT(__copyright_,__LINE__),s)
651#else
652#define	__COPYRIGHT(s)	struct __hack
653#endif
654#endif
655
656#ifndef	__DECONST
657#define	__DECONST(type, var)	((type)(__uintptr_t)(const void *)(var))
658#endif
659
660#ifndef	__DEVOLATILE
661#define	__DEVOLATILE(type, var)	((type)(__uintptr_t)(volatile void *)(var))
662#endif
663
664#ifndef	__DEQUALIFY
665#define	__DEQUALIFY(type, var)	((type)(__uintptr_t)(const volatile void *)(var))
666#endif
667
668/*-
669 * The following definitions are an extension of the behavior originally
670 * implemented in <sys/_posix.h>, but with a different level of granularity.
671 * POSIX.1 requires that the macros we test be defined before any standard
672 * header file is included.
673 *
674 * Here's a quick run-down of the versions:
675 *  defined(_POSIX_SOURCE)		1003.1-1988
676 *  _POSIX_C_SOURCE == 1		1003.1-1990
677 *  _POSIX_C_SOURCE == 2		1003.2-1992 C Language Binding Option
678 *  _POSIX_C_SOURCE == 199309		1003.1b-1993
679 *  _POSIX_C_SOURCE == 199506		1003.1c-1995, 1003.1i-1995,
680 *					and the omnibus ISO/IEC 9945-1: 1996
681 *  _POSIX_C_SOURCE == 200112		1003.1-2001
682 *  _POSIX_C_SOURCE == 200809		1003.1-2008
683 *
684 * In addition, the X/Open Portability Guide, which is now the Single UNIX
685 * Specification, defines a feature-test macro which indicates the version of
686 * that specification, and which subsumes _POSIX_C_SOURCE.
687 *
688 * Our macros begin with two underscores to avoid namespace screwage.
689 */
690
691/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */
692#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1
693#undef _POSIX_C_SOURCE		/* Probably illegal, but beyond caring now. */
694#define	_POSIX_C_SOURCE		199009
695#endif
696
697/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */
698#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2
699#undef _POSIX_C_SOURCE
700#define	_POSIX_C_SOURCE		199209
701#endif
702
703/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
704#ifdef _XOPEN_SOURCE
705#if _XOPEN_SOURCE - 0 >= 700
706#define	__XSI_VISIBLE		700
707#undef _POSIX_C_SOURCE
708#define	_POSIX_C_SOURCE		200809
709#elif _XOPEN_SOURCE - 0 >= 600
710#define	__XSI_VISIBLE		600
711#undef _POSIX_C_SOURCE
712#define	_POSIX_C_SOURCE		200112
713#elif _XOPEN_SOURCE - 0 >= 500
714#define	__XSI_VISIBLE		500
715#undef _POSIX_C_SOURCE
716#define	_POSIX_C_SOURCE		199506
717#endif
718#endif
719
720/*
721 * Deal with all versions of POSIX.  The ordering relative to the tests above is
722 * important.
723 */
724#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
725#define	_POSIX_C_SOURCE		198808
726#endif
727#ifdef _POSIX_C_SOURCE
728#if _POSIX_C_SOURCE >= 200809
729#define	__POSIX_VISIBLE		200809
730#define	__ISO_C_VISIBLE		1999
731#elif _POSIX_C_SOURCE >= 200112
732#define	__POSIX_VISIBLE		200112
733#define	__ISO_C_VISIBLE		1999
734#elif _POSIX_C_SOURCE >= 199506
735#define	__POSIX_VISIBLE		199506
736#define	__ISO_C_VISIBLE		1990
737#elif _POSIX_C_SOURCE >= 199309
738#define	__POSIX_VISIBLE		199309
739#define	__ISO_C_VISIBLE		1990
740#elif _POSIX_C_SOURCE >= 199209
741#define	__POSIX_VISIBLE		199209
742#define	__ISO_C_VISIBLE		1990
743#elif _POSIX_C_SOURCE >= 199009
744#define	__POSIX_VISIBLE		199009
745#define	__ISO_C_VISIBLE		1990
746#else
747#define	__POSIX_VISIBLE		198808
748#define	__ISO_C_VISIBLE		0
749#endif /* _POSIX_C_SOURCE */
750#else
751/*-
752 * Deal with _ANSI_SOURCE:
753 * If it is defined, and no other compilation environment is explicitly
754 * requested, then define our internal feature-test macros to zero.  This
755 * makes no difference to the preprocessor (undefined symbols in preprocessing
756 * expressions are defined to have value zero), but makes it more convenient for
757 * a test program to print out the values.
758 *
759 * If a program mistakenly defines _ANSI_SOURCE and some other macro such as
760 * _POSIX_C_SOURCE, we will assume that it wants the broader compilation
761 * environment (and in fact we will never get here).
762 */
763#if defined(_ANSI_SOURCE)	/* Hide almost everything. */
764#define	__POSIX_VISIBLE		0
765#define	__XSI_VISIBLE		0
766#define	__BSD_VISIBLE		0
767#define	__ISO_C_VISIBLE		1990
768#elif defined(_C99_SOURCE)	/* Localism to specify strict C99 env. */
769#define	__POSIX_VISIBLE		0
770#define	__XSI_VISIBLE		0
771#define	__BSD_VISIBLE		0
772#define	__ISO_C_VISIBLE		1999
773#elif defined(_C11_SOURCE)	/* Localism to specify strict C11 env. */
774#define	__POSIX_VISIBLE		0
775#define	__XSI_VISIBLE		0
776#define	__BSD_VISIBLE		0
777#define	__ISO_C_VISIBLE		2011
778#else				/* Default environment: show everything. */
779#define	__POSIX_VISIBLE		200809
780#define	__XSI_VISIBLE		700
781#define	__BSD_VISIBLE		1
782#define	__ISO_C_VISIBLE		2011
783#endif
784#endif
785
786//#if defined(__mips) || defined(__powerpc64__) || defined(__riscv__)
787#define	__NO_TLS 1
788//#endif
789
790/*
791 * Old versions of GCC use non-standard ARM arch symbols; acle-compat.h
792 * translates them to __ARM_ARCH and the modern feature symbols defined by ARM.
793 */
794#if defined(__arm__) && !defined(__ARM_ARCH)
795#include <machine/acle-compat.h>
796#endif
797
798/*
799 * Type Safety Checking
800 *
801 * Clang provides additional attributes to enable checking type safety
802 * properties that cannot be enforced by the C type system.
803 */
804
805#if __has_attribute(__argument_with_type_tag__) && \
806    __has_attribute(__type_tag_for_datatype__) && !defined(lint)
807#define	__arg_type_tag(arg_kind, arg_idx, type_tag_idx) \
808	    __attribute__((__argument_with_type_tag__(arg_kind, arg_idx, type_tag_idx)))
809#define	__datatype_type_tag(kind, type) \
810	    __attribute__((__type_tag_for_datatype__(kind, type)))
811#else
812#define	__arg_type_tag(arg_kind, arg_idx, type_tag_idx)
813#define	__datatype_type_tag(kind, type)
814#endif
815
816/*
817 * Lock annotations.
818 *
819 * Clang provides support for doing basic thread-safety tests at
820 * compile-time, by marking which locks will/should be held when
821 * entering/leaving a functions.
822 *
823 * Furthermore, it is also possible to annotate variables and structure
824 * members to enforce that they are only accessed when certain locks are
825 * held.
826 */
827
828#if __has_extension(c_thread_safety_attributes)
829#define	__lock_annotate(x)	__attribute__((x))
830#else
831#define	__lock_annotate(x)
832#endif
833
834/* Structure implements a lock. */
835#define	__lockable		__lock_annotate(lockable)
836
837/* Function acquires an exclusive or shared lock. */
838#define	__locks_exclusive(...) \
839	__lock_annotate(exclusive_lock_function(__VA_ARGS__))
840#define	__locks_shared(...) \
841	__lock_annotate(shared_lock_function(__VA_ARGS__))
842
843/* Function attempts to acquire an exclusive or shared lock. */
844#define	__trylocks_exclusive(...) \
845	__lock_annotate(exclusive_trylock_function(__VA_ARGS__))
846#define	__trylocks_shared(...) \
847	__lock_annotate(shared_trylock_function(__VA_ARGS__))
848
849/* Function releases a lock. */
850#define	__unlocks(...)		__lock_annotate(unlock_function(__VA_ARGS__))
851
852/* Function asserts that an exclusive or shared lock is held. */
853#define	__asserts_exclusive(...) \
854	__lock_annotate(assert_exclusive_lock(__VA_ARGS__))
855#define	__asserts_shared(...) \
856	__lock_annotate(assert_shared_lock(__VA_ARGS__))
857
858/* Function requires that an exclusive or shared lock is or is not held. */
859#define	__requires_exclusive(...) \
860	__lock_annotate(exclusive_locks_required(__VA_ARGS__))
861#define	__requires_shared(...) \
862	__lock_annotate(shared_locks_required(__VA_ARGS__))
863#define	__requires_unlocked(...) \
864	__lock_annotate(locks_excluded(__VA_ARGS__))
865
866/* Function should not be analyzed. */
867#define	__no_lock_analysis	__lock_annotate(no_thread_safety_analysis)
868
869/* Guard variables and structure members by lock. */
870#define	__guarded_by(x)		__lock_annotate(guarded_by(x))
871#define	__pt_guarded_by(x)	__lock_annotate(pt_guarded_by(x))
872
873#endif /* !_SYS_CDEFS_H_ */
874