Revert r258455 for now, as it apparently causes miscompilation in some
situations. Until this is fully resolved, the X.org workaround in ports still needs to take place.
This commit is contained in:
parent
7b7d8599fe
commit
56510193f0
@ -2449,15 +2449,21 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
RegsToPass.push_back(std::make_pair(unsigned(X86::EBX),
|
||||
DAG.getNode(X86ISD::GlobalBaseReg, DebugLoc(), getPointerTy())));
|
||||
} else {
|
||||
// If we are tail calling a global or external symbol in GOT pic mode, we
|
||||
// cannot use a direct jump, since that would make lazy dynamic linking
|
||||
// impossible (see PR15086). So pretend this is not a tail call, to
|
||||
// prevent the optimization to a jump.
|
||||
// If we are tail calling and generating PIC/GOT style code load the
|
||||
// address of the callee into ECX. The value in ecx is used as target of
|
||||
// the tail jump. This is done to circumvent the ebx/callee-saved problem
|
||||
// for tail calls on PIC/GOT architectures. Normally we would just put the
|
||||
// address of GOT into ebx and then call target@PLT. But for tail calls
|
||||
// ebx would be restored (since ebx is callee saved) before jumping to the
|
||||
// target@PLT.
|
||||
|
||||
// Note: The actual moving to ECX is done further down.
|
||||
GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
|
||||
if ((G && !G->getGlobal()->hasHiddenVisibility() &&
|
||||
!G->getGlobal()->hasProtectedVisibility()) ||
|
||||
isa<ExternalSymbolSDNode>(Callee))
|
||||
isTailCall = false;
|
||||
if (G && !G->getGlobal()->hasHiddenVisibility() &&
|
||||
!G->getGlobal()->hasProtectedVisibility())
|
||||
Callee = LowerGlobalAddress(Callee, DAG);
|
||||
else if (isa<ExternalSymbolSDNode>(Callee))
|
||||
Callee = LowerExternalSymbol(Callee, DAG);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user