From: Michael J. Spencer Date: Thu, 21 Oct 2010 20:49:23 +0000 (+0000) Subject: X86: Base _fltused on the FunctionType of the called value instead of the potentially... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=391b43bf33b77cb73966c9582d5b3fdfe0c38e80;p=oota-llvm.git X86: Base _fltused on the FunctionType of the called value instead of the potentially null "CalledFunction". Thanks Duncan! This is needed for indirect calls. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117061 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 4be2525cfa1..b5597f83d0f 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -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(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 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 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()) {