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) {}