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