clang 24.0.0git
OSTargets.h
Go to the documentation of this file.
1//===--- OSTargets.h - Declare OS target feature support --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares OS specific TargetInfo types.
10//===----------------------------------------------------------------------===//
11
12#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H
13#define LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H
14
15#include "Targets.h"
16
17namespace clang {
18namespace targets {
19
20template <typename TgtInfo>
21class LLVM_LIBRARY_VISIBILITY OSTargetInfo : public TgtInfo {
22protected:
23 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
24 MacroBuilder &Builder) const = 0;
25
26public:
27 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
28 : TgtInfo(Triple, Opts) {}
29
30 void getTargetDefines(const LangOptions &Opts,
31 MacroBuilder &Builder) const override {
32 TgtInfo::getTargetDefines(Opts, Builder);
33 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
34 }
35};
36
37void getAppleMachODefines(MacroBuilder &Builder, const LangOptions &Opts,
38 const llvm::Triple &Triple);
39
40void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
41 const llvm::Triple &Triple, StringRef &PlatformName,
42 VersionTuple &PlatformMinVersion);
43
44template <typename Target>
45class LLVM_LIBRARY_VISIBILITY AppleMachOTargetInfo
46 : public OSTargetInfo<Target> {
47protected:
48 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
49 MacroBuilder &Builder) const override {
50 getAppleMachODefines(Builder, Opts, Triple);
51 }
52
53public:
54 AppleMachOTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
55 : OSTargetInfo<Target>(Triple, Opts) {}
56
57 const char *getStaticInitSectionSpecifier() const override {
58 return "__TEXT,__StaticInit,regular,pure_instructions";
59 }
60
61 /// Apple Mach-O does not support protected visibility. Its "default" is very
62 /// similar to ELF's "protected"; Apple Mach-O requires a "weak" attribute on
63 /// declarations that can be dynamically replaced.
64 bool hasProtectedVisibility() const override { return false; }
65
66 /// Apple Mach-O can autohide a vague-linkage vtable so that each image gets
67 /// its own copy, so such a vtable may have more than one address in a
68 /// program. A strong (key-function) vtable still has a unique address.
72};
73
74template <typename Target>
75class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo
76 : public AppleMachOTargetInfo<Target> {
77protected:
78 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
79 MacroBuilder &Builder) const override {
80 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
81 this->PlatformMinVersion);
82 }
83
84public:
85 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
86 : AppleMachOTargetInfo<Target>(Triple, Opts) {
87 // By default, no TLS, and we list permitted architecture/OS
88 // combinations.
89 this->TLSSupported = false;
90
91 if (Triple.isMacOSX())
92 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
93 else if (Triple.isiOS()) {
94 // 64-bit iOS supported it from 8 onwards, 32-bit device from 9 onwards,
95 // 32-bit simulator from 10 onwards.
96 if (Triple.isArch64Bit())
97 this->TLSSupported = !Triple.isOSVersionLT(8);
98 else if (Triple.isArch32Bit()) {
99 if (!Triple.isSimulatorEnvironment())
100 this->TLSSupported = !Triple.isOSVersionLT(9);
101 else
102 this->TLSSupported = !Triple.isOSVersionLT(10);
103 }
104 } else if (Triple.isWatchOS()) {
105 if (!Triple.isSimulatorEnvironment())
106 this->TLSSupported = !Triple.isOSVersionLT(2);
107 else
108 this->TLSSupported = !Triple.isOSVersionLT(3);
109 } else if (Triple.isDriverKit()) {
110 // No TLS on DriverKit.
111 } else if (Triple.isXROS())
112 this->TLSSupported = true;
113 else if (Triple.isAppleFirmware()) {
114 if (Triple.isAArch64() || Triple.isARM())
115 this->TLSSupported = true;
116 else if (Triple.isThumb()) {
117 switch (Triple.getSubArch()) {
118 case llvm::Triple::NoSubArch:
119 case llvm::Triple::ARMSubArch_v4t:
120 case llvm::Triple::ARMSubArch_v5:
121 case llvm::Triple::ARMSubArch_v5te:
122 case llvm::Triple::ARMSubArch_v6:
123 case llvm::Triple::ARMSubArch_v6k:
124 case llvm::Triple::ARMSubArch_v6m:
125 // Thumb-1 doesn't support TLS.
126 break;
127
128 default:
129 this->TLSSupported = true;
130 break;
131 }
132 }
133 }
134
135 this->MCountName = "\01mcount";
136 }
137
138 const char *getStaticInitSectionSpecifier() const override {
139 // FIXME: We should return 0 when building kexts.
141 }
142
143 unsigned getExnObjectAlignment() const override {
144 // Older versions of libc++abi guarantee an alignment of only 8-bytes for
145 // exception objects because of a bug in __cxa_exception that was
146 // eventually fixed in r319123.
147 llvm::VersionTuple MinVersion;
148 const llvm::Triple &T = this->getTriple();
149
150 // Compute the earliest OS versions that have the fix to libc++abi.
151 switch (T.getOS()) {
152 case llvm::Triple::Darwin:
153 case llvm::Triple::MacOSX: // Earliest supporting version is 10.14.
154 MinVersion = llvm::VersionTuple(10U, 14U);
155 break;
156 case llvm::Triple::IOS:
157 case llvm::Triple::TvOS: // Earliest supporting version is 12.0.0.
158 MinVersion = llvm::VersionTuple(12U);
159 break;
160 case llvm::Triple::WatchOS: // Earliest supporting version is 5.0.0.
161 MinVersion = llvm::VersionTuple(5U);
162 break;
163 case llvm::Triple::XROS:
164 MinVersion = llvm::VersionTuple(0);
165 break;
166 default:
167 // Conservatively return 8 bytes if OS is unknown.
168 return 64;
169 }
170
171 if (T.getOSVersion() < MinVersion)
172 return 64;
174 }
175
177 bool IsSigned) const final {
178 // Darwin uses `long long` for `int_least64_t` and `int_fast64_t`.
179 return BitWidth == 64
180 ? (IsSigned ? TargetInfo::SignedLongLong
182 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
183 }
184
185 bool areDefaultedSMFStillPOD(const LangOptions &) const override {
186 return false;
187 }
188};
189
190// DragonFlyBSD Target
191template <typename Target>
192class LLVM_LIBRARY_VISIBILITY DragonFlyBSDTargetInfo
193 : public OSTargetInfo<Target> {
194protected:
195 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
196 MacroBuilder &Builder) const override {
197 // DragonFly defines; list based off of gcc output
198 Builder.defineMacro("__DragonFly__");
199 Builder.defineMacro("__DragonFly_cc_version", "100001");
200 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
201 Builder.defineMacro("__tune_i386__");
202 DefineStd(Builder, "unix", Opts);
203 if (this->HasFloat128)
204 Builder.defineMacro("__FLOAT128__");
205
206 if (Opts.C11)
207 Builder.defineMacro("__STDC_NO_THREADS__");
208 }
209
210public:
211 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
212 : OSTargetInfo<Target>(Triple, Opts) {
213 switch (Triple.getArch()) {
214 default:
215 case llvm::Triple::x86:
216 case llvm::Triple::x86_64:
217 this->HasFloat128 = true;
218 this->MCountName = ".mcount";
219 break;
220 }
221 }
222};
223
224#ifndef FREEBSD_CC_VERSION
225#define FREEBSD_CC_VERSION 0U
226#endif
227
228// FreeBSD Target
229template <typename Target>
230class LLVM_LIBRARY_VISIBILITY FreeBSDTargetInfo : public OSTargetInfo<Target> {
231protected:
232 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
233 MacroBuilder &Builder) const override {
234 // FreeBSD defines; list based off of gcc output
235
236 unsigned Release = Triple.getOSMajorVersion();
237 if (Release == 0U)
238 Release = 8U;
239 unsigned CCVersion = FREEBSD_CC_VERSION;
240 if (CCVersion == 0U)
241 CCVersion = Release * 100000U + 1U;
242
243 Builder.defineMacro("__FreeBSD__", Twine(Release));
244 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
245 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
246 DefineStd(Builder, "unix", Opts);
247 if (this->HasFloat128)
248 Builder.defineMacro("__FLOAT128__");
249
250 // On FreeBSD, wchar_t contains the number of the code point as
251 // used by the character set of the locale. These character sets are
252 // not necessarily a superset of ASCII.
253 //
254 // FIXME: This is wrong; the macro refers to the numerical values
255 // of wchar_t *literals*, which are not locale-dependent. However,
256 // FreeBSD systems apparently depend on us getting this wrong, and
257 // setting this to 1 is conforming even if all the basic source
258 // character literals have the same encoding as char and wchar_t.
259 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
260 }
261
262public:
263 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
264 : OSTargetInfo<Target>(Triple, Opts) {
265 switch (Triple.getArch()) {
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->HasFloat128 = true;
269 [[fallthrough]];
270 default:
271 this->MCountName = ".mcount";
272 break;
273 case llvm::Triple::mips:
274 case llvm::Triple::mipsel:
275 case llvm::Triple::ppc:
276 case llvm::Triple::ppcle:
277 case llvm::Triple::ppc64:
278 case llvm::Triple::ppc64le:
279 this->MCountName = "_mcount";
280 break;
281 case llvm::Triple::arm:
282 this->MCountName = "__mcount";
283 break;
284 case llvm::Triple::loongarch64:
285 case llvm::Triple::riscv64:
286 break;
287 }
288 }
289};
290
291// GNU/kFreeBSD Target
292template <typename Target>
293class LLVM_LIBRARY_VISIBILITY KFreeBSDTargetInfo : public OSTargetInfo<Target> {
294protected:
295 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
296 MacroBuilder &Builder) const override {
297 // GNU/kFreeBSD defines; list based off of gcc output
298
299 DefineStd(Builder, "unix", Opts);
300 Builder.defineMacro("__FreeBSD_kernel__");
301 Builder.defineMacro("__GLIBC__");
302 if (Opts.POSIXThreads)
303 Builder.defineMacro("_REENTRANT");
304 if (Opts.CPlusPlus)
305 Builder.defineMacro("_GNU_SOURCE");
306 }
307
308public:
310};
311
312// Haiku Target
313template <typename Target>
314class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo<Target> {
315protected:
316 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
317 MacroBuilder &Builder) const override {
318 // Haiku defines; list based off of gcc output
319 Builder.defineMacro("__HAIKU__");
320 DefineStd(Builder, "unix", Opts);
321 if (this->HasFloat128)
322 Builder.defineMacro("__FLOAT128__");
323 }
324
325public:
326 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
327 : OSTargetInfo<Target>(Triple, Opts) {
328 this->SizeType = TargetInfo::UnsignedLong;
329 this->IntPtrType = TargetInfo::SignedLong;
330 this->PtrDiffType = TargetInfo::SignedLong;
331 this->ProcessIDType = TargetInfo::SignedLong;
332 switch (Triple.getArch()) {
333 default:
334 break;
335 case llvm::Triple::x86:
336 case llvm::Triple::x86_64:
337 this->HasFloat128 = true;
338 break;
339 }
340 }
341};
342
343// Hurd target
344template <typename Target>
345class LLVM_LIBRARY_VISIBILITY HurdTargetInfo : public OSTargetInfo<Target> {
346protected:
347 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
348 MacroBuilder &Builder) const override {
349 // Hurd defines; list based off of gcc output.
350 DefineStd(Builder, "unix", Opts);
351 Builder.defineMacro("__GNU__");
352 Builder.defineMacro("__gnu_hurd__");
353 Builder.defineMacro("__MACH__");
354 Builder.defineMacro("__GLIBC__");
355 if (Opts.POSIXThreads)
356 Builder.defineMacro("_REENTRANT");
357 if (Opts.CPlusPlus)
358 Builder.defineMacro("_GNU_SOURCE");
359 if (this->HasFloat128)
360 Builder.defineMacro("__FLOAT128__");
361 }
362public:
363 HurdTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
364 : OSTargetInfo<Target>(Triple, Opts) {
365 switch (Triple.getArch()) {
366 default:
367 break;
368 case llvm::Triple::x86:
369 case llvm::Triple::x86_64:
370 this->HasFloat128 = true;
371 break;
372 }
373 }
374};
375
376// Linux target
377template <typename Target>
378class LLVM_LIBRARY_VISIBILITY LinuxTargetInfo : public OSTargetInfo<Target> {
379protected:
380 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
381 MacroBuilder &Builder) const override {
382 // Linux defines; list based off of gcc output
383 DefineStd(Builder, "unix", Opts);
384 DefineStd(Builder, "linux", Opts);
385 if (Triple.isAndroid()) {
386 Builder.defineMacro("__ANDROID__", "1");
387 this->PlatformName = "android";
388 this->PlatformMinVersion = Triple.getEnvironmentVersion();
389 const unsigned Maj = this->PlatformMinVersion.getMajor();
390 if (Maj) {
391 Builder.defineMacro("__ANDROID_MIN_SDK_VERSION__", Twine(Maj));
392 // This historical but ambiguous name for the minSdkVersion macro. Keep
393 // defined for compatibility.
394 Builder.defineMacro("__ANDROID_API__", "__ANDROID_MIN_SDK_VERSION__");
395 }
396 } else if (Triple.isMlibc()) {
397 Builder.defineMacro("__mlibc__");
398 } else {
399 Builder.defineMacro("__gnu_linux__");
400 }
401 if (Opts.POSIXThreads)
402 Builder.defineMacro("_REENTRANT");
403 if (Opts.CPlusPlus)
404 Builder.defineMacro("_GNU_SOURCE");
405 if (this->HasFloat128)
406 Builder.defineMacro("__FLOAT128__");
407 if (Triple.isTime64ABI()) {
408 Builder.defineMacro("_FILE_OFFSET_BITS", "64");
409 Builder.defineMacro("_TIME_BITS", "64");
410 }
411 }
412
413public:
414 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
415 : OSTargetInfo<Target>(Triple, Opts) {
416 this->WIntType = TargetInfo::UnsignedInt;
417
418 switch (Triple.getArch()) {
419 default:
420 break;
421 case llvm::Triple::mips:
422 case llvm::Triple::mipsel:
423 case llvm::Triple::mips64:
424 case llvm::Triple::mips64el:
425 case llvm::Triple::ppc:
426 case llvm::Triple::ppcle:
427 case llvm::Triple::ppc64:
428 case llvm::Triple::ppc64le:
429 this->MCountName = "_mcount";
430 break;
431 case llvm::Triple::x86:
432 case llvm::Triple::x86_64:
433 this->HasFloat128 = true;
434 break;
435 }
436 }
437
438 const char *getStaticInitSectionSpecifier() const override {
439 return ".text.startup";
440 }
441
442 // This allows template specializations, see
443 // LinuxTargetInfo<AArch64leTargetInfo>::setABI
444 bool setABI(const std::string &Name) override {
445 return OSTargetInfo<Target>::setABI(Name);
446 }
447};
448
449// Managarm Target
450template <typename Target>
451class LLVM_LIBRARY_VISIBILITY ManagarmTargetInfo : public OSTargetInfo<Target> {
452protected:
453 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
454 MacroBuilder &Builder) const override {
455 DefineStd(Builder, "unix", Opts);
456 Builder.defineMacro("__managarm__");
457 if (Triple.getEnvironmentName() == "mlibc")
458 Builder.defineMacro("__mlibc__");
459 if (Opts.POSIXThreads)
460 Builder.defineMacro("_REENTRANT");
461 if (Opts.CPlusPlus)
462 Builder.defineMacro("_GNU_SOURCE");
463 if (this->HasFloat128)
464 Builder.defineMacro("__FLOAT128__");
465 }
466
467public:
468 ManagarmTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
469 : OSTargetInfo<Target>(Triple, Opts) {
470 switch (Triple.getArch()) {
471 default:
472 break;
473 case llvm::Triple::x86:
474 case llvm::Triple::x86_64:
475 this->HasFloat128 = true;
476 break;
477 }
478 }
479};
480
481// NetBSD Target
482template <typename Target>
483class LLVM_LIBRARY_VISIBILITY NetBSDTargetInfo : public OSTargetInfo<Target> {
484protected:
485 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
486 MacroBuilder &Builder) const override {
487 // NetBSD defines; list based off of gcc output
488 Builder.defineMacro("__NetBSD__");
489 Builder.defineMacro("__unix__");
490 if (Opts.POSIXThreads)
491 Builder.defineMacro("_REENTRANT");
492 if (this->HasFloat128)
493 Builder.defineMacro("__FLOAT128__");
494 }
495
496public:
497 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
498 : OSTargetInfo<Target>(Triple, Opts) {
499 this->MCountName = "__mcount";
500 switch (Triple.getArch()) {
501 default:
502 break;
503 case llvm::Triple::x86:
504 case llvm::Triple::x86_64:
505 this->HasFloat128 = true;
506 break;
507 }
508 }
509};
510
511// OpenBSD Target
512template <typename Target>
513class LLVM_LIBRARY_VISIBILITY OpenBSDTargetInfo : public OSTargetInfo<Target> {
514protected:
515 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
516 MacroBuilder &Builder) const override {
517 // OpenBSD defines; list based off of gcc output
518
519 Builder.defineMacro("__OpenBSD__");
520 DefineStd(Builder, "unix", Opts);
521 if (Opts.POSIXThreads)
522 Builder.defineMacro("_REENTRANT");
523 if (this->HasFloat128)
524 Builder.defineMacro("__FLOAT128__");
525
526 if (Opts.C11)
527 Builder.defineMacro("__STDC_NO_THREADS__");
528 }
529
530public:
531 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
532 : OSTargetInfo<Target>(Triple, Opts) {
533 this->WCharType = this->WIntType = this->SignedInt;
534 this->IntMaxType = TargetInfo::SignedLongLong;
535 this->Int64Type = TargetInfo::SignedLongLong;
536 switch (Triple.getArch()) {
537 case llvm::Triple::x86:
538 case llvm::Triple::x86_64:
539 this->HasFloat128 = true;
540 [[fallthrough]];
541 default:
542 this->MCountName = "__mcount";
543 break;
544 case llvm::Triple::mips64:
545 case llvm::Triple::mips64el:
546 case llvm::Triple::ppc:
547 case llvm::Triple::ppc64:
548 case llvm::Triple::ppc64le:
549 case llvm::Triple::sparcv9:
550 this->MCountName = "_mcount";
551 break;
552 case llvm::Triple::loongarch64:
553 case llvm::Triple::riscv64:
554 break;
555 }
556 }
557};
558
559// PS3 PPU Target
560template <typename Target>
561class LLVM_LIBRARY_VISIBILITY PS3PPUTargetInfo : public OSTargetInfo<Target> {
562protected:
563 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
564 MacroBuilder &Builder) const override {
565 // PS3 PPU defines.
566 Builder.defineMacro("__PPU__");
567 Builder.defineMacro("__CELLOS_LV2__");
568 Builder.defineMacro("__LP32__");
569 Builder.defineMacro("_ARCH_PPC64");
570 Builder.defineMacro("__powerpc64__");
571 }
572
573public:
574 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
575 : OSTargetInfo<Target>(Triple, Opts) {
576 this->LongWidth = this->LongAlign = 32;
577 this->PointerWidth = this->PointerAlign = 32;
578 this->IntMaxType = TargetInfo::SignedLongLong;
579 this->Int64Type = TargetInfo::SignedLongLong;
580 this->SizeType = TargetInfo::UnsignedInt;
581 this->resetDataLayout();
582 }
583};
584
585// Common base class for PS4/PS5 targets.
586template <typename Target>
587class LLVM_LIBRARY_VISIBILITY PSOSTargetInfo : public OSTargetInfo<Target> {
588protected:
589 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
590 MacroBuilder &Builder) const override {
591 Builder.defineMacro("__FreeBSD__", "9");
592 Builder.defineMacro("__FreeBSD_cc_version", "900001");
593 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
594 DefineStd(Builder, "unix", Opts);
595 Builder.defineMacro("__SCE__");
596 Builder.defineMacro("__STDC_NO_COMPLEX__");
597 Builder.defineMacro("__STDC_NO_THREADS__");
598 }
599
600public:
601 PSOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
602 : OSTargetInfo<Target>(Triple, Opts) {
603 this->WCharType = TargetInfo::UnsignedShort;
604
605 // On PS4/PS5, TLS variable cannot be aligned to more than 32 bytes (256
606 // bits).
607 this->MaxTLSAlign = 256;
608
609 // On PS4/PS5, do not honor explicit bit field alignment,
610 // as in "__attribute__((aligned(2))) int b : 1;".
611 this->UseExplicitBitFieldAlignment = false;
612
613 this->MCountName = ".mcount";
614 this->NewAlign = 256;
615 this->SuitableAlign = 256;
616 }
617
621 }
622
623 bool areDefaultedSMFStillPOD(const LangOptions &) const override {
624 return false;
625 }
626};
627
628// PS4 Target
629template <typename Target>
630class LLVM_LIBRARY_VISIBILITY PS4OSTargetInfo : public PSOSTargetInfo<Target> {
631protected:
632 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
633 MacroBuilder &Builder) const override {
634 // Start with base class defines.
635 PSOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);
636
637 Builder.defineMacro("__ORBIS__");
638 }
639
640public:
642};
643
644// PS5 Target
645template <typename Target>
646class LLVM_LIBRARY_VISIBILITY PS5OSTargetInfo : public PSOSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 // Start with base class defines.
651 PSOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);
652
653 Builder.defineMacro("__PROSPERO__");
654 }
655
656public:
658};
659
660// RTEMS Target
661template <typename Target>
662class LLVM_LIBRARY_VISIBILITY RTEMSTargetInfo : public OSTargetInfo<Target> {
663protected:
664 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
665 MacroBuilder &Builder) const override {
666 // RTEMS defines; list based off of gcc output
667
668 Builder.defineMacro("__rtems__");
669 if (Opts.CPlusPlus)
670 Builder.defineMacro("_GNU_SOURCE");
671 }
672
673public:
674 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
675 : OSTargetInfo<Target>(Triple, Opts) {
676 switch (Triple.getArch()) {
677 default:
678 case llvm::Triple::x86:
679 // this->MCountName = ".mcount";
680 break;
681 case llvm::Triple::mips:
682 case llvm::Triple::mipsel:
683 case llvm::Triple::ppc:
684 case llvm::Triple::ppc64:
685 case llvm::Triple::ppc64le:
686 // this->MCountName = "_mcount";
687 break;
688 case llvm::Triple::arm:
689 // this->MCountName = "__mcount";
690 break;
691 }
692 }
693};
694
695// Solaris target
696template <typename Target>
697class LLVM_LIBRARY_VISIBILITY SolarisTargetInfo : public OSTargetInfo<Target> {
698protected:
699 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
700 MacroBuilder &Builder) const override {
701 DefineStd(Builder, "sun", Opts);
702 DefineStd(Builder, "unix", Opts);
703 Builder.defineMacro("__svr4__");
704 Builder.defineMacro("__SVR4");
705 if (Opts.CPlusPlus) {
706 Builder.defineMacro("__C99FEATURES__");
707 Builder.defineMacro("_FILE_OFFSET_BITS", "64");
708 }
709 // GCC restricts the next two to C++.
710 Builder.defineMacro("_LARGEFILE_SOURCE");
711 Builder.defineMacro("_LARGEFILE64_SOURCE");
712 Builder.defineMacro("__EXTENSIONS__");
713 if (Opts.POSIXThreads)
714 Builder.defineMacro("_REENTRANT");
715 if (this->HasFloat128)
716 Builder.defineMacro("__FLOAT128__");
717 }
718
719public:
720 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
721 : OSTargetInfo<Target>(Triple, Opts) {
722 if (this->PointerWidth == 64) {
723 this->WCharType = this->WIntType = this->SignedInt;
724 } else {
725 this->WCharType = this->WIntType = this->SignedLong;
726 }
727 switch (Triple.getArch()) {
728 default:
729 break;
730 case llvm::Triple::x86:
731 case llvm::Triple::x86_64:
732 this->HasFloat128 = true;
733 break;
734 }
735 }
736};
737
738// AIX Target
739template <typename Target>
740class AIXTargetInfo : public OSTargetInfo<Target> {
741protected:
742 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
743 MacroBuilder &Builder) const override {
744 DefineStd(Builder, "unix", Opts);
745 Builder.defineMacro("_IBMR2");
746 Builder.defineMacro("_POWER");
747 Builder.defineMacro("__THW_BIG_ENDIAN__");
748
749 Builder.defineMacro("_AIX");
750 Builder.defineMacro("__TOS_AIX__");
751 Builder.defineMacro("__HOS_AIX__");
752
753 if (Opts.C11) {
754 Builder.defineMacro("__STDC_NO_ATOMICS__");
755 Builder.defineMacro("__STDC_NO_THREADS__");
756 }
757
758 if (Opts.EnableAIXExtendedAltivecABI)
759 Builder.defineMacro("__EXTABI__");
760
761 VersionTuple OsVersion = Triple.getOSVersion();
762
763 // Define AIX OS-Version Macros.
764 // Includes logic for legacy versions of AIX; no specific intent to support.
765 if (OsVersion >= VersionTuple(3, 2))
766 Builder.defineMacro("_AIX32");
767 if (OsVersion >= VersionTuple(4, 1))
768 Builder.defineMacro("_AIX41");
769 if (OsVersion >= VersionTuple(4, 3))
770 Builder.defineMacro("_AIX43");
771 if (OsVersion >= VersionTuple(5, 0))
772 Builder.defineMacro("_AIX50");
773 if (OsVersion >= VersionTuple(5, 1))
774 Builder.defineMacro("_AIX51");
775 if (OsVersion >= VersionTuple(5, 2))
776 Builder.defineMacro("_AIX52");
777 if (OsVersion >= VersionTuple(5, 3))
778 Builder.defineMacro("_AIX53");
779 if (OsVersion >= VersionTuple(6, 1))
780 Builder.defineMacro("_AIX61");
781 if (OsVersion >= VersionTuple(7, 1))
782 Builder.defineMacro("_AIX71");
783 if (OsVersion >= VersionTuple(7, 2))
784 Builder.defineMacro("_AIX72");
785 if (OsVersion >= VersionTuple(7, 3))
786 Builder.defineMacro("_AIX73");
787
788 // FIXME: Do not define _LONG_LONG when -fno-long-long is specified.
789 Builder.defineMacro("_LONG_LONG");
790
791 if (Opts.POSIXThreads) {
792 Builder.defineMacro("_THREAD_SAFE");
793 }
794
795 if (this->PointerWidth == 64) {
796 Builder.defineMacro("__64BIT__");
797 }
798
799 // Define _WCHAR_T when it is a fundamental type
800 // (i.e., for C++ without -fno-wchar).
801 if (Opts.CPlusPlus && Opts.WChar) {
802 Builder.defineMacro("_WCHAR_T");
803 }
804 }
805
806public:
807 AIXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
808 : OSTargetInfo<Target>(Triple, Opts) {
809 this->MCountName = "__mcount";
810 this->TheCXXABI.set(TargetCXXABI::XL);
811
812 if (this->PointerWidth == 64) {
813 this->WCharType = this->UnsignedInt;
814 } else {
815 this->WCharType = this->UnsignedShort;
816 }
817 this->UseZeroLengthBitfieldAlignment = true;
818 }
819
820 // AIX sets FLT_EVAL_METHOD to be 1.
824
825 bool defaultsToAIXPowerAlignment() const override { return true; }
826
827 bool areDefaultedSMFStillPOD(const LangOptions &) const override {
828 return false;
829 }
830};
831
832// z/OS target
833template <typename Target>
834class LLVM_LIBRARY_VISIBILITY ZOSTargetInfo : public OSTargetInfo<Target> {
835protected:
836 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
837 MacroBuilder &Builder) const override {
838 // FIXME: _LONG_LONG should not be defined under -std=c89.
839 Builder.defineMacro("_LONG_LONG");
840 Builder.defineMacro("__370__");
841 Builder.defineMacro("__BFP__");
842 // FIXME: __BOOL__ should not be defined under -std=c89.
843 Builder.defineMacro("__BOOL__");
844 Builder.defineMacro("__COMPILER_VER__", "0x50000000");
845 Builder.defineMacro("__LONGNAME__");
846 Builder.defineMacro("__MVS__");
847 Builder.defineMacro("__THW_370__");
848 Builder.defineMacro("__THW_BIG_ENDIAN__");
849 Builder.defineMacro("__TOS_390__");
850 Builder.defineMacro("__TOS_MVS__");
851 Builder.defineMacro("__XPLINK__");
852
853 if (this->PointerWidth == 64)
854 Builder.defineMacro("__64BIT__");
855
856 if (Opts.CPlusPlus && Opts.WChar) {
857 // Macro __wchar_t is defined so that the wchar_t data
858 // type is not declared as a typedef in system headers.
859 Builder.defineMacro("__wchar_t");
860 }
861
862 this->PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
863 }
864
865public:
866 ZOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
867 : OSTargetInfo<Target>(Triple, Opts) {
868 this->WCharType = TargetInfo::UnsignedInt;
869 this->MaxAlignedAttribute = 128;
870 this->UseBitFieldTypeAlignment = false;
871 this->UseZeroLengthBitfieldAlignment = true;
872 this->UseLeadingZeroLengthBitfield = false;
873 this->ZeroLengthBitfieldBoundary = 32;
874 this->TheCXXABI.set(TargetCXXABI::XL);
875 }
876
877 bool areDefaultedSMFStillPOD(const LangOptions &) const override {
878 return false;
879 }
880};
881
882// UEFI target
883template <typename Target>
884class LLVM_LIBRARY_VISIBILITY UEFITargetInfo : public OSTargetInfo<Target> {
885protected:
886 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
887 MacroBuilder &Builder) const override {
888 Builder.defineMacro("__UEFI__");
889 }
890
891public:
892 UEFITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
893 : OSTargetInfo<Target>(Triple, Opts) {
894 this->WCharType = TargetInfo::UnsignedShort;
895 this->WIntType = TargetInfo::UnsignedShort;
896 this->UseMicrosoftManglingForC = true;
897 }
898};
899
900void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts,
901 MacroBuilder &Builder);
902
903// Windows target
904template <typename Target>
905class LLVM_LIBRARY_VISIBILITY WindowsTargetInfo : public OSTargetInfo<Target> {
906protected:
907 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
908 MacroBuilder &Builder) const override {
909 addWindowsDefines(Triple, Opts, Builder);
910 }
911
912public:
913 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
914 : OSTargetInfo<Target>(Triple, Opts) {
915 this->WCharType = TargetInfo::UnsignedShort;
916 this->WIntType = TargetInfo::UnsignedShort;
917 this->UseMicrosoftManglingForC = true;
918 }
919};
920
921void getFuchsiaDefines(MacroBuilder &Builder, const LangOptions &Opts,
922 const llvm::Triple &Triple);
923
924// Fuchsia Target
925template <typename Target>
926class LLVM_LIBRARY_VISIBILITY FuchsiaTargetInfo : public OSTargetInfo<Target> {
927protected:
928 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
929 MacroBuilder &Builder) const override {
930 getFuchsiaDefines(Builder, Opts, Triple);
931 this->PlatformName = "fuchsia";
932 this->PlatformMinVersion = VersionTuple(Opts.FuchsiaAPILevel);
933 }
934
935public:
936 FuchsiaTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
937 : OSTargetInfo<Target>(Triple, Opts) {
938 this->WIntType = TargetInfo::UnsignedInt;
939 this->MCountName = "__mcount";
940 this->TheCXXABI.set(TargetCXXABI::Fuchsia);
941 }
942};
943
944// WebAssembly target
945template <typename Target>
946class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo
947 : public OSTargetInfo<Target> {
948protected:
949 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
950 MacroBuilder &Builder) const override {
951 // A common platform macro.
952 if (Opts.POSIXThreads)
953 Builder.defineMacro("_REENTRANT");
954 // Follow g++ convention and predefine _GNU_SOURCE for C++.
955 if (Opts.CPlusPlus)
956 Builder.defineMacro("_GNU_SOURCE");
957 // Indicate that we have __float128.
958 Builder.defineMacro("__FLOAT128__");
959 }
960
961public:
962 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
963 const TargetOptions &Opts)
964 : OSTargetInfo<Target>(Triple, Opts) {
965 this->MCountName = "__mcount";
966 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
967 this->HasFloat128 = true;
968 }
969};
970
971// WASIp1 target
972template <typename Target>
973class LLVM_LIBRARY_VISIBILITY WASIP1TargetInfo
974 : public WebAssemblyOSTargetInfo<Target> {
975 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
976 MacroBuilder &Builder) const final {
978 Builder.defineMacro("__wasi__");
979 Builder.defineMacro("__wasip1__");
980 }
981
982public:
984};
985
986// WASIp2 target
987template <typename Target>
988class LLVM_LIBRARY_VISIBILITY WASIP2TargetInfo
989 : public WebAssemblyOSTargetInfo<Target> {
990 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
991 MacroBuilder &Builder) const final {
993 Builder.defineMacro("__wasi__");
994 Builder.defineMacro("__wasip2__");
995 }
996
997public:
999};
1000
1001// WASIp3 target
1002template <typename Target>
1003class LLVM_LIBRARY_VISIBILITY WASIP3TargetInfo
1004 : public WebAssemblyOSTargetInfo<Target> {
1005 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1006 MacroBuilder &Builder) const final {
1007 WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);
1008 Builder.defineMacro("__wasi__");
1009 Builder.defineMacro("__wasip3__");
1010 }
1011
1012public:
1014};
1015
1016// WALI target
1017template <typename Target>
1018class LLVM_LIBRARY_VISIBILITY WALITargetInfo
1019 : public WebAssemblyOSTargetInfo<Target> {
1020 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1021 MacroBuilder &Builder) const final {
1022 WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);
1023 // Linux defines; list based off of gcc output
1024 DefineStd(Builder, "unix", Opts);
1025 DefineStd(Builder, "linux", Opts);
1026 Builder.defineMacro("__wali__");
1027 }
1028
1029public:
1031};
1032
1033// Emscripten target
1034template <typename Target>
1035class LLVM_LIBRARY_VISIBILITY EmscriptenTargetInfo
1036 : public WebAssemblyOSTargetInfo<Target> {
1037 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1038 MacroBuilder &Builder) const final {
1039 WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);
1040 DefineStd(Builder, "unix", Opts);
1041 Builder.defineMacro("__EMSCRIPTEN__");
1042 if (Opts.POSIXThreads)
1043 Builder.defineMacro("__EMSCRIPTEN_PTHREADS__");
1044 }
1045
1046public:
1047 explicit EmscriptenTargetInfo(const llvm::Triple &Triple,
1048 const TargetOptions &Opts)
1049 : WebAssemblyOSTargetInfo<Target>(Triple, Opts) {
1050 // Keeping the alignment of long double to 8 bytes even though its size is
1051 // 16 bytes allows emscripten to have an 8-byte-aligned max_align_t which
1052 // in turn gives is a 8-byte aligned malloc.
1053 // Emscripten's ABI is unstable and we may change this back to 128 to match
1054 // the WebAssembly default in the future.
1055 this->LongDoubleAlign = 64;
1056 this->Float128Align = 64;
1057 }
1058};
1059
1060// OHOS target
1061template <typename Target>
1062class LLVM_LIBRARY_VISIBILITY OHOSTargetInfo : public OSTargetInfo<Target> {
1063protected:
1064 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1065 MacroBuilder &Builder) const override {
1066 // Linux defines; list based off of gcc output
1067 DefineStd(Builder, "unix", Opts);
1068
1069 // Generic OHOS target defines
1070 if (Triple.isOHOSFamily()) {
1071 Builder.defineMacro("__OHOS_FAMILY__", "1");
1072
1073 auto Version = Triple.getEnvironmentVersion();
1074 this->PlatformName = "ohos";
1075 this->PlatformMinVersion = Version;
1076 Builder.defineMacro("__OHOS_Major__", Twine(Version.getMajor()));
1077 if (auto Minor = Version.getMinor())
1078 Builder.defineMacro("__OHOS_Minor__", Twine(*Minor));
1079 if (auto Subminor = Version.getSubminor())
1080 Builder.defineMacro("__OHOS_Micro__", Twine(*Subminor));
1081 }
1082
1083 if (Triple.isOpenHOS())
1084 Builder.defineMacro("__OHOS__");
1085
1086 if (Triple.isOSLinux()) {
1087 DefineStd(Builder, "linux", Opts);
1088 } else if (Triple.isOSLiteOS()) {
1089 Builder.defineMacro("__LITEOS__");
1090 }
1091
1092 if (Opts.POSIXThreads)
1093 Builder.defineMacro("_REENTRANT");
1094 if (Opts.CPlusPlus)
1095 Builder.defineMacro("_GNU_SOURCE");
1096 if (this->HasFloat128)
1097 Builder.defineMacro("__FLOAT128__");
1098 }
1099
1100public:
1101 OHOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1102 : OSTargetInfo<Target>(Triple, Opts) {
1103 this->WIntType = TargetInfo::UnsignedInt;
1104
1105 switch (Triple.getArch()) {
1106 default:
1107 break;
1108 case llvm::Triple::x86:
1109 case llvm::Triple::x86_64:
1110 this->HasFloat128 = true;
1111 break;
1112 }
1113 }
1114
1115 const char *getStaticInitSectionSpecifier() const override {
1116 return ".text.startup";
1117 }
1118};
1119
1120// QURT Target
1121template <typename Target>
1122class LLVM_LIBRARY_VISIBILITY QURTTargetInfo : public OSTargetInfo<Target> {
1123protected:
1124 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1125 MacroBuilder &Builder) const override {
1126 Builder.defineMacro("__qurt__");
1127 if (Opts.CPlusPlus)
1128 Builder.defineMacro("_GNU_SOURCE");
1129 }
1130
1131public:
1133};
1134
1135// H2 Target
1136template <typename Target>
1137class LLVM_LIBRARY_VISIBILITY H2TargetInfo : public OSTargetInfo<Target> {
1138protected:
1139 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1140 MacroBuilder &Builder) const override {
1141 Builder.defineMacro("__h2__");
1142 if (Opts.CPlusPlus)
1143 Builder.defineMacro("_GNU_SOURCE");
1144 }
1145
1146public:
1148};
1149
1150// SerenityOS target
1151template <typename Target>
1152class LLVM_LIBRARY_VISIBILITY SerenityTargetInfo : public OSTargetInfo<Target> {
1153protected:
1154 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1155 MacroBuilder &Builder) const override {
1156 Builder.defineMacro("__serenity__");
1157 DefineStd(Builder, "unix", Opts);
1158 }
1159
1160public:
1161 SerenityTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1162 : OSTargetInfo<Target>(Triple, Opts) {
1163 this->WIntType = TargetInfo::UnsignedInt;
1164 }
1165};
1166
1167} // namespace targets
1168} // namespace clang
1169#endif // LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H
static StringRef getTriple(const Command &Job)
#define FREEBSD_CC_VERSION
Definition OSTargets.h:225
FPEvalMethodKind
Possible float expression evaluation method choices.
@ FEM_Double
Use the type double for fp arithmetic.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return the smallest integer type with at least the specified width.
Options for controlling the target.
AIXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:807
bool defaultsToAIXPowerAlignment() const override
Definition OSTargets.h:825
LangOptions::FPEvalMethodKind getFPEvalMethod() const override
Definition OSTargets.h:821
bool areDefaultedSMFStillPOD(const LangOptions &) const override
Definition OSTargets.h:827
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:742
const char * getStaticInitSectionSpecifier() const override
Definition OSTargets.h:57
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:48
AppleMachOTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:54
bool hasProtectedVisibility() const override
Apple Mach-O does not support protected visibility.
Definition OSTargets.h:64
VTableUniquenessKind getVTableUniqueness() const override
Apple Mach-O can autohide a vague-linkage vtable so that each image gets its own copy,...
Definition OSTargets.h:69
bool areDefaultedSMFStillPOD(const LangOptions &) const override
Definition OSTargets.h:185
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:78
unsigned getExnObjectAlignment() const override
Definition OSTargets.h:143
TargetInfo::IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final
Definition OSTargets.h:176
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:85
const char * getStaticInitSectionSpecifier() const override
Definition OSTargets.h:138
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:195
DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:211
EmscriptenTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:1047
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:232
FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:263
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:928
FuchsiaTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:936
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:1139
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:316
HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:326
HurdTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:363
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:347
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:295
LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:414
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:380
bool setABI(const std::string &Name) override
Definition OSTargets.h:444
const char * getStaticInitSectionSpecifier() const override
Definition OSTargets.h:438
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:453
ManagarmTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:468
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:485
NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:497
const char * getStaticInitSectionSpecifier() const override
Definition OSTargets.h:1115
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:1064
OHOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:1101
virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const =0
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
Definition OSTargets.h:30
OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:27
OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:531
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:515
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:563
PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:574
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:632
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:648
bool areDefaultedSMFStillPOD(const LangOptions &) const override
Definition OSTargets.h:623
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:589
TargetInfo::CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Definition OSTargets.h:619
PSOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:601
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:1124
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:664
RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:674
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:1154
SerenityTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:1161
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:699
SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:720
UEFITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:892
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:886
WebAssemblyOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:962
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:949
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:913
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:907
bool areDefaultedSMFStillPOD(const LangOptions &) const override
Definition OSTargets.h:877
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition OSTargets.h:836
ZOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:866
void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, MacroBuilder &Builder)
void getFuchsiaDefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple)
void getAppleMachODefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple)
Definition OSTargets.cpp:23
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple, StringRef &PlatformName, VersionTuple &PlatformMinVersion)
Definition OSTargets.cpp:57
Top level wrappers for InstallAPI frontend operations.
VTableUniquenessKind
A target's ABI policy for whether a class's vtable can be assumed to have a unique address program-wi...
@ UniqueIfStrongLinkage
A vtable with strong linkage (e.g., a class with a key function) is unique, but a vague-linkage (weak...
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:282
IntType
===-— Target Data Type Query Methods ----------------------------—===//
Definition TargetInfo.h:146