diff options
author | Sriraman Tallam <tmsriram@google.com> | 2018-04-10 22:50:05 +0000 |
---|---|---|
committer | Sriraman Tallam <tmsriram@google.com> | 2018-04-10 22:50:05 +0000 |
commit | d693093a65b3b3744c5ebaa8d591ec6bb97f75cb (patch) | |
tree | 757e9dc2e537fbed63603b1f2c1bac47bd539253 /llvm/lib | |
parent | a9a58fa236ab19b5caae32330d31e30ebdf6751f (diff) | |
download | bcm5719-llvm-d693093a65b3b3744c5ebaa8d591ec6bb97f75cb.tar.gz bcm5719-llvm-d693093a65b3b3744c5ebaa8d591ec6bb97f75cb.zip |
GOTPCREL references must always use RIP.
With -fno-plt, global value references can use GOTPCREL and RIP must be used.
Differential Revision: https://reviews.llvm.org/D45460
llvm-svn: 329765
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 3 |
2 files changed, 9 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 488666acdde..1870a668c98 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -15502,7 +15502,8 @@ static SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, const X86Subtarget &Subtarget, } // Returns the appropriate wrapper opcode for a global reference. -unsigned X86TargetLowering::getGlobalWrapperKind(const GlobalValue *GV) const { +unsigned X86TargetLowering::getGlobalWrapperKind( + const GlobalValue *GV, const unsigned char OpFlags) const { // References to absolute symbols are never PC-relative. if (GV && GV->isAbsoluteSymbolRef()) return X86ISD::Wrapper; @@ -15512,6 +15513,10 @@ unsigned X86TargetLowering::getGlobalWrapperKind(const GlobalValue *GV) const { (M == CodeModel::Small || M == CodeModel::Kernel)) return X86ISD::WrapperRIP; + // GOTPCREL references must always use RIP. + if (OpFlags == X86II::MO_GOTPCREL) + return X86ISD::WrapperRIP; + return X86ISD::Wrapper; } @@ -15635,7 +15640,7 @@ SDValue X86TargetLowering::LowerGlobalAddress(const GlobalValue *GV, Result = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, OpFlags); } - Result = DAG.getNode(getGlobalWrapperKind(GV), dl, PtrVT, Result); + Result = DAG.getNode(getGlobalWrapperKind(GV, OpFlags), dl, PtrVT, Result); // With PIC, the address is actually $g + Offset. if (isGlobalRelativeToPICBase(OpFlags)) { diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 517ac3a1123..dfd2bb19258 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -1199,7 +1199,8 @@ namespace llvm { SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const; SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const; - unsigned getGlobalWrapperKind(const GlobalValue *GV = nullptr) const; + unsigned getGlobalWrapperKind(const GlobalValue *GV = nullptr, + const unsigned char OpFlags = 0) const; SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; SDValue LowerGlobalAddress(const GlobalValue *GV, const SDLoc &dl, |