diff options
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 4be2525cfa..b5597f83d0 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<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()) { |