X86: Base _fltused on the FunctionType of the called value instead of the potentially null "CalledFunction". Thanks Duncan!

This is needed for indirect calls.

llvm-svn: 117061
This commit is contained in:
Michael J. Spencer 2010-10-21 20:49:23 +00:00
parent 2bfa8ed045
commit 0e36e0340a
1 changed files with 20 additions and 19 deletions

View File

@ -5010,6 +5010,26 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
return;
}
// See if any floating point values are being passed to this function. This is
// used to emit an undefined reference to fltused on Windows.
const FunctionType *FT =
cast<FunctionType>(I.getCalledValue()->getType()->getContainedType(0));
MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI();
if (FT->isVarArg() &&
!MMI.callsExternalVAFunctionWithFloatingPointArguments()) {
for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) {
const Type* T = I.getArgOperand(i)->getType();
for (po_iterator<const Type*> i = po_begin(T),
e = po_end(T);
i != e; ++i) {
if (i->isFloatingPointTy()) {
MMI.setCallsExternalVAFunctionWithFloatingPointArguments(true);
break;
}
}
}
}
const char *RenameFn = 0;
if (Function *F = I.getCalledFunction()) {
if (F->isDeclaration()) {
@ -5027,25 +5047,6 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
}
}
// See if any floating point values are being passed to this external
// function. This is used to emit an undefined reference to fltused on
// Windows.
MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI();
if (F->isVarArg() &&
!MMI.callsExternalVAFunctionWithFloatingPointArguments()) {
for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) {
const Type* T = I.getArgOperand(i)->getType();
for (po_iterator<const Type*> i = po_begin(T),
e = po_end(T);
i != e; ++i) {
if (i->isFloatingPointTy()) {
MMI.setCallsExternalVAFunctionWithFloatingPointArguments(true);
break;
}
}
}
}
// Check for well-known libc/libm calls. If the function is internal, it
// can't be a library call.
if (!F->hasLocalLinkage() && F->hasName()) {