CGCall.cpp revision 5323a4b0a1c248fa2ffdf886bb41a5d8fba71d2d
10dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----- CGCall.h - Encapsulate calling convention details ----*- C++ -*-===//
20dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
30dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//                     The LLVM Compiler Infrastructure
40dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
50dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// This file is distributed under the University of Illinois Open Source
60dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// License. See LICENSE.TXT for details.
70dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
80dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----------------------------------------------------------------------===//
90dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
100dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// These classes wrap the information about a call or function
110dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// definition used to handle ABI compliancy.
120dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
130dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----------------------------------------------------------------------===//
140dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
150dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "CGCall.h"
160dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "CodeGenFunction.h"
170dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/ASTContext.h"
180dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/Decl.h"
190dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/DeclObjC.h"
200dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "llvm/ParameterAttributes.h"
210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace clang;
220dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace CodeGen;
230dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
240dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/
250dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
260dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation.
270dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
280dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD)
290dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  : TheDecl(FD)
300dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar{
310dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionType *FTy = FD->getType()->getAsFunctionType();
320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(FTy);
330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
340dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(FTy->getResultType());
350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  if (FTP)
360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
370dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar      ArgTypes.push_back(FTP->getArgType(i));
380dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
390dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
400dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const ObjCMethodDecl *MD,
410dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar                               const ASTContext &Context)
420dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  : TheDecl(MD)
430dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar{
440dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(MD->getResultType());
450dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(MD->getSelfDecl()->getType());
460dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(Context.getObjCSelType());
470dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  for (ObjCMethodDecl::param_const_iterator i = MD->param_begin(),
480dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar         e = MD->param_end(); i != e; ++i)
490dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    ArgTypes.push_back((*i)->getType());
500dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
510dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
525323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGFunctionInfo::argtypes_begin() const {
535323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.begin();
545323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
555323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
565323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGFunctionInfo::argtypes_end() const {
575323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.end();
580dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
590dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
600dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/
610dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
625323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarCGCallInfo::CGCallInfo(QualType _ResultType, const CallArgList &_Args) {
635323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  ArgTypes.push_back(_ResultType);
645323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  for (CallArgList::const_iterator i = _Args.begin(), e = _Args.end(); i!=e; ++i)
650dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    ArgTypes.push_back(i->second);
660dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
670dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
685323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGCallInfo::argtypes_begin() const {
695323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.begin();
705323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
715323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
725323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGCallInfo::argtypes_end() const {
735323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.end();
740dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
7517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
7617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar/***/
7717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
783913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbarbool CodeGenFunction::ReturnTypeUsesSret(QualType RetTy) {
793913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar  return hasAggregateLLVMType(RetTy);
803913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar}
813913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar
825323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbarvoid CodeGenFunction::ConstructParamAttrList(const Decl *TargetDecl,
835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar                                             ArgTypeIterator begin,
845323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar                                             ArgTypeIterator end,
855323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar                                             ParamAttrListType &PAL) {
865323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned FuncAttrs = 0;
875323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
885323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (TargetDecl) {
895323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (TargetDecl->getAttr<NoThrowAttr>())
905323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      FuncAttrs |= llvm::ParamAttr::NoUnwind;
915323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (TargetDecl->getAttr<NoReturnAttr>())
925323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      FuncAttrs |= llvm::ParamAttr::NoReturn;
935323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
945323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
955323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  QualType ResTy = *begin;
965323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned Index = 1;
975323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(ResTy)) {
985323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    PAL.push_back(llvm::ParamAttrsWithIndex::get(Index,
995323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar                                                 llvm::ParamAttr::StructRet));
1005323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    ++Index;
1015323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  } else if (ResTy->isPromotableIntegerType()) {
1025323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (ResTy->isSignedIntegerType()) {
1035323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      FuncAttrs |= llvm::ParamAttr::SExt;
1045323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    } else if (ResTy->isUnsignedIntegerType()) {
1055323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      FuncAttrs |= llvm::ParamAttr::ZExt;
1065323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
1075323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
1085323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (FuncAttrs)
1095323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    PAL.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs));
1105323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  for (++begin; begin != end; ++begin, ++Index) {
1115323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    QualType ParamType = *begin;
1125323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    unsigned ParamAttrs = 0;
1135323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (ParamType->isRecordType())
1145323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      ParamAttrs |= llvm::ParamAttr::ByVal;
1155323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (ParamType->isPromotableIntegerType()) {
1165323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      if (ParamType->isSignedIntegerType()) {
1175323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar        ParamAttrs |= llvm::ParamAttr::SExt;
1185323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      } else if (ParamType->isUnsignedIntegerType()) {
1195323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar        ParamAttrs |= llvm::ParamAttr::ZExt;
1205323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      }
1215323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
1225323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (ParamAttrs)
1235323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, ParamAttrs));
1245323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
1255323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
1265323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
12717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn,
12817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         QualType RetTy,
12917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         const FunctionArgList &Args) {
13017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
13117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Function::arg_iterator AI = Fn->arg_begin();
13217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
13317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Name the struct return argument.
13417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (hasAggregateLLVMType(RetTy)) {
13517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    AI->setName("agg.result");
13617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    ++AI;
13717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
13817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
13917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
14017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar       i != e; ++i, ++AI) {
14117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    const VarDecl *Arg = i->first;
14217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    QualType T = i->second;
14317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    assert(AI != Fn->arg_end() && "Argument mismatch!");
14417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    llvm::Value* V = AI;
14517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    if (!getContext().typesAreCompatible(T, Arg->getType())) {
14617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      // This must be a promotion, for something like
14717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      // "void a(x) short x; {..."
14817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      V = EmitScalarConversion(V, T, Arg->getType());
14917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      }
15017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    EmitParmDecl(*Arg, V);
15117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
15217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  assert(AI == Fn->arg_end() && "Argument mismatch!");
15317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
15417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
15517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(QualType RetTy,
15617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         llvm::Value *ReturnValue) {
15717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (!ReturnValue) {
15817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    Builder.CreateRetVoid();
15917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  } else {
16017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    if (!hasAggregateLLVMType(RetTy)) {
16117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      Builder.CreateRet(Builder.CreateLoad(ReturnValue));
16217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    } else if (RetTy->isAnyComplexType()) {
16317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
16417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      Builder.CreateRetVoid();
16517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    } else {
16617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
16717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      Builder.CreateRetVoid();
16817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
16917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
17017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
17117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
17217b708d61827cd86278e9580b041dd6cbadf07d3Daniel DunbarRValue CodeGenFunction::EmitCall(llvm::Value *Callee,
17317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                 QualType ResultType,
17417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                 const CallArgList &CallArgs) {
17517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // FIXME: Factor out code to load from args into locals into target.
17617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::SmallVector<llvm::Value*, 16> Args;
17717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Value *TempArg0 = 0;
17817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
17917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Handle struct-return functions by passing a pointer to the
18017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // location that we would like to return into.
18117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (hasAggregateLLVMType(ResultType)) {
18217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    // Create a temporary alloca to hold the result of the call. :(
18317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    TempArg0 = CreateTempAlloca(ConvertType(ResultType));
18417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    Args.push_back(TempArg0);
18517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
18617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
18717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
18817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar       I != E; ++I) {
18917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    RValue RV = I->first;
19017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    if (RV.isScalar()) {
19117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      Args.push_back(RV.getScalarVal());
19217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    } else if (RV.isComplex()) {
19317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      // Make a temporary alloca to pass the argument.
19417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      Args.push_back(CreateTempAlloca(ConvertType(I->second)));
19517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
19617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    } else {
19717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      Args.push_back(RV.getAggregateAddr());
19817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
19917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
20017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
20117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size());
20217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  CGCallInfo CallInfo(ResultType, CallArgs);
20317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
2045323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set.
20517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  CodeGen::ParamAttrListType ParamAttrList;
2065323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  ConstructParamAttrList(0, CallInfo.argtypes_begin(), CallInfo.argtypes_end(),
2075323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar                         ParamAttrList);
20817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  CI->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(),
20917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         ParamAttrList.size()));
21017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
21117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (const llvm::Function *F = dyn_cast<llvm::Function>(Callee))
21217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setCallingConv(F->getCallingConv());
21317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (CI->getType() != llvm::Type::VoidTy)
21417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setName("call");
21517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  else if (ResultType->isAnyComplexType())
21617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    return RValue::getComplex(LoadComplexFromAddr(TempArg0, false));
21717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  else if (hasAggregateLLVMType(ResultType))
21817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    // Struct return.
21917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    return RValue::getAggregate(TempArg0);
22017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  else {
22117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    // void return.
22217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    assert(ResultType->isVoidType() && "Should only have a void expr here");
22317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI = 0;
22417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
22517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
22617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  return RValue::get(CI);
22717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
228