parent
a8d8b71680
commit
a811da5fcd
|
@ -428,27 +428,35 @@ RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
|
|||
|
||||
for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
|
||||
QualType ArgTy = E->getArg(i)->getType();
|
||||
RValue ArgVal = EmitAnyExpr(E->getArg(i));
|
||||
|
||||
// If this argument has prototype information, convert it.
|
||||
if (ArgTyIt == ArgTyEnd) {
|
||||
// Otherwise, if passing through "..." or to a function with no prototype,
|
||||
// perform the "default argument promotions" (C99 6.5.2.2p6), which
|
||||
// includes the usual unary conversions, but also promotes float to
|
||||
// double.
|
||||
// FIXME: remove this when the impcast is in place.
|
||||
if (const BuiltinType *BT =
|
||||
dyn_cast<BuiltinType>(ArgTy.getCanonicalType())) {
|
||||
if (BT->getKind() == BuiltinType::Float)
|
||||
ArgVal = RValue::get(Builder.CreateFPExt(ArgVal.getVal(),
|
||||
llvm::Type::DoubleTy,"tmp"));
|
||||
if (!hasAggregateLLVMType(ArgTy)) {
|
||||
// Scalar argument is passed by-value.
|
||||
Args.push_back(EmitScalarExpr(E->getArg(i)));
|
||||
|
||||
if (ArgTyIt == ArgTyEnd) {
|
||||
// Otherwise, if passing through "..." or to a function with no prototype,
|
||||
// perform the "default argument promotions" (C99 6.5.2.2p6), which
|
||||
// includes the usual unary conversions, but also promotes float to
|
||||
// double.
|
||||
// FIXME: remove this when the impcast is in place.
|
||||
if (Args.back()->getType() == llvm::Type::FloatTy)
|
||||
Args.back() = Builder.CreateFPExt(Args.back(), llvm::Type::DoubleTy,
|
||||
"tmp");
|
||||
// FIXME: Remove ArgIt when this is gone.
|
||||
}
|
||||
} else if (ArgTy->isComplexType()) {
|
||||
// Make a temporary alloca to pass the argument.
|
||||
llvm::Value *DestMem = CreateTempAlloca(ConvertType(ArgTy));
|
||||
EmitComplexExprIntoAddr(E->getArg(i), DestMem, false);
|
||||
Args.push_back(DestMem);
|
||||
} else {
|
||||
llvm::Value *DestMem = CreateTempAlloca(ConvertType(ArgTy));
|
||||
EmitAggExpr(E->getArg(i), DestMem, false);
|
||||
Args.push_back(DestMem);
|
||||
}
|
||||
|
||||
if (ArgVal.isScalar())
|
||||
Args.push_back(ArgVal.getVal());
|
||||
else // Pass by-address. FIXME: Set attribute bit on call.
|
||||
Args.push_back(ArgVal.getAggregateAddr());
|
||||
if (ArgTyIt != ArgTyEnd)
|
||||
++ArgTyIt;
|
||||
}
|
||||
|
||||
llvm::Value *V = Builder.CreateCall(Callee, &Args[0], &Args[0]+Args.size());
|
||||
|
|
Loading…
Reference in New Issue