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