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