master
1/*
2 * Copyright (c) 2000-2018 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/* Copyright 1995 NeXT Computer, Inc. All rights reserved. */
29/*
30 * Copyright (c) 1991, 1993
31 * The Regents of the University of California. All rights reserved.
32 *
33 * This code is derived from software contributed to Berkeley by
34 * Berkeley Software Design, Inc.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 * must display the following acknowledgement:
46 * This product includes software developed by the University of
47 * California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 * may be used to endorse or promote products derived from this software
50 * without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 *
64 * @(#)cdefs.h 8.8 (Berkeley) 1/9/95
65 */
66
67#ifndef _CDEFS_H_
68#define _CDEFS_H_
69
70#if defined(__cplusplus)
71#define __BEGIN_DECLS extern "C" {
72#define __END_DECLS }
73#else
74#define __BEGIN_DECLS
75#define __END_DECLS
76#endif
77
78/* This SDK is designed to work with clang and specific versions of
79 * gcc >= 4.0 with Apple's patch sets */
80#if !defined(__GNUC__) || __GNUC__ < 4
81#warning "Unsupported compiler detected"
82#endif
83
84/*
85 * Compatibility with compilers and environments that don't support compiler
86 * feature checking function-like macros.
87 */
88#ifndef __has_builtin
89#define __has_builtin(x) 0
90#endif
91#ifndef __has_include
92#define __has_include(x) 0
93#endif
94#ifndef __has_feature
95#define __has_feature(x) 0
96#endif
97#ifndef __has_attribute
98#define __has_attribute(x) 0
99#endif
100#ifndef __has_cpp_attribute
101#define __has_cpp_attribute(x) 0
102#endif
103#ifndef __has_extension
104#define __has_extension(x) 0
105#endif
106
107/*
108 * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
109 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
110 * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
111 * in between its arguments. __CONCAT can also concatenate double-quoted
112 * strings produced by the __STRING macro, but this only works with ANSI C.
113 */
114#if defined(__STDC__) || defined(__cplusplus)
115#define __P(protos) protos /* full-blown ANSI C */
116#define __CONCAT(x, y) x ## y
117#define __STRING(x) #x
118
119#define __const const /* define reserved names to standard */
120#define __signed signed
121#define __volatile volatile
122#if defined(__cplusplus)
123#define __inline inline /* convert to C++ keyword */
124#else
125#ifndef __GNUC__
126#define __inline /* delete GCC keyword */
127#endif /* !__GNUC__ */
128#endif /* !__cplusplus */
129
130#else /* !(__STDC__ || __cplusplus) */
131#define __P(protos) () /* traditional C preprocessor */
132#define __CONCAT(x, y) x /**/ y
133#define __STRING(x) "x"
134
135#ifndef __GNUC__
136#define __const /* delete pseudo-ANSI C keywords */
137#define __inline
138#define __signed
139#define __volatile
140#endif /* !__GNUC__ */
141
142/*
143 * In non-ANSI C environments, new programs will want ANSI-only C keywords
144 * deleted from the program and old programs will want them left alone.
145 * When using a compiler other than gcc, programs using the ANSI C keywords
146 * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS.
147 * When using "gcc -traditional", we assume that this is the intent; if
148 * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone.
149 */
150#ifndef NO_ANSI_KEYWORDS
151#define const __const /* convert ANSI C keywords */
152#define inline __inline
153#define signed __signed
154#define volatile __volatile
155#endif /* !NO_ANSI_KEYWORDS */
156#endif /* !(__STDC__ || __cplusplus) */
157
158/*
159 * __pure2 can be used for functions that are only a function of their scalar
160 * arguments (meaning they can't dereference pointers).
161 *
162 * __stateful_pure can be used for functions that have no side effects,
163 * but depend on the state of the memory.
164 */
165#define __dead2 __attribute__((__noreturn__))
166#define __pure2 __attribute__((__const__))
167#define __stateful_pure __attribute__((__pure__))
168
169/* __unused denotes variables and functions that may not be used, preventing
170 * the compiler from warning about it if not used.
171 */
172#define __unused __attribute__((__unused__))
173
174/* __used forces variables and functions to be included even if it appears
175 * to the compiler that they are not used (and would thust be discarded).
176 */
177#define __used __attribute__((__used__))
178
179/* __cold marks code used for debugging or that is rarely taken
180 * and tells the compiler to optimize for size and outline code.
181 */
182#if __has_attribute(cold)
183#define __cold __attribute__((__cold__))
184#else
185#define __cold
186#endif
187
188/* __returns_nonnull marks functions that return a non-null pointer. */
189#if __has_attribute(returns_nonnull)
190#define __returns_nonnull __attribute((returns_nonnull))
191#else
192#define __returns_nonnull
193#endif
194
195/* __exported denotes symbols that should be exported even when symbols
196 * are hidden by default.
197 * __exported_push/_exported_pop are pragmas used to delimit a range of
198 * symbols that should be exported even when symbols are hidden by default.
199 */
200#define __exported __attribute__((__visibility__("default")))
201#define __exported_push _Pragma("GCC visibility push(default)")
202#ifndef __BUILDING_XNU_LIBRARY__
203#define __exported_push_hidden _Pragma("GCC visibility push(hidden)")
204#define __exported_pop _Pragma("GCC visibility pop")
205#define __exported_hidden __private_extern__
206#else /* __BUILDING_XNU_LIBRARY__ */
207/* Don't hide symbols that the might be need to be used from outside */
208#define __exported_push_hidden
209#define __exported_pop
210#define __exported_hidden
211#endif /* __BUILDING_XNU_LIBRARY__ */
212
213/* __deprecated causes the compiler to produce a warning when encountering
214 * code using the deprecated functionality.
215 * __deprecated_msg() does the same, and compilers that support it will print
216 * a message along with the deprecation warning.
217 * This may require turning on such warning with the -Wdeprecated flag.
218 * __deprecated_enum_msg() should be used on enums, and compilers that support
219 * it will print the deprecation warning.
220 * __kpi_deprecated() specifically indicates deprecation of kernel programming
221 * interfaces in Kernel.framework used by KEXTs.
222 */
223#define __deprecated __attribute__((__deprecated__))
224
225#if __has_extension(attribute_deprecated_with_message) || \
226 (defined(__GNUC__) && ((__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5))))
227 #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
228#else
229 #define __deprecated_msg(_msg) __attribute__((__deprecated__))
230#endif
231
232#if __has_extension(enumerator_attributes)
233 #define __deprecated_enum_msg(_msg) __deprecated_msg(_msg)
234#else
235 #define __deprecated_enum_msg(_msg)
236#endif
237
238#define __kpi_deprecated(_msg)
239
240/* __unavailable causes the compiler to error out when encountering
241 * code using the tagged function
242 */
243#if __has_attribute(unavailable)
244#define __unavailable __attribute__((__unavailable__))
245#else
246#define __unavailable
247#endif
248
249#define __kpi_unavailable
250
251#define __kpi_deprecated_arm64_macos_unavailable
252
253/* Delete pseudo-keywords wherever they are not available or needed. */
254#ifndef __dead
255#define __dead
256#define __pure
257#endif
258
259/*
260 * We use `__restrict' as a way to define the `restrict' type qualifier
261 * without disturbing older software that is unaware of C99 keywords.
262 */
263#if __STDC_VERSION__ < 199901
264#define __restrict
265#else
266#define __restrict restrict
267#endif
268
269/* Compatibility with compilers and environments that don't support the
270 * nullability feature.
271 */
272
273#if !__has_feature(nullability)
274#ifndef __nullable
275#define __nullable
276#endif
277#ifndef __nonnull
278#define __nonnull
279#endif
280#ifndef __null_unspecified
281#define __null_unspecified
282#endif
283#ifndef _Nullable
284#define _Nullable
285#endif
286#ifndef _Nonnull
287#define _Nonnull
288#endif
289#ifndef _Null_unspecified
290#define _Null_unspecified
291#endif
292#endif
293
294/*
295 * __disable_tail_calls causes the compiler to not perform tail call
296 * optimization inside the marked function.
297 */
298#if __has_attribute(disable_tail_calls)
299#define __disable_tail_calls __attribute__((__disable_tail_calls__))
300#else
301#define __disable_tail_calls
302#endif
303
304/*
305 * __not_tail_called causes the compiler to prevent tail call optimization
306 * on statically bound calls to the function. It has no effect on indirect
307 * calls. Virtual functions, objective-c methods, and functions marked as
308 * "always_inline" cannot be marked as __not_tail_called.
309 */
310#if __has_attribute(not_tail_called)
311#define __not_tail_called __attribute__((__not_tail_called__))
312#else
313#define __not_tail_called
314#endif
315
316/*
317 * __result_use_check warns callers of a function that not using the function
318 * return value is a bug, i.e. dismissing malloc() return value results in a
319 * memory leak.
320 */
321#if __has_attribute(warn_unused_result)
322#define __result_use_check __attribute__((__warn_unused_result__))
323#else
324#define __result_use_check
325#endif
326
327/*
328 * __swift_unavailable causes the compiler to mark a symbol as specifically
329 * unavailable in Swift, regardless of any other availability in C.
330 */
331#if __has_feature(attribute_availability_swift)
332#define __swift_unavailable(_msg) __attribute__((__availability__(swift, unavailable, message=_msg)))
333#else
334#define __swift_unavailable(_msg)
335#endif
336
337/*
338 * Attributes to support Swift concurrency.
339 */
340#if __has_attribute(__swift_attr__)
341#define __swift_unavailable_from_async(_msg) __attribute__((__swift_attr__("@_unavailableFromAsync(message: \"" _msg "\")")))
342#define __swift_nonisolated __attribute__((__swift_attr__("nonisolated")))
343#define __swift_nonisolated_unsafe __attribute__((__swift_attr__("nonisolated(unsafe)")))
344#else
345#define __swift_unavailable_from_async(_msg)
346#define __swift_nonisolated
347#define __swift_nonisolated_unsafe
348#endif
349
350/*
351 * __abortlike is the attribute to put on functions like abort() that are
352 * typically used to mark assertions. These optimize the codegen
353 * for outlining while still maintaining debugability.
354 */
355#ifndef __abortlike
356#define __abortlike __dead2 __cold __not_tail_called
357#endif
358
359/* Declaring inline functions within headers is error-prone due to differences
360 * across various versions of the C language and extensions. __header_inline
361 * can be used to declare inline functions within system headers. In cases
362 * where you want to force inlining instead of letting the compiler make
363 * the decision, you can use __header_always_inline.
364 *
365 * Be aware that using inline for functions which compilers may also provide
366 * builtins can behave differently under various compilers. If you intend to
367 * provide an inline version of such a function, you may want to use a macro
368 * instead.
369 *
370 * The check for !__GNUC__ || __clang__ is because gcc doesn't correctly
371 * support c99 inline in some cases:
372 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55965
373 */
374
375#if defined(__cplusplus) || \
376 (__STDC_VERSION__ >= 199901L && \
377 !defined(__GNUC_GNU_INLINE__) && \
378 (!defined(__GNUC__) || defined(__clang__)))
379# define __header_inline inline
380#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__)
381# define __header_inline extern __inline __attribute__((__gnu_inline__))
382#elif defined(__GNUC__)
383# define __header_inline extern __inline
384#else
385/* If we land here, we've encountered an unsupported compiler,
386 * so hopefully it understands static __inline as a fallback.
387 */
388# define __header_inline static __inline
389#endif
390
391#ifdef __GNUC__
392# define __header_always_inline __header_inline __attribute__ ((__always_inline__))
393#else
394/* Unfortunately, we're using a compiler that we don't know how to force to
395 * inline. Oh well.
396 */
397# define __header_always_inline __header_inline
398#endif
399
400/*
401 * Compiler-dependent macros that bracket portions of code where the
402 * "-Wunreachable-code" warning should be ignored. Please use sparingly.
403 */
404#if defined(__clang__)
405# define __unreachable_ok_push \
406 _Pragma("clang diagnostic push") \
407 _Pragma("clang diagnostic ignored \"-Wunreachable-code\"")
408# define __unreachable_ok_pop \
409 _Pragma("clang diagnostic pop")
410#elif defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
411# define __unreachable_ok_push \
412 _Pragma("GCC diagnostic push") \
413 _Pragma("GCC diagnostic ignored \"-Wunreachable-code\"")
414# define __unreachable_ok_pop \
415 _Pragma("GCC diagnostic pop")
416#else
417# define __unreachable_ok_push
418# define __unreachable_ok_pop
419#endif
420
421/*
422 * Compiler-dependent macros to declare that functions take printf-like
423 * or scanf-like arguments. They are null except for versions of gcc
424 * that are known to support the features properly. Functions declared
425 * with these attributes will cause compilation warnings if there is a
426 * mismatch between the format string and subsequent function parameter
427 * types.
428 */
429#define __printflike(fmtarg, firstvararg) \
430 __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
431#define __printf0like(fmtarg, firstvararg) \
432 __attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
433#define __scanflike(fmtarg, firstvararg) \
434 __attribute__((__format__ (__scanf__, fmtarg, firstvararg)))
435#define __osloglike(fmtarg, firstvararg) \
436 __attribute__((__format__ (__os_log__, fmtarg, firstvararg)))
437
438#define __IDSTRING(name, string) static const char name[] __used = string
439
440#ifndef __COPYRIGHT
441#define __COPYRIGHT(s) __IDSTRING(copyright,s)
442#endif
443
444#ifndef __RCSID
445#define __RCSID(s) __IDSTRING(rcsid,s)
446#endif
447
448#ifndef __SCCSID
449#define __SCCSID(s) __IDSTRING(sccsid,s)
450#endif
451
452#ifndef __PROJECT_VERSION
453#define __PROJECT_VERSION(s) __IDSTRING(project_version,s)
454#endif
455
456/* Source compatibility only, ID string not emitted in object file */
457#ifndef __FBSDID
458#define __FBSDID(s)
459#endif
460
461#ifndef __DECONST
462#define __DECONST(type, var) __CAST_AWAY_QUALIFIER(var, const, type)
463#endif
464
465#ifndef __DEVOLATILE
466#define __DEVOLATILE(type, var) __CAST_AWAY_QUALIFIER(var, volatile, type)
467#endif
468
469#ifndef __DEQUALIFY
470#define __DEQUALIFY(type, var) __CAST_AWAY_QUALIFIER(var, const volatile, type)
471#endif
472
473/*
474 * __alloc_align can be used to label function arguments that represent the
475 * alignment of the returned pointer.
476 */
477#ifndef __alloc_align
478#if __has_attribute(alloc_align)
479#define __alloc_align(n) __attribute__((alloc_align(n)))
480#else
481#define __alloc_align(n)
482#endif
483#endif // __alloc_align
484
485/*
486 * __alloc_size can be used to label function arguments that represent the
487 * size of memory that the function allocates and returns. The one-argument
488 * form labels a single argument that gives the allocation size (where the
489 * arguments are numbered from 1):
490 *
491 * void *malloc(size_t __size) __alloc_size(1);
492 *
493 * The two-argument form handles the case where the size is calculated as the
494 * product of two arguments:
495 *
496 * void *calloc(size_t __count, size_t __size) __alloc_size(1,2);
497 */
498#ifndef __alloc_size
499#if __has_attribute(alloc_size)
500#define __alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
501#else
502#define __alloc_size(...)
503#endif
504#endif // __alloc_size
505
506/*
507 * Facilities below assist adoption of -Wunsafe-buffer-usage, an off-by-default
508 * Clang compiler warning that helps the developer minimize unsafe, raw
509 * buffer manipulation in the code that may lead to buffer overflow
510 * vulnerabilities.
511 *
512 * They are primarily designed for modern C++ code where -Wunsafe-buffer-usage
513 * comes with automatic fix-it hints that help the developer transform
514 * their code to use modern C++ containers, which may be made bounds-safe by
515 * linking against a version of the C++ standard library that offers
516 * bounds-checked containers.
517 * They can be used in plain C, but -fbounds-safety is the preferred solution
518 * for plain C (see also <ptrcheck.h>).
519 *
520 * Attribute __unsafe_buffer_usage can be used to label functions that should be
521 * avoided as they may perform or otherwise introduce unsafe buffer manipulation
522 * operations. The attribute can also be attached to class/struct fields that
523 * are used in unsafe buffer manipulations.
524 *
525 * Calls to attribute annotated functions are flagged by -Wunsafe-buffer-usage, similar to
526 * how unchecked buffer manipulation operations are flagged when observed
527 * by the compiler directly. Similarly, use of and assignment to the struct/class fields
528 * that have the attribute also get flagged by the compiler.
529 *
530 * // An unsafe function that needs to be avoided.
531 * __unsafe_buffer_usage
532 * void foo(int *buf, size_t size);
533 *
534 * // A safe alternative to foo().
535 * void foo(std::span<int> buf);
536 *
537 * void bar(size_t idx) {
538 * int array[5];
539 *
540 * // Direct unsafe buffer manipulation through subscript operator:
541 * array[idx] = 3; // warning: function introduces unsafe buffer manipulation [-Wunsafe-buffer-usage]
542 * // Unsafe buffer manipulation through function foo():
543 * foo(array, 5); // warning: function introduces unsafe buffer manipulation [-Wunsafe-buffer-usage]
544 * // Checked buffer manipulation, with bounds information automatically
545 * // preserved for the purposes of runtime checks in standard library:
546 * foo(array); // no warning
547 * }
548 *
549 * struct Reader {
550 * // Field involved in unsafe buffer manipulation
551 * __unsafe_buffer_usage
552 * void *ptr;
553 *
554 * __unsafe_buffer_usage
555 * size_t sz, count;
556 * };
557 *
558 * void add_element(Reader rdr, int value) {
559 * if(rdr.count < rdr.sz) { // warning: unsafe buffer access [-Wunsafe-buffer-usage]
560 * rdr.ptr[rdr.count] = value; // warning: unsafe buffer access [-Wunsafe-buffer-usage]
561 * rdr.count++; // warning: unsafe buffer access [-Wunsafe-buffer-usage]
562 * }
563 * }
564 *
565 * While annotating a function as __unsafe_buffer_usage has an effect similar
566 * to annotating it as __deprecated, the __unsafe_buffer_usage attribute
567 * should be used whenever the resulting warning needs to be controlled
568 * by the -Wunsafe-buffer-usage flag (which is turned off in codebases that
569 * don't attempt to achieve bounds safety this way) as opposed to -Wdeprecated
570 * (enabled in most codebases).
571 *
572 * The attribute suppresses all -Wunsafe-buffer-usage warnings inside the
573 * function's body as it is explictly marked as unsafe by the user and
574 * introduces new warnings at each call site to help the developers avoid the
575 * function entirely. Most of the time it does not make sense to annotate a
576 * function as __unsafe_buffer_usage without providing the users with a safe
577 * alternative.
578 *
579 * Pragmas __unsafe_buffer_usage_begin and __unsafe_buffer_usage_end
580 * annotate a range of code as intentionally containing unsafe buffer
581 * operations. They suppress -Wunsafe-buffer-usage warnings
582 * for unsafe operations in range:
583 *
584 * __unsafe_buffer_usage_begin
585 * array[idx] = 3; // warning suppressed
586 * foo(array, 5); // warning suppressed
587 * __unsafe_buffer_usage_end
588 *
589 * These pragmas are NOT a way to mass-annotate functions with the attribute
590 * __unsafe_buffer_usage. Functions declared within the pragma range
591 * do NOT get annotated automatically.
592 */
593#if __has_cpp_attribute(clang::unsafe_buffer_usage)
594#define __has_safe_buffers 1
595#define __unsafe_buffer_usage [[clang::unsafe_buffer_usage]]
596#elif __has_attribute(unsafe_buffer_usage)
597#define __has_safe_buffers 1
598#define __unsafe_buffer_usage __attribute__((__unsafe_buffer_usage__))
599#else
600#define __has_safe_buffers 0
601#define __unsafe_buffer_usage
602#endif
603#if __has_safe_buffers
604#define __unsafe_buffer_usage_begin _Pragma("clang unsafe_buffer_usage begin")
605#define __unsafe_buffer_usage_end _Pragma("clang unsafe_buffer_usage end")
606#else
607#define __unsafe_buffer_usage_begin
608#define __unsafe_buffer_usage_end
609#endif
610
611/*
612 * COMPILATION ENVIRONMENTS -- see compat(5) for additional detail
613 *
614 * DEFAULT By default newly complied code will get POSIX APIs plus
615 * Apple API extensions in scope.
616 *
617 * Most users will use this compilation environment to avoid
618 * behavioral differences between 32 and 64 bit code.
619 *
620 * LEGACY Defining _NONSTD_SOURCE will get pre-POSIX APIs plus Apple
621 * API extensions in scope.
622 *
623 * This is generally equivalent to the Tiger release compilation
624 * environment, except that it cannot be applied to 64 bit code;
625 * its use is discouraged.
626 *
627 * We expect this environment to be deprecated in the future.
628 *
629 * STRICT Defining _POSIX_C_SOURCE or _XOPEN_SOURCE restricts the
630 * available APIs to exactly the set of APIs defined by the
631 * corresponding standard, based on the value defined.
632 *
633 * A correct, portable definition for _POSIX_C_SOURCE is 200112L.
634 * A correct, portable definition for _XOPEN_SOURCE is 600L.
635 *
636 * Apple API extensions are not visible in this environment,
637 * which can cause Apple specific code to fail to compile,
638 * or behave incorrectly if prototypes are not in scope or
639 * warnings about missing prototypes are not enabled or ignored.
640 *
641 * In any compilation environment, for correct symbol resolution to occur,
642 * function prototypes must be in scope. It is recommended that all Apple
643 * tools users add either the "-Wall" or "-Wimplicit-function-declaration"
644 * compiler flags to their projects to be warned when a function is being
645 * used without a prototype in scope.
646 */
647
648/* These settings are particular to each product. */
649/* Platform: MacOSX */
650#if defined(__i386__)
651#define __DARWIN_ONLY_64_BIT_INO_T 0
652#define __DARWIN_ONLY_UNIX_CONFORMANCE 0
653#define __DARWIN_ONLY_VERS_1050 0
654#elif defined(__x86_64__)
655#define __DARWIN_ONLY_64_BIT_INO_T 0
656#define __DARWIN_ONLY_UNIX_CONFORMANCE 1
657#define __DARWIN_ONLY_VERS_1050 0
658#else
659#define __DARWIN_ONLY_64_BIT_INO_T 1
660#define __DARWIN_ONLY_UNIX_CONFORMANCE 1
661#define __DARWIN_ONLY_VERS_1050 1
662#endif
663
664/*
665 * The __DARWIN_ALIAS macros are used to do symbol renaming; they allow
666 * legacy code to use the old symbol, thus maintaining binary compatibility
667 * while new code can use a standards compliant version of the same function.
668 *
669 * __DARWIN_ALIAS is used by itself if the function signature has not
670 * changed, it is used along with a #ifdef check for __DARWIN_UNIX03
671 * if the signature has changed. Because the __LP64__ environment
672 * only supports UNIX03 semantics it causes __DARWIN_UNIX03 to be
673 * defined, but causes __DARWIN_ALIAS to do no symbol mangling.
674 *
675 * As a special case, when XCode is used to target a specific version of the
676 * OS, the manifest constant __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
677 * will be defined by the compiler, with the digits representing major version
678 * time 100 + minor version times 10 (e.g. 10.5 := 1050). If we are targeting
679 * pre-10.5, and it is the default compilation environment, revert the
680 * compilation environment to pre-__DARWIN_UNIX03.
681 */
682#if !defined(__DARWIN_UNIX03)
683# if __DARWIN_ONLY_UNIX_CONFORMANCE
684# if defined(_NONSTD_SOURCE)
685# error "Can't define _NONSTD_SOURCE when only UNIX conformance is available."
686# endif /* _NONSTD_SOURCE */
687# define __DARWIN_UNIX03 1
688# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1040)
689# define __DARWIN_UNIX03 0
690# elif defined(_DARWIN_C_SOURCE) || defined(_XOPEN_SOURCE) || defined(_POSIX_C_SOURCE)
691# if defined(_NONSTD_SOURCE)
692# error "Can't define both _NONSTD_SOURCE and any of _DARWIN_C_SOURCE, _XOPEN_SOURCE or _POSIX_C_SOURCE."
693# endif /* _NONSTD_SOURCE */
694# define __DARWIN_UNIX03 1
695# elif defined(_NONSTD_SOURCE)
696# define __DARWIN_UNIX03 0
697# else /* default */
698# if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1050)
699# define __DARWIN_UNIX03 0
700# else /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */
701# define __DARWIN_UNIX03 1
702# endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */
703# endif /* _DARWIN_C_SOURCE || _XOPEN_SOURCE || _POSIX_C_SOURCE || __LP64__ */
704#endif /* !__DARWIN_UNIX03 */
705
706#if !defined(__DARWIN_64_BIT_INO_T)
707# if defined(_DARWIN_USE_64_BIT_INODE)
708# if defined(_DARWIN_NO_64_BIT_INODE)
709# error "Can't define both _DARWIN_USE_64_BIT_INODE and _DARWIN_NO_64_BIT_INODE."
710# endif /* _DARWIN_NO_64_BIT_INODE */
711# define __DARWIN_64_BIT_INO_T 1
712# elif defined(_DARWIN_NO_64_BIT_INODE)
713# if __DARWIN_ONLY_64_BIT_INO_T
714# error "Can't define _DARWIN_NO_64_BIT_INODE when only 64-bit inodes are available."
715# endif /* __DARWIN_ONLY_64_BIT_INO_T */
716# define __DARWIN_64_BIT_INO_T 0
717# else /* default */
718# if __DARWIN_ONLY_64_BIT_INO_T
719# define __DARWIN_64_BIT_INO_T 1
720# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1060) || __DARWIN_UNIX03 == 0
721# define __DARWIN_64_BIT_INO_T 0
722# else /* default */
723# define __DARWIN_64_BIT_INO_T 1
724# endif /* __DARWIN_ONLY_64_BIT_INO_T */
725# endif
726#endif /* !__DARWIN_64_BIT_INO_T */
727
728#if !defined(__DARWIN_VERS_1050)
729# if __DARWIN_ONLY_VERS_1050
730# define __DARWIN_VERS_1050 1
731# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1050) || __DARWIN_UNIX03 == 0
732# define __DARWIN_VERS_1050 0
733# else /* default */
734# define __DARWIN_VERS_1050 1
735# endif
736#endif /* !__DARWIN_VERS_1050 */
737
738#if !defined(__DARWIN_NON_CANCELABLE)
739# define __DARWIN_NON_CANCELABLE 0
740#endif /* !__DARWIN_NON_CANCELABLE */
741
742/*
743 * symbol suffixes used for symbol versioning
744 */
745#if __DARWIN_UNIX03
746# if __DARWIN_ONLY_UNIX_CONFORMANCE
747# define __DARWIN_SUF_UNIX03 /* nothing */
748# else /* !__DARWIN_ONLY_UNIX_CONFORMANCE */
749# define __DARWIN_SUF_UNIX03 "$UNIX2003"
750# endif /* __DARWIN_ONLY_UNIX_CONFORMANCE */
751
752# if __DARWIN_64_BIT_INO_T
753# if __DARWIN_ONLY_64_BIT_INO_T
754# define __DARWIN_SUF_64_BIT_INO_T /* nothing */
755# else /* !__DARWIN_ONLY_64_BIT_INO_T */
756# define __DARWIN_SUF_64_BIT_INO_T "$INODE64"
757# endif /* __DARWIN_ONLY_64_BIT_INO_T */
758# else /* !__DARWIN_64_BIT_INO_T */
759# define __DARWIN_SUF_64_BIT_INO_T /* nothing */
760# endif /* __DARWIN_64_BIT_INO_T */
761
762# if __DARWIN_VERS_1050
763# if __DARWIN_ONLY_VERS_1050
764# define __DARWIN_SUF_1050 /* nothing */
765# else /* !__DARWIN_ONLY_VERS_1050 */
766# define __DARWIN_SUF_1050 "$1050"
767# endif /* __DARWIN_ONLY_VERS_1050 */
768# else /* !__DARWIN_VERS_1050 */
769# define __DARWIN_SUF_1050 /* nothing */
770# endif /* __DARWIN_VERS_1050 */
771
772# if __DARWIN_NON_CANCELABLE
773# define __DARWIN_SUF_NON_CANCELABLE "$NOCANCEL"
774# else /* !__DARWIN_NON_CANCELABLE */
775# define __DARWIN_SUF_NON_CANCELABLE /* nothing */
776# endif /* __DARWIN_NON_CANCELABLE */
777
778#else /* !__DARWIN_UNIX03 */
779# define __DARWIN_SUF_UNIX03 /* nothing */
780# define __DARWIN_SUF_64_BIT_INO_T /* nothing */
781# define __DARWIN_SUF_NON_CANCELABLE /* nothing */
782# define __DARWIN_SUF_1050 /* nothing */
783#endif /* __DARWIN_UNIX03 */
784
785#define __DARWIN_SUF_EXTSN "$DARWIN_EXTSN"
786
787/*
788 * symbol versioning macros
789 */
790#define __DARWIN_ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_UNIX03)
791#define __DARWIN_ALIAS_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03)
792#define __DARWIN_ALIAS_I(sym) __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03)
793#define __DARWIN_NOCANCEL(sym) __asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE)
794#define __DARWIN_INODE64(sym) __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T)
795
796#define __DARWIN_1050(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050)
797#define __DARWIN_1050ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_UNIX03)
798#define __DARWIN_1050ALIAS_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03)
799#define __DARWIN_1050ALIAS_I(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03)
800#define __DARWIN_1050INODE64(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T)
801
802#define __DARWIN_EXTSN(sym) __asm("_" __STRING(sym) __DARWIN_SUF_EXTSN)
803#define __DARWIN_EXTSN_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_EXTSN __DARWIN_SUF_NON_CANCELABLE)
804
805/*
806 * symbol release macros
807 */
808#include <sys/_symbol_aliasing.h>
809
810#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__)
811#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x) __DARWIN_ALIAS_STARTING_IPHONE_##_iphone(x)
812#elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
813#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x) __DARWIN_ALIAS_STARTING_MAC_##_mac(x)
814#else
815#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x) x
816#endif
817
818
819/*
820 * POSIX.1 requires that the macros we test be defined before any standard
821 * header file is included. This permits us to convert values for feature
822 * testing, as necessary, using only _POSIX_C_SOURCE.
823 *
824 * Here's a quick run-down of the versions:
825 * defined(_POSIX_SOURCE) 1003.1-1988
826 * _POSIX_C_SOURCE == 1L 1003.1-1990
827 * _POSIX_C_SOURCE == 2L 1003.2-1992 C Language Binding Option
828 * _POSIX_C_SOURCE == 199309L 1003.1b-1993
829 * _POSIX_C_SOURCE == 199506L 1003.1c-1995, 1003.1i-1995,
830 * and the omnibus ISO/IEC 9945-1: 1996
831 * _POSIX_C_SOURCE == 200112L 1003.1-2001
832 * _POSIX_C_SOURCE == 200809L 1003.1-2008
833 *
834 * In addition, the X/Open Portability Guide, which is now the Single UNIX
835 * Specification, defines a feature-test macro which indicates the version of
836 * that specification, and which subsumes _POSIX_C_SOURCE.
837 */
838
839/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1L. */
840#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1L
841#undef _POSIX_C_SOURCE
842#define _POSIX_C_SOURCE 199009L
843#endif
844
845/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2L. */
846#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2L
847#undef _POSIX_C_SOURCE
848#define _POSIX_C_SOURCE 199209L
849#endif
850
851/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
852#ifdef _XOPEN_SOURCE
853#if _XOPEN_SOURCE - 0L >= 700L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 200809L)
854#undef _POSIX_C_SOURCE
855#define _POSIX_C_SOURCE 200809L
856#elif _XOPEN_SOURCE - 0L >= 600L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 200112L)
857#undef _POSIX_C_SOURCE
858#define _POSIX_C_SOURCE 200112L
859#elif _XOPEN_SOURCE - 0L >= 500L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 199506L)
860#undef _POSIX_C_SOURCE
861#define _POSIX_C_SOURCE 199506L
862#endif
863#endif
864
865/*
866 * Deal with all versions of POSIX. The ordering relative to the tests above is
867 * important.
868 */
869#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
870#define _POSIX_C_SOURCE 198808L
871#endif
872
873/* POSIX C deprecation macros */
874#include <sys/_posix_availability.h>
875
876#define __POSIX_C_DEPRECATED(ver) ___POSIX_C_DEPRECATED_STARTING_##ver
877
878/*
879 * Set a single macro which will always be defined and can be used to determine
880 * the appropriate namespace. For POSIX, these values will correspond to
881 * _POSIX_C_SOURCE value. Currently there are two additional levels corresponding
882 * to ANSI (_ANSI_SOURCE) and Darwin extensions (_DARWIN_C_SOURCE)
883 */
884#define __DARWIN_C_ANSI 010000L
885#define __DARWIN_C_FULL 900000L
886
887#if defined(_ANSI_SOURCE)
888#define __DARWIN_C_LEVEL __DARWIN_C_ANSI
889#elif defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE) && !defined(_NONSTD_SOURCE)
890#define __DARWIN_C_LEVEL _POSIX_C_SOURCE
891#else
892#define __DARWIN_C_LEVEL __DARWIN_C_FULL
893#endif
894
895/* If the developer has neither requested a strict language mode nor a version
896 * of POSIX, turn on functionality provided by __STDC_WANT_LIB_EXT1__ as part
897 * of __DARWIN_C_FULL.
898 */
899#if !defined(__STDC_WANT_LIB_EXT1__) && !defined(__STRICT_ANSI__) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL
900#define __STDC_WANT_LIB_EXT1__ 1
901#endif
902
903/*
904 * long long is not supported in c89 (__STRICT_ANSI__), but g++ -ansi and
905 * c99 still want long longs. While not perfect, we allow long longs for
906 * g++.
907 */
908#if (defined(__STRICT_ANSI__) && (__STDC_VERSION__ - 0 < 199901L) && !defined(__GNUG__))
909#define __DARWIN_NO_LONG_LONG 1
910#else
911#define __DARWIN_NO_LONG_LONG 0
912#endif
913
914/*****************************************
915* Public darwin-specific feature macros
916*****************************************/
917
918/*
919 * _DARWIN_FEATURE_64_BIT_INODE indicates that the ino_t type is 64-bit, and
920 * structures modified for 64-bit inodes (like struct stat) will be used.
921 */
922#if __DARWIN_64_BIT_INO_T
923#define _DARWIN_FEATURE_64_BIT_INODE 1
924#endif
925
926/*
927 * _DARWIN_FEATURE_64_ONLY_BIT_INODE indicates that the ino_t type may only
928 * be 64-bit; there is no support for 32-bit ino_t when this macro is defined
929 * (and non-zero). There is no struct stat64 either, as the regular
930 * struct stat will already be the 64-bit version.
931 */
932#if __DARWIN_ONLY_64_BIT_INO_T
933#define _DARWIN_FEATURE_ONLY_64_BIT_INODE 1
934#endif
935
936/*
937 * _DARWIN_FEATURE_ONLY_VERS_1050 indicates that only those APIs updated
938 * in 10.5 exists; no pre-10.5 variants are available.
939 */
940#if __DARWIN_ONLY_VERS_1050
941#define _DARWIN_FEATURE_ONLY_VERS_1050 1
942#endif
943
944/*
945 * _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE indicates only UNIX conforming API
946 * are available (the legacy BSD APIs are not available)
947 */
948#if __DARWIN_ONLY_UNIX_CONFORMANCE
949#define _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE 1
950#endif
951
952/*
953 * _DARWIN_FEATURE_UNIX_CONFORMANCE indicates whether UNIX conformance is on,
954 * and specifies the conformance level (3 is SUSv3)
955 */
956#if __DARWIN_UNIX03
957#define _DARWIN_FEATURE_UNIX_CONFORMANCE 3
958#endif
959
960
961/*
962 * This macro casts away the qualifier from the variable
963 *
964 * Note: use at your own risk, removing qualifiers can result in
965 * catastrophic run-time failures.
966 */
967#ifndef __CAST_AWAY_QUALIFIER
968/*
969 * XXX: this shouldn't ignore anything more than -Wcast-qual,
970 * but the old implementation made it an almighty cast that
971 * ignored everything, so things break left and right if you
972 * make it only ignore -Wcast-qual.
973 */
974#define __CAST_AWAY_QUALIFIER(variable, qualifier, type) \
975 _Pragma("GCC diagnostic push") \
976 _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") \
977 _Pragma("GCC diagnostic ignored \"-Wcast-align\"") \
978 _Pragma("GCC diagnostic ignored \"-Waddress-of-packed-member\"") \
979 ((type)(variable)) \
980 _Pragma("GCC diagnostic pop")
981#endif
982
983/*
984 * __XNU_PRIVATE_EXTERN is a linkage decoration indicating that a symbol can be
985 * used from other compilation units, but not other libraries or executables.
986 */
987#ifndef __XNU_PRIVATE_EXTERN
988#define __XNU_PRIVATE_EXTERN __attribute__((visibility("hidden")))
989#endif
990
991#if __has_include(<ptrcheck.h>)
992#include <ptrcheck.h>
993#else
994#if __has_feature(bounds_safety)
995#error -fbounds-safety is enabled, but <ptrcheck.h> is missing. \
996 This will lead to difficult-to-diagnose compilation errors.
997#endif /* __has_feature(bounds_safety) */
998
999/*
1000 * We intentionally define to nothing pointer attributes which do not have an
1001 * impact on the ABI. __indexable and __bidi_indexable are not defined because
1002 * of the ABI incompatibility that makes the diagnostic preferable.
1003 */
1004#define __has_ptrcheck 0
1005#define __single
1006#define __unsafe_indexable
1007#define __counted_by(N)
1008#define __counted_by_or_null(N)
1009#define __sized_by(N)
1010#define __sized_by_or_null(N)
1011#define __ended_by(E)
1012#define __terminated_by(T)
1013#define __null_terminated
1014
1015/*
1016 * Similarly, we intentionally define to nothing the
1017 * __ptrcheck_abi_assume_single and __ptrcheck_abi_assume_unsafe_indexable
1018 * macros because they do not lead to an ABI incompatibility. However, we do not
1019 * define the indexable and unsafe_indexable ones because the diagnostic is
1020 * better than the silent ABI break.
1021 */
1022#define __ptrcheck_abi_assume_single()
1023#define __ptrcheck_abi_assume_unsafe_indexable()
1024
1025/* __unsafe_forge intrinsics are defined as regular C casts. */
1026#define __unsafe_forge_bidi_indexable(T, P, S) ((T)(P))
1027#define __unsafe_forge_single(T, P) ((T)(P))
1028#define __unsafe_forge_terminated_by(T, P, E) ((T)(P))
1029#define __unsafe_forge_null_terminated(T, P) ((T)(P))
1030#define __terminated_by_to_indexable(P) (P)
1031#define __unsafe_terminated_by_to_indexable(P) (P)
1032#define __null_terminated_to_indexable(P) (P)
1033#define __unsafe_null_terminated_to_indexable(P) (P)
1034#define __unsafe_terminated_by_from_indexable(T, P, ...) (P)
1035#define __unsafe_null_terminated_from_indexable(P, ...) (P)
1036
1037/* decay operates normally; attribute is meaningless without pointer checks. */
1038#define __array_decay_dicards_count_in_parameters
1039
1040/* this is a write-once variable; not useful without pointer checks. */
1041#define __unsafe_late_const
1042
1043#define __ptrcheck_unavailable
1044#define __ptrcheck_unavailable_r(REPLACEMENT)
1045
1046#endif /* !__has_include(<ptrcheck.h>) */
1047
1048
1049#define __ASSUME_PTR_ABI_SINGLE_BEGIN __ptrcheck_abi_assume_single()
1050#define __ASSUME_PTR_ABI_SINGLE_END __ptrcheck_abi_assume_unsafe_indexable()
1051
1052#if __has_ptrcheck
1053#define __header_indexable __indexable
1054#define __header_bidi_indexable __bidi_indexable
1055#else
1056#define __header_indexable
1057#define __header_bidi_indexable
1058#endif
1059
1060/*
1061 * Architecture validation for current SDK
1062 */
1063#if !defined(__sys_cdefs_arch_unknown__) && defined(__i386__)
1064#elif !defined(__sys_cdefs_arch_unknown__) && defined(__x86_64__)
1065#elif !defined(__sys_cdefs_arch_unknown__) && defined(__arm__)
1066#elif !defined(__sys_cdefs_arch_unknown__) && defined(__arm64__)
1067#else
1068#error Unsupported architecture
1069#endif
1070
1071
1072
1073#define __compiler_barrier() __asm__ __volatile__("" ::: "memory")
1074
1075#if __has_attribute(enum_extensibility)
1076#define __enum_open __attribute__((__enum_extensibility__(open)))
1077#define __enum_closed __attribute__((__enum_extensibility__(closed)))
1078#else
1079#define __enum_open
1080#define __enum_closed
1081#endif // __has_attribute(enum_extensibility)
1082
1083#if __has_attribute(flag_enum)
1084#define __enum_options __attribute__((__flag_enum__))
1085#else
1086#define __enum_options
1087#endif
1088
1089/*
1090 * Similar to OS_ENUM/OS_CLOSED_ENUM/OS_OPTIONS/OS_CLOSED_OPTIONS
1091 *
1092 * This provides more advanced type checking on compilers supporting
1093 * the proper extensions, even in C.
1094 */
1095#if __has_feature(objc_fixed_enum) || __has_extension(cxx_fixed_enum) || \
1096 __has_extension(cxx_strong_enums)
1097#define __enum_decl(_name, _type, ...) \
1098 typedef enum : _type __VA_ARGS__ __enum_open _name
1099#define __enum_closed_decl(_name, _type, ...) \
1100 typedef enum : _type __VA_ARGS__ __enum_closed _name
1101#define __options_decl(_name, _type, ...) \
1102 typedef enum : _type __VA_ARGS__ __enum_open __enum_options _name
1103#define __options_closed_decl(_name, _type, ...) \
1104 typedef enum : _type __VA_ARGS__ __enum_closed __enum_options _name
1105#else
1106#define __enum_decl(_name, _type, ...) \
1107 typedef _type _name; enum __VA_ARGS__ __enum_open
1108#define __enum_closed_decl(_name, _type, ...) \
1109 typedef _type _name; enum __VA_ARGS__ __enum_closed
1110#define __options_decl(_name, _type, ...) \
1111 typedef _type _name; enum __VA_ARGS__ __enum_open __enum_options
1112#define __options_closed_decl(_name, _type, ...) \
1113 typedef _type _name; enum __VA_ARGS__ __enum_closed __enum_options
1114#endif
1115
1116
1117
1118#define __kernel_ptr_semantics
1119#define __kernel_data_semantics
1120#define __kernel_dual_semantics
1121
1122
1123
1124#if defined(KERNEL_PRIVATE) && \
1125 __has_attribute(xnu_data_size) && \
1126 __has_attribute(xnu_returns_data_pointer)
1127/*
1128 * Annotate function parameters to specify that they semantically
1129 * represent the size of a data-only backing storage.
1130 */
1131# define __xnu_data_size __attribute__((xnu_data_size))
1132/*
1133 * Annotate function declarations to specify that the pointer they return
1134 * points to a data-only backing storage.
1135 */
1136# define __xnu_returns_data_pointer __attribute__((xnu_returns_data_pointer))
1137#else
1138# define __xnu_data_size
1139# define __xnu_returns_data_pointer
1140#endif
1141
1142
1143#endif /* !_CDEFS_H_ */