From a811da5fcdc55fd52b6138108b46a90672d88042 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 26 Aug 2007 22:55:13 +0000 Subject: [PATCH] eliminate use of EmitAnyExpr. llvm-svn: 41467 --- clang/CodeGen/CGExpr.cpp | 42 ++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/clang/CodeGen/CGExpr.cpp b/clang/CodeGen/CGExpr.cpp index facca17deddc..549402892f8c 100644 --- a/clang/CodeGen/CGExpr.cpp +++ b/clang/CodeGen/CGExpr.cpp @@ -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(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());