xref: /freebsd-src/tools/build/cross-build/include/common/sys/cdefs.h (revision 881ec81372e0748f2869fe6c18e909afa8304e7a)
1d1d32c3dSAlex Richardson /*-
2d1d32c3dSAlex Richardson  * SPDX-License-Identifier: BSD-2-Clause
3d1d32c3dSAlex Richardson  *
4d1d32c3dSAlex Richardson  * Copyright 2018-2020 Alex Richardson <arichardson@FreeBSD.org>
5d1d32c3dSAlex Richardson  *
6d1d32c3dSAlex Richardson  * This software was developed by SRI International and the University of
7d1d32c3dSAlex Richardson  * Cambridge Computer Laboratory (Department of Computer Science and
8d1d32c3dSAlex Richardson  * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
9d1d32c3dSAlex Richardson  * DARPA SSITH research programme.
10d1d32c3dSAlex Richardson  *
11d1d32c3dSAlex Richardson  * This software was developed by SRI International and the University of
12d1d32c3dSAlex Richardson  * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
13d1d32c3dSAlex Richardson  * ("CTSRD"), as part of the DARPA CRASH research programme.
14d1d32c3dSAlex Richardson  *
15d1d32c3dSAlex Richardson  * Redistribution and use in source and binary forms, with or without
16d1d32c3dSAlex Richardson  * modification, are permitted provided that the following conditions
17d1d32c3dSAlex Richardson  * are met:
18d1d32c3dSAlex Richardson  * 1. Redistributions of source code must retain the above copyright
19d1d32c3dSAlex Richardson  *    notice, this list of conditions and the following disclaimer.
20d1d32c3dSAlex Richardson  * 2. Redistributions in binary form must reproduce the above copyright
21d1d32c3dSAlex Richardson  *    notice, this list of conditions and the following disclaimer in the
22d1d32c3dSAlex Richardson  *    documentation and/or other materials provided with the distribution.
23d1d32c3dSAlex Richardson  *
24d1d32c3dSAlex Richardson  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
25d1d32c3dSAlex Richardson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26d1d32c3dSAlex Richardson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27d1d32c3dSAlex Richardson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
28d1d32c3dSAlex Richardson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29d1d32c3dSAlex Richardson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30d1d32c3dSAlex Richardson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31d1d32c3dSAlex Richardson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32d1d32c3dSAlex Richardson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33d1d32c3dSAlex Richardson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34d1d32c3dSAlex Richardson  * SUCH DAMAGE.
35d1d32c3dSAlex Richardson  */
36d1d32c3dSAlex Richardson #pragma once
37d1d32c3dSAlex Richardson /* musl libc does not provide a sys/cdefs.h header */
38d1d32c3dSAlex Richardson #if __has_include_next(<sys/cdefs.h>)
39d1d32c3dSAlex Richardson #include_next <sys/cdefs.h>
40d1d32c3dSAlex Richardson #else
41d1d32c3dSAlex Richardson /* No sys/cdefs.h header exists so we have to provide some basic macros */
42d1d32c3dSAlex Richardson #ifdef __cplusplus
43d1d32c3dSAlex Richardson #define __BEGIN_DECLS extern "C" {
44d1d32c3dSAlex Richardson #define __END_DECLS }
45d1d32c3dSAlex Richardson #else
46d1d32c3dSAlex Richardson #define __BEGIN_DECLS
47d1d32c3dSAlex Richardson #define __END_DECLS
48d1d32c3dSAlex Richardson #endif
49d1d32c3dSAlex Richardson 
50d1d32c3dSAlex Richardson #endif
51d1d32c3dSAlex Richardson 
52d1d32c3dSAlex Richardson #ifndef __FBSDID
53d1d32c3dSAlex Richardson #define __FBSDID(id)
54d1d32c3dSAlex Richardson #endif
55d1d32c3dSAlex Richardson 
56d1d32c3dSAlex Richardson #ifndef __IDSTRING
57d1d32c3dSAlex Richardson #define __IDSTRING(name, string)
58d1d32c3dSAlex Richardson #endif
59d1d32c3dSAlex Richardson 
60d1d32c3dSAlex Richardson #ifndef __pure
61d1d32c3dSAlex Richardson #define __pure __attribute__((__pure__))
62d1d32c3dSAlex Richardson #endif
63d1d32c3dSAlex Richardson #ifndef __packed
64d1d32c3dSAlex Richardson #define __packed __attribute__((__packed__))
65d1d32c3dSAlex Richardson #endif
66d1d32c3dSAlex Richardson #ifndef __dead2
67d1d32c3dSAlex Richardson #define __dead2 __attribute__((__noreturn__))
68d1d32c3dSAlex Richardson #endif
69d1d32c3dSAlex Richardson #ifndef __pure2
70d1d32c3dSAlex Richardson #define __pure2 __attribute__((__const__))
71d1d32c3dSAlex Richardson #endif
72d1d32c3dSAlex Richardson #ifndef __used
73d1d32c3dSAlex Richardson #define __used __attribute__((__used__))
74d1d32c3dSAlex Richardson #endif
75d1d32c3dSAlex Richardson #ifndef __aligned
76d1d32c3dSAlex Richardson #define __aligned(x) __attribute__((__aligned__(x)))
77d1d32c3dSAlex Richardson #endif
78d1d32c3dSAlex Richardson #ifndef __section
79d1d32c3dSAlex Richardson #define __section(x) __attribute__((__section__(x)))
80d1d32c3dSAlex Richardson #endif
81d1d32c3dSAlex Richardson 
82d1d32c3dSAlex Richardson #ifndef __alloc_size
83d1d32c3dSAlex Richardson #define __alloc_size(...) __attribute__((__alloc_size__(__VA_ARGS__)))
84d1d32c3dSAlex Richardson #endif
85d1d32c3dSAlex Richardson #ifndef __alloc_size2
86d1d32c3dSAlex Richardson #define __alloc_size2(n, x) __attribute__((__alloc_size__(n, x)))
87d1d32c3dSAlex Richardson #endif
88d1d32c3dSAlex Richardson #ifndef __alloc_align
89d1d32c3dSAlex Richardson #define __alloc_align(x) __attribute__((__alloc_align__(x)))
90d1d32c3dSAlex Richardson #endif
91d1d32c3dSAlex Richardson #ifndef __result_use_check
92d1d32c3dSAlex Richardson #define __result_use_check __attribute__((__warn_unused_result__))
93d1d32c3dSAlex Richardson #endif
94d1d32c3dSAlex Richardson #ifndef __printflike
95d1d32c3dSAlex Richardson #define __printflike(fmtarg, firstvararg) \
96d1d32c3dSAlex Richardson 	__attribute__((__format__(__printf__, fmtarg, firstvararg)))
97d1d32c3dSAlex Richardson #endif
98d1d32c3dSAlex Richardson #ifndef __printf0like
99d1d32c3dSAlex Richardson #define __printf0like(fmtarg, firstvararg) \
100d1d32c3dSAlex Richardson 	__attribute__((__format__(__printf0__, fmtarg, firstvararg)))
101d1d32c3dSAlex Richardson #endif
102d1d32c3dSAlex Richardson 
103d1d32c3dSAlex Richardson #ifndef __predict_true
104d1d32c3dSAlex Richardson #define __predict_true(exp) __builtin_expect((exp), 1)
105d1d32c3dSAlex Richardson #endif
106d1d32c3dSAlex Richardson #ifndef __predict_false
107d1d32c3dSAlex Richardson #define __predict_false(exp) __builtin_expect((exp), 0)
108d1d32c3dSAlex Richardson #endif
109d1d32c3dSAlex Richardson 
110d752d10eSJessica Clarke #ifndef __weak_symbol
111d752d10eSJessica Clarke #define __weak_symbol __attribute__((__weak__))
112d752d10eSJessica Clarke #endif
113d1d32c3dSAlex Richardson #ifndef __weak_reference
114d1d32c3dSAlex Richardson #ifdef __ELF__
115d1d32c3dSAlex Richardson #define __weak_reference(sym, alias) \
116d1d32c3dSAlex Richardson 	__asm__(".weak " #alias);    \
117d1d32c3dSAlex Richardson 	__asm__(".equ " #alias ", " #sym)
118d1d32c3dSAlex Richardson #else
119d1d32c3dSAlex Richardson #define __weak_reference(sym, alias) \
120d1d32c3dSAlex Richardson 	static int alias() __attribute__((weakref(#sym)));
121d1d32c3dSAlex Richardson #endif
122d1d32c3dSAlex Richardson #endif
123d1d32c3dSAlex Richardson 
124*881ec813SJessica Clarke #ifndef __WEAK
125*881ec813SJessica Clarke #ifdef __ELF__
126*881ec813SJessica Clarke #define	__WEAK(sym)	__asm__(".weak " __XSTRING(sym))
127*881ec813SJessica Clarke #endif
128*881ec813SJessica Clarke #endif
129*881ec813SJessica Clarke 
130d1d32c3dSAlex Richardson /* Some files built as part of the bootstrap libegacy use these macros, but
131d1d32c3dSAlex Richardson  * since we aren't actually building libc.so, we can defined them to be empty */
132d1d32c3dSAlex Richardson #ifndef __sym_compat
133d1d32c3dSAlex Richardson #define __sym_compat(sym, impl, verid) /* not needed for bootstrapping */
134d1d32c3dSAlex Richardson #endif
135d1d32c3dSAlex Richardson #ifndef __sym_default
136d1d32c3dSAlex Richardson #define __sym_default(sym, impl, verid) /* not needed for bootstrapping */
137d1d32c3dSAlex Richardson #endif
138d1d32c3dSAlex Richardson #ifndef __sym_default
139d1d32c3dSAlex Richardson #define __warn_references(sym, msg) /* not needed for bootstrapping */
140d1d32c3dSAlex Richardson #endif
141d1d32c3dSAlex Richardson 
142d1d32c3dSAlex Richardson #ifndef __malloc_like
143d1d32c3dSAlex Richardson #define __malloc_like __attribute__((__malloc__))
144d1d32c3dSAlex Richardson #endif
145d1d32c3dSAlex Richardson 
146d1d32c3dSAlex Richardson #ifndef __min_size
147d1d32c3dSAlex Richardson #if !defined(__cplusplus)
148d1d32c3dSAlex Richardson #define __min_size(x) static(x)
149d1d32c3dSAlex Richardson #else
150d1d32c3dSAlex Richardson #define __min_size(x) (x)
151d1d32c3dSAlex Richardson #endif
152d1d32c3dSAlex Richardson #endif
153d1d32c3dSAlex Richardson 
154d1d32c3dSAlex Richardson #ifndef __unused
155d1d32c3dSAlex Richardson #define __unused __attribute__((unused))
156d1d32c3dSAlex Richardson #endif
157d1d32c3dSAlex Richardson #define __format_arg(fmtarg) __attribute__((__format_arg__(fmtarg)))
158d1d32c3dSAlex Richardson 
159d1d32c3dSAlex Richardson #ifndef __exported
160d1d32c3dSAlex Richardson #define __exported __attribute__((__visibility__("default")))
161d1d32c3dSAlex Richardson #endif
162d1d32c3dSAlex Richardson #ifndef __hidden
163d1d32c3dSAlex Richardson #define __hidden __attribute__((__visibility__("hidden")))
164d1d32c3dSAlex Richardson #endif
165d1d32c3dSAlex Richardson 
166d1d32c3dSAlex Richardson #ifndef __unreachable
167d1d32c3dSAlex Richardson #define __unreachable() __builtin_unreachable()
168d1d32c3dSAlex Richardson #endif
169d1d32c3dSAlex Richardson 
170d1d32c3dSAlex Richardson #ifndef __clang__
171d1d32c3dSAlex Richardson /* GCC doesn't like the printf0 format specifier. Clang treats it the same as
172d1d32c3dSAlex Richardson  * printf so add the compatibility macro here. */
173d1d32c3dSAlex Richardson #define __printf0__ __printf__
174d1d32c3dSAlex Richardson #endif
175d1d32c3dSAlex Richardson 
176d1d32c3dSAlex Richardson /* On MacOS __CONCAT is defined as x ## y, which won't expand macros */
177d1d32c3dSAlex Richardson #undef __CONCAT
178d1d32c3dSAlex Richardson #define __CONCAT1(x, y) x##y
179d1d32c3dSAlex Richardson #define __CONCAT(x, y) __CONCAT1(x, y)
180d1d32c3dSAlex Richardson 
181d1d32c3dSAlex Richardson #ifndef __STRING
182d1d32c3dSAlex Richardson #define __STRING(x) #x /* stringify without expanding x */
183d1d32c3dSAlex Richardson #endif
184d1d32c3dSAlex Richardson #ifndef __XSTRING
185d1d32c3dSAlex Richardson #define __XSTRING(x) __STRING(x) /* expand x, then stringify */
186d1d32c3dSAlex Richardson #endif
187d1d32c3dSAlex Richardson 
188d1d32c3dSAlex Richardson #ifndef __has_feature
189d1d32c3dSAlex Richardson #define __has_feature(...) 0
190d1d32c3dSAlex Richardson #endif
191d1d32c3dSAlex Richardson 
192d1d32c3dSAlex Richardson #ifndef __has_builtin
193d1d32c3dSAlex Richardson #define __has_builtin(...) 0
194d1d32c3dSAlex Richardson #endif
195d1d32c3dSAlex Richardson 
196d1d32c3dSAlex Richardson /*
197d1d32c3dSAlex Richardson  * Nullability qualifiers: currently only supported by Clang.
198d1d32c3dSAlex Richardson  */
199d1d32c3dSAlex Richardson #if !(defined(__clang__) && __has_feature(nullability))
200d1d32c3dSAlex Richardson #define _Nonnull
201d1d32c3dSAlex Richardson #define _Nullable
202d1d32c3dSAlex Richardson #define _Null_unspecified
203d1d32c3dSAlex Richardson #define __NULLABILITY_PRAGMA_PUSH
204d1d32c3dSAlex Richardson #define __NULLABILITY_PRAGMA_POP
205d1d32c3dSAlex Richardson #else
206d1d32c3dSAlex Richardson #define __NULLABILITY_PRAGMA_PUSH        \
207d1d32c3dSAlex Richardson 	_Pragma("clang diagnostic push") \
208d1d32c3dSAlex Richardson 	    _Pragma("clang diagnostic ignored \"-Wnullability-completeness\"")
209d1d32c3dSAlex Richardson #define __NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop")
210d1d32c3dSAlex Richardson #endif
211d1d32c3dSAlex Richardson 
212d1d32c3dSAlex Richardson #ifndef __offsetof
213d1d32c3dSAlex Richardson #define __offsetof(type, field) __builtin_offsetof(type, field)
214d1d32c3dSAlex Richardson #endif
215d1d32c3dSAlex Richardson 
216d1d32c3dSAlex Richardson #define __rangeof(type, start, end) \
217d1d32c3dSAlex Richardson 	(__offsetof(type, end) - __offsetof(type, start))
218d1d32c3dSAlex Richardson 
219d1d32c3dSAlex Richardson #ifndef __containerof
220d1d32c3dSAlex Richardson #define __containerof(x, s, m)                                           \
221d1d32c3dSAlex Richardson 	({                                                               \
222d1d32c3dSAlex Richardson 		const volatile __typeof(((s *)0)->m) *__x = (x);         \
223d1d32c3dSAlex Richardson 		__DEQUALIFY(                                             \
224d1d32c3dSAlex Richardson 		    s *, (const volatile char *)__x - __offsetof(s, m)); \
225d1d32c3dSAlex Richardson 	})
226d1d32c3dSAlex Richardson #endif
227d1d32c3dSAlex Richardson 
228d1d32c3dSAlex Richardson #ifndef __RCSID
229d1d32c3dSAlex Richardson #define __RCSID(x)
230d1d32c3dSAlex Richardson #endif
231d1d32c3dSAlex Richardson #ifndef __FBSDID
232d1d32c3dSAlex Richardson #define __FBSDID(x)
233d1d32c3dSAlex Richardson #endif
234d1d32c3dSAlex Richardson #ifndef __RCSID
235d1d32c3dSAlex Richardson #define __RCSID(x)
236d1d32c3dSAlex Richardson #endif
237d1d32c3dSAlex Richardson #ifndef __RCSID_SOURCE
238d1d32c3dSAlex Richardson #define __RCSID_SOURCE(x)
239d1d32c3dSAlex Richardson #endif
240d1d32c3dSAlex Richardson #ifndef __SCCSID
241d1d32c3dSAlex Richardson #define __SCCSID(x)
242d1d32c3dSAlex Richardson #endif
243d1d32c3dSAlex Richardson #ifndef __COPYRIGHT
244d1d32c3dSAlex Richardson #define __COPYRIGHT(x)
245d1d32c3dSAlex Richardson #endif
246d1d32c3dSAlex Richardson #ifndef __DECONST
247d1d32c3dSAlex Richardson #define __DECONST(type, var) ((type)(__uintptr_t)(const void *)(var))
248d1d32c3dSAlex Richardson #endif
249d1d32c3dSAlex Richardson 
250d1d32c3dSAlex Richardson #ifndef __DEVOLATILE
251d1d32c3dSAlex Richardson #define __DEVOLATILE(type, var) ((type)(__uintptr_t)(volatile void *)(var))
252d1d32c3dSAlex Richardson #endif
253d1d32c3dSAlex Richardson 
254d1d32c3dSAlex Richardson #ifndef __DEQUALIFY
255d1d32c3dSAlex Richardson #define __DEQUALIFY(type, var) ((type)(__uintptr_t)(const volatile void *)(var))
256d1d32c3dSAlex Richardson #endif
25779e02149SAlex Richardson 
258*881ec813SJessica Clarke #ifndef __nosanitizeaddress
259*881ec813SJessica Clarke #if __has_attribute(no_sanitize) && defined(__clang__)
260*881ec813SJessica Clarke #define __nosanitizeaddress	__attribute__((no_sanitize("address")))
261*881ec813SJessica Clarke #else
262*881ec813SJessica Clarke #define __nosanitizeaddress
263*881ec813SJessica Clarke #endif
264*881ec813SJessica Clarke #endif
26579e02149SAlex Richardson 
26679e02149SAlex Richardson /* Expose all declarations when using FreeBSD headers */
26779e02149SAlex Richardson #define	__POSIX_VISIBLE		200809
26879e02149SAlex Richardson #define	__XSI_VISIBLE		700
26979e02149SAlex Richardson #define	__BSD_VISIBLE		1
27079e02149SAlex Richardson #define	__ISO_C_VISIBLE		2011
27179e02149SAlex Richardson #define	__EXT1_VISIBLE		1
27294d9439bSJose Luis Duran 
27394d9439bSJose Luis Duran /* Alignment builtins for better type checking and improved code generation. */
27494d9439bSJose Luis Duran /* Provide fallback versions for other compilers (GCC/Clang < 10): */
27594d9439bSJose Luis Duran #if !__has_builtin(__builtin_is_aligned)
27694d9439bSJose Luis Duran #define __builtin_is_aligned(x, align)	\
27794d9439bSJose Luis Duran 	(((__uintptr_t)x & ((align) - 1)) == 0)
27894d9439bSJose Luis Duran #endif
27994d9439bSJose Luis Duran #if !__has_builtin(__builtin_align_up)
28094d9439bSJose Luis Duran #define __builtin_align_up(x, align)	\
28194d9439bSJose Luis Duran 	((__typeof__(x))(((__uintptr_t)(x)+((align)-1))&(~((align)-1))))
28294d9439bSJose Luis Duran #endif
28394d9439bSJose Luis Duran #if !__has_builtin(__builtin_align_down)
28494d9439bSJose Luis Duran #define __builtin_align_down(x, align)	\
28594d9439bSJose Luis Duran 	((__typeof__(x))((x)&(~((align)-1))))
28694d9439bSJose Luis Duran #endif
28794d9439bSJose Luis Duran 
28894d9439bSJose Luis Duran #define __align_up(x, y) __builtin_align_up(x, y)
28994d9439bSJose Luis Duran #define __align_down(x, y) __builtin_align_down(x, y)
29094d9439bSJose Luis Duran #define __is_aligned(x, y) __builtin_is_aligned(x, y)
291