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 #pragma once 37 /* musl libc does not provide a sys/cdefs.h header */ 38 #if __has_include_next(<sys/cdefs.h>) 39 #include_next <sys/cdefs.h> 40 #else 41 /* No sys/cdefs.h header exists so we have to provide some basic macros */ 42 #ifdef __cplusplus 43 #define __BEGIN_DECLS extern "C" { 44 #define __END_DECLS } 45 #else 46 #define __BEGIN_DECLS 47 #define __END_DECLS 48 #endif 49 50 #endif 51 52 #ifndef __FBSDID 53 #define __FBSDID(id) 54 #endif 55 56 #ifndef __IDSTRING 57 #define __IDSTRING(name, string) 58 #endif 59 60 #ifndef __pure 61 #define __pure __attribute__((__pure__)) 62 #endif 63 #ifndef __packed 64 #define __packed __attribute__((__packed__)) 65 #endif 66 #ifndef __dead2 67 #define __dead2 __attribute__((__noreturn__)) 68 #endif 69 #ifndef __pure2 70 #define __pure2 __attribute__((__const__)) 71 #endif 72 #ifndef __used 73 #define __used __attribute__((__used__)) 74 #endif 75 #ifndef __aligned 76 #define __aligned(x) __attribute__((__aligned__(x))) 77 #endif 78 #ifndef __section 79 #define __section(x) __attribute__((__section__(x))) 80 #endif 81 82 #ifndef __alloc_size 83 #define __alloc_size(...) __attribute__((__alloc_size__(__VA_ARGS__))) 84 #endif 85 #ifndef __alloc_size2 86 #define __alloc_size2(n, x) __attribute__((__alloc_size__(n, x))) 87 #endif 88 #ifndef __alloc_align 89 #define __alloc_align(x) __attribute__((__alloc_align__(x))) 90 #endif 91 #ifndef __result_use_check 92 #define __result_use_check __attribute__((__warn_unused_result__)) 93 #endif 94 #ifndef __printflike 95 #define __printflike(fmtarg, firstvararg) \ 96 __attribute__((__format__(__printf__, fmtarg, firstvararg))) 97 #endif 98 #ifndef __printf0like 99 #define __printf0like(fmtarg, firstvararg) \ 100 __attribute__((__format__(__printf0__, fmtarg, firstvararg))) 101 #endif 102 103 #ifndef __nonstring 104 #if __has_attribute(__nonstring__) 105 #define __nonstring __attribute__((__nonstring__)) 106 #else 107 #define __nonstring 108 #endif 109 #endif 110 111 #ifndef __predict_true 112 #define __predict_true(exp) __builtin_expect((exp), 1) 113 #endif 114 #ifndef __predict_false 115 #define __predict_false(exp) __builtin_expect((exp), 0) 116 #endif 117 118 #ifndef __weak_symbol 119 #define __weak_symbol __attribute__((__weak__)) 120 #endif 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 #ifndef __WEAK 133 #ifdef __ELF__ 134 #define __WEAK(sym) __asm__(".weak " __XSTRING(sym)) 135 #endif 136 #endif 137 138 /* Some files built as part of the bootstrap libegacy use these macros, but 139 * since we aren't actually building libc.so, we can defined them to be empty */ 140 #ifndef __sym_compat 141 #define __sym_compat(sym, impl, verid) /* not needed for bootstrapping */ 142 #endif 143 #ifndef __sym_default 144 #define __sym_default(sym, impl, verid) /* not needed for bootstrapping */ 145 #endif 146 #ifndef __sym_default 147 #define __warn_references(sym, msg) /* not needed for bootstrapping */ 148 #endif 149 150 #ifndef __malloc_like 151 #define __malloc_like __attribute__((__malloc__)) 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 /* On MacOS __CONCAT is defined as x ## y, which won't expand macros */ 185 #undef __CONCAT 186 #define __CONCAT1(x, y) x##y 187 #define __CONCAT(x, y) __CONCAT1(x, y) 188 189 #ifndef __STRING 190 #define __STRING(x) #x /* stringify without expanding x */ 191 #endif 192 #ifndef __XSTRING 193 #define __XSTRING(x) __STRING(x) /* expand x, then stringify */ 194 #endif 195 196 #ifndef __has_feature 197 #define __has_feature(...) 0 198 #endif 199 200 #ifndef __has_builtin 201 #define __has_builtin(...) 0 202 #endif 203 204 /* 205 * Nullability qualifiers: currently only supported by Clang. 206 */ 207 #if !(defined(__clang__) && __has_feature(nullability)) 208 #define _Nonnull 209 #define _Nullable 210 #define _Null_unspecified 211 #define __NULLABILITY_PRAGMA_PUSH 212 #define __NULLABILITY_PRAGMA_POP 213 #else 214 #define __NULLABILITY_PRAGMA_PUSH \ 215 _Pragma("clang diagnostic push") \ 216 _Pragma("clang diagnostic ignored \"-Wnullability-completeness\"") 217 #define __NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop") 218 #endif 219 220 #ifndef __offsetof 221 #define __offsetof(type, field) __builtin_offsetof(type, field) 222 #endif 223 224 #define __rangeof(type, start, end) \ 225 (__offsetof(type, end) - __offsetof(type, start)) 226 227 #ifndef __containerof 228 #define __containerof(x, s, m) \ 229 ({ \ 230 const volatile __typeof(((s *)0)->m) *__x = (x); \ 231 __DEQUALIFY( \ 232 s *, (const volatile char *)__x - __offsetof(s, m)); \ 233 }) 234 #endif 235 236 #ifndef __RCSID 237 #define __RCSID(x) 238 #endif 239 #ifndef __FBSDID 240 #define __FBSDID(x) 241 #endif 242 #ifndef __RCSID 243 #define __RCSID(x) 244 #endif 245 #ifndef __RCSID_SOURCE 246 #define __RCSID_SOURCE(x) 247 #endif 248 #ifndef __SCCSID 249 #define __SCCSID(x) 250 #endif 251 #ifndef __COPYRIGHT 252 #define __COPYRIGHT(x) 253 #endif 254 #ifndef __DECONST 255 #define __DECONST(type, var) ((type)(__uintptr_t)(const void *)(var)) 256 #endif 257 258 #ifndef __DEVOLATILE 259 #define __DEVOLATILE(type, var) ((type)(__uintptr_t)(volatile void *)(var)) 260 #endif 261 262 #ifndef __DEQUALIFY 263 #define __DEQUALIFY(type, var) ((type)(__uintptr_t)(const volatile void *)(var)) 264 #endif 265 266 #ifndef __nosanitizeaddress 267 #if __has_attribute(no_sanitize) && defined(__clang__) 268 #define __nosanitizeaddress __attribute__((no_sanitize("address"))) 269 #else 270 #define __nosanitizeaddress 271 #endif 272 #endif 273 274 /* Expose all declarations when using FreeBSD headers */ 275 #define __POSIX_VISIBLE 200809 276 #define __XSI_VISIBLE 700 277 #define __BSD_VISIBLE 1 278 #define __ISO_C_VISIBLE 2011 279 #define __EXT1_VISIBLE 1 280 281 /* 282 * Macro to test if we're using a specific version of gcc or later. 283 */ 284 #if defined(__GNUC__) 285 #define __GNUC_PREREQ__(ma, mi) \ 286 (__GNUC__ > (ma) || __GNUC__ == (ma) && __GNUC_MINOR__ >= (mi)) 287 #else 288 #define __GNUC_PREREQ__(ma, mi) 0 289 #endif 290 291 /* Alignment builtins for better type checking and improved code generation. */ 292 /* Provide fallback versions for other compilers (GCC/Clang < 10): */ 293 #if !__has_builtin(__builtin_is_aligned) 294 #define __builtin_is_aligned(x, align) \ 295 (((__uintptr_t)x & ((align) - 1)) == 0) 296 #endif 297 #if !__has_builtin(__builtin_align_up) 298 #define __builtin_align_up(x, align) \ 299 ((__typeof__(x))(((__uintptr_t)(x)+((align)-1))&(~((align)-1)))) 300 #endif 301 #if !__has_builtin(__builtin_align_down) 302 #define __builtin_align_down(x, align) \ 303 ((__typeof__(x))((x)&(~((align)-1)))) 304 #endif 305 306 #define __align_up(x, y) __builtin_align_up(x, y) 307 #define __align_down(x, y) __builtin_align_down(x, y) 308 #define __is_aligned(x, y) __builtin_is_aligned(x, y) 309