diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index 619567665a9..f166b9bc003 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -614,7 +614,8 @@ bool X86DAGToDAGISel::MatchAddress(SDOperand N, X86ISelAddressMode &AM, bool isStatic = TM.getRelocationModel() == Reloc::Static; SDOperand N0 = N.getOperand(0); // Mac OS X X86-64 lower 4G address is not available. - bool isAbs32 = !is64Bit || (isStatic && !Subtarget->isTargetDarwin()); + bool isAbs32 = !is64Bit || + (isStatic && Subtarget->hasLow4GUserSpaceAddress()); if (GlobalAddressSDNode *G = dyn_cast(N0)) { GlobalValue *GV = G->getGlobal(); if (isAbs32 || isRoot) { diff --git a/lib/Target/X86/X86InstrInfo.td b/lib/Target/X86/X86InstrInfo.td index ab2c8dc1094..190d5b1bcc0 100644 --- a/lib/Target/X86/X86InstrInfo.td +++ b/lib/Target/X86/X86InstrInfo.td @@ -162,6 +162,7 @@ def HasSSSE3 : Predicate<"Subtarget->hasSSSE3()">; def FPStack : Predicate<"!Subtarget->hasSSE2()">; def In32BitMode : Predicate<"!Subtarget->is64Bit()">; def In64BitMode : Predicate<"Subtarget->is64Bit()">; +def HasLow4G : Predicate<"Subtarget->hasLow4GUserSpaceAddress()">; def SmallCode : Predicate<"TM.getCodeModel() == CodeModel::Small">; def NotSmallCode : Predicate<"TM.getCodeModel() != CodeModel::Small">; def IsStatic : Predicate<"TM.getRelocationModel() == Reloc::Static">; diff --git a/lib/Target/X86/X86Subtarget.cpp b/lib/Target/X86/X86Subtarget.cpp index 1a75e04511b..51406c39279 100644 --- a/lib/Target/X86/X86Subtarget.cpp +++ b/lib/Target/X86/X86Subtarget.cpp @@ -225,6 +225,7 @@ X86Subtarget::X86Subtarget(const Module &M, const std::string &FS, bool is64Bit) // FIXME: this is a known good value for Yonah. How about others? , MinRepStrSizeThreshold(128) , Is64Bit(is64Bit) + , HasLow4GUserAddress(true) , TargetType(isELF) { // Default to ELF unless otherwise specified. // Determine default and user specified characteristics @@ -285,6 +286,9 @@ X86Subtarget::X86Subtarget(const Module &M, const std::string &FS, bool is64Bit) } } + if (TargetType == isDarwin && Is64Bit) + HasLow4GUserAddress = false; + if (TargetType == isDarwin || TargetType == isCygwin || TargetType == isMingw || diff --git a/lib/Target/X86/X86Subtarget.h b/lib/Target/X86/X86Subtarget.h index 2cda9705e31..6240dc2715a 100644 --- a/lib/Target/X86/X86Subtarget.h +++ b/lib/Target/X86/X86Subtarget.h @@ -46,18 +46,23 @@ protected: }; /// AsmFlavor - Which x86 asm dialect to use. + /// AsmWriterFlavorTy AsmFlavor; /// PICStyle - Which PIC style to use + /// PICStyle::Style PICStyle; /// X86SSELevel - MMX, SSE1, SSE2, SSE3, SSSE3, or none supported. + /// X86SSEEnum X86SSELevel; /// X863DNowLevel - 3DNow or 3DNow Athlon, or none supported. + /// X863DNowEnum X863DNowLevel; /// HasX86_64 - True if the processor supports X86-64 instructions. + /// bool HasX86_64; /// stackAlignment - The minimum alignment known to hold of the stack frame on @@ -65,6 +70,7 @@ protected: unsigned stackAlignment; /// Min. memset / memcpy size that is turned into rep/movs, rep/stos ops. + /// unsigned MinRepStrSizeThreshold; private: @@ -72,6 +78,10 @@ private: /// pointer size is 64 bit. bool Is64Bit; + /// HasLow4GUserAddress - True if the low 4G user-space address is available. + /// + bool HasLow4GUserAddress; + public: enum { isELF, isCygwin, isDarwin, isWindows, isMingw @@ -103,6 +113,10 @@ public: bool is64Bit() const { return Is64Bit; } + /// hasLow4GUserSpaceAddress - True if lower 4G user-space address is + /// available. + bool hasLow4GUserSpaceAddress() const { return HasLow4GUserAddress; } + PICStyle::Style getPICStyle() const { return PICStyle; } void setPICStyle(PICStyle::Style Style) { PICStyle = Style; }