cdefs.h revision 331722
1/*- 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Berkeley Software Design, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 4. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 33 * $FreeBSD: stable/11/sys/sys/cdefs.h 331722 2018-03-29 02:50:57Z eadler $ 34 */ 35 36#ifndef _SYS_CDEFS_H_ 37#define _SYS_CDEFS_H_ 38 39/* 40 * Testing against Clang-specific extensions. 41 */ 42#ifndef __has_attribute 43#define __has_attribute(x) 0 44#endif 45#ifndef __has_extension 46#define __has_extension __has_feature 47#endif 48#ifndef __has_feature 49#define __has_feature(x) 0 50#endif 51#ifndef __has_include 52#define __has_include(x) 0 53#endif 54#ifndef __has_builtin 55#define __has_builtin(x) 0 56#endif 57 58#if defined(__cplusplus) 59#define __BEGIN_DECLS extern "C" { 60#define __END_DECLS } 61#else 62#define __BEGIN_DECLS 63#define __END_DECLS 64#endif 65 66/* 67 * This code has been put in place to help reduce the addition of 68 * compiler specific defines in FreeBSD code. It helps to aid in 69 * having a compiler-agnostic source tree. 70 */ 71 72#if defined(__GNUC__) || defined(__INTEL_COMPILER) 73 74#if __GNUC__ >= 3 || defined(__INTEL_COMPILER) 75#define __GNUCLIKE_ASM 3 76#define __GNUCLIKE_MATH_BUILTIN_CONSTANTS 77#else 78#define __GNUCLIKE_ASM 2 79#endif 80#define __GNUCLIKE___TYPEOF 1 81#define __GNUCLIKE___OFFSETOF 1 82#define __GNUCLIKE___SECTION 1 83 84#ifndef __INTEL_COMPILER 85#define __GNUCLIKE_CTOR_SECTION_HANDLING 1 86#endif 87 88#define __GNUCLIKE_BUILTIN_CONSTANT_P 1 89#if defined(__INTEL_COMPILER) && defined(__cplusplus) && \ 90 __INTEL_COMPILER < 800 91#undef __GNUCLIKE_BUILTIN_CONSTANT_P 92#endif 93 94#if (__GNUC_MINOR__ > 95 || __GNUC__ >= 3) 95#define __GNUCLIKE_BUILTIN_VARARGS 1 96#define __GNUCLIKE_BUILTIN_STDARG 1 97#define __GNUCLIKE_BUILTIN_VAALIST 1 98#endif 99 100#if defined(__GNUC__) 101#define __GNUC_VA_LIST_COMPATIBILITY 1 102#endif 103 104/* 105 * Compiler memory barriers, specific to gcc and clang. 106 */ 107#if defined(__GNUC__) 108#define __compiler_membar() __asm __volatile(" " : : : "memory") 109#endif 110 111#ifndef __INTEL_COMPILER 112#define __GNUCLIKE_BUILTIN_NEXT_ARG 1 113#define __GNUCLIKE_MATH_BUILTIN_RELOPS 114#endif 115 116#define __GNUCLIKE_BUILTIN_MEMCPY 1 117 118/* XXX: if __GNUC__ >= 2: not tested everywhere originally, where replaced */ 119#define __CC_SUPPORTS_INLINE 1 120#define __CC_SUPPORTS___INLINE 1 121#define __CC_SUPPORTS___INLINE__ 1 122 123#define __CC_SUPPORTS___FUNC__ 1 124#define __CC_SUPPORTS_WARNING 1 125 126#define __CC_SUPPORTS_VARADIC_XXX 1 /* see varargs.h */ 127 128#define __CC_SUPPORTS_DYNAMIC_ARRAY_INIT 1 129 130#endif /* __GNUC__ || __INTEL_COMPILER */ 131 132/* 133 * Macro to test if we're using a specific version of gcc or later. 134 */ 135#if defined(__GNUC__) && !defined(__INTEL_COMPILER) 136#define __GNUC_PREREQ__(ma, mi) \ 137 (__GNUC__ > (ma) || __GNUC__ == (ma) && __GNUC_MINOR__ >= (mi)) 138#else 139#define __GNUC_PREREQ__(ma, mi) 0 140#endif 141 142/* 143 * The __CONCAT macro is used to concatenate parts of symbol names, e.g. 144 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. 145 * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI 146 * mode -- there must be no spaces between its arguments, and for nested 147 * __CONCAT's, all the __CONCAT's must be at the left. __CONCAT can also 148 * concatenate double-quoted strings produced by the __STRING macro, but 149 * this only works with ANSI C. 150 * 151 * __XSTRING is like __STRING, but it expands any macros in its argument 152 * first. It is only available with ANSI C. 153 */ 154#if defined(__STDC__) || defined(__cplusplus) 155#define __P(protos) protos /* full-blown ANSI C */ 156#define __CONCAT1(x,y) x ## y 157#define __CONCAT(x,y) __CONCAT1(x,y) 158#define __STRING(x) #x /* stringify without expanding x */ 159#define __XSTRING(x) __STRING(x) /* expand x, then stringify */ 160 161#define __const const /* define reserved names to standard */ 162#define __signed signed 163#define __volatile volatile 164#if defined(__cplusplus) 165#define __inline inline /* convert to C++ keyword */ 166#else 167#if !(defined(__CC_SUPPORTS___INLINE)) 168#define __inline /* delete GCC keyword */ 169#endif /* ! __CC_SUPPORTS___INLINE */ 170#endif /* !__cplusplus */ 171 172#else /* !(__STDC__ || __cplusplus) */ 173#define __P(protos) () /* traditional C preprocessor */ 174#define __CONCAT(x,y) x/**/y 175#define __STRING(x) "x" 176 177#if !defined(__CC_SUPPORTS___INLINE) 178#define __const /* delete pseudo-ANSI C keywords */ 179#define __inline 180#define __signed 181#define __volatile 182/* 183 * In non-ANSI C environments, new programs will want ANSI-only C keywords 184 * deleted from the program and old programs will want them left alone. 185 * When using a compiler other than gcc, programs using the ANSI C keywords 186 * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. 187 * When using "gcc -traditional", we assume that this is the intent; if 188 * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. 189 */ 190#ifndef NO_ANSI_KEYWORDS 191#define const /* delete ANSI C keywords */ 192#define inline 193#define signed 194#define volatile 195#endif /* !NO_ANSI_KEYWORDS */ 196#endif /* !__CC_SUPPORTS___INLINE */ 197#endif /* !(__STDC__ || __cplusplus) */ 198 199/* 200 * Compiler-dependent macros to help declare dead (non-returning) and 201 * pure (no side effects) functions, and unused variables. They are 202 * null except for versions of gcc that are known to support the features 203 * properly (old versions of gcc-2 supported the dead and pure features 204 * in a different (wrong) way). If we do not provide an implementation 205 * for a given compiler, let the compile fail if it is told to use 206 * a feature that we cannot live without. 207 */ 208#ifdef lint 209#define __dead2 210#define __pure2 211#define __unused 212#define __packed 213#define __aligned(x) 214#define __alloc_align(x) 215#define __alloc_size(x) 216#define __alloc_size2(n, x) 217#define __section(x) 218#define __weak_symbol 219#else 220#define __weak_symbol __attribute__((__weak__)) 221#if !__GNUC_PREREQ__(2, 5) && !defined(__INTEL_COMPILER) 222#define __dead2 223#define __pure2 224#define __unused 225#endif 226#if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 && !defined(__INTEL_COMPILER) 227#define __dead2 __attribute__((__noreturn__)) 228#define __pure2 __attribute__((__const__)) 229#define __unused 230/* XXX Find out what to do for __packed, __aligned and __section */ 231#endif 232#if __GNUC_PREREQ__(2, 7) || defined(__INTEL_COMPILER) 233#define __dead2 __attribute__((__noreturn__)) 234#define __pure2 __attribute__((__const__)) 235#define __unused __attribute__((__unused__)) 236#define __used __attribute__((__used__)) 237#define __packed __attribute__((__packed__)) 238#define __aligned(x) __attribute__((__aligned__(x))) 239#define __section(x) __attribute__((__section__(x))) 240#endif 241#if __GNUC_PREREQ__(4, 3) || __has_attribute(__alloc_size__) 242#define __alloc_size(x) __attribute__((__alloc_size__(x))) 243#define __alloc_size2(n, x) __attribute__((__alloc_size__(n, x))) 244#else 245#define __alloc_size(x) 246#define __alloc_size2(n, x) 247#endif 248#if __GNUC_PREREQ__(4, 9) || __has_attribute(__alloc_align__) 249#define __alloc_align(x) __attribute__((__alloc_align__(x))) 250#else 251#define __alloc_align(x) 252#endif 253#endif /* lint */ 254 255#if !__GNUC_PREREQ__(2, 95) 256#define __alignof(x) __offsetof(struct { char __a; x __b; }, __b) 257#endif 258 259/* 260 * Keywords added in C11. 261 */ 262 263#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L || defined(lint) 264 265#if !__has_extension(c_alignas) 266#if (defined(__cplusplus) && __cplusplus >= 201103L) || \ 267 __has_extension(cxx_alignas) 268#define _Alignas(x) alignas(x) 269#else 270/* XXX: Only emulates _Alignas(constant-expression); not _Alignas(type-name). */ 271#define _Alignas(x) __aligned(x) 272#endif 273#endif 274 275#if defined(__cplusplus) && __cplusplus >= 201103L 276#define _Alignof(x) alignof(x) 277#else 278#define _Alignof(x) __alignof(x) 279#endif 280 281#if !defined(__cplusplus) && !__has_extension(c_atomic) && \ 282 !__has_extension(cxx_atomic) 283/* 284 * No native support for _Atomic(). Place object in structure to prevent 285 * most forms of direct non-atomic access. 286 */ 287#define _Atomic(T) struct { T volatile __val; } 288#endif 289 290#if defined(__cplusplus) && __cplusplus >= 201103L 291#define _Noreturn [[noreturn]] 292#else 293#define _Noreturn __dead2 294#endif 295 296#if !__has_extension(c_static_assert) 297#if (defined(__cplusplus) && __cplusplus >= 201103L) || \ 298 __has_extension(cxx_static_assert) 299#define _Static_assert(x, y) static_assert(x, y) 300#elif __GNUC_PREREQ__(4,6) && !defined(__cplusplus) 301/* Nothing, gcc 4.6 and higher has _Static_assert built-in */ 302#elif defined(__COUNTER__) 303#define _Static_assert(x, y) __Static_assert(x, __COUNTER__) 304#define __Static_assert(x, y) ___Static_assert(x, y) 305#define ___Static_assert(x, y) typedef char __assert_ ## y[(x) ? 1 : -1] \ 306 __unused 307#else 308#define _Static_assert(x, y) struct __hack 309#endif 310#endif 311 312#if !__has_extension(c_thread_local) 313/* 314 * XXX: Some compilers (Clang 3.3, GCC 4.7) falsely announce C++11 mode 315 * without actually supporting the thread_local keyword. Don't check for 316 * the presence of C++11 when defining _Thread_local. 317 */ 318#if /* (defined(__cplusplus) && __cplusplus >= 201103L) || */ \ 319 __has_extension(cxx_thread_local) 320#define _Thread_local thread_local 321#else 322#define _Thread_local __thread 323#endif 324#endif 325 326#endif /* __STDC_VERSION__ || __STDC_VERSION__ < 201112L */ 327 328/* 329 * Emulation of C11 _Generic(). Unlike the previously defined C11 330 * keywords, it is not possible to implement this using exactly the same 331 * syntax. Therefore implement something similar under the name 332 * __generic(). Unlike _Generic(), this macro can only distinguish 333 * between a single type, so it requires nested invocations to 334 * distinguish multiple cases. 335 */ 336 337#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \ 338 __has_extension(c_generic_selections) 339#define __generic(expr, t, yes, no) \ 340 _Generic(expr, t: yes, default: no) 341#elif __GNUC_PREREQ__(3, 1) && !defined(__cplusplus) 342#define __generic(expr, t, yes, no) \ 343 __builtin_choose_expr( \ 344 __builtin_types_compatible_p(__typeof(expr), t), yes, no) 345#endif 346 347/* 348 * C99 Static array indices in function parameter declarations. Syntax such as: 349 * void bar(int myArray[static 10]); 350 * is allowed in C99 but not in C++. Define __min_size appropriately so 351 * headers using it can be compiled in either language. Use like this: 352 * void bar(int myArray[__min_size(10)]); 353 */ 354#if !defined(__cplusplus) && \ 355 (defined(__clang__) || __GNUC_PREREQ__(4, 6)) && \ 356 (!defined(__STDC_VERSION__) || (__STDC_VERSION__ >= 199901)) 357#define __min_size(x) static (x) 358#else 359#define __min_size(x) (x) 360#endif 361 362#if __GNUC_PREREQ__(2, 96) 363#define __malloc_like __attribute__((__malloc__)) 364#define __pure __attribute__((__pure__)) 365#else 366#define __malloc_like 367#define __pure 368#endif 369 370#if __GNUC_PREREQ__(3, 1) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800) 371#define __always_inline __attribute__((__always_inline__)) 372#else 373#define __always_inline 374#endif 375 376#if __GNUC_PREREQ__(3, 1) 377#define __noinline __attribute__ ((__noinline__)) 378#else 379#define __noinline 380#endif 381 382#if __GNUC_PREREQ__(3, 4) 383#define __fastcall __attribute__((__fastcall__)) 384#define __result_use_check __attribute__((__warn_unused_result__)) 385#else 386#define __fastcall 387#define __result_use_check 388#endif 389 390#if __GNUC_PREREQ__(4, 1) 391#define __returns_twice __attribute__((__returns_twice__)) 392#else 393#define __returns_twice 394#endif 395 396#if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable) 397#define __unreachable() __builtin_unreachable() 398#else 399#define __unreachable() ((void)0) 400#endif 401 402/* XXX: should use `#if __STDC_VERSION__ < 199901'. */ 403#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER) 404#define __func__ NULL 405#endif 406 407#if (defined(__INTEL_COMPILER) || (defined(__GNUC__) && __GNUC__ >= 2)) && !defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901 408#define __LONG_LONG_SUPPORTED 409#endif 410 411/* C++11 exposes a load of C99 stuff */ 412#if defined(__cplusplus) && __cplusplus >= 201103L 413#define __LONG_LONG_SUPPORTED 414#ifndef __STDC_LIMIT_MACROS 415#define __STDC_LIMIT_MACROS 416#endif 417#ifndef __STDC_CONSTANT_MACROS 418#define __STDC_CONSTANT_MACROS 419#endif 420#endif 421 422/* 423 * GCC 2.95 provides `__restrict' as an extension to C90 to support the 424 * C99-specific `restrict' type qualifier. We happen to use `__restrict' as 425 * a way to define the `restrict' type qualifier without disturbing older 426 * software that is unaware of C99 keywords. 427 */ 428#if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95) 429#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901 || defined(lint) 430#define __restrict 431#else 432#define __restrict restrict 433#endif 434#endif 435 436/* 437 * GNU C version 2.96 adds explicit branch prediction so that 438 * the CPU back-end can hint the processor and also so that 439 * code blocks can be reordered such that the predicted path 440 * sees a more linear flow, thus improving cache behavior, etc. 441 * 442 * The following two macros provide us with a way to utilize this 443 * compiler feature. Use __predict_true() if you expect the expression 444 * to evaluate to true, and __predict_false() if you expect the 445 * expression to evaluate to false. 446 * 447 * A few notes about usage: 448 * 449 * * Generally, __predict_false() error condition checks (unless 450 * you have some _strong_ reason to do otherwise, in which case 451 * document it), and/or __predict_true() `no-error' condition 452 * checks, assuming you want to optimize for the no-error case. 453 * 454 * * Other than that, if you don't know the likelihood of a test 455 * succeeding from empirical or other `hard' evidence, don't 456 * make predictions. 457 * 458 * * These are meant to be used in places that are run `a lot'. 459 * It is wasteful to make predictions in code that is run 460 * seldomly (e.g. at subsystem initialization time) as the 461 * basic block reordering that this affects can often generate 462 * larger code. 463 */ 464#if __GNUC_PREREQ__(2, 96) 465#define __predict_true(exp) __builtin_expect((exp), 1) 466#define __predict_false(exp) __builtin_expect((exp), 0) 467#else 468#define __predict_true(exp) (exp) 469#define __predict_false(exp) (exp) 470#endif 471 472#if __GNUC_PREREQ__(4, 0) 473#define __null_sentinel __attribute__((__sentinel__)) 474#define __exported __attribute__((__visibility__("default"))) 475#define __hidden __attribute__((__visibility__("hidden"))) 476#else 477#define __null_sentinel 478#define __exported 479#define __hidden 480#endif 481 482/* 483 * We define this here since <stddef.h>, <sys/queue.h>, and <sys/types.h> 484 * require it. 485 */ 486#if __GNUC_PREREQ__(4, 1) 487#define __offsetof(type, field) __builtin_offsetof(type, field) 488#else 489#ifndef __cplusplus 490#define __offsetof(type, field) \ 491 ((__size_t)(__uintptr_t)((const volatile void *)&((type *)0)->field)) 492#else 493#define __offsetof(type, field) \ 494 (__offsetof__ (reinterpret_cast <__size_t> \ 495 (&reinterpret_cast <const volatile char &> \ 496 (static_cast<type *> (0)->field)))) 497#endif 498#endif 499#define __rangeof(type, start, end) \ 500 (__offsetof(type, end) - __offsetof(type, start)) 501 502/* 503 * Given the pointer x to the member m of the struct s, return 504 * a pointer to the containing structure. When using GCC, we first 505 * assign pointer x to a local variable, to check that its type is 506 * compatible with member m. 507 */ 508#if __GNUC_PREREQ__(3, 1) 509#define __containerof(x, s, m) ({ \ 510 const volatile __typeof(((s *)0)->m) *__x = (x); \ 511 __DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m));\ 512}) 513#else 514#define __containerof(x, s, m) \ 515 __DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m)) 516#endif 517 518/* 519 * Compiler-dependent macros to declare that functions take printf-like 520 * or scanf-like arguments. They are null except for versions of gcc 521 * that are known to support the features properly (old versions of gcc-2 522 * didn't permit keeping the keywords out of the application namespace). 523 */ 524#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER) 525#define __printflike(fmtarg, firstvararg) 526#define __scanflike(fmtarg, firstvararg) 527#define __format_arg(fmtarg) 528#define __strfmonlike(fmtarg, firstvararg) 529#define __strftimelike(fmtarg, firstvararg) 530#else 531#define __printflike(fmtarg, firstvararg) \ 532 __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 533#define __scanflike(fmtarg, firstvararg) \ 534 __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) 535#define __format_arg(fmtarg) __attribute__((__format_arg__ (fmtarg))) 536#define __strfmonlike(fmtarg, firstvararg) \ 537 __attribute__((__format__ (__strfmon__, fmtarg, firstvararg))) 538#define __strftimelike(fmtarg, firstvararg) \ 539 __attribute__((__format__ (__strftime__, fmtarg, firstvararg))) 540#endif 541 542/* Compiler-dependent macros that rely on FreeBSD-specific extensions. */ 543#if defined(__FreeBSD_cc_version) && __FreeBSD_cc_version >= 300001 && \ 544 defined(__GNUC__) && !defined(__INTEL_COMPILER) 545#define __printf0like(fmtarg, firstvararg) \ 546 __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) 547#else 548#define __printf0like(fmtarg, firstvararg) 549#endif 550 551#if defined(__GNUC__) || defined(__INTEL_COMPILER) 552#ifndef __INTEL_COMPILER 553#define __strong_reference(sym,aliassym) \ 554 extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym))) 555#endif 556#ifdef __STDC__ 557#define __weak_reference(sym,alias) \ 558 __asm__(".weak " #alias); \ 559 __asm__(".equ " #alias ", " #sym) 560#define __warn_references(sym,msg) \ 561 __asm__(".section .gnu.warning." #sym); \ 562 __asm__(".asciz \"" msg "\""); \ 563 __asm__(".previous") 564#define __sym_compat(sym,impl,verid) \ 565 __asm__(".symver " #impl ", " #sym "@" #verid) 566#define __sym_default(sym,impl,verid) \ 567 __asm__(".symver " #impl ", " #sym "@@" #verid) 568#else 569#define __weak_reference(sym,alias) \ 570 __asm__(".weak alias"); \ 571 __asm__(".equ alias, sym") 572#define __warn_references(sym,msg) \ 573 __asm__(".section .gnu.warning.sym"); \ 574 __asm__(".asciz \"msg\""); \ 575 __asm__(".previous") 576#define __sym_compat(sym,impl,verid) \ 577 __asm__(".symver impl, sym@verid") 578#define __sym_default(impl,sym,verid) \ 579 __asm__(".symver impl, sym@@verid") 580#endif /* __STDC__ */ 581#endif /* __GNUC__ || __INTEL_COMPILER */ 582 583#define __GLOBL1(sym) __asm__(".globl " #sym) 584#define __GLOBL(sym) __GLOBL1(sym) 585 586#if defined(__GNUC__) || defined(__INTEL_COMPILER) 587#define __IDSTRING(name,string) __asm__(".ident\t\"" string "\"") 588#else 589/* 590 * The following definition might not work well if used in header files, 591 * but it should be better than nothing. If you want a "do nothing" 592 * version, then it should generate some harmless declaration, such as: 593 * #define __IDSTRING(name,string) struct __hack 594 */ 595#define __IDSTRING(name,string) static const char name[] __unused = string 596#endif 597 598/* 599 * Embed the rcs id of a source file in the resulting library. Note that in 600 * more recent ELF binutils, we use .ident allowing the ID to be stripped. 601 * Usage: 602 * __FBSDID("$FreeBSD: stable/11/sys/sys/cdefs.h 331722 2018-03-29 02:50:57Z eadler $"); 603 */ 604#ifndef __FBSDID 605#if !defined(lint) && !defined(STRIP_FBSDID) 606#define __FBSDID(s) __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) 607#else 608#define __FBSDID(s) struct __hack 609#endif 610#endif 611 612#ifndef __RCSID 613#ifndef NO__RCSID 614#define __RCSID(s) __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) 615#else 616#define __RCSID(s) struct __hack 617#endif 618#endif 619 620#ifndef __RCSID_SOURCE 621#ifndef NO__RCSID_SOURCE 622#define __RCSID_SOURCE(s) __IDSTRING(__CONCAT(__rcsid_source_,__LINE__),s) 623#else 624#define __RCSID_SOURCE(s) struct __hack 625#endif 626#endif 627 628#ifndef __SCCSID 629#ifndef NO__SCCSID 630#define __SCCSID(s) __IDSTRING(__CONCAT(__sccsid_,__LINE__),s) 631#else 632#define __SCCSID(s) struct __hack 633#endif 634#endif 635 636#ifndef __COPYRIGHT 637#ifndef NO__COPYRIGHT 638#define __COPYRIGHT(s) __IDSTRING(__CONCAT(__copyright_,__LINE__),s) 639#else 640#define __COPYRIGHT(s) struct __hack 641#endif 642#endif 643 644#ifndef __DECONST 645#define __DECONST(type, var) ((type)(__uintptr_t)(const void *)(var)) 646#endif 647 648#ifndef __DEVOLATILE 649#define __DEVOLATILE(type, var) ((type)(__uintptr_t)(volatile void *)(var)) 650#endif 651 652#ifndef __DEQUALIFY 653#define __DEQUALIFY(type, var) ((type)(__uintptr_t)(const volatile void *)(var)) 654#endif 655 656/*- 657 * The following definitions are an extension of the behavior originally 658 * implemented in <sys/_posix.h>, but with a different level of granularity. 659 * POSIX.1 requires that the macros we test be defined before any standard 660 * header file is included. 661 * 662 * Here's a quick run-down of the versions: 663 * defined(_POSIX_SOURCE) 1003.1-1988 664 * _POSIX_C_SOURCE == 1 1003.1-1990 665 * _POSIX_C_SOURCE == 2 1003.2-1992 C Language Binding Option 666 * _POSIX_C_SOURCE == 199309 1003.1b-1993 667 * _POSIX_C_SOURCE == 199506 1003.1c-1995, 1003.1i-1995, 668 * and the omnibus ISO/IEC 9945-1: 1996 669 * _POSIX_C_SOURCE == 200112 1003.1-2001 670 * _POSIX_C_SOURCE == 200809 1003.1-2008 671 * 672 * In addition, the X/Open Portability Guide, which is now the Single UNIX 673 * Specification, defines a feature-test macro which indicates the version of 674 * that specification, and which subsumes _POSIX_C_SOURCE. 675 * 676 * Our macros begin with two underscores to avoid namespace screwage. 677 */ 678 679/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */ 680#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1 681#undef _POSIX_C_SOURCE /* Probably illegal, but beyond caring now. */ 682#define _POSIX_C_SOURCE 199009 683#endif 684 685/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */ 686#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2 687#undef _POSIX_C_SOURCE 688#define _POSIX_C_SOURCE 199209 689#endif 690 691/* Deal with various X/Open Portability Guides and Single UNIX Spec. */ 692#ifdef _XOPEN_SOURCE 693#if _XOPEN_SOURCE - 0 >= 700 694#define __XSI_VISIBLE 700 695#undef _POSIX_C_SOURCE 696#define _POSIX_C_SOURCE 200809 697#elif _XOPEN_SOURCE - 0 >= 600 698#define __XSI_VISIBLE 600 699#undef _POSIX_C_SOURCE 700#define _POSIX_C_SOURCE 200112 701#elif _XOPEN_SOURCE - 0 >= 500 702#define __XSI_VISIBLE 500 703#undef _POSIX_C_SOURCE 704#define _POSIX_C_SOURCE 199506 705#endif 706#endif 707 708/* 709 * Deal with all versions of POSIX. The ordering relative to the tests above is 710 * important. 711 */ 712#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) 713#define _POSIX_C_SOURCE 198808 714#endif 715#ifdef _POSIX_C_SOURCE 716#if _POSIX_C_SOURCE >= 200809 717#define __POSIX_VISIBLE 200809 718#define __ISO_C_VISIBLE 1999 719#elif _POSIX_C_SOURCE >= 200112 720#define __POSIX_VISIBLE 200112 721#define __ISO_C_VISIBLE 1999 722#elif _POSIX_C_SOURCE >= 199506 723#define __POSIX_VISIBLE 199506 724#define __ISO_C_VISIBLE 1990 725#elif _POSIX_C_SOURCE >= 199309 726#define __POSIX_VISIBLE 199309 727#define __ISO_C_VISIBLE 1990 728#elif _POSIX_C_SOURCE >= 199209 729#define __POSIX_VISIBLE 199209 730#define __ISO_C_VISIBLE 1990 731#elif _POSIX_C_SOURCE >= 199009 732#define __POSIX_VISIBLE 199009 733#define __ISO_C_VISIBLE 1990 734#else 735#define __POSIX_VISIBLE 198808 736#define __ISO_C_VISIBLE 0 737#endif /* _POSIX_C_SOURCE */ 738#else 739/*- 740 * Deal with _ANSI_SOURCE: 741 * If it is defined, and no other compilation environment is explicitly 742 * requested, then define our internal feature-test macros to zero. This 743 * makes no difference to the preprocessor (undefined symbols in preprocessing 744 * expressions are defined to have value zero), but makes it more convenient for 745 * a test program to print out the values. 746 * 747 * If a program mistakenly defines _ANSI_SOURCE and some other macro such as 748 * _POSIX_C_SOURCE, we will assume that it wants the broader compilation 749 * environment (and in fact we will never get here). 750 */ 751#if defined(_ANSI_SOURCE) /* Hide almost everything. */ 752#define __POSIX_VISIBLE 0 753#define __XSI_VISIBLE 0 754#define __BSD_VISIBLE 0 755#define __ISO_C_VISIBLE 1990 756#define __EXT1_VISIBLE 0 757#elif defined(_C99_SOURCE) /* Localism to specify strict C99 env. */ 758#define __POSIX_VISIBLE 0 759#define __XSI_VISIBLE 0 760#define __BSD_VISIBLE 0 761#define __ISO_C_VISIBLE 1999 762#define __EXT1_VISIBLE 0 763#elif defined(_C11_SOURCE) /* Localism to specify strict C11 env. */ 764#define __POSIX_VISIBLE 0 765#define __XSI_VISIBLE 0 766#define __BSD_VISIBLE 0 767#define __ISO_C_VISIBLE 2011 768#define __EXT1_VISIBLE 0 769#else /* Default environment: show everything. */ 770#define __POSIX_VISIBLE 200809 771#define __XSI_VISIBLE 700 772#define __BSD_VISIBLE 1 773#define __ISO_C_VISIBLE 2011 774#define __EXT1_VISIBLE 1 775#endif 776#endif 777 778/* User override __EXT1_VISIBLE */ 779#if defined(__STDC_WANT_LIB_EXT1__) 780#undef __EXT1_VISIBLE 781#if __STDC_WANT_LIB_EXT1__ 782#define __EXT1_VISIBLE 1 783#else 784#define __EXT1_VISIBLE 0 785#endif 786#endif /* __STDC_WANT_LIB_EXT1__ */ 787 788#if defined(__mips) || defined(__powerpc64__) || defined(__riscv__) 789#define __NO_TLS 1 790#endif 791 792/* 793 * Old versions of GCC use non-standard ARM arch symbols; acle-compat.h 794 * translates them to __ARM_ARCH and the modern feature symbols defined by ARM. 795 */ 796#if defined(__arm__) && !defined(__ARM_ARCH) 797#include <machine/acle-compat.h> 798#endif 799 800/* 801 * Nullability qualifiers: currently only supported by Clang. 802 */ 803#if !(defined(__clang__) && __has_feature(nullability)) 804#define _Nonnull 805#define _Nullable 806#define _Null_unspecified 807#define __NULLABILITY_PRAGMA_PUSH 808#define __NULLABILITY_PRAGMA_POP 809#else 810#define __NULLABILITY_PRAGMA_PUSH _Pragma("clang diagnostic push") \ 811 _Pragma("clang diagnostic ignored \"-Wnullability-completeness\"") 812#define __NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop") 813#endif 814 815/* 816 * Type Safety Checking 817 * 818 * Clang provides additional attributes to enable checking type safety 819 * properties that cannot be enforced by the C type system. 820 */ 821 822#if __has_attribute(__argument_with_type_tag__) && \ 823 __has_attribute(__type_tag_for_datatype__) && !defined(lint) 824#define __arg_type_tag(arg_kind, arg_idx, type_tag_idx) \ 825 __attribute__((__argument_with_type_tag__(arg_kind, arg_idx, type_tag_idx))) 826#define __datatype_type_tag(kind, type) \ 827 __attribute__((__type_tag_for_datatype__(kind, type))) 828#else 829#define __arg_type_tag(arg_kind, arg_idx, type_tag_idx) 830#define __datatype_type_tag(kind, type) 831#endif 832 833/* 834 * Lock annotations. 835 * 836 * Clang provides support for doing basic thread-safety tests at 837 * compile-time, by marking which locks will/should be held when 838 * entering/leaving a functions. 839 * 840 * Furthermore, it is also possible to annotate variables and structure 841 * members to enforce that they are only accessed when certain locks are 842 * held. 843 */ 844 845#if __has_extension(c_thread_safety_attributes) 846#define __lock_annotate(x) __attribute__((x)) 847#else 848#define __lock_annotate(x) 849#endif 850 851/* Structure implements a lock. */ 852#define __lockable __lock_annotate(lockable) 853 854/* Function acquires an exclusive or shared lock. */ 855#define __locks_exclusive(...) \ 856 __lock_annotate(exclusive_lock_function(__VA_ARGS__)) 857#define __locks_shared(...) \ 858 __lock_annotate(shared_lock_function(__VA_ARGS__)) 859 860/* Function attempts to acquire an exclusive or shared lock. */ 861#define __trylocks_exclusive(...) \ 862 __lock_annotate(exclusive_trylock_function(__VA_ARGS__)) 863#define __trylocks_shared(...) \ 864 __lock_annotate(shared_trylock_function(__VA_ARGS__)) 865 866/* Function releases a lock. */ 867#define __unlocks(...) __lock_annotate(unlock_function(__VA_ARGS__)) 868 869/* Function asserts that an exclusive or shared lock is held. */ 870#define __asserts_exclusive(...) \ 871 __lock_annotate(assert_exclusive_lock(__VA_ARGS__)) 872#define __asserts_shared(...) \ 873 __lock_annotate(assert_shared_lock(__VA_ARGS__)) 874 875/* Function requires that an exclusive or shared lock is or is not held. */ 876#define __requires_exclusive(...) \ 877 __lock_annotate(exclusive_locks_required(__VA_ARGS__)) 878#define __requires_shared(...) \ 879 __lock_annotate(shared_locks_required(__VA_ARGS__)) 880#define __requires_unlocked(...) \ 881 __lock_annotate(locks_excluded(__VA_ARGS__)) 882 883/* Function should not be analyzed. */ 884#define __no_lock_analysis __lock_annotate(no_thread_safety_analysis) 885 886/* Guard variables and structure members by lock. */ 887#define __guarded_by(x) __lock_annotate(guarded_by(x)) 888#define __pt_guarded_by(x) __lock_annotate(pt_guarded_by(x)) 889 890#endif /* !_SYS_CDEFS_H_ */ 891