1 /* libc/sys/linux/sys/cdefs.h - Helper macros for K&R vs. ANSI C compat. */
2 
3 /* Written 2000 by Werner Almesberger */
4 
5 /*-
6  * SPDX-License-Identifier: BSD-3-Clause
7  *
8  * Copyright (c) 1991, 1993
9  *	The Regents of the University of California.  All rights reserved.
10  *
11  * This code is derived from software contributed to Berkeley by
12  * Berkeley Software Design, Inc.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions
16  * are met:
17  * 1. Redistributions of source code must retain the above copyright
18  *    notice, this list of conditions and the following disclaimer.
19  * 2. Redistributions in binary form must reproduce the above copyright
20  *    notice, this list of conditions and the following disclaimer in the
21  *    documentation and/or other materials provided with the distribution.
22  * 3. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *	@(#)cdefs.h	8.8 (Berkeley) 1/9/95
39  * $FreeBSD$
40  */
41 
42 #ifndef	_SYS_CDEFS_H_
43 #define	_SYS_CDEFS_H_
44 
45 #include <sys/config.h>
46 #include <machine/_default_types.h>
47 
48 #define __PMT(args)	args
49 #define __DOTS    	, ...
50 #define __THROW
51 
52 #ifdef __GNUC__
53 # define __ASMNAME(cname)  __XSTRING (__USER_LABEL_PREFIX__) cname
54 # define _ASMNAME(cname)   __asm__(__ASMNAME(cname))
55 #else
56 # define _ASMNAME(cname)
57 #endif
58 
59 #define __ptr_t void *
60 #define __long_double_t  long double
61 
62 #define __attribute_malloc__
63 #define __attribute_pure__
64 #define __attribute_format_strfmon__(a,b)
65 #define __flexarr      [0]
66 
67 #ifndef __BOUNDED_POINTERS__
68 # define __bounded      /* nothing */
69 # define __unbounded    /* nothing */
70 # define __ptrvalue     /* nothing */
71 #endif
72 
73 /*
74  * Testing against Clang-specific extensions.
75  */
76 #ifndef	__has_attribute
77 #define	__has_attribute(x)	0
78 #endif
79 #ifndef	__has_extension
80 #define	__has_extension		__has_feature
81 #endif
82 #ifndef	__has_feature
83 #define	__has_feature(x)	0
84 #endif
85 #ifndef	__has_include
86 #define	__has_include(x)	0
87 #endif
88 #ifndef	__has_builtin
89 #define	__has_builtin(x)	0
90 #endif
91 
92 #if defined(__cplusplus)
93 #define	__BEGIN_DECLS	extern "C" {
94 #define	__END_DECLS	}
95 #else
96 #define	__BEGIN_DECLS
97 #define	__END_DECLS
98 #endif
99 
100 /*  ISO C++.  */
101 
102 #ifdef __cplusplus
103 #if !(defined(_BEGIN_STD_C) && defined(_END_STD_C))
104 #ifdef _HAVE_STD_CXX
105 #define _BEGIN_STD_C namespace std { extern "C" {
106 #define _END_STD_C  } }
107 #else
108 #define _BEGIN_STD_C extern "C" {
109 #define _END_STD_C  }
110 #endif
111 #if __GNUC_PREREQ (3, 3)
112 #define _NOTHROW __attribute__ ((__nothrow__))
113 #else
114 #define _NOTHROW throw()
115 #endif
116 #endif
117 #else
118 #define _BEGIN_STD_C
119 #define _END_STD_C
120 #if __GNUC_PREREQ (3, 3)
121 #define _NOTHROW __attribute__ ((__nothrow__))
122 #else
123 #define _NOTHROW
124 #endif
125 #endif
126 
127 /**
128  * Not all compilers offer __builtin_expect (e.g. CompCert does
129  * not have it). In that case, transparently replace all
130  * occurences of that builtin with just the condition:
131  */
132 #ifndef _HAVE_BUILTIN_EXPECT
133 #define __builtin_expect(cond, exp) (cond)
134 #endif
135 
136 /*
137  * This code has been put in place to help reduce the addition of
138  * compiler specific defines in FreeBSD code.  It helps to aid in
139  * having a compiler-agnostic source tree.
140  */
141 
142 #if defined(__GNUC__)
143 
144 #if __GNUC__ >= 3
145 #define	__GNUCLIKE_ASM 3
146 #define	__GNUCLIKE_MATH_BUILTIN_CONSTANTS
147 #else
148 #define	__GNUCLIKE_ASM 2
149 #endif
150 #define	__GNUCLIKE___TYPEOF 1
151 #define	__GNUCLIKE___SECTION 1
152 
153 #define	__GNUCLIKE_CTOR_SECTION_HANDLING 1
154 
155 #define	__GNUCLIKE_BUILTIN_CONSTANT_P 1
156 
157 #if (__GNUC_MINOR__ > 95 || __GNUC__ >= 3)
158 #define	__GNUCLIKE_BUILTIN_VARARGS 1
159 #define	__GNUCLIKE_BUILTIN_STDARG 1
160 #define	__GNUCLIKE_BUILTIN_VAALIST 1
161 #endif
162 
163 #define	__GNUC_VA_LIST_COMPATIBILITY 1
164 
165 /*
166  * Compiler memory barriers, specific to gcc and clang.
167  */
168 #define	__compiler_membar()	__asm __volatile(" " : : : "memory")
169 
170 #define	__GNUCLIKE_BUILTIN_NEXT_ARG 1
171 #define	__GNUCLIKE_MATH_BUILTIN_RELOPS
172 
173 #define	__GNUCLIKE_BUILTIN_MEMCPY 1
174 
175 /* XXX: if __GNUC__ >= 2: not tested everywhere originally, where replaced */
176 #define	__CC_SUPPORTS_INLINE 1
177 #define	__CC_SUPPORTS___INLINE 1
178 #define	__CC_SUPPORTS___INLINE__ 1
179 
180 #define	__CC_SUPPORTS___FUNC__ 1
181 #define	__CC_SUPPORTS_WARNING 1
182 
183 #define	__CC_SUPPORTS_VARADIC_XXX 1 /* see varargs.h */
184 
185 #define	__CC_SUPPORTS_DYNAMIC_ARRAY_INIT 1
186 
187 #endif /* __GNUC__ */
188 
189 /*
190  * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
191  * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
192  * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI
193  * mode -- there must be no spaces between its arguments, and for nested
194  * __CONCAT's, all the __CONCAT's must be at the left.  __CONCAT can also
195  * concatenate double-quoted strings produced by the __STRING macro, but
196  * this only works with ANSI C.
197  *
198  * __XSTRING is like __STRING, but it expands any macros in its argument
199  * first.  It is only available with ANSI C.
200  */
201 #if defined(__STDC__) || defined(__cplusplus)
202 #define	__P(protos)	protos		/* full-blown ANSI C */
203 #define	__CONCAT1(x,y)	x ## y
204 #define	__CONCAT(x,y)	__CONCAT1(x,y)
205 #define	__STRING(x)	#x		/* stringify without expanding x */
206 #define	__XSTRING(x)	__STRING(x)	/* expand x, then stringify */
207 
208 #define	__const		const		/* define reserved names to standard */
209 #define	__signed	signed
210 #define	__volatile	volatile
211 #if defined(__cplusplus)
212 #define	__inline	inline		/* convert to C++ keyword */
213 #else
214 #if !(defined(__CC_SUPPORTS___INLINE))
215 #define	__inline			/* delete GCC keyword */
216 #endif /* ! __CC_SUPPORTS___INLINE */
217 #endif /* !__cplusplus */
218 
219 #else	/* !(__STDC__ || __cplusplus) */
220 #define	__P(protos)	()		/* traditional C preprocessor */
221 #define	__CONCAT(x,y)	x/**/y
222 #define	__STRING(x)	"x"
223 
224 #if !defined(__CC_SUPPORTS___INLINE)
225 #define	__const				/* delete pseudo-ANSI C keywords */
226 #define	__inline
227 #define	__signed
228 #define	__volatile
229 /*
230  * In non-ANSI C environments, new programs will want ANSI-only C keywords
231  * deleted from the program and old programs will want them left alone.
232  * When using a compiler other than gcc, programs using the ANSI C keywords
233  * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS.
234  * When using "gcc -traditional", we assume that this is the intent; if
235  * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone.
236  */
237 #ifndef	NO_ANSI_KEYWORDS
238 #define	const				/* delete ANSI C keywords */
239 #define	inline
240 #define	signed
241 #define	volatile
242 #endif	/* !NO_ANSI_KEYWORDS */
243 #endif	/* !__CC_SUPPORTS___INLINE */
244 #endif	/* !(__STDC__ || __cplusplus) */
245 
246 /*
247  * Compiler-dependent macros to help declare dead (non-returning) and
248  * pure (no side effects) functions, and unused variables.  They are
249  * null except for versions of gcc that are known to support the features
250  * properly (old versions of gcc-2 supported the dead and pure features
251  * in a different (wrong) way).  If we do not provide an implementation
252  * for a given compiler, let the compile fail if it is told to use
253  * a feature that we cannot live without.
254  */
255 #define	__weak_symbol	__attribute__((__weak__))
256 #if !__GNUC_PREREQ__(2, 5)
257 #define	__dead2
258 #define	__pure2
259 #define	__unused
260 #endif
261 #if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7
262 #define	__dead2		__attribute__((__noreturn__))
263 #define	__pure2		__attribute__((__const__))
264 #define	__unused
265 /* XXX Find out what to do for __packed, __aligned and __section */
266 #endif
267 #if __GNUC_PREREQ__(2, 7)
268 #define	__dead2		__attribute__((__noreturn__))
269 #define	__pure2		__attribute__((__const__))
270 #define	__unused	__attribute__((__unused__))
271 #define	__used		__attribute__((__used__))
272 #define	__packed	__attribute__((__packed__))
273 #define	__aligned(x)	__attribute__((__aligned__(x)))
274 #define	__section(x)	__attribute__((__section__(x)))
275 #endif
276 
277 #ifdef _HAVE_ALLOC_SIZE
278 #define	__alloc_size(x)	__attribute__((__alloc_size__(x)))
279 #define	__alloc_size2(n, x)	__attribute__((__alloc_size__(n, x)))
280 #else
281 #define	__alloc_size(x)
282 #define	__alloc_size2(n, x)
283 #endif
284 #if __GNUC_PREREQ__(4, 9) || __has_attribute(__alloc_align__)
285 #define	__alloc_align(x)	__attribute__((__alloc_align__(x)))
286 #else
287 #define	__alloc_align(x)
288 #endif
289 
290 #if !__GNUC_PREREQ__(2, 95)
291 #define	__alignof(x)	__offsetof(struct { char __a; x __b; }, __b)
292 #endif
293 
294 #if __GNUC_PREREQ__(4,5) || defined(__clang__)
295 #define __picolibc_deprecated(m) __attribute__((__deprecated__(m)))
296 #else
297 #define __picolibc_deprecated(m) _ATTRIBUTE(__deprecated__)
298 #endif
299 
300 /*
301  * Keywords added in C11.
302  */
303 
304 #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
305 
306 #if !__has_extension(c_alignas)
307 #if (defined(__cplusplus) && __cplusplus >= 201103L) || \
308     __has_extension(cxx_alignas)
309 #define	_Alignas(x)		alignas(x)
310 #else
311 /* XXX: Only emulates _Alignas(constant-expression); not _Alignas(type-name). */
312 #define	_Alignas(x)		__aligned(x)
313 #endif
314 #endif
315 
316 #if defined(__cplusplus) && __cplusplus >= 201103L
317 #define	_Alignof(x)		alignof(x)
318 #else
319 #define	_Alignof(x)		__alignof(x)
320 #endif
321 
322 #if !defined(__cplusplus) && !__has_extension(c_atomic) && \
323 	!__has_extension(cxx_atomic) && !__GNUC_PREREQ__(4, 7)
324 /*
325  * No native support for _Atomic(). Place object in structure to prevent
326  * most forms of direct non-atomic access.
327  */
328 #define	_Atomic(T)		struct { T volatile __val; }
329 #endif
330 
331 #if defined(__cplusplus) && __cplusplus >= 201103L
332 #define	_Noreturn		[[noreturn]]
333 #else
334 #define	_Noreturn		__dead2
335 #endif
336 
337 #if !__has_extension(c_static_assert)
338 #if (defined(__cplusplus) && __cplusplus >= 201103L) || \
339     __has_extension(cxx_static_assert)
340 #define	_Static_assert(x, y)	static_assert(x, y)
341 #elif __GNUC_PREREQ__(4,6) && !defined(__cplusplus)
342 /* Nothing, gcc 4.6 and higher has _Static_assert built-in */
343 #elif defined(__COUNTER__)
344 #define	_Static_assert(x, y)	__Static_assert(x, __COUNTER__)
345 #define	__Static_assert(x, y)	___Static_assert(x, y)
346 #define	___Static_assert(x, y)	typedef char __assert_ ## y[(x) ? 1 : -1] \
347 				__unused
348 #else
349 #define	_Static_assert(x, y)	struct __hack
350 #endif
351 #endif
352 
353 #endif /* __STDC_VERSION__ || __STDC_VERSION__ < 201112L */
354 
355 /*
356  * Emulation of C11 _Generic().  Unlike the previously defined C11
357  * keywords, it is not possible to implement this using exactly the same
358  * syntax.  Therefore implement something similar under the name
359  * __generic().  Unlike _Generic(), this macro can only distinguish
360  * between a single type, so it requires nested invocations to
361  * distinguish multiple cases.
362  *
363  * Note that the comma operator is used to force expr to decay in
364  * order to match _Generic().
365  */
366 
367 #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
368     __has_extension(c_generic_selections)
369 #define	__generic(expr, t, yes, no)					\
370 	_Generic(expr, t: yes, default: no)
371 #elif __GNUC_PREREQ__(3, 1) && !defined(__cplusplus)
372 #define	__generic(expr, t, yes, no)					\
373 	__builtin_choose_expr(						\
374 	    __builtin_types_compatible_p(__typeof((0, (expr))), t), yes, no)
375 #endif
376 
377 /*
378  * C99 Static array indices in function parameter declarations.  Syntax such as:
379  * void bar(int myArray[static 10]);
380  * is allowed in C99 but not in C++.  Define __min_size appropriately so
381  * headers using it can be compiled in either language.  Use like this:
382  * void bar(int myArray[__min_size(10)]);
383  */
384 #if !defined(__cplusplus) && \
385     (defined(__clang__) || __GNUC_PREREQ__(4, 6)) && \
386     (!defined(__STDC_VERSION__) || (__STDC_VERSION__ >= 199901))
387 #define __min_size(x)	static (x)
388 #else
389 #define __min_size(x)	(x)
390 #endif
391 
392 #if __GNUC_PREREQ__(2, 96)
393 # if __GNUC_PREREQ__(11, 0)
394 #  define       __malloc_like_with_free(_f,_a) __attribute__((__malloc__, __malloc__(_f,_a)))
395 # else
396 #  define       __malloc_like_with_free(_f,_a) __attribute__((__malloc__))
397 # endif
398 # define	__pure		__attribute__((__pure__))
399 #else
400 #define __malloc_like_with_free(free,free_arg)
401 #define	__pure
402 #endif
403 
404 #define	__malloc_like __malloc_like_with_free(free, 1)
405 
406 #ifndef __always_inline
407 #if __GNUC_PREREQ__(3, 1)
408 #define	__always_inline	__inline__ __attribute__((__always_inline__))
409 #else
410 #define	__always_inline
411 #endif
412 #endif
413 
414 #ifndef __noinline
415 #if __GNUC_PREREQ__(3, 1)
416 #define	__noinline	__attribute__ ((__noinline__))
417 #else
418 #define	__noinline
419 #endif
420 #endif
421 
422 #if defined(_HAVE_ATTRIBUTE_ALWAYS_INLINE) && defined(_HAVE_ATTRIBUTE_GNU_INLINE)
423 /*
424  * When this macro is defined, use it to declare inline versions of extern functions.
425  */
426 #define __declare_extern_inline(type) extern __inline type __attribute((gnu_inline, always_inline))
427 #endif
428 
429 #if defined(__clang__) && defined(__nonnull)
430 /* Clang has a builtin macro __nonnull for the _Nonnull qualifier */
431 #undef __nonnull
432 #endif
433 #if __GNUC_PREREQ__(3, 3)
434 #define	__nonnull(x)	__attribute__((__nonnull__ x))
435 #define	__nonnull_all	__attribute__((__nonnull__))
436 #else
437 #define	__nonnull(x)
438 #define	__nonnull_all
439 #endif
440 
441 #if __GNUC_PREREQ__(3, 4)
442 #define	__fastcall	__attribute__((__fastcall__))
443 #define	__result_use_check	__attribute__((__warn_unused_result__))
444 #else
445 #define	__fastcall
446 #define	__result_use_check
447 #endif
448 
449 #if __GNUC_PREREQ__(4, 1)
450 #define	__returns_twice	__attribute__((__returns_twice__))
451 #else
452 #define	__returns_twice
453 #endif
454 
455 #if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable)
456 #define	__unreachable()	__builtin_unreachable()
457 #else
458 #define	__unreachable()	((void)0)
459 #endif
460 
461 /* XXX: should use `#if __STDC_VERSION__ < 199901'. */
462 #if !__GNUC_PREREQ__(2, 7) && !defined(__COMPCERT__)
463 #define	__func__	NULL
464 #endif
465 
466 /*
467  * We use `__restrict' as a way to define the `restrict' type qualifier
468  * without disturbing older software that is unaware of C99 keywords.
469  * GCC also provides `__restrict' as an extension to support C99-style
470  * restricted pointers in other language modes.
471  */
472 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901
473 #define	__restrict	restrict
474 #elif !__GNUC_PREREQ__(2, 95)
475 #define	__restrict
476 #endif
477 
478 /*
479  * Additionally, we allow to use `__restrict_arr' for declaring arrays as
480  * non-overlapping per C99.  That's supported since gcc 3.1, but it's not
481  * allowed in C++.
482  */
483 #if defined(__cplusplus) || !__GNUC_PREREQ__(3, 1)
484 #define __restrict_arr
485 #elif defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
486 #define __restrict_arr       restrict
487 #else
488 #define __restrict_arr
489 #endif
490 
491 /*
492  * GNU C version 2.96 adds explicit branch prediction so that
493  * the CPU back-end can hint the processor and also so that
494  * code blocks can be reordered such that the predicted path
495  * sees a more linear flow, thus improving cache behavior, etc.
496  *
497  * The following two macros provide us with a way to utilize this
498  * compiler feature.  Use __predict_true() if you expect the expression
499  * to evaluate to true, and __predict_false() if you expect the
500  * expression to evaluate to false.
501  *
502  * A few notes about usage:
503  *
504  *	* Generally, __predict_false() error condition checks (unless
505  *	  you have some _strong_ reason to do otherwise, in which case
506  *	  document it), and/or __predict_true() `no-error' condition
507  *	  checks, assuming you want to optimize for the no-error case.
508  *
509  *	* Other than that, if you don't know the likelihood of a test
510  *	  succeeding from empirical or other `hard' evidence, don't
511  *	  make predictions.
512  *
513  *	* These are meant to be used in places that are run `a lot'.
514  *	  It is wasteful to make predictions in code that is run
515  *	  seldomly (e.g. at subsystem initialization time) as the
516  *	  basic block reordering that this affects can often generate
517  *	  larger code.
518  */
519 #if __GNUC_PREREQ__(2, 96)
520 #define	__predict_true(exp)     __builtin_expect((exp), 1)
521 #define	__predict_false(exp)    __builtin_expect((exp), 0)
522 #else
523 #define	__predict_true(exp)     (exp)
524 #define	__predict_false(exp)    (exp)
525 #endif
526 
527 #if __GNUC_PREREQ__(4, 0)
528 #define	__null_sentinel	__attribute__((__sentinel__))
529 #define	__exported	__attribute__((__visibility__("default")))
530 /* Only default visibility is supported on PE/COFF targets. */
531 #define	__hidden	__attribute__((__visibility__("hidden")))
532 #else
533 #define	__null_sentinel
534 #define	__exported
535 #define	__hidden
536 #endif
537 
538 #define __offsetof(type, field)	offsetof(type, field)
539 #define	__rangeof(type, start, end) \
540 	(__offsetof(type, end) - __offsetof(type, start))
541 
542 /*
543  * Given the pointer x to the member m of the struct s, return
544  * a pointer to the containing structure.  When using GCC, we first
545  * assign pointer x to a local variable, to check that its type is
546  * compatible with member m.
547  */
548 #if __GNUC_PREREQ__(3, 1)
549 #define	__containerof(x, s, m) ({					\
550 	const volatile __typeof(((s *)0)->m) *__x = (x);		\
551 	__DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m));\
552 })
553 #else
554 #define	__containerof(x, s, m)						\
555 	__DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m))
556 #endif
557 
558 /*
559  * Compiler-dependent macros to declare that functions take printf-like
560  * or scanf-like arguments.  They are null except for versions of gcc
561  * that are known to support the features properly (old versions of gcc-2
562  * didn't permit keeping the keywords out of the application namespace).
563  */
564 #if !__GNUC_PREREQ__(2, 7)
565 #define	__printflike(fmtarg, firstvararg)
566 #define	__scanflike(fmtarg, firstvararg)
567 #define	__format_arg(fmtarg)
568 #define	__strfmonlike(fmtarg, firstvararg)
569 #define	__strftimelike(fmtarg, firstvararg)
570 #else
571 #define	__printflike(fmtarg, firstvararg) \
572 	    __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
573 #define	__scanflike(fmtarg, firstvararg) \
574 	    __attribute__((__format__ (__scanf__, fmtarg, firstvararg)))
575 #define	__format_arg(fmtarg)	__attribute__((__format_arg__ (fmtarg)))
576 #define	__strfmonlike(fmtarg, firstvararg) \
577 	    __attribute__((__format__ (__strfmon__, fmtarg, firstvararg)))
578 #define	__strftimelike(fmtarg, firstvararg) \
579 	    __attribute__((__format__ (__strftime__, fmtarg, firstvararg)))
580 #endif
581 
582 /* Compiler-dependent macros that rely on FreeBSD-specific extensions. */
583 #if defined(__FreeBSD_cc_version) && __FreeBSD_cc_version >= 300001 && \
584     defined(__GNUC__)
585 #define	__printf0like(fmtarg, firstvararg) \
586 	    __attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
587 #else
588 #define	__printf0like(fmtarg, firstvararg)
589 #endif
590 
591 #if defined(_HAVE_ALIAS_ATTRIBUTE)
592 #define	__strong_reference(sym,aliassym)	\
593     extern __typeof (sym) aliassym __attribute__ ((__alias__ (__STRING(sym))))
594 #endif
595 
596 #if defined(_HAVE_WEAK_ATTRIBUTE) && defined(_HAVE_ALIAS_ATTRIBUTE)
597 #define	__weak_reference(sym,aliassym)	\
598     extern __typeof (sym) aliassym __attribute__ ((__weak__, __alias__ (__STRING(sym))))
599 #endif
600 
601 /*
602    Taken from glibc:
603    Add the compiler optimization to inhibit loop transformation to library
604    calls.  This is used to avoid recursive calls in memset and memmove
605    default implementations.
606 */
607 #if defined(_HAVE_CC_INHIBIT_LOOP_TO_LIBCALL)
608 # define __inhibit_loop_to_libcall \
609   __attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
610 #elif defined(_HAVE_NO_BUILTIN_ATTRIBUTE)
611 # define __inhibit_loop_to_libcall \
612     __attribute__((no_builtin))
613 #else
614 # define __inhibit_loop_to_libcall
615 #endif
616 
617 /*
618  * Tell optimizer to not add new builtin calls when optimizing a
619  * function body.
620  */
621 #if defined(_HAVE_NO_BUILTIN_ATTRIBUTE)
622 # define __inhibit_new_builtin_calls \
623     __attribute__((no_builtin))
624 #else
625 #define __inhibit_new_builtin_calls
626 #endif
627 
628 #if defined(__GNUC__)
629 #ifndef __weak_reference
630 #ifdef __ELF__
631 #ifdef __STDC__
632 #define	__weak_reference(sym,alias)	\
633 	__asm__(".weak " #alias);	\
634 	__asm__(".equ "  #alias ", " #sym)
635 #else
636 #define	__weak_reference(sym,alias)	\
637 	__asm__(".weak alias");		\
638 	__asm__(".equ alias, sym")
639 #endif
640 #elif __clang__
641 #ifdef __MACH__
642 /* Macos prefixes all C symbols with an underscore, this needs to be done manually in asm */
643 
644 /* So far I have not been able to create on Macos an exported symbol that itself
645  * is weak but aliases a strong symbol. A workaround is to make the original
646  * symbol weak and the alias symbol will automatically become weak too. */
647 /* Hint: use `nm -m obj.o` to check the symbols weak/strong on Mac */
648 #define __weak_reference(sym,alias) \
649 	__asm__(".weak_definition _" #sym); \
650 	__asm__(".globl _" #alias); \
651 	__asm__(".set _" #alias ", _" #sym)
652 #elif defined(__STDC__)
653 #define __weak_reference(sym,alias) \
654 	__asm__(".weak_reference " #alias); \
655 	__asm__(".globl " #alias); \
656 	__asm__(".set " #alias ", " #sym)
657 #else
658 #define __weak_reference(sym,alias) \
659 	__asm__(".weak_reference alias");\
660 	__asm__(".set alias, sym")
661 #endif
662 #else	/* !__ELF__ && !__clang__ */
663 #ifdef __STDC__
664 #define	__weak_reference(sym,alias)	\
665 	__asm__(".stabs \"_" #alias "\",11,0,0,0");	\
666 	__asm__(".stabs \"_" #sym "\",1,0,0,0")
667 #else
668 #define	__weak_reference(sym,alias)	\
669 	__asm__(".stabs \"_/**/alias\",11,0,0,0");	\
670 	__asm__(".stabs \"_/**/sym\",1,0,0,0")
671 #endif
672 #endif
673 #endif
674 
675 #endif	/* __GNUC__ */
676 
677 #ifndef	__DECONST
678 #define	__DECONST(type, var)	((type)(__uintptr_t)(const void *)(var))
679 #endif
680 
681 #ifndef	__DEVOLATILE
682 #define	__DEVOLATILE(type, var)	((type)(__uintptr_t)(volatile void *)(var))
683 #endif
684 
685 #ifndef	__DEQUALIFY
686 #define	__DEQUALIFY(type, var)	((type)(__uintptr_t)(const volatile void *)(var))
687 #endif
688 
689 /*
690  * Nullability qualifiers: currently only supported by Clang.
691  */
692 #if !(defined(__clang__) && __has_feature(nullability))
693 #define	_Nonnull
694 #define	_Nullable
695 #define	_Null_unspecified
696 #define	__NULLABILITY_PRAGMA_PUSH
697 #define	__NULLABILITY_PRAGMA_POP
698 #else
699 #define	__NULLABILITY_PRAGMA_PUSH _Pragma("clang diagnostic push")	\
700 	_Pragma("clang diagnostic ignored \"-Wnullability-completeness\"")
701 #define	__NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop")
702 #endif
703 
704 /*
705  * Type Safety Checking
706  *
707  * Clang provides additional attributes to enable checking type safety
708  * properties that cannot be enforced by the C type system.
709  */
710 
711 #if __has_attribute(__argument_with_type_tag__) && \
712     __has_attribute(__type_tag_for_datatype__)
713 #define	__arg_type_tag(arg_kind, arg_idx, type_tag_idx) \
714 	    __attribute__((__argument_with_type_tag__(arg_kind, arg_idx, type_tag_idx)))
715 #define	__datatype_type_tag(kind, type) \
716 	    __attribute__((__type_tag_for_datatype__(kind, type)))
717 #else
718 #define	__arg_type_tag(arg_kind, arg_idx, type_tag_idx)
719 #define	__datatype_type_tag(kind, type)
720 #endif
721 
722 /*
723  * Lock annotations.
724  *
725  * Clang provides support for doing basic thread-safety tests at
726  * compile-time, by marking which locks will/should be held when
727  * entering/leaving a functions.
728  *
729  * Furthermore, it is also possible to annotate variables and structure
730  * members to enforce that they are only accessed when certain locks are
731  * held.
732  */
733 
734 #if __has_extension(c_thread_safety_attributes)
735 #define	__lock_annotate(x)	__attribute__((x))
736 #else
737 #define	__lock_annotate(x)
738 #endif
739 
740 /* Structure implements a lock. */
741 /* FIXME: Use __lockable__, etc. to avoid colliding with user namespace macros,
742  * once clang is fixed: https://bugs.llvm.org/show_bug.cgi?id=34319 */
743 #define	__lockable		__lock_annotate(lockable)
744 
745 /* Function acquires an exclusive or shared lock. */
746 #define	__locks_exclusive(...) \
747 	__lock_annotate(exclusive_lock_function(__VA_ARGS__))
748 #define	__locks_shared(...) \
749 	__lock_annotate(shared_lock_function(__VA_ARGS__))
750 
751 /* Function attempts to acquire an exclusive or shared lock. */
752 #define	__trylocks_exclusive(...) \
753 	__lock_annotate(exclusive_trylock_function(__VA_ARGS__))
754 #define	__trylocks_shared(...) \
755 	__lock_annotate(shared_trylock_function(__VA_ARGS__))
756 
757 /* Function releases a lock. */
758 #define	__unlocks(...)		__lock_annotate(unlock_function(__VA_ARGS__))
759 
760 /* Function asserts that an exclusive or shared lock is held. */
761 #define	__asserts_exclusive(...) \
762 	__lock_annotate(assert_exclusive_lock(__VA_ARGS__))
763 #define	__asserts_shared(...) \
764 	__lock_annotate(assert_shared_lock(__VA_ARGS__))
765 
766 /* Function requires that an exclusive or shared lock is or is not held. */
767 #define	__requires_exclusive(...) \
768 	__lock_annotate(exclusive_locks_required(__VA_ARGS__))
769 #define	__requires_shared(...) \
770 	__lock_annotate(shared_locks_required(__VA_ARGS__))
771 #define	__requires_unlocked(...) \
772 	__lock_annotate(locks_excluded(__VA_ARGS__))
773 
774 /* Function should not be analyzed. */
775 #define	__no_lock_analysis	__lock_annotate(no_thread_safety_analysis)
776 
777 /*
778  * Function or variable should not be sanitized, e.g., by AddressSanitizer.
779  * GCC has the nosanitize attribute, but as a function attribute only, and
780  * warns on use as a variable attribute.
781  */
782 #if __has_attribute(no_sanitize) && defined(__clang__)
783 #ifdef _KERNEL
784 #define __nosanitizeaddress	__attribute__((no_sanitize("kernel-address")))
785 #define __nosanitizememory	__attribute__((no_sanitize("kernel-memory")))
786 #else
787 #define __nosanitizeaddress	__attribute__((no_sanitize("address")))
788 #define __nosanitizememory	__attribute__((no_sanitize("memory")))
789 #endif
790 #define __nosanitizethread	__attribute__((no_sanitize("thread")))
791 #else
792 #define __nosanitizeaddress
793 #define __nosanitizememory
794 #define __nosanitizethread
795 #endif
796 
797 /*
798  * fall-through case statement annotations
799  */
800 #if __cplusplus >= 201703L || __STDC_VERSION__ > 201710L
801 /* Standard C++17/C23 attribute */
802 #define __PICOLIBC_FALLTHROUGH [[fallthrough]]
803 #elif __has_attribute(fallthrough)
804 /* Non-standard but supported by at least gcc and clang */
805 #define __PICOLIBC_FALLTHROUGH __attribute__((fallthrough))
806 #else
807 #define __PICOLIBC_FALLTHROUGH do { } while(0)
808 #endif
809 
810 /* Guard variables and structure members by lock. */
811 #define	__guarded_by(x)		__lock_annotate(guarded_by(x))
812 #define	__pt_guarded_by(x)	__lock_annotate(pt_guarded_by(x))
813 
814 /* Alignment builtins for better type checking and improved code generation. */
815 /* Provide fallback versions for other compilers (GCC/Clang < 10): */
816 #if !__has_builtin(__builtin_is_aligned)
817 #define __builtin_is_aligned(x, align)	\
818 	(((__uintptr_t)x & ((align) - 1)) == 0)
819 #endif
820 #if !__has_builtin(__builtin_align_up)
821 #define __builtin_align_up(x, align)	\
822 	((__typeof__(x))(((__uintptr_t)(x)+((align)-1))&(~((align)-1))))
823 #endif
824 #if !__has_builtin(__builtin_align_down)
825 #define __builtin_align_down(x, align)	\
826 	((__typeof__(x))((x)&(~((align)-1))))
827 #endif
828 
829 #define __align_up(x, y) __builtin_align_up(x, y)
830 #define __align_down(x, y) __builtin_align_down(x, y)
831 #define __is_aligned(x, y) __builtin_is_aligned(x, y)
832 
833 #ifndef _LONG_DOUBLE
834 #define _LONG_DOUBLE long double
835 #endif
836 
837 /* Support gcc's __attribute__ facility.  */
838 
839 #ifdef __GNUC__
840 #define _ATTRIBUTE(attrs) __attribute__ (attrs)
841 #else
842 #define _ATTRIBUTE(attrs)
843 #endif
844 
845 /*  The traditional meaning of 'extern inline' for GCC is not
846   to emit the function body unless the address is explicitly
847   taken.  However this behaviour is changing to match the C99
848   standard, which uses 'extern inline' to indicate that the
849   function body *must* be emitted.  Likewise, a function declared
850   without either 'extern' or 'static' defaults to extern linkage
851   (C99 6.2.2p5), and the compiler may choose whether to use the
852   inline version or call the extern linkage version (6.7.4p6).
853   If we are using GCC, but do not have the new behaviour, we need
854   to use extern inline; if we are using a new GCC with the
855   C99-compatible behaviour, or a non-GCC compiler (which we will
856   have to hope is C99, since there is no other way to achieve the
857   effect of omitting the function if it isn't referenced) we use
858   'static inline', which c99 defines to mean more-or-less the same
859   as the Gnu C 'extern inline'.  */
860 #if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__)
861 /* We're using GCC, but without the new C99-compatible behaviour.  */
862 #define _ELIDABLE_INLINE extern __inline__ _ATTRIBUTE ((__always_inline__))
863 #else
864 /* We're using GCC in C99 mode, or an unknown compiler which
865   we just have to hope obeys the C99 semantics of inline.  */
866 #define _ELIDABLE_INLINE static __inline__
867 #endif
868 
869 #if __GNUC_PREREQ (3, 1)
870 #define _NOINLINE		__attribute__ ((__noinline__))
871 #define _NOINLINE_STATIC	_NOINLINE static
872 #else
873 /* On non-GNU compilers and GCC prior to version 3.1 the compiler can't be
874    trusted not to inline if it is static. */
875 #define _NOINLINE
876 #define _NOINLINE_STATIC
877 #endif
878 
879 #endif /* !_SYS_CDEFS_H_ */
880