diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -1637,8 +1637,8 @@ 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 char OpFlags = 0) const; + unsigned getGlobalWrapperKind(const GlobalValue *GV, + const unsigned char OpFlags) const; SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -18204,15 +18204,17 @@ if (GV && GV->isAbsoluteSymbolRef()) return X86ISD::Wrapper; - CodeModel::Model M = getTargetMachine().getCodeModel(); + // The following OpFlags under RIP-rel PIC use RIP. if (Subtarget.isPICStyleRIPRel() && - (M == CodeModel::Small || M == CodeModel::Kernel)) + (OpFlags == X86II::MO_NO_FLAG || OpFlags == X86II::MO_COFFSTUB || + OpFlags == X86II::MO_DLLIMPORT)) return X86ISD::WrapperRIP; // In the medium model, functions can always be referenced RIP-relatively, // since they must be within 2GiB. This is also possible in non-PIC mode, and // shorter than the 64-bit absolute immediate that would otherwise be emitted. - if (M == CodeModel::Medium && isa_and_nonnull(GV)) + if (getTargetMachine().getCodeModel() == CodeModel::Medium && + isa_and_nonnull(GV)) return X86ISD::WrapperRIP; // GOTPCREL references must always use RIP. @@ -18240,7 +18242,8 @@ SDValue Result = DAG.getTargetConstantPool( CP->getConstVal(), PtrVT, CP->getAlign(), CP->getOffset(), OpFlag); SDLoc DL(CP); - Result = DAG.getNode(getGlobalWrapperKind(), DL, PtrVT, Result); + Result = + DAG.getNode(getGlobalWrapperKind(nullptr, OpFlag), DL, PtrVT, Result); // With PIC, the address is actually $g + Offset. if (OpFlag) { Result = @@ -18261,7 +18264,8 @@ auto PtrVT = getPointerTy(DAG.getDataLayout()); SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, OpFlag); SDLoc DL(JT); - Result = DAG.getNode(getGlobalWrapperKind(), DL, PtrVT, Result); + Result = + DAG.getNode(getGlobalWrapperKind(nullptr, OpFlag), DL, PtrVT, Result); // With PIC, the address is actually $g + Offset. if (OpFlag) @@ -18287,7 +18291,8 @@ SDLoc dl(Op); auto PtrVT = getPointerTy(DAG.getDataLayout()); SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT, Offset, OpFlags); - Result = DAG.getNode(getGlobalWrapperKind(), dl, PtrVT, Result); + Result = + DAG.getNode(getGlobalWrapperKind(nullptr, OpFlags), dl, PtrVT, Result); // With PIC, the address is actually $g + Offset. if (isGlobalRelativeToPICBase(OpFlags)) { @@ -25975,7 +25980,7 @@ auto &Context = MF.getMMI().getContext(); MCSymbol *S = Context.getOrCreateSymbol(Twine("GCC_except_table") + Twine(MF.getFunctionNumber())); - return DAG.getNode(getGlobalWrapperKind(), dl, VT, + return DAG.getNode(getGlobalWrapperKind(nullptr, /*OpFlags=*/0), dl, VT, DAG.getMCSymbol(S, PtrVT)); } diff --git a/llvm/lib/Target/X86/X86Subtarget.cpp b/llvm/lib/Target/X86/X86Subtarget.cpp --- a/llvm/lib/Target/X86/X86Subtarget.cpp +++ b/llvm/lib/Target/X86/X86Subtarget.cpp @@ -323,7 +323,9 @@ InstrInfo(initializeSubtargetDependencies(CPU, TuneCPU, FS)), TLInfo(TM, *this), FrameLowering(*this, getStackAlignment()) { // Determine the PICStyle based on the target selected. - if (!isPositionIndependent()) + if (!isPositionIndependent() || TM.getCodeModel() == CodeModel::Large) + // With the large code model, None forces all memory accesses to be indirect + // rather than RIP-relative. setPICStyle(PICStyles::Style::None); else if (is64Bit()) setPICStyle(PICStyles::Style::RIPRel);