Pass a GlobalAddress instead of an ExternalSymbol to LowerCallTo in

MipsTargetLowering::LowerGlobalTLSAddress. This is necessary to have
call16(__tls_get_addr) emitted instead of got_disp(__tls_get_addr) when the
target is Mips64.

llvm-svn: 146183
This commit is contained in:
Akira Hatanaka 2011-12-08 21:05:38 +00:00
parent ab9c8bb45b
commit f10ee84956
1 changed files with 11 additions and 4 deletions

View File

@ -1550,19 +1550,26 @@ LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, PtrVT,
0, MipsII::MO_TLSGD);
SDValue Argument = DAG.getNode(MipsISD::WrapperPIC, dl, PtrVT, TGA);
unsigned PtrSize = PtrVT.getSizeInBits();
IntegerType *PtrTy = Type::getIntNTy(*DAG.getContext(), PtrSize);
SmallVector<Type*, 1> Params;
Params.push_back(PtrTy);
FunctionType *FuncTy = FunctionType::get(PtrTy, Params, false);
Function *Func = Function::Create(FuncTy, GlobalValue::ExternalLinkage,
"__tls_get_addr");
SDValue TlsGetAddr = DAG.getGlobalAddress(Func, dl, PtrVT);
ArgListTy Args;
ArgListEntry Entry;
Entry.Node = Argument;
unsigned PtrSize = PtrVT.getSizeInBits();
IntegerType *PtrTy = Type::getIntNTy(*DAG.getContext(), PtrSize);
Entry.Ty = PtrTy;
Args.push_back(Entry);
std::pair<SDValue, SDValue> CallResult =
LowerCallTo(DAG.getEntryNode(), PtrTy,
false, false, false, false, 0, CallingConv::C, false, true,
DAG.getExternalSymbol("__tls_get_addr", PtrVT), Args, DAG,
dl);
TlsGetAddr, Args, DAG, dl);
return CallResult.first;
}