| Index: lib/Basic/Targets.cpp
|
| diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
|
| index 6469c465747261f62bba450222d560a46013644a..8498e73ff6b03d85bf69a1aeb48e3f24a4405fce 100644
|
| --- a/lib/Basic/Targets.cpp
|
| +++ b/lib/Basic/Targets.cpp
|
| @@ -590,6 +590,43 @@ public:
|
| : OSTargetInfo<Target>(triple) {}
|
| };
|
|
|
| +template <typename Target>
|
| +class NaClTargetInfo : public OSTargetInfo<Target> {
|
| + protected:
|
| + virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
|
| + MacroBuilder &Builder) const {
|
| + if (Opts.POSIXThreads)
|
| + Builder.defineMacro("_REENTRANT");
|
| + if (Opts.CPlusPlus)
|
| + Builder.defineMacro("_GNU_SOURCE");
|
| +
|
| + DefineStd(Builder, "unix", Opts);
|
| + Builder.defineMacro("__ELF__");
|
| + Builder.defineMacro("__native_client__");
|
| + }
|
| + public:
|
| + NaClTargetInfo(const std::string &triple)
|
| + : OSTargetInfo<Target>(triple) {
|
| + this->UserLabelPrefix = "";
|
| + this->LongAlign = 32;
|
| + this->LongWidth = 32;
|
| + this->PointerAlign = 32;
|
| + this->PointerWidth = 32;
|
| + this->IntMaxType = TargetInfo::SignedLongLong;
|
| + this->UIntMaxType = TargetInfo::UnsignedLongLong;
|
| + this->Int64Type = TargetInfo::SignedLongLong;
|
| + this->DoubleAlign = 64;
|
| + this->LongDoubleWidth = 64;
|
| + this->LongDoubleAlign = 64;
|
| + this->SizeType = TargetInfo::UnsignedInt;
|
| + this->PtrDiffType = TargetInfo::SignedInt;
|
| + this->IntPtrType = TargetInfo::SignedInt;
|
| + this->RegParmMax = 2;
|
| + this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
|
| + this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
|
| + "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
|
| + }
|
| +};
|
| } // end anonymous namespace.
|
|
|
| //===----------------------------------------------------------------------===//
|
| @@ -1549,9 +1586,10 @@ public:
|
| virtual bool hasFeature(StringRef Feature) const;
|
| virtual void HandleTargetFeatures(std::vector<std::string> &Features);
|
| virtual const char* getABI() const {
|
| - if (PointerWidth == 64 && SSELevel >= AVX)
|
| + if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
|
| return "avx";
|
| - else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
|
| + else if (getTriple().getArch() == llvm::Triple::x86 &&
|
| + MMX3DNowLevel == NoMMX3DNow)
|
| return "no-mmx";
|
| return "";
|
| }
|
| @@ -1645,7 +1683,7 @@ public:
|
| case CK_AthlonMP:
|
| case CK_Geode:
|
| // Only accept certain architectures when compiling in 32-bit mode.
|
| - if (PointerWidth != 32)
|
| + if (getTriple().getArch() != llvm::Triple::x86)
|
| return false;
|
|
|
| // Fallthrough
|
| @@ -1716,7 +1754,7 @@ void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
|
| // FIXME: This *really* should not be here.
|
|
|
| // X86_64 always has SSE2.
|
| - if (PointerWidth == 64)
|
| + if (getTriple().getArch() == llvm::Triple::x86_64)
|
| Features["sse2"] = Features["sse"] = Features["mmx"] = true;
|
|
|
| switch (CPU) {
|
| @@ -2089,7 +2127,7 @@ void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
|
| void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
|
| MacroBuilder &Builder) const {
|
| // Target identification.
|
| - if (PointerWidth == 64) {
|
| + if (getTriple().getArch() == llvm::Triple::x86_64) {
|
| Builder.defineMacro("__amd64__");
|
| Builder.defineMacro("__amd64");
|
| Builder.defineMacro("__x86_64");
|
| @@ -2285,7 +2323,7 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
|
| break;
|
| }
|
|
|
| - if (Opts.MicrosoftExt && PointerWidth == 32) {
|
| + if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
|
| switch (SSELevel) {
|
| case AVX2:
|
| case AVX:
|
| @@ -2341,8 +2379,8 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const {
|
| .Case("sse42", SSELevel >= SSE42)
|
| .Case("sse4a", HasSSE4a)
|
| .Case("x86", true)
|
| - .Case("x86_32", PointerWidth == 32)
|
| - .Case("x86_64", PointerWidth == 64)
|
| + .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
|
| + .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
|
| .Case("xop", HasXOP)
|
| .Default(false);
|
| }
|
| @@ -4176,15 +4214,7 @@ public:
|
| }
|
| virtual void getTargetDefines(const LangOptions &Opts,
|
| MacroBuilder &Builder) const {
|
| - DefineStd(Builder, "unix", Opts);
|
| - Builder.defineMacro("__ELF__");
|
| - if (Opts.POSIXThreads)
|
| - Builder.defineMacro("_REENTRANT");
|
| - if (Opts.CPlusPlus)
|
| - Builder.defineMacro("_GNU_SOURCE");
|
| -
|
| Builder.defineMacro("__LITTLE_ENDIAN__");
|
| - Builder.defineMacro("__native_client__");
|
| getArchDefines(Opts, Builder);
|
| }
|
| virtual bool hasFeature(StringRef Feature) const {
|
| @@ -4257,6 +4287,8 @@ static TargetInfo *AllocateTarget(const std::string &T) {
|
| return new BitrigTargetInfo<ARMTargetInfo>(T);
|
| case llvm::Triple::RTEMS:
|
| return new RTEMSTargetInfo<ARMTargetInfo>(T);
|
| + case llvm::Triple::NativeClient:
|
| + return new NaClTargetInfo<ARMTargetInfo>(T);
|
| default:
|
| return new ARMTargetInfo(T);
|
| }
|
| @@ -4327,7 +4359,7 @@ static TargetInfo *AllocateTarget(const std::string &T) {
|
| case llvm::Triple::le32:
|
| switch (os) {
|
| case llvm::Triple::NativeClient:
|
| - return new PNaClTargetInfo(T);
|
| + return new NaClTargetInfo<PNaClTargetInfo>(T);
|
| default:
|
| return NULL;
|
| }
|
| @@ -4432,6 +4464,8 @@ static TargetInfo *AllocateTarget(const std::string &T) {
|
| return new HaikuX86_32TargetInfo(T);
|
| case llvm::Triple::RTEMS:
|
| return new RTEMSX86_32TargetInfo(T);
|
| + case llvm::Triple::NativeClient:
|
| + return new NaClTargetInfo<X86_32TargetInfo>(T);
|
| default:
|
| return new X86_32TargetInfo(T);
|
| }
|
| @@ -4461,6 +4495,8 @@ static TargetInfo *AllocateTarget(const std::string &T) {
|
| return new MinGWX86_64TargetInfo(T);
|
| case llvm::Triple::Win32: // This is what Triple.h supports now.
|
| return new VisualStudioWindowsX86_64TargetInfo(T);
|
| + case llvm::Triple::NativeClient:
|
| + return new NaClTargetInfo<X86_64TargetInfo>(T);
|
| default:
|
| return new X86_64TargetInfo(T);
|
| }
|
|
|