master
1/*
2 * Copyright (c) 2000-2014 by Apple Inc.. All rights reserved.
3 *
4 * @APPLE_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. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24/*
25 File: TargetConditionals.h
26
27 Contains: Autoconfiguration of TARGET_ conditionals for Mac OS X and iPhone
28
29 Note: TargetConditionals.h in 3.4 Universal Interfaces works
30 with all compilers. This header only recognizes compilers
31 known to run on Mac OS X.
32
33*/
34
35#ifndef __TARGETCONDITIONALS__
36#define __TARGETCONDITIONALS__
37
38/*
39 *
40 * TARGET_CPU_*
41 * These conditionals specify which microprocessor instruction set is being
42 * generated. At most one of these is true, the rest are false.
43 *
44 * TARGET_CPU_PPC - Compiler is generating PowerPC instructions for 32-bit mode
45 * TARGET_CPU_PPC64 - Compiler is generating PowerPC instructions for 64-bit mode
46 * TARGET_CPU_68K - Compiler is generating 680x0 instructions
47 * TARGET_CPU_X86 - Compiler is generating x86 instructions for 32-bit mode
48 * TARGET_CPU_X86_64 - Compiler is generating x86 instructions for 64-bit mode
49 * TARGET_CPU_ARM - Compiler is generating ARM instructions for 32-bit mode
50 * TARGET_CPU_ARM64 - Compiler is generating ARM instructions for 64-bit mode
51 * TARGET_CPU_MIPS - Compiler is generating MIPS instructions
52 * TARGET_CPU_SPARC - Compiler is generating Sparc instructions
53 * TARGET_CPU_ALPHA - Compiler is generating Dec Alpha instructions
54 */
55
56
57
58/*
59 * TARGET_OS_*
60 *
61 * These conditionals specify in which Operating System the generated code will
62 * run. Indention is used to show which conditionals are evolutionary subclasses.
63 *
64 * The MAC/WIN32/UNIX conditionals are mutually exclusive.
65 * The IOS/TV/WATCH/VISION conditionals are mutually exclusive.
66 *
67 * TARGET_OS_WIN32 - Generated code will run on WIN32 API
68 * TARGET_OS_WINDOWS - Generated code will run on Windows
69 * TARGET_OS_UNIX - Generated code will run on some Unix (not macOS)
70 * TARGET_OS_LINUX - Generated code will run on Linux
71 * TARGET_OS_MAC - Generated code will run on a variant of macOS
72 * TARGET_OS_OSX - Generated code will run on macOS
73 * TARGET_OS_IPHONE - Generated code will run on a variant of iOS (firmware, devices, simulator)
74 * TARGET_OS_IOS - Generated code will run on iOS
75 * TARGET_OS_MACCATALYST - Generated code will run on macOS
76 * TARGET_OS_TV - Generated code will run on tvOS
77 * TARGET_OS_WATCH - Generated code will run on watchOS
78 * TARGET_OS_VISION - Generated code will run on visionOS
79 * TARGET_OS_BRIDGE - Generated code will run on bridge devices
80 * TARGET_OS_SIMULATOR - Generated code will run on an iOS, tvOS, watchOS, or visionOS simulator
81 * TARGET_OS_DRIVERKIT - Generated code will run on macOS, iOS, tvOS, watchOS, or visionOS
82 *
83 * TARGET_OS_EMBEDDED - DEPRECATED: Use TARGET_OS_IPHONE and/or TARGET_OS_SIMULATOR instead
84 * TARGET_IPHONE_SIMULATOR - DEPRECATED: Same as TARGET_OS_SIMULATOR
85 * TARGET_OS_NANO - DEPRECATED: Same as TARGET_OS_WATCH
86 *
87 * +--------------------------------------------------------------------------------------+
88 * | TARGET_OS_MAC |
89 * | +-----+ +------------------------------------------------------------+ +-----------+ |
90 * | | | | TARGET_OS_IPHONE | | | |
91 * | | | | +-----------------+ +----+ +-------+ +--------+ +--------+ | | | |
92 * | | | | | IOS | | | | | | | | | | | | |
93 * | | OSX | | | +-------------+ | | TV | | WATCH | | BRIDGE | | VISION | | | DRIVERKIT | |
94 * | | | | | | MACCATALYST | | | | | | | | | | | | | |
95 * | | | | | +-------------+ | | | | | | | | | | | | |
96 * | | | | +-----------------+ +----+ +-------+ +--------+ +--------+ | | | |
97 * | +-----+ +------------------------------------------------------------+ +-----------+ |
98 * +--------------------------------------------------------------------------------------+
99 */
100
101/*
102 * TARGET_RT_*
103 *
104 * These conditionals specify in which runtime the generated code will
105 * run. This is needed when the OS and CPU support more than one runtime
106 * (e.g. Mac OS X supports CFM and mach-o).
107 *
108 * TARGET_RT_LITTLE_ENDIAN - Generated code uses little endian format for integers
109 * TARGET_RT_BIG_ENDIAN - Generated code uses big endian format for integers
110 * TARGET_RT_64_BIT - Generated code uses 64-bit pointers
111 * TARGET_RT_MAC_CFM - TARGET_OS_MAC is true and CFM68K or PowerPC CFM (TVectors) are used
112 * TARGET_RT_MAC_MACHO - TARGET_OS_MAC is true and Mach-O/dlyd runtime is used
113 */
114
115/*
116 * TARGET_OS conditionals can be enabled via clang preprocessor extensions:
117 *
118 * __is_target_arch
119 * __is_target_vendor
120 * __is_target_os
121 * __is_target_environment
122 *
123 * "-target=x86_64-apple-ios12-macabi"
124 * TARGET_OS_MAC=1
125 * TARGET_OS_IPHONE=1
126 * TARGET_OS_IOS=1
127 * TARGET_OS_MACCATALYST=1
128 *
129 * "-target=x86_64-apple-ios12-simulator"
130 * TARGET_OS_MAC=1
131 * TARGET_OS_IPHONE=1
132 * TARGET_OS_IOS=1
133 * TARGET_OS_SIMULATOR=1
134 *
135 * DYNAMIC_TARGETS_ENABLED indicates that the core TARGET_OS macros were enabled via clang preprocessor extensions.
136 * If this value is not set, the macro enablements will fall back to the static behavior.
137 * It is disabled by default.
138 */
139
140#if !defined(__has_extension) || !__has_extension(define_target_os_macros)
141#if defined(__has_builtin)
142 #if __has_builtin(__is_target_arch)
143 #if __has_builtin(__is_target_vendor)
144 #if __has_builtin(__is_target_os)
145 #if __has_builtin(__is_target_environment)
146
147 /* "-target=x86_64-apple-ios12-macabi" */
148 /* "-target=arm64-apple-ios12-macabi" */
149 /* "-target=arm64e-apple-ios12-macabi" */
150 #if (__is_target_arch(x86_64) || __is_target_arch(arm64) || __is_target_arch(arm64e)) && __is_target_vendor(apple) && __is_target_os(ios) && __is_target_environment(macabi)
151 #define TARGET_OS_MAC 1
152 #define TARGET_OS_IPHONE 1
153 #define TARGET_OS_IOS 1
154 #define TARGET_OS_MACCATALYST 1
155 #define TARGET_OS_MACCATALYST 1
156 #ifndef TARGET_OS_UIKITFORMAC
157 #define TARGET_OS_UIKITFORMAC 1
158 #endif
159 #define TARGET_OS_UNIX 0
160 #define DYNAMIC_TARGETS_ENABLED 1
161 #endif
162
163 /* "-target=x86_64-apple-ios12-simulator" */
164 /* "-target=arm64-apple-ios12-simulator" */
165 /* "-target=arm64e-apple-ios12-simulator" */
166 #if (__is_target_arch(x86_64) || __is_target_arch(arm64) || __is_target_arch(arm64e)) && __is_target_vendor(apple) && __is_target_os(ios) && __is_target_environment(simulator)
167 #define TARGET_OS_MAC 1
168 #define TARGET_OS_IPHONE 1
169 #define TARGET_OS_IOS 1
170 #define TARGET_OS_SIMULATOR 1
171 #define TARGET_OS_UNIX 0
172 #define DYNAMIC_TARGETS_ENABLED 1
173 #endif
174
175
176
177 /* "-target=arm64e-apple-xros1.0[-simulator]" */
178 #if __is_target_vendor(apple) && __is_target_os(xros) && (!__is_target_environment(exclavekit) && !__is_target_environment(exclavecore))
179 #define TARGET_OS_MAC 1
180 #define TARGET_OS_IPHONE 1
181
182 #if __is_target_environment(simulator)
183 #define TARGET_OS_SIMULATOR 1
184 #else
185 #define TARGET_OS_EMBEDDED 1
186 #endif
187 #define TARGET_OS_VISION 1
188 #define TARGET_OS_UNIX 0
189 #define DYNAMIC_TARGETS_ENABLED 1
190 #endif
191
192
193 #if (__is_target_vendor(apple) && __is_target_environment(exclavecore))
194
195 #define TARGET_OS_UNIX 0
196 #define DYNAMIC_TARGETS_ENABLED 1
197 #endif
198
199
200 #if (__is_target_vendor(apple) && __is_target_environment(exclavekit))
201 #define TARGET_OS_MAC 1
202
203 #define TARGET_OS_UNIX 0
204 #define DYNAMIC_TARGETS_ENABLED 1
205 #endif
206
207 /* "-target=x86_64-apple-driverkit19.0" */
208 /* "-target=arm64-apple-driverkit19.0" */
209 /* "-target=arm64e-apple-driverkit19.0" */
210 #if __is_target_vendor(apple) && __is_target_os(driverkit)
211 #define TARGET_OS_MAC 1
212 #define TARGET_OS_DRIVERKIT 1
213 #define TARGET_OS_UNIX 0
214 #define DYNAMIC_TARGETS_ENABLED 1
215 #endif
216
217 #endif /* #if __has_builtin(__is_target_environment) */
218 #endif /* #if __has_builtin(__is_target_os) */
219 #endif /* #if __has_builtin(__is_target_vendor) */
220 #endif /* #if __has_builtin(__is_target_arch) */
221#endif /* #if defined(__has_builtin) */
222
223#ifndef DYNAMIC_TARGETS_ENABLED
224 #define DYNAMIC_TARGETS_ENABLED 0
225#endif /* DYNAMIC_TARGETS_ENABLED */
226
227/*
228 * gcc based compiler used on Mac OS X
229 */
230#if defined(__GNUC__) && ( defined(__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__MACOS_CLASSIC__) )
231 #if !DYNAMIC_TARGETS_ENABLED
232 #define TARGET_OS_MAC 1
233 #define TARGET_OS_OSX 1
234 #define TARGET_OS_IPHONE 0
235
236 #define TARGET_OS_IOS 0
237
238 #define TARGET_OS_WATCH 0
239
240 #define TARGET_OS_TV 0
241 #define TARGET_OS_MACCATALYST 0
242 #define TARGET_OS_MACCATALYST 0
243 #ifndef TARGET_OS_UIKITFORMAC
244 #define TARGET_OS_UIKITFORMAC 0
245 #endif
246 #define TARGET_OS_SIMULATOR 0
247 #define TARGET_OS_EMBEDDED 0
248 #define TARGET_OS_UNIX 0
249 #endif
250
251/*
252 * CodeWarrior compiler from Metrowerks/Motorola
253 */
254#elif defined(__MWERKS__)
255 #define TARGET_OS_MAC 1
256
257/*
258 * unknown compiler
259 */
260#else
261 #define TARGET_OS_MAC 1
262#endif
263#endif /* !defined(__has_extension) || !__has_extension(define_target_os_macros) */
264
265// This has to always be defined in the header due to limitations in define_target_os_macros
266#define TARGET_OS_RTKIT 0
267
268/*
269 * gcc based compiler used on Mac OS X
270 */
271#if defined(__GNUC__) && ( defined(__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__MACOS_CLASSIC__) )
272 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
273 #define TARGET_RT_LITTLE_ENDIAN 1
274 #define TARGET_RT_BIG_ENDIAN 0
275 #else
276 #define TARGET_RT_LITTLE_ENDIAN 0
277 #define TARGET_RT_BIG_ENDIAN 1
278 #endif
279 #if __LP64__
280 #define TARGET_RT_64_BIT 1
281 #else
282 #define TARGET_RT_64_BIT 0
283 #endif
284 #if defined(__ppc__) && __MACOS_CLASSIC__
285 #define TARGET_RT_MAC_CFM 1
286 #define TARGET_RT_MAC_MACHO 0
287 #else
288 #define TARGET_RT_MAC_CFM 0
289 #define TARGET_RT_MAC_MACHO 1
290 #endif
291
292/*
293 * CodeWarrior compiler from Metrowerks/Motorola
294 */
295#elif defined(__MWERKS__)
296 #if defined(__POWERPC__)
297 #define TARGET_RT_LITTLE_ENDIAN 0
298 #define TARGET_RT_BIG_ENDIAN 1
299 #elif defined(__INTEL__)
300 #define TARGET_RT_LITTLE_ENDIAN 1
301 #define TARGET_RT_BIG_ENDIAN 0
302 #else
303 #error unknown Metrowerks CPU type
304 #endif
305 #define TARGET_RT_64_BIT 0
306 #ifdef __MACH__
307 #define TARGET_RT_MAC_CFM 0
308 #define TARGET_RT_MAC_MACHO 1
309 #else
310 #define TARGET_RT_MAC_CFM 1
311 #define TARGET_RT_MAC_MACHO 0
312 #endif
313
314/*
315 * unknown compiler
316 */
317#else
318 #if TARGET_CPU_PPC || TARGET_CPU_PPC64
319 #define TARGET_RT_BIG_ENDIAN 1
320 #define TARGET_RT_LITTLE_ENDIAN 0
321 #else
322 #define TARGET_RT_BIG_ENDIAN 0
323 #define TARGET_RT_LITTLE_ENDIAN 1
324 #endif
325 #if TARGET_CPU_PPC64 || TARGET_CPU_X86_64
326 #define TARGET_RT_64_BIT 1
327 #else
328 #define TARGET_RT_64_BIT 0
329 #endif
330 #ifdef __MACH__
331 #define TARGET_RT_MAC_MACHO 1
332 #define TARGET_RT_MAC_CFM 0
333 #else
334 #define TARGET_RT_MAC_MACHO 0
335 #define TARGET_RT_MAC_CFM 1
336 #endif
337#endif
338
339/*
340 * __is_target_arch based defines
341 */
342#if defined(__has_builtin) && __has_builtin(__is_target_arch)
343 #if __is_target_arch(arm64) || __is_target_arch(arm64e) || __is_target_arch(arm64_32)
344 #define TARGET_CPU_ARM64 1
345 #elif __is_target_arch(arm)
346 #define TARGET_CPU_ARM 1
347 #elif __is_target_arch(x86_64)
348 #define TARGET_CPU_X86_64 1
349 #elif __is_target_arch(i386)
350 #define TARGET_CPU_X86 1
351 #else
352
353 #error unrecognized arch using compiler with __is_target_arch support
354
355 #endif
356
357/*
358 * GCC and older clang fallback
359 */
360#elif defined(__GNUC__) && ( defined(__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__MACOS_CLASSIC__) )
361 #if defined(__ppc__)
362 #define TARGET_CPU_PPC 1
363 #elif defined(__ppc64__)
364 #define TARGET_CPU_PPC64 1
365 #elif defined(__i386__)
366 #define TARGET_CPU_X86 1
367 #elif defined(__x86_64__)
368 #define TARGET_CPU_X86_64 1
369 #elif defined(__arm__)
370 #define TARGET_CPU_ARM 1
371 #elif defined(__arm64__)
372 #define TARGET_CPU_ARM64 1
373 #else
374 #error unrecognized GNU C compiler
375 #endif
376
377/*
378 * CodeWarrior compiler from Metrowerks/Motorola
379 */
380#elif defined(__MWERKS__)
381 #if defined(__POWERPC__)
382 #define TARGET_CPU_PPC 1
383 #elif defined(__INTEL__)
384 #define TARGET_CPU_X86 1
385 #else
386 #error unknown Metrowerks CPU type
387 #endif
388
389/*
390 * unknown compiler
391 */
392#else
393 #if !defined(TARGET_CPU_PPC) && !defined(TARGET_CPU_PPC64) \
394 && !defined(TARGET_CPU_X86) && !defined(TARGET_CPU_X86_64) \
395 && !defined(TARGET_CPU_ARM) && !defined(TARGET_CPU_ARM64)
396 /*
397 TargetConditionals.h is designed to be plug-and-play. It auto detects
398 which compiler is being run and configures the TARGET_ conditionals
399 appropriately.
400
401 The short term work around is to set the TARGET_CPU_ and TARGET_OS_
402 on the command line to the compiler (e.g. -DTARGET_CPU_MIPS=1 -DTARGET_OS_UNIX=1)
403
404 The long term solution is to add suppport for __is_target_arch and __is_target_os
405 to your compiler.
406 */
407 #error TargetConditionals.h: unknown compiler (see comment above)
408 #endif
409#endif
410
411
412
413// Make sure all TARGET_OS_* and TARGET_CPU_* values are defined
414#ifndef TARGET_OS_MAC
415 #define TARGET_OS_MAC 0
416#endif
417
418#ifndef TARGET_OS_OSX
419 #define TARGET_OS_OSX 0
420#endif
421
422#ifndef TARGET_OS_IPHONE
423 #define TARGET_OS_IPHONE 0
424#endif
425
426#ifndef TARGET_OS_IOS
427 #define TARGET_OS_IOS 0
428#endif
429
430#ifndef TARGET_OS_WATCH
431 #define TARGET_OS_WATCH 0
432#endif
433
434#ifndef TARGET_OS_TV
435 #define TARGET_OS_TV 0
436#endif
437
438#ifndef TARGET_OS_SIMULATOR
439 #define TARGET_OS_SIMULATOR 0
440#endif
441
442#ifndef TARGET_OS_EMBEDDED
443 #define TARGET_OS_EMBEDDED 0
444#endif
445
446#ifndef TARGET_OS_RTKIT
447 #define TARGET_OS_RTKIT 0
448#endif
449
450#ifndef TARGET_OS_MACCATALYST
451 #define TARGET_OS_MACCATALYST 0
452#endif
453
454#ifndef TARGET_OS_VISION
455 #define TARGET_OS_VISION 0
456#endif
457
458#ifndef TARGET_OS_UIKITFORMAC
459 #define TARGET_OS_UIKITFORMAC 0
460#endif
461
462#ifndef TARGET_OS_DRIVERKIT
463 #define TARGET_OS_DRIVERKIT 0
464#endif
465
466#ifndef TARGET_OS_WIN32
467 #define TARGET_OS_WIN32 0
468#endif
469
470#ifndef TARGET_OS_WINDOWS
471 #define TARGET_OS_WINDOWS 0
472#endif
473
474
475
476#ifndef TARGET_OS_LINUX
477 #define TARGET_OS_LINUX 0
478#endif
479
480#ifndef TARGET_CPU_PPC
481 #define TARGET_CPU_PPC 0
482#endif
483
484#ifndef TARGET_CPU_PPC64
485 #define TARGET_CPU_PPC64 0
486#endif
487
488#ifndef TARGET_CPU_68K
489 #define TARGET_CPU_68K 0
490#endif
491
492#ifndef TARGET_CPU_X86
493 #define TARGET_CPU_X86 0
494#endif
495
496#ifndef TARGET_CPU_X86_64
497 #define TARGET_CPU_X86_64 0
498#endif
499
500#ifndef TARGET_CPU_ARM
501 #define TARGET_CPU_ARM 0
502#endif
503
504#ifndef TARGET_CPU_ARM64
505 #define TARGET_CPU_ARM64 0
506#endif
507
508#ifndef TARGET_CPU_MIPS
509 #define TARGET_CPU_MIPS 0
510#endif
511
512#ifndef TARGET_CPU_SPARC
513 #define TARGET_CPU_SPARC 0
514#endif
515
516#ifndef TARGET_CPU_ALPHA
517 #define TARGET_CPU_ALPHA 0
518#endif
519
520#ifndef TARGET_ABI_USES_IOS_VALUES
521 #define TARGET_ABI_USES_IOS_VALUES (!TARGET_CPU_X86_64 || (TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST))
522#endif
523
524#ifndef TARGET_IPHONE_SIMULATOR
525 #define TARGET_IPHONE_SIMULATOR TARGET_OS_SIMULATOR /* deprecated */
526#endif
527
528#ifndef TARGET_OS_NANO
529 #define TARGET_OS_NANO TARGET_OS_WATCH /* deprecated */
530#endif
531
532
533
534#endif /* __TARGETCONDITIONALS__ */