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