X86: Don't make illegal GOTTPOFF relocations

"ELF Handling for Thread-Local Storage" specifies that R_X86_64_GOTTPOFF
relocation target a movq or addq instruction.

Prohibit the truncation of such loads to movl or addl.

This fixes PR22083.

Differential Revision: http://reviews.llvm.org/D6839

llvm-svn: 225250
This commit is contained in:
David Majnemer 2015-01-06 07:12:52 +00:00
parent 3fe09ea4d9
commit 29c52f7449
3 changed files with 25 additions and 0 deletions

View File

@ -3862,6 +3862,18 @@ bool X86TargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
return false;
}
bool X86TargetLowering::shouldReduceLoadWidth(SDNode *Load,
ISD::LoadExtType ExtTy,
EVT NewVT) const {
// "ELF Handling for Thread-Local Storage" specifies that R_X86_64_GOTTPOFF
// relocation target a movq or addq instruction: don't let the load shrink.
SDValue BasePtr = cast<LoadSDNode>(Load)->getBasePtr();
if (BasePtr.getOpcode() == X86ISD::WrapperRIP)
if (const auto *GA = dyn_cast<GlobalAddressSDNode>(BasePtr.getOperand(0)))
return GA->getTargetFlags() != X86II::MO_GOTTPOFF;
return true;
}
/// \brief Returns true if it is beneficial to convert a load of a constant
/// to just the constant itself.
bool X86TargetLowering::shouldConvertConstantLoadToIntImm(const APInt &Imm,

View File

@ -770,6 +770,11 @@ namespace llvm {
return !X86ScalarSSEf64 || VT == MVT::f80;
}
/// Return true if we believe it is correct and profitable to reduce the
/// load node to a smaller type.
bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy,
EVT NewVT) const override;
const X86Subtarget* getSubtarget() const {
return Subtarget;
}

View File

@ -128,6 +128,14 @@ entry:
; DARWIN: _internal_ie@TLVP
}
define i32 @PR22083() {
entry:
ret i32 ptrtoint (i32* @external_ie to i32)
; X64-LABEL: PR22083:
; X64: movq external_ie@GOTTPOFF(%rip), %rax
; X64_PIC-LABEL: PR22083:
; X64_PIC: movq external_ie@GOTTPOFF(%rip), %rax
}
; ----- localexec specified -----