aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/X86
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-08-01 23:45:51 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-08-01 23:45:51 +0000
commitf6844ca0e4a02fae3b100db7b0c62170d05e5b53 (patch)
tree68d97d3babcc18a54080ecb62f6aec16eee36b50 /lib/Target/X86
parent2f2e519083d8ac06f4e0a980b43fa78a3aa727f4 (diff)
downloadexternal_llvm-f6844ca0e4a02fae3b100db7b0c62170d05e5b53.zip
external_llvm-f6844ca0e4a02fae3b100db7b0c62170d05e5b53.tar.gz
external_llvm-f6844ca0e4a02fae3b100db7b0c62170d05e5b53.tar.bz2
Mac OS X X86-64 low 4G address not available.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40701 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86')
-rw-r--r--lib/Target/X86/X86ISelDAGToDAG.cpp3
-rw-r--r--lib/Target/X86/X86InstrInfo.td1
-rw-r--r--lib/Target/X86/X86Subtarget.cpp4
-rw-r--r--lib/Target/X86/X86Subtarget.h14
4 files changed, 21 insertions, 1 deletions
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp
index 6195676..f166b9b 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<GlobalAddressSDNode>(N0)) {
GlobalValue *GV = G->getGlobal();
if (isAbs32 || isRoot) {
diff --git a/lib/Target/X86/X86InstrInfo.td b/lib/Target/X86/X86InstrInfo.td
index ab2c8dc..190d5b1 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 1a75e04..51406c3 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 2cda970..6240dc2 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; }