CGCall.cpp revision bac7c250c9b098ee3d637c8ed77da62e860d9244
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" 17b768807c49a1c7085def099b848631856af766faDaniel Dunbar#include "CodeGenModule.h" 186b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar#include "clang/Basic/TargetInfo.h" 190dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/Decl.h" 20f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson#include "clang/AST/DeclCXX.h" 210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/DeclObjC.h" 2224095dad88dd9d48aa16afa6416417073af251b5Devang Patel#include "clang/Frontend/CompileOptions.h" 23d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel#include "llvm/Attributes.h" 24d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar#include "llvm/Support/CallSite.h" 2554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar#include "llvm/Target/TargetData.h" 269eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar 279eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar#include "ABIInfo.h" 289eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar 290dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace clang; 300dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace CodeGen; 310dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/ 330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 340dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation. 350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst 3772564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionNoProtoType *FTNP) { 38bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar // FIXME: Set calling convention correctly, it needs to be associated with the 39bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar // type somehow. 401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getFunctionInfo(FTNP->getResultType(), 41bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar llvm::SmallVector<QualType, 16>(), 0); 4245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 4345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst 4572564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionProtoType *FTP) { 46541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 47541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar // FIXME: Kill copy. 4845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 49541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(FTP->getArgType(i)); 50bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar // FIXME: Set calling convention correctly, it needs to be associated with the 51bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar // type somehow. 52bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return getFunctionInfo(FTP->getResultType(), ArgTys, 0); 53bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar} 54bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar 55bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbarstatic unsigned getCallingConventionForDecl(const Decl *D) { 56bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar // Set the appropriate calling convention for the Function. 57bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar if (D->hasAttr<StdCallAttr>()) 58bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return llvm::CallingConv::X86_StdCall; 59bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar 60bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar if (D->hasAttr<FastCallAttr>()) 61bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return llvm::CallingConv::X86_FastCall; 62bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar 63bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return llvm::CallingConv::C; 6445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 6545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 66f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) { 67f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson llvm::SmallVector<QualType, 16> ArgTys; 683eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner // Add the 'this' pointer unless this is a static method. 693eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner if (MD->isInstance()) 703eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner ArgTys.push_back(MD->getThisType(Context)); 711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson const FunctionProtoType *FTP = MD->getType()->getAsFunctionProtoType(); 73f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 74f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson ArgTys.push_back(FTP->getArgType(i)); 75bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return getFunctionInfo(FTP->getResultType(), ArgTys, 76bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar getCallingConventionForDecl(MD)); 77f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson} 78f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson 79541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionDecl *FD) { 803eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) 81f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson if (MD->isInstance()) 82f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson return getFunctionInfo(MD); 831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 84bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar unsigned CallingConvention = getCallingConventionForDecl(FD); 850dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const FunctionType *FTy = FD->getType()->getAsFunctionType(); 86bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar if (const FunctionNoProtoType *FNTP = dyn_cast<FunctionNoProtoType>(FTy)) 87bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return getFunctionInfo(FNTP->getResultType(), 88bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar llvm::SmallVector<QualType, 16>(), 89bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar CallingConvention); 90bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar 91bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar const FunctionProtoType *FPT = cast<FunctionProtoType>(FTy); 92bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 93bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar // FIXME: Kill copy. 94bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) 95bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar ArgTys.push_back(FPT->getArgType(i)); 96bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return getFunctionInfo(FPT->getResultType(), ArgTys, CallingConvention); 970dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 980dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 99541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) { 100541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 101541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(MD->getSelfDecl()->getType()); 102541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(Context.getObjCSelType()); 103541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar // FIXME: Kill copy? 1042073216a1075767b5d25c23d1462b7034686d94dChris Lattner for (ObjCMethodDecl::param_iterator i = MD->param_begin(), 1050dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar e = MD->param_end(); i != e; ++i) 106541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back((*i)->getType()); 107bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return getFunctionInfo(MD->getResultType(), ArgTys, 108bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar getCallingConventionForDecl(MD)); 1090dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 1100dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, 112bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar const CallArgList &Args, 113bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar unsigned CallingConvention){ 114541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar // FIXME: Kill copy. 115541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CallArgList::const_iterator i = Args.begin(), e = Args.end(); 117725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar i != e; ++i) 118541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(i->second); 119bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return getFunctionInfo(ResTy, ArgTys, CallingConvention); 1200dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 1210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, 123bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar const FunctionArgList &Args, 124bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar unsigned CallingConvention){ 125541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar // FIXME: Kill copy. 126541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); 128bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar i != e; ++i) 129541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(i->second); 130bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar return getFunctionInfo(ResTy, ArgTys, CallingConvention); 131541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar} 132541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar 133541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, 134bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar const llvm::SmallVector<QualType, 16> &ArgTys, 135bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar unsigned CallingConvention){ 13640a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar // Lookup or create unique function info. 13740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar llvm::FoldingSetNodeID ID; 138bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar CGFunctionInfo::Profile(ID, CallingConvention, ResTy, 139bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar ArgTys.begin(), ArgTys.end()); 14040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar 14140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar void *InsertPos = 0; 14240a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos); 14340a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar if (FI) 14440a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar return *FI; 14540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar 14688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar // Construct the function info. 147bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar FI = new CGFunctionInfo(CallingConvention, ResTy, ArgTys); 14835e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar FunctionInfos.InsertNode(FI, InsertPos); 149541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar 15088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar // Compute ABI information. 151a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson getABIInfo().computeInfo(*FI, getContext(), TheModule.getContext()); 152541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar 15388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar return *FI; 1540dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 15517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 156bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel DunbarCGFunctionInfo::CGFunctionInfo(unsigned _CallingConvention, 157bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar QualType ResTy, 158bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar const llvm::SmallVector<QualType, 16> &ArgTys) 159bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar : CallingConvention(_CallingConvention) 160bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar{ 16188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar NumArgs = ArgTys.size(); 16288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar Args = new ArgInfo[1 + NumArgs]; 16388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar Args[0].type = ResTy; 16488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar for (unsigned i = 0; i < NumArgs; ++i) 16588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar Args[1 + i].type = ArgTys[i]; 16688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar} 16788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar 16888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar/***/ 16988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar 1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid CodeGenTypes::GetExpandedTypes(QualType Ty, 1715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> &ArgTys) { 1725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 1735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 1745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordDecl *RD = RT->getDecl(); 1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(!RD->hasFlexibleArrayMember() && 1765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with flexible array."); 1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 17917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) { 1805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const FieldDecl *FD = *i; 1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(!FD->isBitField() && 1825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with bit-field members."); 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 1855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 1865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar GetExpandedTypes(FT, ArgTys); 1875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 1885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ArgTys.push_back(ConvertType(FT)); 1895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 1925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpllvm::Function::arg_iterator 1945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV, 1955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator AI) { 1965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 1975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 1985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(LV.isSimple() && 2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump "Unexpected non-simple lvalue during struct expansion."); 2025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = LV.getAddress(); 20317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 20417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) { 2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldDecl *FD = *i; 2065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 2075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 2085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 2095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 2105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 2115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI = ExpandTypeFromArgs(FT, LV, AI); 2125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 2135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitStoreThroughLValue(RValue::get(AI), LV, FT); 2145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 2155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 2165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 2175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 2185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return AI; 2195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 2205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 2221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV, 2235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::SmallVector<llvm::Value*, 16> &Args) { 2245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 2255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 2265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 2275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 2285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isAggregate() && "Unexpected rvalue during struct expansion"); 2295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = RV.getAggregateAddr(); 23017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 23117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) { 2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldDecl *FD = *i; 2335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 2365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 2375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 2385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args); 2395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 2405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RValue RV = EmitLoadOfLValue(LV, FT); 2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(RV.isScalar() && 2425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-scalar rvalue during struct expansion."); 2435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 2445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 2455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 2465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 2475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 248275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as 249275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty. 250275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// 251275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the 252275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not 253275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined. 254275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr, 255275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *Ty, 256275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CodeGenFunction &CGF) { 2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const llvm::Type *SrcTy = 258275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar cast<llvm::PointerType>(SrcPtr->getType())->getElementType(); 2599408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy); 2609408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(Ty); 261275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 262b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar // If load is legal, just bitcast the src pointer. 2637ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar if (SrcSize >= DstSize) { 264f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // Generally SrcSize is never greater than DstSize, since this means we are 265f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // losing bits. However, this can happen in cases where the structure has 266f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // additional padding, for example due to a user specified alignment. 2677ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar // 268f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: Assert that we aren't truncating non-padding bits when have access 269f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // to that information. 270275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 271275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty)); 272386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted); 273386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar // FIXME: Use better alignment / avoid requiring aligned load. 274386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar Load->setAlignment(1); 275386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar return Load; 276275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } else { 277275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // Otherwise do coercion through memory. This is stupid, but 278275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // simple. 279275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Tmp = CGF.CreateTempAlloca(Ty); 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::Value *Casted = 281275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy)); 2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::StoreInst *Store = 283386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted); 284386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar // FIXME: Use better alignment / avoid requiring aligned store. 285386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar Store->setAlignment(1); 286275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar return CGF.Builder.CreateLoad(Tmp); 287275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } 288275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar} 289275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 290275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src, 291275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types. 292275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// 293275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the 294275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost. 295275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src, 296275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *DstPtr, 297275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CodeGenFunction &CGF) { 298275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *SrcTy = Src->getType(); 2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const llvm::Type *DstTy = 300275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar cast<llvm::PointerType>(DstPtr->getType())->getElementType(); 301275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 3029408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy); 3039408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(DstTy); 304275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 30588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar // If store is legal, just bitcast the src pointer. 306fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar if (SrcSize <= DstSize) { 307275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 308275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy)); 309386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar // FIXME: Use better alignment / avoid requiring aligned store. 310386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar CGF.Builder.CreateStore(Src, Casted)->setAlignment(1); 311275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } else { 312275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // Otherwise do coercion through memory. This is stupid, but 313275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // simple. 314fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar 315fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // Generally SrcSize is never greater than DstSize, since this means we are 316fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // losing bits. However, this can happen in cases where the structure has 317fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // additional padding, for example due to a user specified alignment. 318fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // 319fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // FIXME: Assert that we aren't truncating non-padding bits when have access 320fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // to that information. 321275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy); 322275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateStore(Src, Tmp); 3231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::Value *Casted = 324275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy)); 325386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted); 326386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar // FIXME: Use better alignment / avoid requiring aligned load. 327386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar Load->setAlignment(1); 328386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar CGF.Builder.CreateStore(Load, DstPtr); 329275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } 330275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar} 331275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 3325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/ 3335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 33488b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) { 33511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar return FI.getReturnInfo().isIndirect(); 336bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar} 337bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar 33845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType * 339bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) { 34045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar std::vector<const llvm::Type*> ArgTys; 34145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 34245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar const llvm::Type *ResultType = 0; 34345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 344a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar QualType RetTy = FI.getReturnType(); 345b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &RetAI = FI.getReturnInfo(); 3468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (RetAI.getKind()) { 3478951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 3488951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 3498951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 350cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 35146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 35246327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar ResultType = ConvertType(RetTy); 35346327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar break; 35446327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar 35511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: { 35611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar assert(!RetAI.getIndirectAlign() && "Align unused on indirect return."); 3570032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson ResultType = llvm::Type::getVoidTy(getLLVMContext()); 35862d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar const llvm::Type *STy = ConvertType(RetTy); 35945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace())); 36045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 36145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 36245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 36311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 3640032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson ResultType = llvm::Type::getVoidTy(getLLVMContext()); 36511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 36611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 36745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::Coerce: 368639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar ResultType = RetAI.getCoerceToType(); 36945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 37045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), 37388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar ie = FI.arg_end(); it != ie; ++it) { 37488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar const ABIArgInfo &AI = it->info; 3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 37711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 37811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 37911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 3805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 38189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar ArgTys.push_back(AI.getCoerceToType()); 38289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar break; 38389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar 384adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar case ABIArgInfo::Indirect: { 38511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar // indirect arguments are always on the stack, which is addr space #0. 386adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar const llvm::Type *LTy = ConvertTypeForMem(it->type); 387adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar ArgTys.push_back(llvm::PointerType::getUnqual(LTy)); 3888951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 389adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar } 390cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov 391cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 39246327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 3931f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar ArgTys.push_back(ConvertType(it->type)); 3948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 39788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar GetExpandedTypes(it->type, ArgTys); 3988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 3998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 40045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 40145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 402bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic); 4033913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar} 4043913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar 405a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbarvoid CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, 40688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar const Decl *TargetDecl, 407761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeListType &PAL) { 4085323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned FuncAttrs = 0; 409a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel unsigned RetAttrs = 0; 4105323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 4111102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // FIXME: handle sseregparm someday... 4125323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl) { 41340b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis if (TargetDecl->hasAttr<NoThrowAttr>()) 414761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel FuncAttrs |= llvm::Attribute::NoUnwind; 41540b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis if (TargetDecl->hasAttr<NoReturnAttr>()) 416761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel FuncAttrs |= llvm::Attribute::NoReturn; 41740b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis if (TargetDecl->hasAttr<ConstAttr>()) 418232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson FuncAttrs |= llvm::Attribute::ReadNone; 41940b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis else if (TargetDecl->hasAttr<PureAttr>()) 42064c2e0762628eba26c100642521b6100c2515cc5Daniel Dunbar FuncAttrs |= llvm::Attribute::ReadOnly; 42176168e289ca4b307259e3bc9b3353f03b05bb6b9Ryan Flynn if (TargetDecl->hasAttr<MallocAttr>()) 42276168e289ca4b307259e3bc9b3353f03b05bb6b9Ryan Flynn RetAttrs |= llvm::Attribute::NoAlias; 4235323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 4245323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 42524095dad88dd9d48aa16afa6416417073af251b5Devang Patel if (CompileOpts.DisableRedZone) 42624095dad88dd9d48aa16afa6416417073af251b5Devang Patel FuncAttrs |= llvm::Attribute::NoRedZone; 427acebb397fa5d63835a0de9cee144987057ec1333Devang Patel if (CompileOpts.NoImplicitFloat) 428acebb397fa5d63835a0de9cee144987057ec1333Devang Patel FuncAttrs |= llvm::Attribute::NoImplicitFloat; 42924095dad88dd9d48aa16afa6416417073af251b5Devang Patel 4304ebe3e4c811a376c423a544f5e76ee2e96533324Bill Wendling if (Features.getStackProtectorMode() == LangOptions::SSPOn) 43145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling FuncAttrs |= llvm::Attribute::StackProtect; 4324ebe3e4c811a376c423a544f5e76ee2e96533324Bill Wendling else if (Features.getStackProtectorMode() == LangOptions::SSPReq) 43345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling FuncAttrs |= llvm::Attribute::StackProtectReq; 43445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 435a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar QualType RetTy = FI.getReturnType(); 4365323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned Index = 1; 437b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &RetAI = FI.getReturnInfo(); 43845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar switch (RetAI.getKind()) { 439cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 440cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov if (RetTy->isSignedIntegerType()) { 441cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov RetAttrs |= llvm::Attribute::SExt; 442cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov } else if (RetTy->isUnsignedIntegerType()) { 443cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov RetAttrs |= llvm::Attribute::ZExt; 444cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov } 445cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov // FALLTHROUGH 44646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 4472c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 4482c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 44911e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PAL.push_back(llvm::AttributeWithIndex::get(Index, 451725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar llvm::Attribute::StructRet | 452725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar llvm::Attribute::NoAlias)); 4535323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar ++Index; 4540ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar // sret disables readnone and readonly 4550ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar FuncAttrs &= ~(llvm::Attribute::ReadOnly | 4560ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar llvm::Attribute::ReadNone); 4572c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 4582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 45911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 4602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Coerce: 4612c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 4628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 4638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 4641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(0 && "Invalid ABI kind for return argument"); 4655323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 4662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 467a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel if (RetAttrs) 468a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs)); 4691102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov 4701102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // FIXME: we need to honour command line settings also... 4711102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // FIXME: RegParm should be reduced in case of nested functions and/or global 4721102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // register variable. 4731102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov signed RegParm = 0; 4741102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov if (TargetDecl) 4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const RegparmAttr *RegParmAttr 47640b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis = TargetDecl->getAttr<RegparmAttr>()) 4771102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov RegParm = RegParmAttr->getNumParams(); 4781102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov 4791102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov unsigned PointerWidth = getContext().Target.getPointerWidth(0); 4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), 48188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar ie = FI.arg_end(); it != ie; ++it) { 48288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar QualType ParamType = it->type; 48388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar const ABIArgInfo &AI = it->info; 484761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel unsigned Attributes = 0; 4851102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov 4868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 48789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar case ABIArgInfo::Coerce: 48889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar break; 48989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar 49011e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 491761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel Attributes |= llvm::Attribute::ByVal; 4921102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov Attributes |= 49311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign()); 4940ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar // byval disables readnone and readonly. 4950ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar FuncAttrs &= ~(llvm::Attribute::ReadOnly | 4960ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar llvm::Attribute::ReadNone); 4978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 498cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov 499cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 500cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov if (ParamType->isSignedIntegerType()) { 501cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov Attributes |= llvm::Attribute::SExt; 502cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov } else if (ParamType->isUnsignedIntegerType()) { 503cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov Attributes |= llvm::Attribute::ZExt; 504cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov } 505cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov // FALLS THROUGH 50646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 5071102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov if (RegParm > 0 && 5081102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov (ParamType->isIntegerType() || ParamType->isPointerType())) { 5091102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov RegParm -= 5101102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov (Context.getTypeSize(ParamType) + PointerWidth - 1) / PointerWidth; 5111102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov if (RegParm >= 0) 5121102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov Attributes |= llvm::Attribute::InReg; 5131102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov } 5141102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // FIXME: handle sseregparm someday... 5158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 5161102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov 51711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 51811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar // Skip increment, no matching LLVM parameter. 5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump continue; 52011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 5215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 5221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::vector<const llvm::Type*> Tys; 523f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: This is rather inefficient. Do we ever actually need to do 524f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // anything here? The result should be just reconstructed on the other 525f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // side, so extension should be a non-issue. 5265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar getTypes().GetExpandedTypes(ParamType, Tys); 5275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Index += Tys.size(); 5285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 5295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 5305323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 532761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel if (Attributes) 533761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes)); 5345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++Index; 5355323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 536a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel if (FuncAttrs) 537a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs)); 5385323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 5395323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 54088b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI, 54188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar llvm::Function *Fn, 54217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const FunctionArgList &Args) { 5430cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall // If this is an implicit-return-zero function, go ahead and 5440cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall // initialize the return value. TODO: it might be nice to have 5450cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall // a more general mechanism for this that didn't require synthesized 5460cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall // return statements. 54789ed31d3f9eeb8ec77c284a5cf404a74bf5e7acfAnders Carlsson if (const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl)) { 5480cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall if (FD->hasImplicitReturnZero()) { 5490cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall QualType RetTy = FD->getResultType().getUnqualifiedType(); 5500cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall const llvm::Type* LLVMTy = CGM.getTypes().ConvertType(RetTy); 551c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson llvm::Constant* Zero = llvm::Constant::getNullValue(LLVMTy); 5520cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall Builder.CreateStore(Zero, ReturnValue); 5530cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall } 5540cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall } 5550cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall 556f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: We no longer need the types from FunctionArgList; lift up and 557f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // simplify. 5585251afa21d3583f2740fd4f83659d008625a7260Daniel Dunbar 55917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Emit allocs for param decls. Give the LLVM Argument nodes names. 56017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Function::arg_iterator AI = Fn->arg_begin(); 5611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Name the struct return argument. 56388b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar if (CGM.ReturnTypeUsesSret(FI)) { 56417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar AI->setName("agg.result"); 56517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar ++AI; 56617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 5671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5684b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar assert(FI.arg_size() == Args.size() && 5694b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar "Mismatch between function signature & arguments."); 570b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar CGFunctionInfo::const_arg_iterator info_it = FI.arg_begin(); 57117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); 572b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar i != e; ++i, ++info_it) { 57317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const VarDecl *Arg = i->first; 574b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar QualType Ty = info_it->type; 575b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &ArgI = info_it->info; 5768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (ArgI.getKind()) { 5781f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar case ABIArgInfo::Indirect: { 5791f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar llvm::Value* V = AI; 5801f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar if (hasAggregateLLVMType(Ty)) { 5811f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // Do nothing, aggregates and complex variables are accessed by 5821f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // reference. 5831f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } else { 5841f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // Load scalar value from indirect argument. 585adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar V = EmitLoadOfScalar(V, false, Ty); 5861f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 5871f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // This must be a promotion, for something like 5881f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // "void a(x) short x; {..." 5891f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 5901f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } 5911f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } 5921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EmitParmDecl(*Arg, V); 5931f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar break; 5941f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } 595cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov 596cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 59746327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: { 5988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI != Fn->arg_end() && "Argument mismatch!"); 5998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar llvm::Value* V = AI; 6002fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar if (hasAggregateLLVMType(Ty)) { 6012fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // Create a temporary alloca to hold the argument; the rest of 6022fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // codegen expects to access aggregates & complex values by 6032fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // reference. 604adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar V = CreateTempAlloca(ConvertTypeForMem(Ty)); 6052fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Builder.CreateStore(AI, V); 6062fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar } else { 6072fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 6082fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // This must be a promotion, for something like 6092fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // "void a(x) short x; {..." 6102fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 6112fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar } 61217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 6138951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar EmitParmDecl(*Arg, V); 6148951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 6158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 6161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 618b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar // If this structure was expanded into multiple arguments then 6195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // we need to create a temporary and reconstruct it from the 6205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // arguments. 62139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = Arg->getNameAsString(); 6221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::Value *Temp = CreateTempAlloca(ConvertTypeForMem(Ty), 6235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar (Name + ".addr").c_str()); 6245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 6251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::Function::arg_iterator End = 6261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI); 6275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitParmDecl(*Arg, Temp); 6285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 6295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // Name the arguments used in expansion and increment AI. 6305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar unsigned Index = 0; 6315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (; AI != End; ++AI, ++Index) 6320ab9a25101efeb56620a99118bee116ae052a7caDaniel Dunbar AI->setName(Name + "." + llvm::Twine(Index)); 6335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 6345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 63511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 63611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 6378b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar // Initialize the local variable appropriately. 6381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (hasAggregateLLVMType(Ty)) { 639adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar EmitParmDecl(*Arg, CreateTempAlloca(ConvertTypeForMem(Ty))); 6408b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar } else { 6418b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType()))); 6428b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar } 6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar // Skip increment, no matching LLVM parameter. 6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump continue; 64611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 64789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar case ABIArgInfo::Coerce: { 64889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar assert(AI != Fn->arg_end() && "Argument mismatch!"); 649f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: This is very wasteful; EmitParmDecl is just going to drop the 650f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // result in a new alloca anyway, so we could just store into that 651f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // directly if we broke the abstraction down more. 652adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(Ty), "coerce"); 65389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar CreateCoercedStore(AI, V, *this); 65489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar // Match to what EmitParmDecl is expecting for this type. 6558b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar if (!CodeGenFunction::hasAggregateLLVMType(Ty)) { 656adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar V = EmitLoadOfScalar(V, false, Ty); 6578b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 6588b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar // This must be a promotion, for something like 6598b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar // "void a(x) short x; {..." 6608b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 6618b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar } 6628b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar } 66389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar EmitParmDecl(*Arg, V); 66489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar break; 66589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar } 6668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 6675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 6685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 66917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 67017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar assert(AI == Fn->arg_end() && "Argument mismatch!"); 67117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 67217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 67388b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI, 67417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Value *ReturnValue) { 6752c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar llvm::Value *RV = 0; 6762c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 6772c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar // Functions with no result always return void. 678cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov if (ReturnValue) { 67988b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar QualType RetTy = FI.getReturnType(); 680b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &RetAI = FI.getReturnInfo(); 681cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov 6822c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 68311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 6843aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar if (RetTy->isAnyComplexType()) { 6853aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false); 6863aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar StoreComplexToAddr(RT, CurFn->arg_begin(), false); 6873aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 6883aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy); 6893aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } else { 690cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov EmitStoreOfScalar(Builder.CreateLoad(ReturnValue), CurFn->arg_begin(), 691b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson false, RetTy); 6923aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } 6932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 6948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 695cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 69646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 6972fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // The internal return value temp always will have 6982fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // pointer-to-return-type type. 6992c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar RV = Builder.CreateLoad(ReturnValue); 7002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 7012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 70211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 70311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 705adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar case ABIArgInfo::Coerce: 70654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this); 7078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 7088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 7098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 7101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(0 && "Invalid ABI kind for return argument"); 71117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 71217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7142c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RV) { 7152c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRet(RV); 7162c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else { 7172c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRetVoid(); 7182c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 71917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 72017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 7210139bb96494b4c4ba0824617d5d2495dc7e44c76Anders CarlssonRValue CodeGenFunction::EmitCallArg(const Expr *E, QualType ArgType) { 7224029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson if (ArgType->isReferenceType()) 7234029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson return EmitReferenceBindingToExpr(E, ArgType); 7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7250139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson return EmitAnyExprToTemp(E); 7260139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson} 7270139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson 72888b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel DunbarRValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, 7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::Value *Callee, 730c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar const CallArgList &CallArgs, 731c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar const Decl *TargetDecl) { 732f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: We no longer need the types from CallArgs; lift up and simplify. 73317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::SmallVector<llvm::Value*, 16> Args; 73417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 73517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Handle struct-return functions by passing a pointer to the 73617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // location that we would like to return into. 737bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar QualType RetTy = CallInfo.getReturnType(); 738b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &RetAI = CallInfo.getReturnInfo(); 7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7415db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // If the call returns a temporary with struct return, create a temporary 7425db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // alloca to hold the result. 7435db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (CGM.ReturnTypeUsesSret(CallInfo)) 744adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar Args.push_back(CreateTempAlloca(ConvertTypeForMem(RetTy))); 7451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7464b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar assert(CallInfo.arg_size() == CallArgs.size() && 7474b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar "Mismatch between function signature & arguments."); 748b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar CGFunctionInfo::const_arg_iterator info_it = CallInfo.arg_begin(); 7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end(); 750b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar I != E; ++I, ++info_it) { 751b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &ArgInfo = info_it->info; 75217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar RValue RV = I->first; 7535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar switch (ArgInfo.getKind()) { 75511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 7561f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar if (RV.isScalar() || RV.isComplex()) { 7571f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // Make a temporary alloca to pass the argument. 758adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar Args.push_back(CreateTempAlloca(ConvertTypeForMem(I->second))); 7591f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar if (RV.isScalar()) 760b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson EmitStoreOfScalar(RV.getScalarVal(), Args.back(), false, I->second); 7611f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar else 7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StoreComplexToAddr(RV.getComplexVal(), Args.back(), false); 7631f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } else { 7641f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar Args.push_back(RV.getAggregateAddr()); 7651f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } 7661f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar break; 7671f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar 768cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 76946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 7705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (RV.isScalar()) { 7715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 7725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else if (RV.isComplex()) { 7732fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar llvm::Value *Tmp = llvm::UndefValue::get(ConvertType(I->second)); 7742fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().first, 0); 7752fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().second, 1); 7762fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Args.push_back(Tmp); 7775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 7782fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Args.push_back(Builder.CreateLoad(RV.getAggregateAddr())); 7795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 7805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 78311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 78411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 78589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar case ABIArgInfo::Coerce: { 78689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar // FIXME: Avoid the conversion through memory if possible. 78789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar llvm::Value *SrcPtr; 78889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar if (RV.isScalar()) { 7895a1be6e16ba306c349a3c3f80e9dce800976bc24Daniel Dunbar SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce"); 790b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, I->second); 79189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar } else if (RV.isComplex()) { 792adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce"); 79389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar StoreComplexToAddr(RV.getComplexVal(), SrcPtr, false); 7941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 79589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar SrcPtr = RV.getAggregateAddr(); 7961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.push_back(CreateCoercedLoad(SrcPtr, ArgInfo.getCoerceToType(), 79789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar *this)); 79889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar break; 79989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar } 80089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar 8015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: 8025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(I->second, RV, Args); 8035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 80417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 80517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8075db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // If the callee is a bitcast of a function to a varargs pointer to function 8085db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // type, check to see if we can remove the bitcast. This handles some cases 8095db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // with unprototyped functions. 8105db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Callee)) 8115db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (llvm::Function *CalleeF = dyn_cast<llvm::Function>(CE->getOperand(0))) { 8125db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner const llvm::PointerType *CurPT=cast<llvm::PointerType>(Callee->getType()); 8135db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner const llvm::FunctionType *CurFT = 8145db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner cast<llvm::FunctionType>(CurPT->getElementType()); 8155db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner const llvm::FunctionType *ActualFT = CalleeF->getFunctionType(); 8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8175db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (CE->getOpcode() == llvm::Instruction::BitCast && 8185db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner ActualFT->getReturnType() == CurFT->getReturnType() && 819d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner ActualFT->getNumParams() == CurFT->getNumParams() && 820d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner ActualFT->getNumParams() == Args.size()) { 8215db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner bool ArgsMatch = true; 8225db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner for (unsigned i = 0, e = ActualFT->getNumParams(); i != e; ++i) 8235db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (ActualFT->getParamType(i) != CurFT->getParamType(i)) { 8245db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner ArgsMatch = false; 8255db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner break; 8265db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner } 8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8285db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // Strip the cast if we can get away with it. This is a nice cleanup, 8295db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // but also allows us to inline the function at -O0 if it is marked 8305db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // always_inline. 8315db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (ArgsMatch) 8325db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner Callee = CalleeF; 8335db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner } 8345db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner } 8351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 83617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 8379834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar llvm::BasicBlock *InvokeDest = getInvokeDest(); 838761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel CodeGen::AttributeListType AttributeList; 839c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar CGM.ConstructAttributeList(CallInfo, TargetDecl, AttributeList); 8409834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar llvm::AttrListPtr Attrs = llvm::AttrListPtr::get(AttributeList.begin(), 8419834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar AttributeList.end()); 8421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 843d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar llvm::CallSite CS; 844d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar if (!InvokeDest || (Attrs.getFnAttributes() & llvm::Attribute::NoUnwind)) { 845beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size()); 8469834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar } else { 8479834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar llvm::BasicBlock *Cont = createBasicBlock("invoke.cont"); 8481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CS = Builder.CreateInvoke(Callee, Cont, InvokeDest, 849beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Args.data(), Args.data()+Args.size()); 8509834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar EmitBlock(Cont); 851f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar } 852f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar 853d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar CS.setAttributes(Attrs); 8545db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (const llvm::Function *F = 8555db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner dyn_cast<llvm::Function>(Callee->stripPointerCasts())) 856d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar CS.setCallingConv(F->getCallingConv()); 857d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar 858d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar // If the call doesn't return, finish the basic block and clear the 859d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar // insertion point; this allows the rest of IRgen to discard 860d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar // unreachable code. 861d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar if (CS.doesNotReturn()) { 862d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar Builder.CreateUnreachable(); 863d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar Builder.ClearInsertionPoint(); 8641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 865f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: For now, emit a dummy basic block because expr emitters in 866f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // generally are not ready to handle emitting expressions at unreachable 867f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // points. 868d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar EnsureInsertPoint(); 8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 870d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar // Return a reasonable RValue. 871d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar return GetUndefRValue(RetTy); 8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 873d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar 874d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar llvm::Instruction *CI = CS.getInstruction(); 8750032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson if (Builder.isNamePreserving() && 8760032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson CI->getType() != llvm::Type::getVoidTy(VMContext)) 87717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setName("call"); 8782c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 8792c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 88011e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 8812c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isAnyComplexType()) 8825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getComplex(LoadComplexFromAddr(Args[0], false)); 8833403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 8845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getAggregate(Args[0]); 8853403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner return RValue::get(EmitLoadOfScalar(Args[0], false, RetTy)); 8868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 887cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 88846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 8892fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar if (RetTy->isAnyComplexType()) { 8902fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar llvm::Value *Real = Builder.CreateExtractValue(CI, 0); 8912fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar llvm::Value *Imag = Builder.CreateExtractValue(CI, 1); 8922fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar return RValue::getComplex(std::make_pair(Real, Imag)); 8933403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner } 8943403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 895adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "agg.tmp"); 8962fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Builder.CreateStore(CI, V); 8972fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar return RValue::getAggregate(V); 8983403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner } 8993403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner return RValue::get(CI); 9002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 90111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 9020bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar // If we are ignoring an argument that had a result, make sure to 9030bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar // construct the appropriate return value for our caller. 90413e81737a433b23f8c662d10d1d57356122a8caaDaniel Dunbar return GetUndefRValue(RetTy); 90511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 906639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar case ABIArgInfo::Coerce: { 90789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar // FIXME: Avoid the conversion through memory if possible. 908adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "coerce"); 90954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CreateCoercedStore(CI, V, *this); 910ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson if (RetTy->isAnyComplexType()) 911ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson return RValue::getComplex(LoadComplexFromAddr(V, false)); 9123403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 913ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson return RValue::getAggregate(V); 9143403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner return RValue::get(EmitLoadOfScalar(V, false, RetTy)); 915639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 9168951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 9178951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 9181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(0 && "Invalid ABI kind for return argument"); 91917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 9202c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 9212c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar assert(0 && "Unhandled ABIArgInfo::Kind"); 9222c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return RValue::get(0); 92317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 924b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar 925b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar/* VarArg handling */ 926b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar 927b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty) { 928b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar return CGM.getTypes().getABIInfo().EmitVAArg(VAListAddr, Ty, *this); 929b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar} 930