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