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