mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@329765 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -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)) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnu \
|
||||
; RUN: | FileCheck -check-prefix=X64 --check-prefix=STATIC %s
|
||||
|
||||
define i32 @fp_weakfunc() {
|
||||
; X64: weakfunc@GOTPCREL(%rip)
|
||||
ret i32 select (i1 icmp ne (i32 ()* @weakfunc, i32 ()* null), i32 1, i32 0)
|
||||
}
|
||||
declare extern_weak i32 @weakfunc() nonlazybind
|
||||
|
||||
define void @memset_call(i8* nocapture %a, i8 %c, i32 %n) {
|
||||
; X64: callq *memset@GOTPCREL(%rip)
|
||||
call void @llvm.memset.p0i8.i32(i8* %a, i8 %c, i32 %n, i1 false)
|
||||
|
||||
Reference in New Issue
Block a user