add a couple of predicates to test for "stub style pic in PIC mode" and "stub style...
authorChris Lattner <sabre@nondot.org>
Fri, 10 Jul 2009 20:47:30 +0000 (20:47 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 10 Jul 2009 20:47:30 +0000 (20:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75273 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
lib/Target/X86/X86FastISel.cpp
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86Subtarget.cpp
lib/Target/X86/X86Subtarget.h

index afde3a847f25e8a177a5416cbbc2296b47b56c51..33aef4005dc1213f61bf4cab32600c4985d6f536 100644 (file)
@@ -603,15 +603,12 @@ void X86ATTAsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,
 
   O << JTEntryDirective << ' ';
 
-  if (TM.getRelocationModel() == Reloc::PIC_) {
-    if (Subtarget->isPICStyleRIPRel() || Subtarget->isPICStyleStub()) {
-      O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
-        << '_' << uid << "_set_" << MBB->getNumber();
-    } else if (Subtarget->isPICStyleGOT()) {
-      printBasicBlockLabel(MBB, false, false, false);
-      O << "@GOTOFF";
-    } else
-      assert(0 && "Don't know how to print MBB label for this PIC mode");
+  if (Subtarget->isPICStyleRIPRel() || Subtarget->isPICStyleStubPIC(TM)) {
+    O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
+      << '_' << uid << "_set_" << MBB->getNumber();
+  } else if (Subtarget->isPICStyleGOT()) {
+    printBasicBlockLabel(MBB, false, false, false);
+    O << "@GOTOFF";
   } else
     printBasicBlockLabel(MBB, false, false, false);
 }
index 4b0ff7b114f34d72df6e9b50d8d4a91efc8d13b8..2864cd0628663706149b4c040f21ebd93056cda2 100644 (file)
@@ -578,8 +578,7 @@ bool X86FastISel::X86SelectCallAddress(Value *V, X86AddressMode &AM) {
       // base and index registers are unused.
       assert(AM.Base.Reg == 0 && AM.IndexReg == 0);
       AM.Base.Reg = X86::RIP;
-    } else if (Subtarget->isPICStyleStub() &&
-               TM.getRelocationModel() == Reloc::PIC_) {
+    } else if (Subtarget->isPICStyleStubPIC(TM)) {
       AM.GVOpFlags = X86II::MO_PIC_BASE_OFFSET;
     } else if (Subtarget->isPICStyleGOT()) {
       AM.GVOpFlags = X86II::MO_GOTOFF;
@@ -1413,7 +1412,7 @@ bool X86FastISel::X86SelectCall(Instruction *I) {
         TM.getRelocationModel() == Reloc::PIC_ &&
         GV->hasDefaultVisibility() && !GV->hasLocalLinkage()) {
       OpFlags = X86II::MO_PLT;
-    } else if (Subtarget->isPICStyleStub() &&
+    } else if (Subtarget->isPICStyleStubAny() &&
                (GV->isDeclaration() || GV->isWeakForLinker()) &&
                Subtarget->getDarwinVers() < 9) {
       // PC-relative references to external symbols should go through $stub,
@@ -1621,8 +1620,7 @@ unsigned X86FastISel::TargetMaterializeConstant(Constant *C) {
   // x86-32 PIC requires a PIC base register for constant pools.
   unsigned PICBase = 0;
   unsigned char OpFlag = 0;
-  if (Subtarget->isPICStyleStub() &&
-      TM.getRelocationModel() == Reloc::PIC_) { // Not dynamic-no-pic
+  if (Subtarget->isPICStyleStubPIC(TM)) { // Not dynamic-no-pic
     OpFlag = X86II::MO_PIC_BASE_OFFSET;
     PICBase = getInstrInfo()->getGlobalBaseReg(&MF);
   } else if (Subtarget->isPICStyleGOT()) {
index 11a7596695560fecc3874d4a551b55e47afced98..af4d405bce367a936e3be56211452a9a019436e9 100644 (file)
@@ -1913,7 +1913,7 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
           getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
           GV->hasDefaultVisibility() && !GV->hasLocalLinkage()) {
         OpFlags = X86II::MO_PLT;
-      } else if (Subtarget->isPICStyleStub() &&
+      } else if (Subtarget->isPICStyleStubAny() &&
                (GV->isDeclaration() || GV->isWeakForLinker()) &&
                Subtarget->getDarwinVers() < 9) {
         // PC-relative references to external symbols should go through $stub,
@@ -1933,7 +1933,7 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
     if (Subtarget->isTargetELF() &&
         getTargetMachine().getRelocationModel() == Reloc::PIC_) {
       OpFlags = X86II::MO_PLT;
-    } else if (Subtarget->isPICStyleStub() &&
+    } else if (Subtarget->isPICStyleStubAny() &&
              Subtarget->getDarwinVers() < 9) {
       // PC-relative references to external symbols should go through $stub,
       // unless we're building with the leopard linker or later, which
@@ -4454,14 +4454,12 @@ X86TargetLowering::LowerConstantPool(SDValue Op, SelectionDAG &DAG) {
   unsigned WrapperKind = X86ISD::Wrapper;
   
   if (Subtarget->is64Bit() &&
-      getTargetMachine().getCodeModel() == CodeModel::Small) {
+      getTargetMachine().getCodeModel() == CodeModel::Small)
     WrapperKind = X86ISD::WrapperRIP;
-  } else if (Subtarget->isPICStyleGOT()) {
+  else if (Subtarget->isPICStyleGOT())
     OpFlag = X86II::MO_GOTOFF;
-  } else if (Subtarget->isPICStyleStub() &&
-             getTargetMachine().getRelocationModel() == Reloc::PIC_) {
+  else if (Subtarget->isPICStyleStubPIC(getTargetMachine()))
     OpFlag = X86II::MO_PIC_BASE_OFFSET;
-  }
   
   SDValue Result = DAG.getTargetConstantPool(CP->getConstVal(), getPointerTy(),
                                              CP->getAlignment(),
@@ -4487,14 +4485,13 @@ SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) {
   unsigned char OpFlag = 0;
   unsigned WrapperKind = X86ISD::Wrapper;
   
-  if (Subtarget->is64Bit()) {
+  if (Subtarget->is64Bit() &&
+      getTargetMachine().getCodeModel() == CodeModel::Small)
     WrapperKind = X86ISD::WrapperRIP;
-  } else if (Subtarget->isPICStyleGOT()) {
+  else if (Subtarget->isPICStyleGOT())
     OpFlag = X86II::MO_GOTOFF;
-  } else if (Subtarget->isPICStyleStub() &&
-             getTargetMachine().getRelocationModel() == Reloc::PIC_) {
+  else if (Subtarget->isPICStyleStubPIC(getTargetMachine()))
     OpFlag = X86II::MO_PIC_BASE_OFFSET;
-  }
   
   SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy(),
                                           OpFlag);
@@ -4520,14 +4517,13 @@ X86TargetLowering::LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) {
   // global base reg.
   unsigned char OpFlag = 0;
   unsigned WrapperKind = X86ISD::Wrapper;
-  if (Subtarget->is64Bit()) {
+  if (Subtarget->is64Bit() &&
+      getTargetMachine().getCodeModel() == CodeModel::Small)
     WrapperKind = X86ISD::WrapperRIP;
-  } else if (Subtarget->isPICStyleGOT()) {
+  else if (Subtarget->isPICStyleGOT())
     OpFlag = X86II::MO_GOTOFF;
-  } else if (Subtarget->isPICStyleStub() &&
-             getTargetMachine().getRelocationModel() == Reloc::PIC_) {
+  else if (Subtarget->isPICStyleStubPIC(getTargetMachine()))
     OpFlag = X86II::MO_PIC_BASE_OFFSET;
-  }
   
   SDValue Result = DAG.getTargetExternalSymbol(Sym, getPointerTy(), OpFlag);
   
index 6665c67bafc798251bc3fa4d49174aeb5910e7b5..c68b29b00bb906a37474a0ca7142d8cc9429bed7 100644 (file)
@@ -34,6 +34,17 @@ AsmWriterFlavor("x86-asm-syntax", cl::init(X86Subtarget::Unset),
     clEnumValN(X86Subtarget::Intel, "intel", "Emit Intel-style assembly"),
     clEnumValEnd));
 
+bool X86Subtarget::isPICStyleStubPIC(const TargetMachine &TM) const {
+  return PICStyle == PICStyles::Stub &&
+         TM.getRelocationModel() == Reloc::PIC_;
+}
+
+bool X86Subtarget::isPICStyleStubNoDynamic(const TargetMachine &TM) const {
+  return PICStyle == PICStyles::Stub &&
+         TM.getRelocationModel() == Reloc::DynamicNoPIC;
+}
+
+
 
 /// ClassifyGlobalReference - Classify a global variable reference for the
 /// current subtarget according to how we should reference it in a non-pcrel
@@ -76,7 +87,7 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const {
     return X86II::MO_GOT;
   }
   
-  if (isPICStyleStub()) {
+  if (isPICStyleStubAny()) {
     // In Darwin/32, we have multiple different stub types, and we have both PIC
     // and -mdynamic-no-pic.  Determine whether we have a stub reference
     // and/or whether the reference is relative to the PIC base or not.
index e789a56b2a0982e27258a81ef56981c97e9c6052..6509f04e33a22791144dba7364a3fffd030ed52e 100644 (file)
@@ -184,10 +184,14 @@ public:
 
   bool isPICStyleSet() const { return PICStyle != PICStyles::None; }
   bool isPICStyleGOT() const { return PICStyle == PICStyles::GOT; }
-  bool isPICStyleStub() const { return PICStyle == PICStyles::Stub; }
   bool isPICStyleRIPRel() const { return PICStyle == PICStyles::RIPRel; }
+
+  bool isPICStyleStubPIC(const TargetMachine &TM) const;
+  bool isPICStyleStubNoDynamic(const TargetMachine &TM) const;
+  bool isPICStyleStubAny() const { return PICStyle == PICStyles::Stub; }
   
-  /// getDarwinVers - Return the darwin version number, 8 = tiger, 9 = leopard.
+  /// getDarwinVers - Return the darwin version number, 8 = Tiger, 9 = Leopard,
+  /// 10 = Snow Leopard, etc.
   unsigned getDarwinVers() const { return DarwinVers; }
   
   /// isLinux - Return true if the target is "Linux".