X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d9a64523371fa019c4575bb400cbbc3a50ac9903..c3c9b80d004dbbfdf763edeb97968c6997e3b45b:/bsd/sys/cdefs.h diff --git a/bsd/sys/cdefs.h b/bsd/sys/cdefs.h index a7f6639e0..c00ca16de 100644 --- a/bsd/sys/cdefs.h +++ b/bsd/sys/cdefs.h @@ -2,7 +2,7 @@ * Copyright (c) 2000-2018 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,7 +22,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* Copyright 1995 NeXT Computer, Inc. All rights reserved. */ @@ -64,15 +64,15 @@ * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 */ -#ifndef _CDEFS_H_ -#define _CDEFS_H_ +#ifndef _CDEFS_H_ +#define _CDEFS_H_ #if defined(__cplusplus) -#define __BEGIN_DECLS extern "C" { -#define __END_DECLS } +#define __BEGIN_DECLS extern "C" { +#define __END_DECLS } #else -#define __BEGIN_DECLS -#define __END_DECLS +#define __BEGIN_DECLS +#define __END_DECLS #endif /* This SDK is designed to work with clang and specific versions of @@ -109,32 +109,32 @@ * strings produced by the __STRING macro, but this only works with ANSI C. */ #if defined(__STDC__) || defined(__cplusplus) -#define __P(protos) protos /* full-blown ANSI C */ -#define __CONCAT(x,y) x ## y -#define __STRING(x) #x +#define __P(protos) protos /* full-blown ANSI C */ +#define __CONCAT(x, y) x ## y +#define __STRING(x) #x -#define __const const /* define reserved names to standard */ -#define __signed signed -#define __volatile volatile +#define __const const /* define reserved names to standard */ +#define __signed signed +#define __volatile volatile #if defined(__cplusplus) -#define __inline inline /* convert to C++ keyword */ +#define __inline inline /* convert to C++ keyword */ #else #ifndef __GNUC__ -#define __inline /* delete GCC keyword */ +#define __inline /* delete GCC keyword */ #endif /* !__GNUC__ */ #endif /* !__cplusplus */ -#else /* !(__STDC__ || __cplusplus) */ -#define __P(protos) () /* traditional C preprocessor */ -#define __CONCAT(x,y) x/**/y -#define __STRING(x) "x" +#else /* !(__STDC__ || __cplusplus) */ +#define __P(protos) () /* traditional C preprocessor */ +#define __CONCAT(x, y) x /**/ y +#define __STRING(x) "x" #ifndef __GNUC__ -#define __const /* delete pseudo-ANSI C keywords */ -#define __inline -#define __signed -#define __volatile -#endif /* !__GNUC__ */ +#define __const /* delete pseudo-ANSI C keywords */ +#define __inline +#define __signed +#define __volatile +#endif /* !__GNUC__ */ /* * In non-ANSI C environments, new programs will want ANSI-only C keywords @@ -144,26 +144,44 @@ * When using "gcc -traditional", we assume that this is the intent; if * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. */ -#ifndef NO_ANSI_KEYWORDS -#define const __const /* convert ANSI C keywords */ -#define inline __inline -#define signed __signed -#define volatile __volatile +#ifndef NO_ANSI_KEYWORDS +#define const __const /* convert ANSI C keywords */ +#define inline __inline +#define signed __signed +#define volatile __volatile #endif /* !NO_ANSI_KEYWORDS */ #endif /* !(__STDC__ || __cplusplus) */ -#define __dead2 __attribute__((noreturn)) -#define __pure2 __attribute__((const)) +#define __dead2 __attribute__((__noreturn__)) +#define __pure2 __attribute__((__const__)) /* __unused denotes variables and functions that may not be used, preventing * the compiler from warning about it if not used. */ -#define __unused __attribute__((unused)) +#define __unused __attribute__((__unused__)) /* __used forces variables and functions to be included even if it appears * to the compiler that they are not used (and would thust be discarded). */ -#define __used __attribute__((used)) +#define __used __attribute__((__used__)) + +/* __cold marks code used for debugging or that is rarely taken + * and tells the compiler to optimize for size and outline code. + */ +#if __has_attribute(cold) +#define __cold __attribute__((__cold__)) +#else +#define __cold +#endif + +/* __exported denotes symbols that should be exported even when symbols + * are hidden by default. + * __exported_push/_exported_pop are pragmas used to delimit a range of + * symbols that should be exported even when symbols are hidden by default. + */ +#define __exported __attribute__((__visibility__("default"))) +#define __exported_push _Pragma("GCC visibility push(default)") +#define __exported_pop _Pragma("GCC visibility pop") /* __deprecated causes the compiler to produce a warning when encountering * code using the deprecated functionality. @@ -172,14 +190,16 @@ * This may require turning on such warning with the -Wdeprecated flag. * __deprecated_enum_msg() should be used on enums, and compilers that support * it will print the deprecation warning. + * __kpi_deprecated() specifically indicates deprecation of kernel programming + * interfaces in Kernel.framework used by KEXTs. */ -#define __deprecated __attribute__((deprecated)) +#define __deprecated __attribute__((__deprecated__)) #if __has_extension(attribute_deprecated_with_message) || \ - (defined(__GNUC__) && ((__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)))) - #define __deprecated_msg(_msg) __attribute__((deprecated(_msg))) + (defined(__GNUC__) && ((__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)))) + #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg))) #else - #define __deprecated_msg(_msg) __attribute__((deprecated)) + #define __deprecated_msg(_msg) __attribute__((__deprecated__)) #endif #if __has_extension(enumerator_attributes) @@ -188,15 +208,54 @@ #define __deprecated_enum_msg(_msg) #endif +#if defined(KERNEL) && !defined(KERNEL_PRIVATE) +#define __kpi_deprecated(_msg) __deprecated_msg(_msg) +#else /* !defined(KERNEL) || defined(KERNEL_PRIVATE) */ +#define __kpi_deprecated(_msg) +#endif /* !defined(KERNEL) || defined(KERNEL_PRIVATE) */ + /* __unavailable causes the compiler to error out when encountering - * code using the tagged function of variable. + * code using the tagged function */ -#define __unavailable __attribute__((unavailable)) +#if __has_attribute(unavailable) +#define __unavailable __attribute__((__unavailable__)) +#else +#define __unavailable +#endif + +#if defined(KERNEL) && !defined(KERNEL_PRIVATE) +#define __kpi_unavailable __unavailable +#else /* !defined(KERNEL) || defined(KERNEL_PRIVATE) */ +#define __kpi_unavailable +#endif /* !defined(KERNEL) || defined(KERNEL_PRIVATE) */ + +#if defined(KERNEL) +#if defined(XNU_KERNEL_PRIVATE) +/* This macro is meant to be used for kpi deprecated to x86 3rd parties + * but should be marked as unavailable for arm macOS devices. + * XNU: nothing (API is still available) + * 1st party kexts: __deprecated + * 3rd party kexts macOS x86: __deprecated + * 3rd party kexts macOS arm: __unavailable + */ +#define __kpi_deprecated_arm64_macos_unavailable +#elif defined(KERNEL_PRIVATE) +#define __kpi_deprecated_arm64_macos_unavailable __deprecated +#else /* !defined(XNU_KERNEL_PRIVATE) */ +#if TARGET_OS_OSX && defined(__arm64__) +#define __kpi_deprecated_arm64_macos_unavailable __unavailable +#else /* !TARGET_OS_OSX || !defined(__arm64__) */ +#define __kpi_deprecated_arm64_macos_unavailable __deprecated +#endif /* !TARGET_OS_OSX || !defined(__arm64__) */ +#endif /* !defined(XNU_KERNEL_PRIVATE) */ +#else /* !defined(KERNEL) */ +#define __kpi_deprecated_arm64_macos_unavailable +#endif /* !defined(KERNEL) */ /* Delete pseudo-keywords wherever they are not available or needed. */ #ifndef __dead -#define __dead -#define __pure +#define __dead +#define __pure #endif /* @@ -206,7 +265,7 @@ #if __STDC_VERSION__ < 199901 #define __restrict #else -#define __restrict restrict +#define __restrict restrict #endif /* Compatibility with compilers and environments that don't support the @@ -239,7 +298,7 @@ * optimization inside the marked function. */ #if __has_attribute(disable_tail_calls) -#define __disable_tail_calls __attribute__((__disable_tail_calls__)) +#define __disable_tail_calls __attribute__((__disable_tail_calls__)) #else #define __disable_tail_calls #endif @@ -251,7 +310,7 @@ * "always_inline" cannot be marked as __not_tail_called. */ #if __has_attribute(not_tail_called) -#define __not_tail_called __attribute__((__not_tail_called__)) +#define __not_tail_called __attribute__((__not_tail_called__)) #else #define __not_tail_called #endif @@ -272,11 +331,20 @@ * unavailable in Swift, regardless of any other availability in C. */ #if __has_feature(attribute_availability_swift) -#define __swift_unavailable(_msg) __attribute__((__availability__(swift, unavailable, message=_msg))) +#define __swift_unavailable(_msg) __attribute__((__availability__(swift, unavailable, message=_msg))) #else #define __swift_unavailable(_msg) #endif +/* + * __abortlike is the attribute to put on functions like abort() that are + * typically used to mark assertions. These optimize the codegen + * for outlining while still maintaining debugability. + */ +#ifndef __abortlike +#define __abortlike __dead2 __cold __not_tail_called +#endif + /* Declaring inline functions within headers is error-prone due to differences * across various versions of the C language and extensions. __header_inline * can be used to declare inline functions within system headers. In cases @@ -294,27 +362,27 @@ */ #if defined(__cplusplus) || \ - (__STDC_VERSION__ >= 199901L && \ - !defined(__GNUC_GNU_INLINE__) && \ - (!defined(__GNUC__) || defined(__clang__))) + (__STDC_VERSION__ >= 199901L && \ + !defined(__GNUC_GNU_INLINE__) && \ + (!defined(__GNUC__) || defined(__clang__))) # define __header_inline inline #elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) # define __header_inline extern __inline __attribute__((__gnu_inline__)) #elif defined(__GNUC__) # define __header_inline extern __inline #else - /* If we land here, we've encountered an unsupported compiler, - * so hopefully it understands static __inline as a fallback. - */ +/* If we land here, we've encountered an unsupported compiler, + * so hopefully it understands static __inline as a fallback. + */ # define __header_inline static __inline #endif #ifdef __GNUC__ # define __header_always_inline __header_inline __attribute__ ((__always_inline__)) #else - /* Unfortunately, we're using a compiler that we don't know how to force to - * inline. Oh well. - */ +/* Unfortunately, we're using a compiler that we don't know how to force to + * inline. Oh well. + */ # define __header_always_inline __header_inline #endif @@ -324,16 +392,16 @@ */ #if defined(__clang__) # define __unreachable_ok_push \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wunreachable-code\"") + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wunreachable-code\"") # define __unreachable_ok_pop \ - _Pragma("clang diagnostic pop") + _Pragma("clang diagnostic pop") #elif defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) # define __unreachable_ok_push \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wunreachable-code\"") + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wunreachable-code\"") # define __unreachable_ok_pop \ - _Pragma("GCC diagnostic pop") + _Pragma("GCC diagnostic pop") #else # define __unreachable_ok_push # define __unreachable_ok_pop @@ -348,13 +416,13 @@ * types. */ #define __printflike(fmtarg, firstvararg) \ - __attribute__((__format__ (__printf__, fmtarg, firstvararg))) + __attribute__((__format__ (__printf__, fmtarg, firstvararg))) #define __printf0like(fmtarg, firstvararg) \ - __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) + __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) #define __scanflike(fmtarg, firstvararg) \ - __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) + __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) -#define __IDSTRING(name,string) static const char name[] __used = string +#define __IDSTRING(name, string) static const char name[] __used = string #ifndef __COPYRIGHT #define __COPYRIGHT(s) __IDSTRING(copyright,s) @@ -374,19 +442,19 @@ /* Source compatibility only, ID string not emitted in object file */ #ifndef __FBSDID -#define __FBSDID(s) +#define __FBSDID(s) #endif -#ifndef __DECONST -#define __DECONST(type, var) __CAST_AWAY_QUALIFIER(var, const, type) +#ifndef __DECONST +#define __DECONST(type, var) __CAST_AWAY_QUALIFIER(var, const, type) #endif -#ifndef __DEVOLATILE -#define __DEVOLATILE(type, var) __CAST_AWAY_QUALIFIER(var, volatile, type) +#ifndef __DEVOLATILE +#define __DEVOLATILE(type, var) __CAST_AWAY_QUALIFIER(var, volatile, type) #endif -#ifndef __DEQUALIFY -#define __DEQUALIFY(type, var) __CAST_AWAY_QUALIFIER(var, const volatile, type) +#ifndef __DEQUALIFY +#define __DEQUALIFY(type, var) __CAST_AWAY_QUALIFIER(var, const volatile, type) #endif /* @@ -449,87 +517,103 @@ /* These settings are particular to each product. */ #ifdef KERNEL -#define __DARWIN_ONLY_64_BIT_INO_T 0 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 0 -#define __DARWIN_ONLY_VERS_1050 0 +#define __DARWIN_ONLY_64_BIT_INO_T 0 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 0 +#define __DARWIN_ONLY_VERS_1050 0 #if defined(__x86_64__) -#define __DARWIN_SUF_DARWIN14 "_darwin14" -#define __DARWIN14_ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_DARWIN14) +#define __DARWIN_SUF_DARWIN14 "_darwin14" +#define __DARWIN14_ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_DARWIN14) #else -#define __DARWIN14_ALIAS(sym) +#define __DARWIN14_ALIAS(sym) #endif #else /* !KERNEL */ #ifdef PLATFORM_iPhoneOS /* Platform: iPhoneOS */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_iPhoneOS */ #ifdef PLATFORM_iPhoneSimulator /* Platform: iPhoneSimulator */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_iPhoneSimulator */ #ifdef PLATFORM_tvOS /* Platform: tvOS */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_tvOS */ #ifdef PLATFORM_AppleTVOS /* Platform: AppleTVOS */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_AppleTVOS */ #ifdef PLATFORM_tvSimulator /* Platform: tvSimulator */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_tvSimulator */ #ifdef PLATFORM_AppleTVSimulator /* Platform: AppleTVSimulator */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_AppleTVSimulator */ #ifdef PLATFORM_iPhoneOSNano /* Platform: iPhoneOSNano */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_iPhoneOSNano */ #ifdef PLATFORM_iPhoneNanoSimulator /* Platform: iPhoneNanoSimulator */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_iPhoneNanoSimulator */ #ifdef PLATFORM_WatchOS /* Platform: WatchOS */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_WatchOS */ #ifdef PLATFORM_WatchSimulator /* Platform: WatchSimulator */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_WatchSimulator */ #ifdef PLATFORM_BridgeOS /* Platform: BridgeOS */ -#define __DARWIN_ONLY_64_BIT_INO_T 1 -#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -#define __DARWIN_ONLY_VERS_1050 1 +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 #endif /* PLATFORM_BridgeOS */ +#ifdef PLATFORM_DriverKit +/* Platform: DriverKit */ +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 +#endif /* PLATFORM_DriverKit */ #ifdef PLATFORM_MacOSX /* Platform: MacOSX */ -#define __DARWIN_ONLY_64_BIT_INO_T 0 -/* #undef __DARWIN_ONLY_UNIX_CONFORMANCE (automatically set for 64-bit) */ -#define __DARWIN_ONLY_VERS_1050 0 +#if defined(__i386__) +#define __DARWIN_ONLY_64_BIT_INO_T 0 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 0 +#define __DARWIN_ONLY_VERS_1050 0 +#elif defined(__x86_64__) +#define __DARWIN_ONLY_64_BIT_INO_T 0 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 0 +#else +#define __DARWIN_ONLY_64_BIT_INO_T 1 +#define __DARWIN_ONLY_UNIX_CONFORMANCE 1 +#define __DARWIN_ONLY_VERS_1050 1 +#endif #endif /* PLATFORM_MacOSX */ #endif /* KERNEL */ @@ -551,36 +635,28 @@ * pre-10.5, and it is the default compilation environment, revert the * compilation environment to pre-__DARWIN_UNIX03. */ -#if !defined(__DARWIN_ONLY_UNIX_CONFORMANCE) -# if defined(__LP64__) -# define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -# else /* !__LP64__ */ -# define __DARWIN_ONLY_UNIX_CONFORMANCE 0 -# endif /* __LP64__ */ -#endif /* !__DARWIN_ONLY_UNIX_CONFORMANCE */ - #if !defined(__DARWIN_UNIX03) # if defined(KERNEL) -# define __DARWIN_UNIX03 0 +# define __DARWIN_UNIX03 0 # elif __DARWIN_ONLY_UNIX_CONFORMANCE # if defined(_NONSTD_SOURCE) # error "Can't define _NONSTD_SOURCE when only UNIX conformance is available." # endif /* _NONSTD_SOURCE */ -# define __DARWIN_UNIX03 1 -# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1040) -# define __DARWIN_UNIX03 0 +# define __DARWIN_UNIX03 1 +# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1040) +# define __DARWIN_UNIX03 0 # elif defined(_DARWIN_C_SOURCE) || defined(_XOPEN_SOURCE) || defined(_POSIX_C_SOURCE) # if defined(_NONSTD_SOURCE) # error "Can't define both _NONSTD_SOURCE and any of _DARWIN_C_SOURCE, _XOPEN_SOURCE or _POSIX_C_SOURCE." # endif /* _NONSTD_SOURCE */ -# define __DARWIN_UNIX03 1 +# define __DARWIN_UNIX03 1 # elif defined(_NONSTD_SOURCE) -# define __DARWIN_UNIX03 0 +# define __DARWIN_UNIX03 0 # else /* default */ -# if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1050) -# define __DARWIN_UNIX03 0 +# if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1050) +# define __DARWIN_UNIX03 0 # else /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */ -# define __DARWIN_UNIX03 1 +# define __DARWIN_UNIX03 1 # endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */ # endif /* _DARWIN_C_SOURCE || _XOPEN_SOURCE || _POSIX_C_SOURCE || __LP64__ */ #endif /* !__DARWIN_UNIX03 */ @@ -601,7 +677,7 @@ # else /* default */ # if __DARWIN_ONLY_64_BIT_INO_T # define __DARWIN_64_BIT_INO_T 1 -# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1060) || __DARWIN_UNIX03 == 0 +# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1060) || __DARWIN_UNIX03 == 0 # define __DARWIN_64_BIT_INO_T 0 # else /* default */ # define __DARWIN_64_BIT_INO_T 1 @@ -614,7 +690,7 @@ # define __DARWIN_VERS_1050 0 # elif __DARWIN_ONLY_VERS_1050 # define __DARWIN_VERS_1050 1 -# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1050) || __DARWIN_UNIX03 == 0 +# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1050) || __DARWIN_UNIX03 == 0 # define __DARWIN_VERS_1050 0 # else /* default */ # define __DARWIN_VERS_1050 1 @@ -634,63 +710,66 @@ */ #if __DARWIN_UNIX03 # if __DARWIN_ONLY_UNIX_CONFORMANCE -# define __DARWIN_SUF_UNIX03 /* nothing */ +# define __DARWIN_SUF_UNIX03 /* nothing */ # else /* !__DARWIN_ONLY_UNIX_CONFORMANCE */ -# define __DARWIN_SUF_UNIX03 "$UNIX2003" +# define __DARWIN_SUF_UNIX03 "$UNIX2003" # endif /* __DARWIN_ONLY_UNIX_CONFORMANCE */ # if __DARWIN_64_BIT_INO_T # if __DARWIN_ONLY_64_BIT_INO_T -# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ +# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ # else /* !__DARWIN_ONLY_64_BIT_INO_T */ -# define __DARWIN_SUF_64_BIT_INO_T "$INODE64" +# define __DARWIN_SUF_64_BIT_INO_T "$INODE64" # endif /* __DARWIN_ONLY_64_BIT_INO_T */ # else /* !__DARWIN_64_BIT_INO_T */ -# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ +# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ # endif /* __DARWIN_64_BIT_INO_T */ # if __DARWIN_VERS_1050 # if __DARWIN_ONLY_VERS_1050 -# define __DARWIN_SUF_1050 /* nothing */ +# define __DARWIN_SUF_1050 /* nothing */ # else /* !__DARWIN_ONLY_VERS_1050 */ -# define __DARWIN_SUF_1050 "$1050" +# define __DARWIN_SUF_1050 "$1050" # endif /* __DARWIN_ONLY_VERS_1050 */ # else /* !__DARWIN_VERS_1050 */ -# define __DARWIN_SUF_1050 /* nothing */ +# define __DARWIN_SUF_1050 /* nothing */ # endif /* __DARWIN_VERS_1050 */ # if __DARWIN_NON_CANCELABLE -# define __DARWIN_SUF_NON_CANCELABLE "$NOCANCEL" +# define __DARWIN_SUF_NON_CANCELABLE "$NOCANCEL" # else /* !__DARWIN_NON_CANCELABLE */ -# define __DARWIN_SUF_NON_CANCELABLE /* nothing */ +# define __DARWIN_SUF_NON_CANCELABLE /* nothing */ # endif /* __DARWIN_NON_CANCELABLE */ #else /* !__DARWIN_UNIX03 */ -# define __DARWIN_SUF_UNIX03 /* nothing */ -# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ -# define __DARWIN_SUF_NON_CANCELABLE /* nothing */ -# define __DARWIN_SUF_1050 /* nothing */ +# define __DARWIN_SUF_UNIX03 /* nothing */ +# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ +# define __DARWIN_SUF_NON_CANCELABLE /* nothing */ +# define __DARWIN_SUF_1050 /* nothing */ #endif /* __DARWIN_UNIX03 */ -#define __DARWIN_SUF_EXTSN "$DARWIN_EXTSN" +#define __DARWIN_SUF_EXTSN "$DARWIN_EXTSN" /* * symbol versioning macros */ -#define __DARWIN_ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_UNIX03) -#define __DARWIN_ALIAS_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03) -#define __DARWIN_ALIAS_I(sym) __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03) -#define __DARWIN_NOCANCEL(sym) __asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE) -#define __DARWIN_INODE64(sym) __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T) - -#define __DARWIN_1050(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050) -#define __DARWIN_1050ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_UNIX03) -#define __DARWIN_1050ALIAS_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03) -#define __DARWIN_1050ALIAS_I(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03) -#define __DARWIN_1050INODE64(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T) - -#define __DARWIN_EXTSN(sym) __asm("_" __STRING(sym) __DARWIN_SUF_EXTSN) -#define __DARWIN_EXTSN_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_EXTSN __DARWIN_SUF_NON_CANCELABLE) +#define __DARWIN_ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_UNIX03) +#define __DARWIN_ALIAS_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03) +#define __DARWIN_ALIAS_I(sym) __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03) +#define __DARWIN_NOCANCEL(sym) __asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE) +#define __DARWIN_INODE64(sym) __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T) + +#define __DARWIN_1050(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050) +#define __DARWIN_1050ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_UNIX03) +#define __DARWIN_1050ALIAS_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03) +#define __DARWIN_1050ALIAS_I(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03) +#define __DARWIN_1050INODE64(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T) + +#define __DARWIN_EXTSN(sym) __asm("_" __STRING(sym) __DARWIN_SUF_EXTSN) +#define __DARWIN_EXTSN_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_EXTSN __DARWIN_SUF_NON_CANCELABLE) +#if XNU_KERNEL_PRIVATE +#define __XNU_INTERNAL(sym) __asm("_" __STRING(sym) "$XNU_INTERNAL") +#endif /* * symbol release macros @@ -733,13 +812,13 @@ /* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1L. */ #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1L #undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 199009L +#define _POSIX_C_SOURCE 199009L #endif /* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2L. */ #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2L #undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 199209L +#define _POSIX_C_SOURCE 199209L #endif /* Deal with various X/Open Portability Guides and Single UNIX Spec. */ @@ -749,10 +828,10 @@ #define _POSIX_C_SOURCE 200809L #elif _XOPEN_SOURCE - 0L >= 600L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 200112L) #undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 200112L +#define _POSIX_C_SOURCE 200112L #elif _XOPEN_SOURCE - 0L >= 500L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 199506L) #undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 199506L +#define _POSIX_C_SOURCE 199506L #endif #endif @@ -803,22 +882,22 @@ * c99 still want long longs. While not perfect, we allow long longs for * g++. */ -#if (defined(__STRICT_ANSI__) && (__STDC_VERSION__-0 < 199901L) && !defined(__GNUG__)) +#if (defined(__STRICT_ANSI__) && (__STDC_VERSION__ - 0 < 199901L) && !defined(__GNUG__)) #define __DARWIN_NO_LONG_LONG 1 #else #define __DARWIN_NO_LONG_LONG 0 #endif /***************************************** - * Public darwin-specific feature macros - *****************************************/ +* Public darwin-specific feature macros +*****************************************/ /* * _DARWIN_FEATURE_64_BIT_INODE indicates that the ino_t type is 64-bit, and * structures modified for 64-bit inodes (like struct stat) will be used. */ #if __DARWIN_64_BIT_INO_T -#define _DARWIN_FEATURE_64_BIT_INODE 1 +#define _DARWIN_FEATURE_64_BIT_INODE 1 #endif /* @@ -828,7 +907,7 @@ * struct stat will already be the 64-bit version. */ #if __DARWIN_ONLY_64_BIT_INO_T -#define _DARWIN_FEATURE_ONLY_64_BIT_INODE 1 +#define _DARWIN_FEATURE_ONLY_64_BIT_INODE 1 #endif /* @@ -836,7 +915,7 @@ * in 10.5 exists; no pre-10.5 variants are available. */ #if __DARWIN_ONLY_VERS_1050 -#define _DARWIN_FEATURE_ONLY_VERS_1050 1 +#define _DARWIN_FEATURE_ONLY_VERS_1050 1 #endif /* @@ -844,7 +923,7 @@ * are available (the legacy BSD APIs are not available) */ #if __DARWIN_ONLY_UNIX_CONFORMANCE -#define _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE 1 +#define _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE 1 #endif /* @@ -852,10 +931,20 @@ * and specifies the conformance level (3 is SUSv3) */ #if __DARWIN_UNIX03 -#define _DARWIN_FEATURE_UNIX_CONFORMANCE 3 +#define _DARWIN_FEATURE_UNIX_CONFORMANCE 3 #endif -/* +#if defined(DRIVERKIT) && !defined(KERNEL) +/* + * __DRIVERKIT_LIBC__ indicates to the C++ standard library headers and + * similar components that only the restricted set of standard C library + * functionality and headers for the DriverKit userspace driver environment + * are available. + */ +#define __DRIVERKIT_LIBC__ 1 +#endif /* defined(DRIVERKIT) && !defined(KERNEL) */ + +/* * This macro casts away the qualifier from the variable * * Note: use at your own risk, removing qualifiers can result in @@ -889,9 +978,9 @@ * Selectively ignore cast alignment warnings */ #define __IGNORE_WCASTALIGN(x) _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wcast-align\"") \ - x; \ - _Pragma("clang diagnostic pop") + _Pragma("clang diagnostic ignored \"-Wcast-align\"") \ + x; \ + _Pragma("clang diagnostic pop") #endif #if defined(PRIVATE) || defined(KERNEL) @@ -901,17 +990,65 @@ * to be taken. */ #if !defined(__probable) && !defined(__improbable) -#define __probable(x) __builtin_expect(!!(x), 1) -#define __improbable(x) __builtin_expect(!!(x), 0) +#define __probable(x) __builtin_expect(!!(x), 1) +#define __improbable(x) __builtin_expect(!!(x), 0) #endif /* !defined(__probable) && !defined(__improbable) */ -#define __container_of(ptr, type, field) ({ \ - const typeof(((type *)0)->field) *__ptr = (ptr); \ - (type *)((uintptr_t)__ptr - offsetof(type, field)); \ +#if defined(__cplusplus) +#define __container_of(ptr, type, field) __extension__({ \ + const __typeof__(((type *)nullptr)->field) *__ptr = (ptr); \ + (type *)((uintptr_t)__ptr - offsetof(type, field)); \ }) +#else +#define __container_of(ptr, type, field) __extension__({ \ + const __typeof__(((type *)NULL)->field) *__ptr = (ptr); \ + (type *)((uintptr_t)__ptr - offsetof(type, field)); \ + }) +#endif #endif /* KERNEL || PRIVATE */ #define __compiler_barrier() __asm__ __volatile__("" ::: "memory") +#if __has_attribute(enum_extensibility) +#define __enum_open __attribute__((__enum_extensibility__(open))) +#define __enum_closed __attribute__((__enum_extensibility__(closed))) +#else +#define __enum_open +#define __enum_closed +#endif // __has_attribute(enum_extensibility) + +#if __has_attribute(flag_enum) +#define __enum_options __attribute__((__flag_enum__)) +#else +#define __enum_options +#endif + +/* + * Similar to OS_ENUM/OS_CLOSED_ENUM/OS_OPTIONS/OS_CLOSED_OPTIONS + * + * This provides more advanced type checking on compilers supporting + * the proper extensions, even in C. + */ +#if __has_feature(objc_fixed_enum) || __has_extension(cxx_fixed_enum) || \ + __has_extension(cxx_strong_enums) +#define __enum_decl(_name, _type, ...) \ + typedef enum : _type __VA_ARGS__ __enum_open _name +#define __enum_closed_decl(_name, _type, ...) \ + typedef enum : _type __VA_ARGS__ __enum_closed _name +#define __options_decl(_name, _type, ...) \ + typedef enum : _type __VA_ARGS__ __enum_open __enum_options _name +#define __options_closed_decl(_name, _type, ...) \ + typedef enum : _type __VA_ARGS__ __enum_closed __enum_options _name +#else +#define __enum_decl(_name, _type, ...) \ + typedef _type _name; enum __VA_ARGS__ __enum_open +#define __enum_closed_decl(_name, _type, ...) \ + typedef _type _name; enum __VA_ARGS__ __enum_closed +#define __options_decl(_name, _type, ...) \ + typedef _type _name; enum __VA_ARGS__ __enum_open __enum_options +#define __options_closed_decl(_name, _type, ...) \ + typedef _type _name; enum __VA_ARGS__ __enum_closed __enum_options +#endif + #endif /* !_CDEFS_H_ */