Mercurial > hg > CbC > CbC_llvm
comparison clang/lib/Basic/Targets/OSTargets.h @ 207:2e18cbf3894f
LLVM12
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 08 Jun 2021 06:07:14 +0900 |
parents | 0572611fdcc8 |
children | 5f17cb93ff66 |
comparison
equal
deleted
inserted
replaced
173:0572611fdcc8 | 207:2e18cbf3894f |
---|---|
11 | 11 |
12 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H | 12 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H |
13 #define LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H | 13 #define LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H |
14 | 14 |
15 #include "Targets.h" | 15 #include "Targets.h" |
16 #include "llvm/MC/MCSectionMachO.h" | |
17 | 16 |
18 namespace clang { | 17 namespace clang { |
19 namespace targets { | 18 namespace targets { |
20 | 19 |
21 template <typename TgtInfo> | 20 template <typename TgtInfo> |
85 } | 84 } |
86 | 85 |
87 public: | 86 public: |
88 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) | 87 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) |
89 : OSTargetInfo<Target>(Triple, Opts) { | 88 : OSTargetInfo<Target>(Triple, Opts) { |
90 // By default, no TLS, and we whitelist permitted architecture/OS | 89 // By default, no TLS, and we list permitted architecture/OS |
91 // combinations. | 90 // combinations. |
92 this->TLSSupported = false; | 91 this->TLSSupported = false; |
93 | 92 |
94 if (Triple.isMacOSX()) | 93 if (Triple.isMacOSX()) |
95 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7); | 94 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7); |
112 } | 111 } |
113 | 112 |
114 this->MCountName = "\01mcount"; | 113 this->MCountName = "\01mcount"; |
115 } | 114 } |
116 | 115 |
117 std::string isValidSectionSpecifier(StringRef SR) const override { | |
118 // Let MCSectionMachO validate this. | |
119 StringRef Segment, Section; | |
120 unsigned TAA, StubSize; | |
121 bool HasTAA; | |
122 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section, | |
123 TAA, HasTAA, StubSize); | |
124 } | |
125 | |
126 const char *getStaticInitSectionSpecifier() const override { | 116 const char *getStaticInitSectionSpecifier() const override { |
127 // FIXME: We should return 0 when building kexts. | 117 // FIXME: We should return 0 when building kexts. |
128 return "__TEXT,__StaticInit,regular,pure_instructions"; | 118 return "__TEXT,__StaticInit,regular,pure_instructions"; |
129 } | 119 } |
130 | 120 |
152 break; | 142 break; |
153 case llvm::Triple::WatchOS: // Earliest supporting version is 5.0.0. | 143 case llvm::Triple::WatchOS: // Earliest supporting version is 5.0.0. |
154 MinVersion = llvm::VersionTuple(5U); | 144 MinVersion = llvm::VersionTuple(5U); |
155 break; | 145 break; |
156 default: | 146 default: |
157 llvm_unreachable("Unexpected OS"); | 147 // Conservatively return 8 bytes if OS is unknown. |
148 return 64; | |
158 } | 149 } |
159 | 150 |
160 unsigned Major, Minor, Micro; | 151 unsigned Major, Minor, Micro; |
161 T.getOSVersion(Major, Minor, Micro); | 152 T.getOSVersion(Major, Minor, Micro); |
162 if (llvm::VersionTuple(Major, Minor, Micro) < MinVersion) | 153 if (llvm::VersionTuple(Major, Minor, Micro) < MinVersion) |
250 this->MCountName = ".mcount"; | 241 this->MCountName = ".mcount"; |
251 break; | 242 break; |
252 case llvm::Triple::mips: | 243 case llvm::Triple::mips: |
253 case llvm::Triple::mipsel: | 244 case llvm::Triple::mipsel: |
254 case llvm::Triple::ppc: | 245 case llvm::Triple::ppc: |
246 case llvm::Triple::ppcle: | |
255 case llvm::Triple::ppc64: | 247 case llvm::Triple::ppc64: |
256 case llvm::Triple::ppc64le: | 248 case llvm::Triple::ppc64le: |
257 this->MCountName = "_mcount"; | 249 this->MCountName = "_mcount"; |
258 break; | 250 break; |
259 case llvm::Triple::arm: | 251 case llvm::Triple::arm: |
260 this->MCountName = "__mcount"; | 252 this->MCountName = "__mcount"; |
253 break; | |
254 case llvm::Triple::riscv32: | |
255 case llvm::Triple::riscv64: | |
261 break; | 256 break; |
262 } | 257 } |
263 } | 258 } |
264 }; | 259 }; |
265 | 260 |
380 Builder.defineMacro("__ANDROID__", "1"); | 375 Builder.defineMacro("__ANDROID__", "1"); |
381 unsigned Maj, Min, Rev; | 376 unsigned Maj, Min, Rev; |
382 Triple.getEnvironmentVersion(Maj, Min, Rev); | 377 Triple.getEnvironmentVersion(Maj, Min, Rev); |
383 this->PlatformName = "android"; | 378 this->PlatformName = "android"; |
384 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev); | 379 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev); |
385 if (Maj) | 380 if (Maj) { |
386 Builder.defineMacro("__ANDROID_API__", Twine(Maj)); | 381 Builder.defineMacro("__ANDROID_MIN_SDK_VERSION__", Twine(Maj)); |
382 // This historical but ambiguous name for the minSdkVersion macro. Keep | |
383 // defined for compatibility. | |
384 Builder.defineMacro("__ANDROID_API__", "__ANDROID_MIN_SDK_VERSION__"); | |
385 } | |
387 } else { | 386 } else { |
388 Builder.defineMacro("__gnu_linux__"); | 387 Builder.defineMacro("__gnu_linux__"); |
389 } | 388 } |
390 if (Opts.POSIXThreads) | 389 if (Opts.POSIXThreads) |
391 Builder.defineMacro("_REENTRANT"); | 390 Builder.defineMacro("_REENTRANT"); |
406 case llvm::Triple::mips: | 405 case llvm::Triple::mips: |
407 case llvm::Triple::mipsel: | 406 case llvm::Triple::mipsel: |
408 case llvm::Triple::mips64: | 407 case llvm::Triple::mips64: |
409 case llvm::Triple::mips64el: | 408 case llvm::Triple::mips64el: |
410 case llvm::Triple::ppc: | 409 case llvm::Triple::ppc: |
410 case llvm::Triple::ppcle: | |
411 case llvm::Triple::ppc64: | 411 case llvm::Triple::ppc64: |
412 case llvm::Triple::ppc64le: | 412 case llvm::Triple::ppc64le: |
413 this->MCountName = "_mcount"; | 413 this->MCountName = "_mcount"; |
414 break; | 414 break; |
415 case llvm::Triple::x86: | 415 case llvm::Triple::x86: |
463 } | 463 } |
464 | 464 |
465 public: | 465 public: |
466 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) | 466 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) |
467 : OSTargetInfo<Target>(Triple, Opts) { | 467 : OSTargetInfo<Target>(Triple, Opts) { |
468 this->WCharType = this->WIntType = this->SignedInt; | |
469 this->IntMaxType = TargetInfo::SignedLongLong; | |
470 this->Int64Type = TargetInfo::SignedLongLong; | |
468 switch (Triple.getArch()) { | 471 switch (Triple.getArch()) { |
469 case llvm::Triple::x86: | 472 case llvm::Triple::x86: |
470 case llvm::Triple::x86_64: | 473 case llvm::Triple::x86_64: |
471 this->HasFloat128 = true; | 474 this->HasFloat128 = true; |
472 LLVM_FALLTHROUGH; | 475 LLVM_FALLTHROUGH; |
474 this->MCountName = "__mcount"; | 477 this->MCountName = "__mcount"; |
475 break; | 478 break; |
476 case llvm::Triple::mips64: | 479 case llvm::Triple::mips64: |
477 case llvm::Triple::mips64el: | 480 case llvm::Triple::mips64el: |
478 case llvm::Triple::ppc: | 481 case llvm::Triple::ppc: |
482 case llvm::Triple::ppc64: | |
483 case llvm::Triple::ppc64le: | |
479 case llvm::Triple::sparcv9: | 484 case llvm::Triple::sparcv9: |
480 this->MCountName = "_mcount"; | 485 this->MCountName = "_mcount"; |
486 break; | |
487 case llvm::Triple::riscv32: | |
488 case llvm::Triple::riscv64: | |
481 break; | 489 break; |
482 } | 490 } |
483 } | 491 } |
484 }; | 492 }; |
485 | 493 |
666 Builder.defineMacro("_IBMR2"); | 674 Builder.defineMacro("_IBMR2"); |
667 Builder.defineMacro("_POWER"); | 675 Builder.defineMacro("_POWER"); |
668 | 676 |
669 Builder.defineMacro("_AIX"); | 677 Builder.defineMacro("_AIX"); |
670 | 678 |
679 if (Opts.EnableAIXExtendedAltivecABI) | |
680 Builder.defineMacro("__EXTABI__"); | |
681 | |
671 unsigned Major, Minor, Micro; | 682 unsigned Major, Minor, Micro; |
672 Triple.getOSVersion(Major, Minor, Micro); | 683 Triple.getOSVersion(Major, Minor, Micro); |
673 | 684 |
674 // Define AIX OS-Version Macros. | 685 // Define AIX OS-Version Macros. |
675 // Includes logic for legacy versions of AIX; no specific intent to support. | 686 // Includes logic for legacy versions of AIX; no specific intent to support. |
717 } | 728 } |
718 | 729 |
719 // AIX sets FLT_EVAL_METHOD to be 1. | 730 // AIX sets FLT_EVAL_METHOD to be 1. |
720 unsigned getFloatEvalMethod() const override { return 1; } | 731 unsigned getFloatEvalMethod() const override { return 1; } |
721 bool hasInt128Type() const override { return false; } | 732 bool hasInt128Type() const override { return false; } |
733 | |
734 bool defaultsToAIXPowerAlignment() const override { return true; } | |
735 }; | |
736 | |
737 // z/OS target | |
738 template <typename Target> | |
739 class LLVM_LIBRARY_VISIBILITY ZOSTargetInfo : public OSTargetInfo<Target> { | |
740 protected: | |
741 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, | |
742 MacroBuilder &Builder) const override { | |
743 // FIXME: _LONG_LONG should not be defined under -std=c89. | |
744 Builder.defineMacro("_LONG_LONG"); | |
745 Builder.defineMacro("_OPEN_DEFAULT"); | |
746 // _UNIX03_WITHDRAWN is required to build libcxx. | |
747 Builder.defineMacro("_UNIX03_WITHDRAWN"); | |
748 Builder.defineMacro("__370__"); | |
749 Builder.defineMacro("__BFP__"); | |
750 // FIXME: __BOOL__ should not be defined under -std=c89. | |
751 Builder.defineMacro("__BOOL__"); | |
752 Builder.defineMacro("__LONGNAME__"); | |
753 Builder.defineMacro("__MVS__"); | |
754 Builder.defineMacro("__THW_370__"); | |
755 Builder.defineMacro("__THW_BIG_ENDIAN__"); | |
756 Builder.defineMacro("__TOS_390__"); | |
757 Builder.defineMacro("__TOS_MVS__"); | |
758 Builder.defineMacro("__XPLINK__"); | |
759 | |
760 if (this->PointerWidth == 64) | |
761 Builder.defineMacro("__64BIT__"); | |
762 | |
763 if (Opts.CPlusPlus) { | |
764 Builder.defineMacro("__DLL__"); | |
765 // _XOPEN_SOURCE=600 is required to build libcxx. | |
766 Builder.defineMacro("_XOPEN_SOURCE", "600"); | |
767 } | |
768 | |
769 if (Opts.GNUMode) { | |
770 Builder.defineMacro("_MI_BUILTIN"); | |
771 Builder.defineMacro("_EXT"); | |
772 } | |
773 | |
774 if (Opts.CPlusPlus && Opts.WChar) { | |
775 // Macro __wchar_t is defined so that the wchar_t data | |
776 // type is not declared as a typedef in system headers. | |
777 Builder.defineMacro("__wchar_t"); | |
778 } | |
779 | |
780 this->PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); | |
781 } | |
782 | |
783 public: | |
784 ZOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) | |
785 : OSTargetInfo<Target>(Triple, Opts) { | |
786 this->WCharType = TargetInfo::UnsignedInt; | |
787 this->MaxAlignedAttribute = 128; | |
788 this->UseBitFieldTypeAlignment = false; | |
789 this->UseZeroLengthBitfieldAlignment = true; | |
790 this->UseLeadingZeroLengthBitfield = false; | |
791 this->ZeroLengthBitfieldBoundary = 32; | |
792 this->MinGlobalAlign = 0; | |
793 this->DefaultAlignForAttributeAligned = 128; | |
794 } | |
722 }; | 795 }; |
723 | 796 |
724 void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, | 797 void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, |
725 MacroBuilder &Builder); | 798 MacroBuilder &Builder); |
726 | 799 |
819 template <typename Target> | 892 template <typename Target> |
820 class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo | 893 class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo |
821 : public OSTargetInfo<Target> { | 894 : public OSTargetInfo<Target> { |
822 protected: | 895 protected: |
823 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, | 896 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, |
824 MacroBuilder &Builder) const { | 897 MacroBuilder &Builder) const override { |
825 // A common platform macro. | 898 // A common platform macro. |
826 if (Opts.POSIXThreads) | 899 if (Opts.POSIXThreads) |
827 Builder.defineMacro("_REENTRANT"); | 900 Builder.defineMacro("_REENTRANT"); |
828 // Follow g++ convention and predefine _GNU_SOURCE for C++. | 901 // Follow g++ convention and predefine _GNU_SOURCE for C++. |
829 if (Opts.CPlusPlus) | 902 if (Opts.CPlusPlus) |
863 : public WebAssemblyOSTargetInfo<Target> { | 936 : public WebAssemblyOSTargetInfo<Target> { |
864 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, | 937 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, |
865 MacroBuilder &Builder) const final { | 938 MacroBuilder &Builder) const final { |
866 WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder); | 939 WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder); |
867 Builder.defineMacro("__EMSCRIPTEN__"); | 940 Builder.defineMacro("__EMSCRIPTEN__"); |
941 if (Opts.POSIXThreads) | |
942 Builder.defineMacro("__EMSCRIPTEN_PTHREADS__"); | |
868 } | 943 } |
869 | 944 |
870 public: | 945 public: |
871 explicit EmscriptenTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) | 946 explicit EmscriptenTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) |
872 : WebAssemblyOSTargetInfo<Target>(Triple, Opts) {} | 947 : WebAssemblyOSTargetInfo<Target>(Triple, Opts) {} |