Index: lib/Basic/Targets.cpp |
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp |
index f8a2882057f900180e266d9b779c43646a3f3715..4cfd0cf62bb27ba115ca7ef0efd7e28cfe625760 100644 |
--- a/lib/Basic/Targets.cpp |
+++ b/lib/Basic/Targets.cpp |
@@ -758,8 +758,7 @@ public: |
if (Triple.getArch() == llvm::Triple::arm) { |
// Handled in ARM's setABI(). |
} else if (Triple.getArch() == llvm::Triple::x86) { |
- // @LOCALMOD MERGETODO: upstream this if it actually works. |
- this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128"; |
+ // Handled in X86_32's setDescriptionString. |
} else if (Triple.getArch() == llvm::Triple::x86_64) { |
this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128"; |
} else if (Triple.getArch() == llvm::Triple::mipsel) { |
@@ -3460,13 +3459,23 @@ X86TargetInfo::convertConstraint(const char *&Constraint) const { |
// X86-32 generic target |
class X86_32TargetInfo : public X86TargetInfo { |
+ // @LOCALMOD-START |
+ virtual void setDescriptionString() { |
+ if (getTriple().isOSNaCl()) |
+ DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128"; |
+ else if (HasAlignedDouble) |
+ DescriptionString = "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S128"; |
+ else |
+ DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"; |
+ } |
+ bool HasAlignedDouble; |
+ // @LOCALMOD-END |
public: |
X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) { |
DoubleAlign = LongLongAlign = 32; |
LongDoubleWidth = 96; |
LongDoubleAlign = 32; |
SuitableAlign = 128; |
- DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"; |
SizeType = UnsignedInt; |
PtrDiffType = SignedInt; |
IntPtrType = SignedInt; |
@@ -3511,6 +3520,21 @@ public: |
return X86TargetInfo::validateOperandSize(Constraint, Size); |
} |
+ // @LOCALMOD-START |
+ bool handleTargetFeatures(std::vector<std::string> &Features, |
+ DiagnosticsEngine &Diags) override { |
+ HasAlignedDouble = false; |
+ auto it = std::find(Features.begin(), Features.end(), "+align-double"); |
+ if (it != Features.end()) { |
+ HasAlignedDouble = true; |
+ Features.erase(it); |
+ } |
+ |
+ setDescriptionString(); |
+ |
+ return X86TargetInfo::handleTargetFeatures(Features, Diags); |
+ } |
+ // @LOCALMOD-END |
}; |
class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> { |
@@ -3550,6 +3574,11 @@ public: |
}; |
class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> { |
+ // @LOCALMOD-START |
+ void setDescriptionString() override { |
+ DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128"; |
+ } |
+ // @LOCALMOD-END |
public: |
DarwinI386TargetInfo(const llvm::Triple &Triple) |
: DarwinTargetInfo<X86_32TargetInfo>(Triple) { |
@@ -3559,7 +3588,6 @@ public: |
MaxVectorAlign = 256; |
SizeType = UnsignedLong; |
IntPtrType = SignedLong; |
- DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128"; |
HasAlignMac68kSupport = true; |
} |
@@ -3567,15 +3595,19 @@ public: |
// x86-32 Windows target |
class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> { |
+ // @LOCALMOD-START |
+ void setDescriptionString() override { |
+ if (getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF()) |
+ DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32"; |
+ else |
+ DescriptionString = "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S32"; |
+ } |
+ // @LOCALMOD-END |
public: |
WindowsX86_32TargetInfo(const llvm::Triple &Triple) |
: WindowsTargetInfo<X86_32TargetInfo>(Triple) { |
WCharType = UnsignedShort; |
DoubleAlign = LongLongAlign = 64; |
- bool IsWinCOFF = |
- getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF(); |
- DescriptionString = IsWinCOFF ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32" |
- : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S32"; |
} |
void getTargetDefines(const LangOptions &Opts, |
MacroBuilder &Builder) const override { |
@@ -3648,13 +3680,17 @@ public: |
// x86-32 Cygwin target |
class CygwinX86_32TargetInfo : public X86_32TargetInfo { |
+ // @LOCALMOD-START |
+ void setDescriptionString() override { |
+ DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32"; |
+ } |
+ // @LOCALMOD-END |
public: |
CygwinX86_32TargetInfo(const llvm::Triple &Triple) |
: X86_32TargetInfo(Triple) { |
TLSSupported = false; |
WCharType = UnsignedShort; |
DoubleAlign = LongLongAlign = 64; |
- DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32"; |
} |
void getTargetDefines(const LangOptions &Opts, |
MacroBuilder &Builder) const override { |