eliminate use of EmitAnyExpr.

llvm-svn: 41467
This commit is contained in:
Chris Lattner 2007-08-26 22:55:13 +00:00
parent a8d8b71680
commit a811da5fcd
1 changed files with 25 additions and 17 deletions

View File

@ -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());