1 /* $NetBSD: cdefs.h,v 1.166 2025/04/06 22:43:08 rillig Exp $ */ 2 3 /* * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * Berkeley Software Design, Inc. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 34 */ 35 36 #ifndef _SYS_CDEFS_H_ 37 #define _SYS_CDEFS_H_ 38 39 /* 40 * Macro to test if we're using a GNU C compiler of a specific vintage 41 * or later, for e.g. features that appeared in a particular version 42 * of GNU C. Usage: 43 * 44 * #if __GNUC_PREREQ__(major, minor) 45 * ...cool feature... 46 * #else 47 * ...delete feature... 48 * #endif 49 */ 50 #ifdef __GNUC__ 51 #define __GNUC_PREREQ__(x, y) \ 52 ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \ 53 (__GNUC__ > (x))) 54 #else 55 #define __GNUC_PREREQ__(x, y) 0 56 #endif 57 58 /* 59 * Macros to test Clang/LLVM features. 60 * Usage: 61 * 62 * #if __has_feature(safe_stack) 63 * ...SafeStack specific code... 64 * #else 65 * ..regular code... 66 * #endif 67 */ 68 #ifndef __has_feature 69 #define __has_feature(x) 0 70 #endif 71 72 #ifndef __has_extension 73 #define __has_extension __has_feature /* Compat with pre-3.0 Clang */ 74 #endif 75 76 #include <machine/cdefs.h> 77 #ifdef __ELF__ 78 #include <sys/cdefs_elf.h> 79 #else 80 #include <sys/cdefs_aout.h> 81 #endif 82 83 #ifdef __GNUC__ 84 #define __strict_weak_alias(alias,sym) \ 85 __unused static __typeof__(alias) *__weak_alias_##alias = &sym; \ 86 __weak_alias(alias,sym) 87 #else 88 #define __strict_weak_alias(alias,sym) __weak_alias(alias,sym) 89 #endif 90 91 /* 92 * Optional marker for size-optimised MD calling convention. 93 */ 94 #ifndef __compactcall 95 #define __compactcall 96 #endif 97 98 /* 99 * The __CONCAT macro is used to concatenate parts of symbol names, e.g. 100 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. 101 * The __CONCAT macro is a bit tricky -- make sure you don't put spaces 102 * in between its arguments. __CONCAT can also concatenate double-quoted 103 * strings produced by the __STRING macro, but this only works with ANSI C. 104 */ 105 106 #define ___STRING(x) __STRING(x) 107 #define ___CONCAT(x,y) __CONCAT(x,y) 108 109 #if __STDC__ || defined(__cplusplus) 110 #define __P(protos) protos /* full-blown ANSI C */ 111 #define __CONCAT(x,y) x ## y 112 #define __STRING(x) #x 113 114 #define __const const /* define reserved names to standard */ 115 #define __signed signed 116 #define __volatile volatile 117 118 #define __CONCAT3(a,b,c) a ## b ## c 119 #define __CONCAT4(a,b,c,d) a ## b ## c ## d 120 #define __CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e 121 #define __CONCAT6(a,b,c,d,e,f) a ## b ## c ## d ## e ## f 122 #define __CONCAT7(a,b,c,d,e,f,g) a ## b ## c ## d ## e ## f ## g 123 #define __CONCAT8(a,b,c,d,e,f,g,h) a ## b ## c ## d ## e ## f ## g ## h 124 125 #if defined(__cplusplus) || defined(__PCC__) 126 #define __inline inline /* convert to C++/C99 keyword */ 127 #else 128 #if !defined(__GNUC__) && !defined(__lint__) 129 #define __inline /* delete GCC keyword */ 130 #endif /* !__GNUC__ && !__lint__ */ 131 #endif /* !__cplusplus */ 132 133 #else /* !(__STDC__ || __cplusplus) */ 134 #define __P(protos) () /* traditional C preprocessor */ 135 #define __CONCAT(x,y) x/**/y 136 #define __STRING(x) "x" 137 138 #ifndef __GNUC__ 139 #define __const /* delete pseudo-ANSI C keywords */ 140 #define __inline 141 #define __signed 142 #define __volatile 143 #endif /* !__GNUC__ */ 144 145 /* 146 * In non-ANSI C environments, new programs will want ANSI-only C keywords 147 * deleted from the program and old programs will want them left alone. 148 * Programs using the ANSI C keywords const, inline etc. as normal 149 * identifiers should define -DNO_ANSI_KEYWORDS. 150 */ 151 #ifndef NO_ANSI_KEYWORDS 152 #define const __const /* convert ANSI C keywords */ 153 #define inline __inline 154 #define signed __signed 155 #define volatile __volatile 156 #endif /* !NO_ANSI_KEYWORDS */ 157 #endif /* !(__STDC__ || __cplusplus) */ 158 159 /* 160 * Used for internal auditing of the NetBSD source tree. 161 */ 162 #ifdef __AUDIT__ 163 #define __aconst __const 164 #else 165 #define __aconst 166 #endif 167 168 /* 169 * Compile Time Assertion. 170 */ 171 #ifdef __COUNTER__ 172 #define __CTASSERT(x) __CTASSERT0(x, __ctassert, __COUNTER__) 173 #else 174 #define __CTASSERT(x) __CTASSERT99(x, __INCLUDE_LEVEL__, __LINE__) 175 #define __CTASSERT99(x, a, b) __CTASSERT0(x, __CONCAT(__ctassert,a), \ 176 __CONCAT(_,b)) 177 #endif 178 #define __CTASSERT0(x, y, z) __CTASSERT1(x, y, z) 179 #define __CTASSERT1(x, y, z) \ 180 struct y ## z ## _struct { \ 181 unsigned int y ## z : /*CONSTCOND*/(x) ? 1 : -1; \ 182 } 183 184 /* 185 * The following macro is used to remove const cast-away warnings 186 * from gcc -Wcast-qual; it should be used with caution because it 187 * can hide valid errors; in particular most valid uses are in 188 * situations where the API requires it, not to cast away string 189 * constants. We don't use *intptr_t on purpose here and we are 190 * explicit about unsigned long so that we don't have additional 191 * dependencies. 192 */ 193 #define __UNCONST(a) ((void *)(unsigned long)(const void *)(a)) 194 195 /* 196 * The following macro is used to remove the volatile cast-away warnings 197 * from gcc -Wcast-qual; as above it should be used with caution 198 * because it can hide valid errors or warnings. Valid uses include 199 * making it possible to pass a volatile pointer to memset(). 200 * For the same reasons as above, we use unsigned long and not intptr_t. 201 */ 202 #define __UNVOLATILE(a) ((void *)(unsigned long)(volatile void *)(a)) 203 204 /* 205 * The following macro is used to remove the the function type cast warnings 206 * from gcc -Wcast-function-type and as above should be used with caution. 207 */ 208 #define __FPTRCAST(t, f) ((t)(void *)(f)) 209 210 /* 211 * GCC2 provides __extension__ to suppress warnings for various GNU C 212 * language extensions under "-ansi -pedantic". 213 */ 214 #if !__GNUC_PREREQ__(2, 0) 215 #define __extension__ /* delete __extension__ if non-gcc or gcc1 */ 216 #endif 217 218 /* 219 * GCC1 and some versions of GCC2 declare dead (non-returning) and 220 * pure (no side effects) functions using "volatile" and "const"; 221 * unfortunately, these then cause warnings under "-ansi -pedantic". 222 * GCC2 uses a new, peculiar __attribute__((attrs)) style. All of 223 * these work for GNU C++ (modulo a slight glitch in the C++ grammar 224 * in the distribution version of 2.5.5). 225 * 226 * GCC defines a pure function as depending only on its arguments and 227 * global variables. Typical examples are strlen and sqrt. 228 * 229 * GCC defines a const function as depending only on its arguments. 230 * Therefore calling a const function again with identical arguments 231 * will always produce the same result. 232 * 233 * Rounding modes for floating point operations are considered global 234 * variables and prevent sqrt from being a const function. 235 * 236 * Calls to const functions can be optimised away and moved around 237 * without limitations. 238 */ 239 #if !__GNUC_PREREQ__(2, 0) && !defined(__lint__) 240 #define __attribute__(x) 241 #endif 242 243 #if __GNUC_PREREQ__(2, 5) || defined(__lint__) 244 #define __dead __attribute__((__noreturn__)) 245 #elif defined(__GNUC__) 246 #define __dead __volatile 247 #else 248 #define __dead 249 #endif 250 251 #if __GNUC_PREREQ__(2, 96) || defined(__lint__) 252 #define __pure __attribute__((__pure__)) 253 #elif defined(__GNUC__) 254 #define __pure __const 255 #else 256 #define __pure 257 #endif 258 259 #if __GNUC_PREREQ__(2, 5) || defined(__lint__) 260 #define __constfunc __attribute__((__const__)) 261 #else 262 #define __constfunc 263 #endif 264 265 #if __GNUC_PREREQ__(3, 0) || defined(__lint__) 266 #define __noinline __attribute__((__noinline__)) 267 #else 268 #define __noinline /* nothing */ 269 #endif 270 271 #if __GNUC_PREREQ__(3, 0) || defined(__lint__) 272 #define __always_inline __attribute__((__always_inline__)) 273 #else 274 #define __always_inline /* nothing */ 275 #endif 276 277 #if __GNUC_PREREQ__(4, 0) || defined(__lint__) 278 #define __null_sentinel __attribute__((__sentinel__)) 279 #else 280 #define __null_sentinel /* nothing */ 281 #endif 282 283 #if __GNUC_PREREQ__(4, 1) || defined(__lint__) 284 #define __returns_twice __attribute__((__returns_twice__)) 285 #else 286 #define __returns_twice /* nothing */ 287 #endif 288 289 #if __GNUC_PREREQ__(4, 5) || defined(__lint__) 290 #define __noclone __attribute__((__noclone__)) 291 #else 292 #define __noclone /* nothing */ 293 #endif 294 295 /* 296 * __unused: Note that item or function might be unused. 297 */ 298 #if __GNUC_PREREQ__(2, 7) || defined(__lint__) 299 #define __unused __attribute__((__unused__)) 300 #else 301 #define __unused /* delete */ 302 #endif 303 304 /* 305 * __used: Note that item is needed, even if it appears to be unused. 306 */ 307 #if __GNUC_PREREQ__(3, 1) || defined(__lint__) 308 #define __used __attribute__((__used__)) 309 #else 310 #define __used __unused 311 #endif 312 313 /* 314 * __diagused: Note that item is used in diagnostic code, but may be 315 * unused in non-diagnostic code. 316 */ 317 #if (defined(_KERNEL) && defined(DIAGNOSTIC)) \ 318 || (!defined(_KERNEL) && !defined(NDEBUG)) 319 #define __diagused /* empty */ 320 #else 321 #define __diagused __unused 322 #endif 323 324 /* 325 * __debugused: Note that item is used in debug code, but may be 326 * unused in non-debug code. 327 */ 328 #if defined(DEBUG) 329 #define __debugused /* empty */ 330 #else 331 #define __debugused __unused 332 #endif 333 334 #if __GNUC_PREREQ__(3, 1) || defined(__lint__) 335 #define __noprofile __attribute__((__no_instrument_function__)) 336 #else 337 #define __noprofile /* nothing */ 338 #endif 339 340 #if __GNUC_PREREQ__(4, 6) || defined(__clang__) || defined(__lint__) 341 #define __unreachable() __builtin_unreachable() 342 #else 343 #define __unreachable() do {} while (0) 344 #endif 345 346 #if defined(_KERNEL) || defined(_RUMPKERNEL) 347 #if defined(__clang__) && __has_feature(address_sanitizer) 348 #define __noasan __attribute__((no_sanitize("kernel-address", "address"))) 349 #elif __GNUC_PREREQ__(4, 9) && defined(__SANITIZE_ADDRESS__) 350 #define __noasan __attribute__((no_sanitize_address)) 351 #else 352 #define __noasan /* nothing */ 353 #endif 354 355 #if defined(__clang__) && __has_feature(thread_sanitizer) 356 #define __nocsan __attribute__((no_sanitize("thread"))) 357 #elif __GNUC_PREREQ__(4, 9) && defined(__SANITIZE_THREAD__) 358 #define __nocsan __attribute__((no_sanitize_thread)) 359 #else 360 #define __nocsan /* nothing */ 361 #endif 362 363 #if defined(__clang__) && __has_feature(memory_sanitizer) 364 #define __nomsan __attribute__((no_sanitize("kernel-memory", "memory"))) 365 #else 366 #define __nomsan /* nothing */ 367 #endif 368 369 #if defined(__clang__) && __has_feature(undefined_behavior_sanitizer) 370 #define __noubsan __attribute__((no_sanitize("undefined"))) 371 #elif __GNUC_PREREQ__(4, 9) && defined(__SANITIZE_UNDEFINED__) 372 #define __noubsan __attribute__((no_sanitize_undefined)) 373 #else 374 #define __noubsan /* nothing */ 375 #endif 376 #endif 377 378 #if defined(__COVERITY__) || \ 379 __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) ||\ 380 __has_feature(leak_sanitizer) || defined(__SANITIZE_LEAK__) 381 #define __NO_LEAKS 382 #endif 383 384 /* 385 * To be used when an empty body is required like: 386 * 387 * #ifdef DEBUG 388 * # define dprintf(a) printf(a) 389 * #else 390 * # define dprintf(a) __nothing 391 * #endif 392 * 393 * We use ((void)0) instead of do {} while (0) so that it 394 * works on , expressions. 395 */ 396 #define __nothing (/*LINTED*/(void)0) 397 398 #if defined(__cplusplus) 399 #define __BEGIN_EXTERN_C extern "C" { 400 #define __END_EXTERN_C } 401 #define __static_cast(x,y) static_cast<x>(y) 402 #else 403 #define __BEGIN_EXTERN_C 404 #define __END_EXTERN_C 405 #define __static_cast(x,y) (x)y 406 #endif 407 408 #if __GNUC_PREREQ__(4, 0) || defined(__lint__) 409 # define __dso_public __attribute__((__visibility__("default"))) 410 # define __dso_hidden __attribute__((__visibility__("hidden"))) 411 # define __BEGIN_PUBLIC_DECLS \ 412 _Pragma("GCC visibility push(default)") __BEGIN_EXTERN_C 413 # define __END_PUBLIC_DECLS __END_EXTERN_C _Pragma("GCC visibility pop") 414 # define __BEGIN_HIDDEN_DECLS \ 415 _Pragma("GCC visibility push(hidden)") __BEGIN_EXTERN_C 416 # define __END_HIDDEN_DECLS __END_EXTERN_C _Pragma("GCC visibility pop") 417 #else 418 # define __dso_public 419 # define __dso_hidden 420 # define __BEGIN_PUBLIC_DECLS __BEGIN_EXTERN_C 421 # define __END_PUBLIC_DECLS __END_EXTERN_C 422 # define __BEGIN_HIDDEN_DECLS __BEGIN_EXTERN_C 423 # define __END_HIDDEN_DECLS __END_EXTERN_C 424 #endif 425 #if __GNUC_PREREQ__(4, 2) || defined(__lint__) 426 # define __dso_protected __attribute__((__visibility__("protected"))) 427 #else 428 # define __dso_protected 429 #endif 430 431 #define __BEGIN_DECLS __BEGIN_PUBLIC_DECLS 432 #define __END_DECLS __END_PUBLIC_DECLS 433 434 /* 435 * Non-static C99 inline functions are optional bodies. They don't 436 * create global symbols if not used, but can be replaced if desirable. 437 * This differs from the behavior of GCC before version 4.3. The nearest 438 * equivalent for older GCC is `extern inline'. For newer GCC, use the 439 * gnu_inline attribute additionally to get the old behavior. 440 * 441 * For C99 compilers other than GCC, the C99 behavior is expected. 442 */ 443 #if defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) 444 #define __c99inline extern __attribute__((__gnu_inline__)) __inline 445 #elif defined(__GNUC__) 446 #define __c99inline extern __inline 447 #elif defined(__STDC_VERSION__) || defined(__lint__) 448 #define __c99inline __inline 449 #endif 450 451 #if defined(__lint__) 452 #define __thread /* delete */ 453 #define __packed __packed 454 #define __aligned(x) _Alignas((x)) 455 #define __section(x) /* delete */ 456 #elif __GNUC_PREREQ__(2, 7) || defined(__PCC__) || defined(__lint__) 457 #define __packed __attribute__((__packed__)) 458 #define __aligned(x) __attribute__((__aligned__(x))) 459 #define __section(x) __attribute__((__section__(x))) 460 #elif defined(_MSC_VER) 461 #define __packed /* ignore */ 462 #else 463 #define __packed error: no __packed for this compiler 464 #define __aligned(x) error: no __aligned for this compiler 465 #define __section(x) error: no __section for this compiler 466 #endif 467 468 /* 469 * C99 defines the restrict type qualifier keyword, which was made available 470 * in GCC 2.92. 471 */ 472 #if __STDC_VERSION__ >= 199901L 473 #define __restrict restrict 474 #elif __GNUC_PREREQ__(2, 92) 475 #define __restrict __restrict__ 476 #else 477 #define __restrict /* delete __restrict when not supported */ 478 #endif 479 480 /* 481 * C99 and C++11 define __func__ predefined identifier, which was made 482 * available in GCC 2.95. 483 */ 484 #if !(__STDC_VERSION__ >= 199901L) && !(__cplusplus - 0 >= 201103L) 485 #if __GNUC_PREREQ__(2, 4) || defined(__lint__) 486 #define __func__ __FUNCTION__ 487 #else 488 #define __func__ "" 489 #endif 490 #endif /* !(__STDC_VERSION__ >= 199901L) && !(__cplusplus - 0 >= 201103L) */ 491 492 #if defined(_KERNEL) && defined(NO_KERNEL_RCSIDS) 493 #undef __KERNEL_RCSID 494 #define __KERNEL_RCSID(_n, _s) /* nothing */ 495 #undef __RCSID 496 #define __RCSID(_s) /* nothing */ 497 #endif 498 499 #if !defined(_STANDALONE) && !defined(_KERNEL) 500 #if defined(__GNUC__) || defined(__PCC__) 501 #define __RENAME(x) ___RENAME(x) 502 #elif defined(__lint__) 503 #define __RENAME(x) __symbolrename(x) 504 #else 505 #error "No function renaming possible" 506 #endif /* __GNUC__ */ 507 #else /* _STANDALONE || _KERNEL */ 508 #define __RENAME(x) no renaming in kernel/standalone environment 509 #endif 510 511 /* 512 * A barrier to stop the optimizer from moving code or assume live 513 * register values. This is gcc specific, the version is more or less 514 * arbitrary, might work with older compilers. 515 */ 516 #if __GNUC_PREREQ__(2, 95) || defined(__lint__) 517 #define __insn_barrier() __asm __volatile("":::"memory") 518 #else 519 #define __insn_barrier() /* */ 520 #endif 521 522 /* 523 * GNU C version 2.96 adds explicit branch prediction so that 524 * the CPU back-end can hint the processor and also so that 525 * code blocks can be reordered such that the predicted path 526 * sees a more linear flow, thus improving cache behavior, etc. 527 * 528 * The following two macros provide us with a way to use this 529 * compiler feature. Use __predict_true() if you expect the expression 530 * to evaluate to true, and __predict_false() if you expect the 531 * expression to evaluate to false. 532 * 533 * A few notes about usage: 534 * 535 * * Generally, __predict_false() error condition checks (unless 536 * you have some _strong_ reason to do otherwise, in which case 537 * document it), and/or __predict_true() `no-error' condition 538 * checks, assuming you want to optimize for the no-error case. 539 * 540 * * Other than that, if you don't know the likelihood of a test 541 * succeeding from empirical or other `hard' evidence, don't 542 * make predictions. 543 * 544 * * These are meant to be used in places that are run `a lot'. 545 * It is wasteful to make predictions in code that is run 546 * seldomly (e.g. at subsystem initialization time) as the 547 * basic block reordering that this affects can often generate 548 * larger code. 549 * 550 * We use an explicit ternary operator to map any value to exactly 0 or 551 * 1 so that (a) we can specify one value to expect, and (b) the given 552 * expression occurs only in the position of a conditional so that C++ 553 * classes with conversion to bool work as if this were a conditional. 554 * In contrast, say, `(exp) != 0' would require the type of exp to 555 * support conversion to integer as well. 556 */ 557 #if __GNUC_PREREQ__(2, 96) || defined(__lint__) 558 #define __predict_true(exp) __builtin_expect((exp) ? 1 : 0, 1) 559 #define __predict_false(exp) __builtin_expect((exp) ? 1 : 0, 0) 560 #else 561 #define __predict_true(exp) (exp) 562 #define __predict_false(exp) (exp) 563 #endif 564 565 /* 566 * Compiler-dependent macros to declare that functions take printf-like 567 * or scanf-like arguments. They are null except for versions of gcc 568 * that are known to support the features properly (old versions of gcc-2 569 * didn't permit keeping the keywords out of the application namespace). 570 */ 571 #if __GNUC_PREREQ__(2, 7) || defined(__lint__) 572 #define __printflike(fmtarg, firstvararg) \ 573 __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 574 #ifndef __syslog_attribute__ 575 #define __syslog__ __printf__ 576 #endif 577 #define __sysloglike(fmtarg, firstvararg) \ 578 __attribute__((__format__ (__syslog__, fmtarg, firstvararg))) 579 #define __scanflike(fmtarg, firstvararg) \ 580 __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) 581 #define __format_arg(fmtarg) __attribute__((__format_arg__ (fmtarg))) 582 #else 583 #define __printflike(fmtarg, firstvararg) /* nothing */ 584 #define __scanflike(fmtarg, firstvararg) /* nothing */ 585 #define __sysloglike(fmtarg, firstvararg) /* nothing */ 586 #define __format_arg(fmtarg) /* nothing */ 587 #endif 588 589 /* 590 * Macros for manipulating "link sets". Link sets are arrays of pointers 591 * to objects, which are gathered up by the linker. 592 * 593 * Object format-specific code has provided us with the following macros: 594 * 595 * __link_set_add_text(set, sym) 596 * Add a reference to the .text symbol `sym' to `set'. 597 * 598 * __link_set_add_rodata(set, sym) 599 * Add a reference to the .rodata symbol `sym' to `set'. 600 * 601 * __link_set_add_data(set, sym) 602 * Add a reference to the .data symbol `sym' to `set'. 603 * 604 * __link_set_add_bss(set, sym) 605 * Add a reference to the .bss symbol `sym' to `set'. 606 * 607 * __link_set_decl(set, ptype) 608 * Provide an extern declaration of the set `set', which 609 * contains an array of pointers to type `ptype'. This 610 * macro must be used by any code which wishes to reference 611 * the elements of a link set. 612 * 613 * __link_set_start(set) 614 * This points to the first slot in the link set. 615 * 616 * __link_set_end(set) 617 * This points to the (non-existent) slot after the last 618 * entry in the link set. 619 * 620 * __link_set_count(set) 621 * Count the number of entries in link set `set'. 622 * 623 * In addition, we provide the following macros for accessing link sets: 624 * 625 * __link_set_foreach(pvar, set) 626 * Iterate over the link set `set'. Because a link set is 627 * an array of pointers, pvar must be declared as "type **pvar", 628 * and the actual entry accessed as "*pvar". 629 * 630 * __link_set_entry(set, idx) 631 * Access the link set entry at index `idx' from set `set'. 632 */ 633 #define __link_set_foreach(pvar, set) \ 634 for (pvar = __link_set_start(set); pvar < __link_set_end(set); pvar++) 635 636 #define __link_set_entry(set, idx) (__link_set_start(set)[idx]) 637 638 /* 639 * Return the natural alignment in bytes for the given type 640 */ 641 #if __GNUC_PREREQ__(4, 1) || defined(__lint__) 642 #define __alignof(__t) __alignof__(__t) 643 #else 644 #define __alignof(__t) (sizeof(struct { char __x; __t __y; }) - sizeof(__t)) 645 #endif 646 647 /* 648 * Return the number of elements in a statically-allocated array, 649 * __x. 650 */ 651 #define __arraycount(__x) (sizeof(__x) / sizeof(__x[0])) 652 653 #ifndef __ASSEMBLER__ 654 /* __BIT(n): nth bit, where __BIT(0) == 0x1. */ 655 #define __BIT(__n) \ 656 (((__UINTMAX_TYPE__)(__n) >= __CHAR_BIT__ * sizeof(__UINTMAX_TYPE__)) \ 657 ? 0 \ 658 : ((__UINTMAX_TYPE__)1 << \ 659 (__UINTMAX_TYPE__)((__n) & \ 660 (__CHAR_BIT__ * sizeof(__UINTMAX_TYPE__) - 1)))) 661 662 /* __MASK(n): first n bits all set, where __MASK(4) == 0b1111. */ 663 #define __MASK(__n) (__BIT(__n) - 1) 664 665 /* Macros for min/max. */ 666 #define __MIN(a,b) ((/*CONSTCOND*/(a)<=(b))?(a):(b)) 667 #define __MAX(a,b) ((/*CONSTCOND*/(a)>(b))?(a):(b)) 668 669 /* __BITS(m, n): bits m through n, m < n. */ 670 #define __BITS(__m, __n) \ 671 ((__BIT(__MAX((__m), (__n)) + 1) - 1) ^ (__BIT(__MIN((__m), (__n))) - 1)) 672 #endif /* !__ASSEMBLER__ */ 673 674 /* find least significant bit that is set */ 675 #define __LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask)) 676 677 #define __PRIuBIT PRIuMAX 678 #define __PRIuBITS __PRIuBIT 679 680 #define __PRIxBIT PRIxMAX 681 #define __PRIxBITS __PRIxBIT 682 683 #define __SHIFTOUT(__x, __mask) (((__x) & (__mask)) / __LOWEST_SET_BIT(__mask)) 684 #define __SHIFTIN(__x, __mask) ((__x) * __LOWEST_SET_BIT(__mask)) 685 #define __SHIFTOUT_MASK(__mask) __SHIFTOUT((__mask), (__mask)) 686 687 /* 688 * Only to be used in other headers that are included from both c or c++ 689 * NOT to be used in code. 690 */ 691 #ifdef __cplusplus 692 #define __CAST(__dt, __st) static_cast<__dt>(__st) 693 #else 694 #define __CAST(__dt, __st) ((__dt)(__st)) 695 #endif 696 697 #define __CASTV(__dt, __st) __CAST(__dt, __CAST(void *, __st)) 698 #define __CASTCV(__dt, __st) __CAST(__dt, __CAST(const void *, __st)) 699 700 /* 701 * Suppresses `variable set but not used' warnings. 702 * 703 * Typically for #ifdefs, where one branch of the #ifdef uses a 704 * variable but the other does not. Useful in patching external code 705 * to keep the patches narrowly scoped. 706 * 707 * Limitation: Only for variables, and only non-volatile variables. 708 * 709 * (Abusing this for anything else may lead to side effects. Pointers 710 * to volatile objects are OK, as in `volatile int *a', as long as the 711 * pointer itself is not volatile, as in `int *volatile a'.) 712 */ 713 #define __USE(a) (/*LINTED*/(void)(a)) 714 715 /* 716 * Verifies the expression e compiles, but does not evaluate it. Safe 717 * when e has side effects. 718 * 719 * Typically used for the arguments to macros with conditional 720 * definitions like DIAGNOSTIC or KDTRACE_HOOKS: when enabled, the 721 * macro uses the argument; when disabled, the macro passes the 722 * argument to __MACROUSE but doesn't otherwise use it. Cast to long 723 * in case the argument is a bit field, which is forbidden in sizeof. 724 * 725 * Limitation: Doesn't work for expressions of aggregate (struct/union) 726 * types. 727 * 728 * (If you find a way to handle both bit fields and aggregate types, 729 * you could unify __USE and __MACROUSE.) 730 */ 731 #define __MACROUSE(e) (/*LINTED*/(void)sizeof((long)(e))) 732 733 #define __type_mask(t) (/*LINTED*/sizeof(t) < sizeof(__INTMAX_TYPE__) ? \ 734 (~((1ULL << (sizeof(t) * __CHAR_BIT__)) - 1)) : 0ULL) 735 736 #ifndef __ASSEMBLER__ 737 static __inline long long __zeroll(void) { return 0; } 738 static __inline unsigned long long __zeroull(void) { return 0; } 739 #else 740 #define __zeroll() (0LL) 741 #define __zeroull() (0ULL) 742 #endif 743 744 #define __negative_p(x) (!((x) > 0) && ((x) != 0)) 745 746 #define __type_min_s(t) ((t)((1ULL << (sizeof(t) * __CHAR_BIT__ - 1)))) 747 #define __type_max_s(t) ((t)~((1ULL << (sizeof(t) * __CHAR_BIT__ - 1)))) 748 #define __type_min_u(t) ((t)0ULL) 749 #define __type_max_u(t) ((t)~0ULL) 750 #define __type_is_signed(t) (/*LINTED*/__type_min_s(t) + (t)1 < (t)1) 751 #define __type_min(t) (__type_is_signed(t) ? __type_min_s(t) : __type_min_u(t)) 752 #define __type_max(t) (__type_is_signed(t) ? __type_max_s(t) : __type_max_u(t)) 753 754 755 #define __type_fit_u(t, a) \ 756 (/*LINTED*/!__negative_p(a) && \ 757 ((__UINTMAX_TYPE__)((a) + __zeroull()) <= \ 758 (__UINTMAX_TYPE__)__type_max_u(t))) 759 760 #define __type_fit_s(t, a) \ 761 (/*LINTED*/__negative_p(a) \ 762 ? ((__INTMAX_TYPE__)((a) + __zeroll()) >= \ 763 (__INTMAX_TYPE__)__type_min_s(t)) \ 764 : ((__INTMAX_TYPE__)((a) + __zeroll()) >= (__INTMAX_TYPE__)0 && \ 765 ((__INTMAX_TYPE__)((a) + __zeroll()) <= \ 766 (__INTMAX_TYPE__)__type_max_s(t)))) 767 768 /* 769 * return true if value 'a' fits in type 't' 770 */ 771 #define __type_fit(t, a) (__type_is_signed(t) ? \ 772 __type_fit_s(t, a) : __type_fit_u(t, a)) 773 774 #endif /* !_SYS_CDEFS_H_ */ 775