Mac OS X X86-64 low 4G address not available.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 1 Aug 2007 23:45:51 +0000 (23:45 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 1 Aug 2007 23:45:51 +0000 (23:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40701 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelDAGToDAG.cpp
lib/Target/X86/X86InstrInfo.td
lib/Target/X86/X86Subtarget.cpp
lib/Target/X86/X86Subtarget.h

index 619567665a9d8a102f72da30839bd1033c52033e..f166b9bc003e65e4111fbc29bcb700a426d45b23 100644 (file)
@@ -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<GlobalAddressSDNode>(N0)) {
         GlobalValue *GV = G->getGlobal();
         if (isAbs32 || isRoot) {
index ab2c8dc10940863902db911e9f9049d77c003b0c..190d5b1bcc0aa16104579334f69f06301f14219a 100644 (file)
@@ -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">;
index 1a75e04511baf03c32ba23217db71e18f2dd1de8..51406c392792a6c8f36de9cde90211a356028d84 100644 (file)
@@ -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  ||
index 2cda9705e31edccb8967d2d2f6bdfb1a15d89901..6240dc2715a8886823977c0e8320f8dae2eef4c8 100644 (file)
@@ -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; }