Linux GOT indirect reference is only necessary in PIC mode.
authorEvan Cheng <evan.cheng@apple.com>
Mon, 22 Jan 2007 21:34:25 +0000 (21:34 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 22 Jan 2007 21:34:25 +0000 (21:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33441 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelDAGToDAG.cpp
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86Subtarget.cpp

index 53302c6bb8a5fb4f71aa72da25e31a6cbfc3bfb2..7c61febf00ee0d233aaa89c8ba0dbcd053429cae 100644 (file)
@@ -947,7 +947,8 @@ SDNode *X86DAGToDAGISel::getGlobalBaseReg() {
     
     // If we're using vanilla 'GOT' PIC style, we should use relative addressing
     // not to pc, but to _GLOBAL_ADDRESS_TABLE_ external
-    if (Subtarget->isPICStyleGOT()) {
+    if (TM.getRelocationModel() == Reloc::PIC_ &&
+        Subtarget->isPICStyleGOT()) {
       GlobalBaseReg = RegMap->createVirtualRegister(X86::GR32RegisterClass);
       BuildMI(FirstMBB, MBBI, TII->get(X86::ADD32ri), GlobalBaseReg).
         addReg(PC).
index 350f5759b8109b3154dd58ccf89f944dca089c52..0c2c4e6c04c1aa46bf40fe77120f1bf036bdac0c 100644 (file)
@@ -664,7 +664,8 @@ SDOperand X86TargetLowering::LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG) {
     InFlag = Chain.getValue(1);
   }
 
-  if (Subtarget->isPICStyleGOT()) {
+  if (getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
+      Subtarget->isPICStyleGOT()) {
     Chain = DAG.getCopyToReg(Chain, X86::EBX,
                              DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()),
                              InFlag);
index be5c64d6d3bc7ab6741577bbf03d8fc6ba62058c..4af00859e30f42af87dc8b7accc30f40efee1d24 100644 (file)
@@ -40,7 +40,7 @@ bool X86Subtarget::GVRequiresExtraLoad(const GlobalValue* GV,
       return (!isDirectCall &&
               (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
                (GV->isExternal() && !GV->hasNotBeenReadFromBytecode())));
-    } else if (isPICStyleGOT()) {
+    } else if (TM.getRelocationModel() == Reloc::PIC_ && isPICStyleGOT()) {
       // Extra load is needed for all non-statics.
       return (!isDirectCall &&
               (GV->isExternal() || !GV->hasInternalLinkage()));