1 /* $NetBSD: cdefs.h,v 1.58 2004/12/11 05:59:00 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1991, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Berkeley Software Design, Inc. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 35 */ 36 37 #ifndef _SYS_CDEFS_H_ 38 #define _SYS_CDEFS_H_ 39 40 /* 41 * Testing against Clang-specific extensions. 42 */ 43 44 #ifndef __has_extension 45 #define __has_extension __has_feature 46 #endif 47 #ifndef __has_feature 48 #define __has_feature(x) 0 49 #endif 50 #ifndef __has_include 51 #define __has_include(x) 0 52 #endif 53 #ifndef __has_builtin 54 #define __has_builtin(x) 0 55 #endif 56 #ifndef __has_attribute 57 #define __has_attribute(x) 0 58 #endif 59 60 61 /* 62 * Macro to test if we're using a GNU C compiler of a specific vintage 63 * or later, for e.g. features that appeared in a particular version 64 * of GNU C. Usage: 65 * 66 * #if __GNUC_PREREQ(major, minor) 67 * ...cool feature... 68 * #else 69 * ...delete feature... 70 * #endif 71 */ 72 #ifdef __GNUC__ 73 #define __GNUC_PREREQ(x, y) \ 74 ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \ 75 (__GNUC__ > (x))) 76 #else 77 #define __GNUC_PREREQ(x, y) 0 78 #endif 79 80 #include <sys/cdefs_elf.h> 81 82 #if defined(__cplusplus) 83 #define __BEGIN_DECLS extern "C" { 84 #define __END_DECLS } 85 #define __static_cast(x,y) static_cast<x>(y) 86 #else 87 #define __BEGIN_DECLS 88 #define __END_DECLS 89 #define __static_cast(x,y) (x)y 90 #endif 91 92 /* 93 * The __CONCAT macro is used to concatenate parts of symbol names, e.g. 94 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. 95 * The __CONCAT macro is a bit tricky -- make sure you don't put spaces 96 * in between its arguments. __CONCAT can also concatenate double-quoted 97 * strings produced by the __STRING macro, but this only works with ANSI C. 98 */ 99 100 #define ___STRING(x) __STRING(x) 101 #define ___CONCAT(x,y) __CONCAT(x,y) 102 103 #if defined(__STDC__) || defined(__cplusplus) 104 #define __P(protos) protos /* full-blown ANSI C */ 105 #define __CONCAT(x,y) x ## y 106 #define __STRING(x) #x 107 108 #define __const const /* define reserved names to standard */ 109 #define __signed signed 110 #define __volatile volatile 111 #if defined(__cplusplus) 112 #define __inline inline /* convert to C++ keyword */ 113 #else 114 #if !defined(__GNUC__) && !defined(__lint__) 115 #define __inline /* delete GCC keyword */ 116 #endif /* !__GNUC__ && !__lint__ */ 117 #endif /* !__cplusplus */ 118 119 #else /* !(__STDC__ || __cplusplus) */ 120 #define __P(protos) () /* traditional C preprocessor */ 121 #define __CONCAT(x,y) x/**/y 122 #define __STRING(x) "x" 123 124 #ifndef __GNUC__ 125 #define __const /* delete pseudo-ANSI C keywords */ 126 #define __inline 127 #define __signed 128 #define __volatile 129 #endif /* !__GNUC__ */ 130 131 /* 132 * In non-ANSI C environments, new programs will want ANSI-only C keywords 133 * deleted from the program and old programs will want them left alone. 134 * Programs using the ANSI C keywords const, inline etc. as normal 135 * identifiers should define -DNO_ANSI_KEYWORDS. 136 */ 137 #ifndef NO_ANSI_KEYWORDS 138 #define const __const /* convert ANSI C keywords */ 139 #define inline __inline 140 #define signed __signed 141 #define volatile __volatile 142 #endif /* !NO_ANSI_KEYWORDS */ 143 #endif /* !(__STDC__ || __cplusplus) */ 144 145 /* 146 * Used for internal auditing of the NetBSD source tree. 147 */ 148 #ifdef __AUDIT__ 149 #define __aconst __const 150 #else 151 #define __aconst 152 #endif 153 154 /* 155 * The following macro is used to remove const cast-away warnings 156 * from gcc -Wcast-qual; it should be used with caution because it 157 * can hide valid errors; in particular most valid uses are in 158 * situations where the API requires it, not to cast away string 159 * constants. We don't use *intptr_t on purpose here and we are 160 * explicit about unsigned long so that we don't have additional 161 * dependencies. 162 */ 163 #define __UNCONST(a) ((void *)(unsigned long)(const void *)(a)) 164 165 /* 166 * GCC2 provides __extension__ to suppress warnings for various GNU C 167 * language extensions under "-ansi -pedantic". 168 */ 169 #if !__GNUC_PREREQ(2, 0) 170 #define __extension__ /* delete __extension__ if non-gcc or gcc1 */ 171 #endif 172 173 /* 174 * GCC1 and some versions of GCC2 declare dead (non-returning) and 175 * pure (no side effects) functions using "volatile" and "const"; 176 * unfortunately, these then cause warnings under "-ansi -pedantic". 177 * GCC2 uses a new, peculiar __attribute__((attrs)) style. All of 178 * these work for GNU C++ (modulo a slight glitch in the C++ grammar 179 * in the distribution version of 2.5.5). 180 */ 181 #if !__GNUC_PREREQ(2, 5) 182 #define __attribute__(x) /* delete __attribute__ if non-gcc or gcc1 */ 183 #if defined(__GNUC__) && !defined(__STRICT_ANSI__) 184 #define __dead __volatile 185 #define __pure __const 186 #endif 187 #endif 188 189 /* Delete pseudo-keywords wherever they are not available or needed. */ 190 #ifndef __dead 191 #define __dead 192 #define __pure 193 #endif 194 195 #if __GNUC_PREREQ(2, 7) 196 #define __unused __attribute__((__unused__)) 197 #else 198 #define __unused /* delete */ 199 #endif 200 201 #define __pure2 __attribute__((__const__)) /* Android-added: used by FreeBSD libm */ 202 203 #if __GNUC_PREREQ(3, 1) 204 #define __used __attribute__((__used__)) 205 #else 206 #define __used /* delete */ 207 #endif 208 209 #if __GNUC_PREREQ(2, 7) 210 #define __packed __attribute__((__packed__)) 211 #define __aligned(x) __attribute__((__aligned__(x))) 212 #define __section(x) __attribute__((__section__(x))) 213 #elif defined(__lint__) 214 #define __packed /* delete */ 215 #define __aligned(x) /* delete */ 216 #define __section(x) /* delete */ 217 #else 218 #define __packed error: no __packed for this compiler 219 #define __aligned(x) error: no __aligned for this compiler 220 #define __section(x) error: no __section for this compiler 221 #endif 222 223 #if !__GNUC_PREREQ(2, 8) 224 #define __extension__ 225 #endif 226 227 #if __GNUC_PREREQ(2, 8) 228 #define __statement(x) __extension__(x) 229 #elif defined(lint) 230 #define __statement(x) (0) 231 #else 232 #define __statement(x) (x) 233 #endif 234 235 #define __nonnull(args) __attribute__((__nonnull__ args)) 236 237 #define __printflike(x, y) __attribute__((__format__(printf, x, y))) __nonnull((x)) 238 #define __scanflike(x, y) __attribute__((__format__(scanf, x, y))) __nonnull((x)) 239 240 /* 241 * C99 defines the restrict type qualifier keyword, which was made available 242 * in GCC 2.92. 243 */ 244 #if defined(__STDC__VERSION__) && __STDC_VERSION__ >= 199901L 245 #define __restrict restrict 246 #else 247 #if !__GNUC_PREREQ(2, 92) 248 #define __restrict /* delete __restrict when not supported */ 249 #endif 250 #endif 251 252 /* 253 * C99 defines __func__ predefined identifier, which was made available 254 * in GCC 2.95. 255 */ 256 #if !defined(__STDC_VERSION__) || !(__STDC_VERSION__ >= 199901L) 257 #if __GNUC_PREREQ(2, 6) 258 #define __func__ __PRETTY_FUNCTION__ 259 #elif __GNUC_PREREQ(2, 4) 260 #define __func__ __FUNCTION__ 261 #else 262 #define __func__ "" 263 #endif 264 #endif /* !(__STDC_VERSION__ >= 199901L) */ 265 266 #if defined(_KERNEL) 267 #if defined(NO_KERNEL_RCSIDS) 268 #undef __KERNEL_RCSID 269 #define __KERNEL_RCSID(_n, _s) /* nothing */ 270 #endif /* NO_KERNEL_RCSIDS */ 271 #endif /* _KERNEL */ 272 273 /* 274 * A barrier to stop the optimizer from moving code or assume live 275 * register values. This is gcc specific, the version is more or less 276 * arbitrary, might work with older compilers. 277 */ 278 #if __GNUC_PREREQ(2, 95) 279 #define __insn_barrier() __asm __volatile("":::"memory") 280 #else 281 #define __insn_barrier() /* */ 282 #endif 283 284 /* 285 * GNU C version 2.96 adds explicit branch prediction so that 286 * the CPU back-end can hint the processor and also so that 287 * code blocks can be reordered such that the predicted path 288 * sees a more linear flow, thus improving cache behavior, etc. 289 * 290 * The following two macros provide us with a way to use this 291 * compiler feature. Use __predict_true() if you expect the expression 292 * to evaluate to true, and __predict_false() if you expect the 293 * expression to evaluate to false. 294 * 295 * A few notes about usage: 296 * 297 * * Generally, __predict_false() error condition checks (unless 298 * you have some _strong_ reason to do otherwise, in which case 299 * document it), and/or __predict_true() `no-error' condition 300 * checks, assuming you want to optimize for the no-error case. 301 * 302 * * Other than that, if you don't know the likelihood of a test 303 * succeeding from empirical or other `hard' evidence, don't 304 * make predictions. 305 * 306 * * These are meant to be used in places that are run `a lot'. 307 * It is wasteful to make predictions in code that is run 308 * seldomly (e.g. at subsystem initialization time) as the 309 * basic block reordering that this affects can often generate 310 * larger code. 311 */ 312 #if __GNUC_PREREQ(2, 96) 313 #define __predict_true(exp) __builtin_expect((exp) != 0, 1) 314 #define __predict_false(exp) __builtin_expect((exp) != 0, 0) 315 #else 316 #define __predict_true(exp) (exp) 317 #define __predict_false(exp) (exp) 318 #endif 319 320 #if __GNUC_PREREQ(2, 96) 321 #define __noreturn __attribute__((__noreturn__)) 322 #define __mallocfunc __attribute__((malloc)) 323 #define __purefunc __attribute__((pure)) 324 #else 325 #define __noreturn 326 #define __mallocfunc 327 #define __purefunc 328 #endif 329 330 #if __GNUC_PREREQ(3, 1) 331 #define __always_inline __attribute__((__always_inline__)) 332 #else 333 #define __always_inline 334 #endif 335 336 #if __GNUC_PREREQ(3, 4) 337 #define __wur __attribute__((__warn_unused_result__)) 338 #else 339 #define __wur 340 #endif 341 342 #if __GNUC_PREREQ(4, 3) 343 #define __errordecl(name, msg) extern void name(void) __attribute__((__error__(msg))) 344 #define __warnattr(msg) __attribute__((__warning__(msg))) 345 #else 346 #define __errordecl(name, msg) extern void name(void) 347 #define __warnattr(msg) 348 #endif 349 350 /* 351 * Some BSD source needs these macros. 352 * Originally they embedded the rcs versions of each source file 353 * in the generated binary. We strip strings during build anyway,. 354 */ 355 #define __IDSTRING(_prefix,_s) /* nothing */ 356 #define __COPYRIGHT(_s) /* nothing */ 357 #define __FBSDID(_s) /* nothing */ 358 #define __RCSID(_s) /* nothing */ 359 #define __SCCSID(_s) /* nothing */ 360 361 /*- 362 * The following definitions are an extension of the behavior originally 363 * implemented in <sys/_posix.h>, but with a different level of granularity. 364 * POSIX.1 requires that the macros we test be defined before any standard 365 * header file is included. 366 * 367 * Here's a quick run-down of the versions: 368 * defined(_POSIX_SOURCE) 1003.1-1988 369 * _POSIX_C_SOURCE == 1 1003.1-1990 370 * _POSIX_C_SOURCE == 2 1003.2-1992 C Language Binding Option 371 * _POSIX_C_SOURCE == 199309 1003.1b-1993 372 * _POSIX_C_SOURCE == 199506 1003.1c-1995, 1003.1i-1995, 373 * and the omnibus ISO/IEC 9945-1: 1996 374 * _POSIX_C_SOURCE == 200112 1003.1-2001 375 * _POSIX_C_SOURCE == 200809 1003.1-2008 376 * 377 * In addition, the X/Open Portability Guide, which is now the Single UNIX 378 * Specification, defines a feature-test macro which indicates the version of 379 * that specification, and which subsumes _POSIX_C_SOURCE. 380 * 381 * Our macros begin with two underscores to avoid namespace screwage. 382 */ 383 384 /* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */ 385 #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1 386 #undef _POSIX_C_SOURCE /* Probably illegal, but beyond caring now. */ 387 #define _POSIX_C_SOURCE 199009 388 #endif 389 390 /* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */ 391 #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2 392 #undef _POSIX_C_SOURCE 393 #define _POSIX_C_SOURCE 199209 394 #endif 395 396 /* Deal with various X/Open Portability Guides and Single UNIX Spec. */ 397 #ifdef _XOPEN_SOURCE 398 #if _XOPEN_SOURCE - 0 >= 700 399 #define __XSI_VISIBLE 700 400 #undef _POSIX_C_SOURCE 401 #define _POSIX_C_SOURCE 200809 402 #elif _XOPEN_SOURCE - 0 >= 600 403 #define __XSI_VISIBLE 600 404 #undef _POSIX_C_SOURCE 405 #define _POSIX_C_SOURCE 200112 406 #elif _XOPEN_SOURCE - 0 >= 500 407 #define __XSI_VISIBLE 500 408 #undef _POSIX_C_SOURCE 409 #define _POSIX_C_SOURCE 199506 410 #endif 411 #endif 412 413 /* 414 * Deal with all versions of POSIX. The ordering relative to the tests above is 415 * important. 416 */ 417 #if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) 418 #define _POSIX_C_SOURCE 198808 419 #endif 420 #ifdef _POSIX_C_SOURCE 421 #if _POSIX_C_SOURCE >= 200809 422 #define __POSIX_VISIBLE 200809 423 #define __ISO_C_VISIBLE 1999 424 #elif _POSIX_C_SOURCE >= 200112 425 #define __POSIX_VISIBLE 200112 426 #define __ISO_C_VISIBLE 1999 427 #elif _POSIX_C_SOURCE >= 199506 428 #define __POSIX_VISIBLE 199506 429 #define __ISO_C_VISIBLE 1990 430 #elif _POSIX_C_SOURCE >= 199309 431 #define __POSIX_VISIBLE 199309 432 #define __ISO_C_VISIBLE 1990 433 #elif _POSIX_C_SOURCE >= 199209 434 #define __POSIX_VISIBLE 199209 435 #define __ISO_C_VISIBLE 1990 436 #elif _POSIX_C_SOURCE >= 199009 437 #define __POSIX_VISIBLE 199009 438 #define __ISO_C_VISIBLE 1990 439 #else 440 #define __POSIX_VISIBLE 198808 441 #define __ISO_C_VISIBLE 0 442 #endif /* _POSIX_C_SOURCE */ 443 #else 444 /*- 445 * Deal with _ANSI_SOURCE: 446 * If it is defined, and no other compilation environment is explicitly 447 * requested, then define our internal feature-test macros to zero. This 448 * makes no difference to the preprocessor (undefined symbols in preprocessing 449 * expressions are defined to have value zero), but makes it more convenient for 450 * a test program to print out the values. 451 * 452 * If a program mistakenly defines _ANSI_SOURCE and some other macro such as 453 * _POSIX_C_SOURCE, we will assume that it wants the broader compilation 454 * environment (and in fact we will never get here). 455 */ 456 #if defined(_ANSI_SOURCE) /* Hide almost everything. */ 457 #define __POSIX_VISIBLE 0 458 #define __XSI_VISIBLE 0 459 #define __BSD_VISIBLE 0 460 #define __ISO_C_VISIBLE 1990 461 #elif defined(_C99_SOURCE) /* Localism to specify strict C99 env. */ 462 #define __POSIX_VISIBLE 0 463 #define __XSI_VISIBLE 0 464 #define __BSD_VISIBLE 0 465 #define __ISO_C_VISIBLE 1999 466 #else /* Default environment: show everything. */ 467 #define __POSIX_VISIBLE 200809 468 #define __XSI_VISIBLE 700 469 #define __BSD_VISIBLE 1 470 #define __ISO_C_VISIBLE 1999 471 #endif 472 #endif 473 474 /* 475 * Default values. 476 */ 477 #ifndef __XPG_VISIBLE 478 # define __XPG_VISIBLE 700 479 #endif 480 #ifndef __POSIX_VISIBLE 481 # define __POSIX_VISIBLE 200809 482 #endif 483 #ifndef __ISO_C_VISIBLE 484 # define __ISO_C_VISIBLE 1999 485 #endif 486 #ifndef __BSD_VISIBLE 487 # define __BSD_VISIBLE 1 488 #endif 489 490 #define __BIONIC__ 1 491 #include <android/api-level.h> 492 493 /* glibc compatibility. */ 494 #if __LP64__ 495 #define __WORDSIZE 64 496 #else 497 #define __WORDSIZE 32 498 #endif 499 500 /* 501 * When _FORTIFY_SOURCE is defined, automatic bounds checking is 502 * added to commonly used libc functions. If a buffer overrun is 503 * detected, the program is safely aborted. 504 * 505 * See 506 * http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html for details. 507 */ 508 #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 509 #define __BIONIC_FORTIFY 1 510 #if _FORTIFY_SOURCE == 2 511 #define __bos(s) __builtin_object_size((s), 1) 512 #else 513 #define __bos(s) __builtin_object_size((s), 0) 514 #endif 515 #define __bos0(s) __builtin_object_size((s), 0) 516 517 #if __GNUC_PREREQ(4,3) || __has_attribute(__artificial__) 518 #define __BIONIC_FORTIFY_INLINE extern __inline__ __always_inline __attribute__((gnu_inline)) __attribute__((__artificial__)) 519 #else 520 #define __BIONIC_FORTIFY_INLINE extern __inline__ __always_inline __attribute__((gnu_inline)) 521 #endif 522 #endif 523 #define __BIONIC_FORTIFY_UNKNOWN_SIZE ((size_t) -1) 524 525 /* Used to tag non-static symbols that are private and never exposed by the shared library. */ 526 #define __LIBC_HIDDEN__ __attribute__((visibility("hidden"))) 527 528 /* Like __LIBC_HIDDEN__, but preserves binary compatibility for LP32. */ 529 #ifdef __LP64__ 530 #define __LIBC64_HIDDEN__ __LIBC_HIDDEN__ 531 #else 532 #define __LIBC64_HIDDEN__ __LIBC_ABI_PUBLIC__ 533 #endif 534 535 /* Used to tag non-static symbols that are public and exposed by the shared library. */ 536 #define __LIBC_ABI_PUBLIC__ __attribute__((visibility ("default"))) 537 538 /* Used to rename functions so that the compiler emits a call to 'x' rather than the function this was applied to. */ 539 #define __RENAME(x) __asm__(#x) 540 541 #endif /* !_SYS_CDEFS_H_ */ 542