CGCall.cpp revision 45483f7a1b3e57b4603b141bee80596b2d4dd443
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 36541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst 3772564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionNoProtoType *FTNP) { 38541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar return getFunctionInfo(FTNP->getResultType(), 39541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16>()); 4045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 4145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 42541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst 4372564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionProtoType *FTP) { 44541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 45541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar // FIXME: Kill copy. 4645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 47541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(FTP->getArgType(i)); 48541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar return getFunctionInfo(FTP->getResultType(), ArgTys); 4945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 5045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 51f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) { 52f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson llvm::SmallVector<QualType, 16> ArgTys; 533eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner // Add the 'this' pointer unless this is a static method. 543eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner if (MD->isInstance()) 553eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner ArgTys.push_back(MD->getThisType(Context)); 56f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson 57f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson const FunctionProtoType *FTP = MD->getType()->getAsFunctionProtoType(); 58f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 59f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson ArgTys.push_back(FTP->getArgType(i)); 60f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson return getFunctionInfo(FTP->getResultType(), ArgTys); 61f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson} 62f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson 63541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionDecl *FD) { 643eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) 65f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson if (MD->isInstance()) 66f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson return getFunctionInfo(MD); 67f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson 680dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const FunctionType *FTy = FD->getType()->getAsFunctionType(); 6972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor if (const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(FTy)) 70541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar return getFunctionInfo(FTP); 7172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor return getFunctionInfo(cast<FunctionNoProtoType>(FTy)); 720dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 730dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 74541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) { 75541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 76541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(MD->getSelfDecl()->getType()); 77541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(Context.getObjCSelType()); 78541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar // FIXME: Kill copy? 792073216a1075767b5d25c23d1462b7034686d94dChris Lattner for (ObjCMethodDecl::param_iterator i = MD->param_begin(), 800dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar e = MD->param_end(); i != e; ++i) 81541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back((*i)->getType()); 82541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar return getFunctionInfo(MD->getResultType(), ArgTys); 830dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 840dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 85541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, 86541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar const CallArgList &Args) { 87541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar // FIXME: Kill copy. 88541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 89725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar for (CallArgList::const_iterator i = Args.begin(), e = Args.end(); 90725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar i != e; ++i) 91541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(i->second); 92541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar return getFunctionInfo(ResTy, ArgTys); 930dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 940dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 95541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, 96541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar const FunctionArgList &Args) { 97541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar // FIXME: Kill copy. 98541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar llvm::SmallVector<QualType, 16> ArgTys; 99bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); 100bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar i != e; ++i) 101541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar ArgTys.push_back(i->second); 102541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar return getFunctionInfo(ResTy, ArgTys); 103541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar} 104541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar 105541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, 106541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar const llvm::SmallVector<QualType, 16> &ArgTys) { 10740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar // Lookup or create unique function info. 10840a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar llvm::FoldingSetNodeID ID; 10940a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar CGFunctionInfo::Profile(ID, ResTy, ArgTys.begin(), ArgTys.end()); 11040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar 11140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar void *InsertPos = 0; 11240a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos); 11340a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar if (FI) 11440a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar return *FI; 11540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar 11688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar // Construct the function info. 11740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar FI = new CGFunctionInfo(ResTy, ArgTys); 11835e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar FunctionInfos.InsertNode(FI, InsertPos); 119541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar 12088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar // Compute ABI information. 1216bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar getABIInfo().computeInfo(*FI, getContext()); 122541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar 12388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar return *FI; 1240dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 12517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 12688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel DunbarCGFunctionInfo::CGFunctionInfo(QualType ResTy, 12788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar const llvm::SmallVector<QualType, 16> &ArgTys) { 12888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar NumArgs = ArgTys.size(); 12988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar Args = new ArgInfo[1 + NumArgs]; 13088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar Args[0].type = ResTy; 13188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar for (unsigned i = 0; i < NumArgs; ++i) 13288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar Args[1 + i].type = ArgTys[i]; 13388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar} 13488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar 13588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar/***/ 13688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar 1375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty, 1385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> &ArgTys) { 1395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 1405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 1415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordDecl *RD = RT->getDecl(); 1425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(!RD->hasFlexibleArrayMember() && 1435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with flexible array."); 1445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1456ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(Context), 1466ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor e = RD->field_end(Context); i != e; ++i) { 1475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const FieldDecl *FD = *i; 1485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(!FD->isBitField() && 1495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with bit-field members."); 1505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 1525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 1535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar GetExpandedTypes(FT, ArgTys); 1545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 1555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ArgTys.push_back(ConvertType(FT)); 1565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 1595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator 1615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV, 1625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator AI) { 1635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 1645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 1655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 1675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(LV.isSimple() && 1685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-simple lvalue during struct expansion."); 1695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = LV.getAddress(); 1706ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(getContext()), 1716ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor e = RD->field_end(getContext()); i != e; ++i) { 1725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar FieldDecl *FD = *i; 1735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 1745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 1765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 1775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 1785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI = ExpandTypeFromArgs(FT, LV, AI); 1795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 1805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitStoreThroughLValue(RValue::get(AI), LV, FT); 1815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 1825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return AI; 1865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 1875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid 1895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV, 1905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::SmallVector<llvm::Value*, 16> &Args) { 1915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 1925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 1935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 1945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 1955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isAggregate() && "Unexpected rvalue during struct expansion"); 1965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = RV.getAggregateAddr(); 1976ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(getContext()), 1986ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor e = RD->field_end(getContext()); i != e; ++i) { 1995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar FieldDecl *FD = *i; 2005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 2015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 2025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 2035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 2045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 2055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args); 2065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 2075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RValue RV = EmitLoadOfLValue(LV, FT); 2085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isScalar() && 2095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-scalar rvalue during struct expansion."); 2105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 2115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 2125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 2135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 2145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 215275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as 216275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty. 217275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// 218275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the 219275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not 220275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined. 221275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr, 222275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *Ty, 223275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CodeGenFunction &CGF) { 224275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *SrcTy = 225275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar cast<llvm::PointerType>(SrcPtr->getType())->getElementType(); 2269408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy); 2279408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(Ty); 228275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 229b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar // If load is legal, just bitcast the src pointer. 2307ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar if (SrcSize >= DstSize) { 231f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // Generally SrcSize is never greater than DstSize, since this means we are 232f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // losing bits. However, this can happen in cases where the structure has 233f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // additional padding, for example due to a user specified alignment. 2347ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar // 235f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: Assert that we aren't truncating non-padding bits when have access 236f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // to that information. 237275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 238275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty)); 239386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted); 240386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar // FIXME: Use better alignment / avoid requiring aligned load. 241386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar Load->setAlignment(1); 242386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar return Load; 243275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } else { 244275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // Otherwise do coercion through memory. This is stupid, but 245275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // simple. 246275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Tmp = CGF.CreateTempAlloca(Ty); 247275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 248275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy)); 249386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar llvm::StoreInst *Store = 250386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted); 251386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar // FIXME: Use better alignment / avoid requiring aligned store. 252386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar Store->setAlignment(1); 253275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar return CGF.Builder.CreateLoad(Tmp); 254275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } 255275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar} 256275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 257275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src, 258275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types. 259275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// 260275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the 261275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost. 262275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src, 263275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *DstPtr, 264275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CodeGenFunction &CGF) { 265275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *SrcTy = Src->getType(); 266275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *DstTy = 267275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar cast<llvm::PointerType>(DstPtr->getType())->getElementType(); 268275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 2699408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy); 2709408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(DstTy); 271275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 27288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar // If store is legal, just bitcast the src pointer. 273fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar if (SrcSize <= DstSize) { 274275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 275275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy)); 276386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar // FIXME: Use better alignment / avoid requiring aligned store. 277386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar CGF.Builder.CreateStore(Src, Casted)->setAlignment(1); 278275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } else { 279275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // Otherwise do coercion through memory. This is stupid, but 280275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // simple. 281fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar 282fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // Generally SrcSize is never greater than DstSize, since this means we are 283fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // losing bits. However, this can happen in cases where the structure has 284fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // additional padding, for example due to a user specified alignment. 285fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // 286fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // FIXME: Assert that we aren't truncating non-padding bits when have access 287fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar // to that information. 288275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy); 289275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateStore(Src, Tmp); 290275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 291275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy)); 292386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted); 293386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar // FIXME: Use better alignment / avoid requiring aligned load. 294386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar Load->setAlignment(1); 295386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar CGF.Builder.CreateStore(Load, DstPtr); 296275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } 297275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar} 298275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 2995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/ 3005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 30188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) { 30211e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar return FI.getReturnInfo().isIndirect(); 303bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar} 304bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar 30545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType * 306bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) { 30745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar std::vector<const llvm::Type*> ArgTys; 30845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 30945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar const llvm::Type *ResultType = 0; 31045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 311a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar QualType RetTy = FI.getReturnType(); 312b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &RetAI = FI.getReturnInfo(); 3138951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (RetAI.getKind()) { 3148951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 3158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 3168951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 317cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 31846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 31946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar ResultType = ConvertType(RetTy); 32046327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar break; 32146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar 32211e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: { 32311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar assert(!RetAI.getIndirectAlign() && "Align unused on indirect return."); 32445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ResultType = llvm::Type::VoidTy; 32562d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar const llvm::Type *STy = ConvertType(RetTy); 32645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace())); 32745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 32845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 32945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 33011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 33111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar ResultType = llvm::Type::VoidTy; 33211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 33311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 33445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::Coerce: 335639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar ResultType = RetAI.getCoerceToType(); 33645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 33745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 33845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 33988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), 34088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar ie = FI.arg_end(); it != ie; ++it) { 34188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar const ABIArgInfo &AI = it->info; 3428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 3438951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 34411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 34511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 34611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 3475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 34889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar ArgTys.push_back(AI.getCoerceToType()); 34989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar break; 35089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar 351adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar case ABIArgInfo::Indirect: { 35211e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar // indirect arguments are always on the stack, which is addr space #0. 353adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar const llvm::Type *LTy = ConvertTypeForMem(it->type); 354adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar ArgTys.push_back(llvm::PointerType::getUnqual(LTy)); 3558951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 356adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar } 357cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov 358cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 35946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 3601f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar ArgTys.push_back(ConvertType(it->type)); 3618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 3628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 3638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 36488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar GetExpandedTypes(it->type, ArgTys); 3658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 3668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 36745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 36845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 369bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic); 3703913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar} 3713913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar 372a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbarvoid CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, 37388b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar const Decl *TargetDecl, 374761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeListType &PAL) { 3755323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned FuncAttrs = 0; 376a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel unsigned RetAttrs = 0; 3775323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 3781102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // FIXME: handle sseregparm someday... 3795323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl) { 38068584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (TargetDecl->hasAttr<NoThrowAttr>(getContext())) 381761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel FuncAttrs |= llvm::Attribute::NoUnwind; 38268584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (TargetDecl->hasAttr<NoReturnAttr>(getContext())) 383761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel FuncAttrs |= llvm::Attribute::NoReturn; 38468584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (TargetDecl->hasAttr<ConstAttr>(getContext())) 385232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson FuncAttrs |= llvm::Attribute::ReadNone; 38668584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor else if (TargetDecl->hasAttr<PureAttr>(getContext())) 38764c2e0762628eba26c100642521b6100c2515cc5Daniel Dunbar FuncAttrs |= llvm::Attribute::ReadOnly; 3885323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 3895323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 39024095dad88dd9d48aa16afa6416417073af251b5Devang Patel if (CompileOpts.DisableRedZone) 39124095dad88dd9d48aa16afa6416417073af251b5Devang Patel FuncAttrs |= llvm::Attribute::NoRedZone; 392acebb397fa5d63835a0de9cee144987057ec1333Devang Patel if (CompileOpts.NoImplicitFloat) 393acebb397fa5d63835a0de9cee144987057ec1333Devang Patel FuncAttrs |= llvm::Attribute::NoImplicitFloat; 39424095dad88dd9d48aa16afa6416417073af251b5Devang Patel 39545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Features.StackProtector == 1) 39645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling FuncAttrs |= llvm::Attribute::StackProtect; 39745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling else if (Features.StackProtector == 2) 39845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling FuncAttrs |= llvm::Attribute::StackProtectReq; 39945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 400a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar QualType RetTy = FI.getReturnType(); 4015323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned Index = 1; 402b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &RetAI = FI.getReturnInfo(); 40345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar switch (RetAI.getKind()) { 404cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 405cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov if (RetTy->isSignedIntegerType()) { 406cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov RetAttrs |= llvm::Attribute::SExt; 407cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov } else if (RetTy->isUnsignedIntegerType()) { 408cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov RetAttrs |= llvm::Attribute::ZExt; 409cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov } 410cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov // FALLTHROUGH 41146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 4122c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 4132c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 41411e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 415761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel PAL.push_back(llvm::AttributeWithIndex::get(Index, 416725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar llvm::Attribute::StructRet | 417725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar llvm::Attribute::NoAlias)); 4185323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar ++Index; 4190ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar // sret disables readnone and readonly 4200ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar FuncAttrs &= ~(llvm::Attribute::ReadOnly | 4210ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar llvm::Attribute::ReadNone); 4222c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 4232c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 42411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 4252c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Coerce: 4262c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 4278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 4288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 4298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 4305323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 4312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 432a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel if (RetAttrs) 433a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs)); 4341102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov 4351102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // FIXME: we need to honour command line settings also... 4361102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // FIXME: RegParm should be reduced in case of nested functions and/or global 4371102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // register variable. 4381102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov signed RegParm = 0; 4391102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov if (TargetDecl) 44068584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (const RegparmAttr *RegParmAttr 44168584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor = TargetDecl->getAttr<RegparmAttr>(getContext())) 4421102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov RegParm = RegParmAttr->getNumParams(); 4431102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov 4441102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov unsigned PointerWidth = getContext().Target.getPointerWidth(0); 44588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), 44688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar ie = FI.arg_end(); it != ie; ++it) { 44788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar QualType ParamType = it->type; 44888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar const ABIArgInfo &AI = it->info; 449761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel unsigned Attributes = 0; 4501102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov 4518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 45289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar case ABIArgInfo::Coerce: 45389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar break; 45489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar 45511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 456761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel Attributes |= llvm::Attribute::ByVal; 4571102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov Attributes |= 45811e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign()); 4590ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar // byval disables readnone and readonly. 4600ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar FuncAttrs &= ~(llvm::Attribute::ReadOnly | 4610ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar llvm::Attribute::ReadNone); 4628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 463cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov 464cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 465cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov if (ParamType->isSignedIntegerType()) { 466cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov Attributes |= llvm::Attribute::SExt; 467cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov } else if (ParamType->isUnsignedIntegerType()) { 468cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov Attributes |= llvm::Attribute::ZExt; 469cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov } 470cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov // FALLS THROUGH 47146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 4721102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov if (RegParm > 0 && 4731102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov (ParamType->isIntegerType() || ParamType->isPointerType())) { 4741102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov RegParm -= 4751102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov (Context.getTypeSize(ParamType) + PointerWidth - 1) / PointerWidth; 4761102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov if (RegParm >= 0) 4771102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov Attributes |= llvm::Attribute::InReg; 4781102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov } 4791102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov // FIXME: handle sseregparm someday... 4808951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 4811102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov 48211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 48311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar // Skip increment, no matching LLVM parameter. 48411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar continue; 48511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 4865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 4875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> Tys; 488f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: This is rather inefficient. Do we ever actually need to do 489f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // anything here? The result should be just reconstructed on the other 490f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // side, so extension should be a non-issue. 4915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar getTypes().GetExpandedTypes(ParamType, Tys); 4925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Index += Tys.size(); 4935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 4945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 4955323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 4968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 497761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel if (Attributes) 498761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes)); 4995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++Index; 5005323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 501a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel if (FuncAttrs) 502a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs)); 5035323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 5045323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 50588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI, 50688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar llvm::Function *Fn, 50717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const FunctionArgList &Args) { 508f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: We no longer need the types from FunctionArgList; lift up and 509f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // simplify. 5105251afa21d3583f2740fd4f83659d008625a7260Daniel Dunbar 51117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Emit allocs for param decls. Give the LLVM Argument nodes names. 51217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Function::arg_iterator AI = Fn->arg_begin(); 51317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 51417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Name the struct return argument. 51588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar if (CGM.ReturnTypeUsesSret(FI)) { 51617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar AI->setName("agg.result"); 51717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar ++AI; 51817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 519b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar 5204b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar assert(FI.arg_size() == Args.size() && 5214b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar "Mismatch between function signature & arguments."); 522b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar CGFunctionInfo::const_arg_iterator info_it = FI.arg_begin(); 52317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); 524b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar i != e; ++i, ++info_it) { 52517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const VarDecl *Arg = i->first; 526b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar QualType Ty = info_it->type; 527b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &ArgI = info_it->info; 5288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (ArgI.getKind()) { 5301f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar case ABIArgInfo::Indirect: { 5311f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar llvm::Value* V = AI; 5321f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar if (hasAggregateLLVMType(Ty)) { 5331f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // Do nothing, aggregates and complex variables are accessed by 5341f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // reference. 5351f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } else { 5361f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // Load scalar value from indirect argument. 537adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar V = EmitLoadOfScalar(V, false, Ty); 5381f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 5391f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // This must be a promotion, for something like 5401f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // "void a(x) short x; {..." 5411f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 5421f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } 5431f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } 5441f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar EmitParmDecl(*Arg, V); 5451f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar break; 5461f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } 547cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov 548cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 54946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: { 5508951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI != Fn->arg_end() && "Argument mismatch!"); 5518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar llvm::Value* V = AI; 5522fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar if (hasAggregateLLVMType(Ty)) { 5532fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // Create a temporary alloca to hold the argument; the rest of 5542fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // codegen expects to access aggregates & complex values by 5552fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // reference. 556adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar V = CreateTempAlloca(ConvertTypeForMem(Ty)); 5572fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Builder.CreateStore(AI, V); 5582fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar } else { 5592fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 5602fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // This must be a promotion, for something like 5612fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // "void a(x) short x; {..." 5622fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 5632fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar } 56417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 5658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar EmitParmDecl(*Arg, V); 5668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 5678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 5688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 570b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar // If this structure was expanded into multiple arguments then 5715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // we need to create a temporary and reconstruct it from the 5725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // arguments. 57339f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = Arg->getNameAsString(); 574adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar llvm::Value *Temp = CreateTempAlloca(ConvertTypeForMem(Ty), 5755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar (Name + ".addr").c_str()); 5765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 5775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator End = 5785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI); 5795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitParmDecl(*Arg, Temp); 5805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 5815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // Name the arguments used in expansion and increment AI. 5825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar unsigned Index = 0; 5835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (; AI != End; ++AI, ++Index) 5845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI->setName(Name + "." + llvm::utostr(Index)); 5855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 5865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 58711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 58811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 5898b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar // Initialize the local variable appropriately. 5908b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar if (hasAggregateLLVMType(Ty)) { 591adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar EmitParmDecl(*Arg, CreateTempAlloca(ConvertTypeForMem(Ty))); 5928b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar } else { 5938b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType()))); 5948b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar } 5958b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar 59659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar // Skip increment, no matching LLVM parameter. 59759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar continue; 59811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 59989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar case ABIArgInfo::Coerce: { 60089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar assert(AI != Fn->arg_end() && "Argument mismatch!"); 601f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: This is very wasteful; EmitParmDecl is just going to drop the 602f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // result in a new alloca anyway, so we could just store into that 603f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // directly if we broke the abstraction down more. 604adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(Ty), "coerce"); 60589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar CreateCoercedStore(AI, V, *this); 60689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar // Match to what EmitParmDecl is expecting for this type. 6078b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar if (!CodeGenFunction::hasAggregateLLVMType(Ty)) { 608adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar V = EmitLoadOfScalar(V, false, Ty); 6098b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 6108b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar // This must be a promotion, for something like 6118b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar // "void a(x) short x; {..." 6128b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 6138b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar } 6148b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar } 61589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar EmitParmDecl(*Arg, V); 61689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar break; 61789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar } 6188951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 6195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 6205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 62117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 62217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar assert(AI == Fn->arg_end() && "Argument mismatch!"); 62317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 62417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 62588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI, 62617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Value *ReturnValue) { 6272c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar llvm::Value *RV = 0; 6282c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 6292c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar // Functions with no result always return void. 630cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov if (ReturnValue) { 63188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar QualType RetTy = FI.getReturnType(); 632b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &RetAI = FI.getReturnInfo(); 633cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov 6342c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 63511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 6363aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar if (RetTy->isAnyComplexType()) { 6373aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false); 6383aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar StoreComplexToAddr(RT, CurFn->arg_begin(), false); 6393aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 6403aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy); 6413aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } else { 642cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov EmitStoreOfScalar(Builder.CreateLoad(ReturnValue), CurFn->arg_begin(), 643b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson false, RetTy); 6443aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } 6452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 6468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 647cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 64846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 6492fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // The internal return value temp always will have 6502fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar // pointer-to-return-type type. 6512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar RV = Builder.CreateLoad(ReturnValue); 6522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 6532c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 65411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 65511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 65611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 657adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar case ABIArgInfo::Coerce: 65854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this); 6598951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 6608951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 6618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 6628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 66317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 66417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 6652c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 6662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RV) { 6672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRet(RV); 6682c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else { 6692c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRetVoid(); 6702c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 67117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 67217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 6730139bb96494b4c4ba0824617d5d2495dc7e44c76Anders CarlssonRValue CodeGenFunction::EmitCallArg(const Expr *E, QualType ArgType) { 6744029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson if (ArgType->isReferenceType()) 6754029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson return EmitReferenceBindingToExpr(E, ArgType); 6764029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson 6770139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson return EmitAnyExprToTemp(E); 6780139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson} 6790139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson 68088b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel DunbarRValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, 68188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar llvm::Value *Callee, 682c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar const CallArgList &CallArgs, 683c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar const Decl *TargetDecl) { 684f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: We no longer need the types from CallArgs; lift up and simplify. 68517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::SmallVector<llvm::Value*, 16> Args; 68617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 68717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Handle struct-return functions by passing a pointer to the 68817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // location that we would like to return into. 689bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar QualType RetTy = CallInfo.getReturnType(); 690b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &RetAI = CallInfo.getReturnInfo(); 6915db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner 6925db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner 6935db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // If the call returns a temporary with struct return, create a temporary 6945db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // alloca to hold the result. 6955db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (CGM.ReturnTypeUsesSret(CallInfo)) 696adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar Args.push_back(CreateTempAlloca(ConvertTypeForMem(RetTy))); 69717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 6984b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar assert(CallInfo.arg_size() == CallArgs.size() && 6994b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar "Mismatch between function signature & arguments."); 700b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar CGFunctionInfo::const_arg_iterator info_it = CallInfo.arg_begin(); 70117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end(); 702b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar I != E; ++I, ++info_it) { 703b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar const ABIArgInfo &ArgInfo = info_it->info; 70417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar RValue RV = I->first; 7055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar switch (ArgInfo.getKind()) { 70711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 7081f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar if (RV.isScalar() || RV.isComplex()) { 7091f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar // Make a temporary alloca to pass the argument. 710adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar Args.push_back(CreateTempAlloca(ConvertTypeForMem(I->second))); 7111f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar if (RV.isScalar()) 712b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson EmitStoreOfScalar(RV.getScalarVal(), Args.back(), false, I->second); 7131f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar else 7141f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar StoreComplexToAddr(RV.getComplexVal(), Args.back(), false); 7151f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } else { 7161f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar Args.push_back(RV.getAggregateAddr()); 7171f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar } 7181f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar break; 7191f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar 720cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 72146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 7225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (RV.isScalar()) { 7235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 7245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else if (RV.isComplex()) { 7252fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar llvm::Value *Tmp = llvm::UndefValue::get(ConvertType(I->second)); 7262fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().first, 0); 7272fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().second, 1); 7282fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Args.push_back(Tmp); 7295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 7302fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Args.push_back(Builder.CreateLoad(RV.getAggregateAddr())); 7315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 7325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 7335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 73411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 73511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 73611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 73789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar case ABIArgInfo::Coerce: { 73889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar // FIXME: Avoid the conversion through memory if possible. 73989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar llvm::Value *SrcPtr; 74089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar if (RV.isScalar()) { 7415a1be6e16ba306c349a3c3f80e9dce800976bc24Daniel Dunbar SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce"); 742b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, I->second); 74389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar } else if (RV.isComplex()) { 744adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce"); 74589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar StoreComplexToAddr(RV.getComplexVal(), SrcPtr, false); 74689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar } else 74789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar SrcPtr = RV.getAggregateAddr(); 74889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar Args.push_back(CreateCoercedLoad(SrcPtr, ArgInfo.getCoerceToType(), 74989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar *this)); 75089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar break; 75189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar } 75289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar 7535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: 7545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(I->second, RV, Args); 7555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 75617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 75717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 7585db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner 7595db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // If the callee is a bitcast of a function to a varargs pointer to function 7605db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // type, check to see if we can remove the bitcast. This handles some cases 7615db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // with unprototyped functions. 7625db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Callee)) 7635db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (llvm::Function *CalleeF = dyn_cast<llvm::Function>(CE->getOperand(0))) { 7645db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner const llvm::PointerType *CurPT=cast<llvm::PointerType>(Callee->getType()); 7655db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner const llvm::FunctionType *CurFT = 7665db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner cast<llvm::FunctionType>(CurPT->getElementType()); 7675db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner const llvm::FunctionType *ActualFT = CalleeF->getFunctionType(); 7685db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner 7695db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (CE->getOpcode() == llvm::Instruction::BitCast && 7705db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner ActualFT->getReturnType() == CurFT->getReturnType() && 771d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner ActualFT->getNumParams() == CurFT->getNumParams() && 772d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner ActualFT->getNumParams() == Args.size()) { 7735db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner bool ArgsMatch = true; 7745db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner for (unsigned i = 0, e = ActualFT->getNumParams(); i != e; ++i) 7755db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (ActualFT->getParamType(i) != CurFT->getParamType(i)) { 7765db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner ArgsMatch = false; 7775db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner break; 7785db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner } 7795db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner 7805db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // Strip the cast if we can get away with it. This is a nice cleanup, 7815db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // but also allows us to inline the function at -O0 if it is marked 7825db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner // always_inline. 7835db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (ArgsMatch) 7845db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner Callee = CalleeF; 7855db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner } 7865db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner } 7875db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner 78817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 7899834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar llvm::BasicBlock *InvokeDest = getInvokeDest(); 790761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel CodeGen::AttributeListType AttributeList; 791c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar CGM.ConstructAttributeList(CallInfo, TargetDecl, AttributeList); 7929834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar llvm::AttrListPtr Attrs = llvm::AttrListPtr::get(AttributeList.begin(), 7939834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar AttributeList.end()); 794725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar 795d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar llvm::CallSite CS; 796d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar if (!InvokeDest || (Attrs.getFnAttributes() & llvm::Attribute::NoUnwind)) { 797beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size()); 7989834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar } else { 7999834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar llvm::BasicBlock *Cont = createBasicBlock("invoke.cont"); 800d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar CS = Builder.CreateInvoke(Callee, Cont, InvokeDest, 801beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Args.data(), Args.data()+Args.size()); 8029834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar EmitBlock(Cont); 803f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar } 804f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar 805d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar CS.setAttributes(Attrs); 8065db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner if (const llvm::Function *F = 8075db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner dyn_cast<llvm::Function>(Callee->stripPointerCasts())) 808d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar CS.setCallingConv(F->getCallingConv()); 809d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar 810d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar // If the call doesn't return, finish the basic block and clear the 811d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar // insertion point; this allows the rest of IRgen to discard 812d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar // unreachable code. 813d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar if (CS.doesNotReturn()) { 814d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar Builder.CreateUnreachable(); 815d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar Builder.ClearInsertionPoint(); 816d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar 817f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: For now, emit a dummy basic block because expr emitters in 818f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // generally are not ready to handle emitting expressions at unreachable 819f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // points. 820d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar EnsureInsertPoint(); 821d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar 822d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar // Return a reasonable RValue. 823d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar return GetUndefRValue(RetTy); 824d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar } 825d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar 826d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar llvm::Instruction *CI = CS.getInstruction(); 8273403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner if (Builder.isNamePreserving() && CI->getType() != llvm::Type::VoidTy) 82817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setName("call"); 8292c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 8302c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 83111e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar case ABIArgInfo::Indirect: 8322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isAnyComplexType()) 8335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getComplex(LoadComplexFromAddr(Args[0], false)); 8343403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 8355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getAggregate(Args[0]); 8363403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner return RValue::get(EmitLoadOfScalar(Args[0], false, RetTy)); 8378951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 838cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case ABIArgInfo::Extend: 83946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar case ABIArgInfo::Direct: 8402fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar if (RetTy->isAnyComplexType()) { 8412fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar llvm::Value *Real = Builder.CreateExtractValue(CI, 0); 8422fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar llvm::Value *Imag = Builder.CreateExtractValue(CI, 1); 8432fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar return RValue::getComplex(std::make_pair(Real, Imag)); 8443403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner } 8453403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 846adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "agg.tmp"); 8472fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar Builder.CreateStore(CI, V); 8482fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar return RValue::getAggregate(V); 8493403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner } 8503403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner return RValue::get(CI); 8512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 85211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 8530bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar // If we are ignoring an argument that had a result, make sure to 8540bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar // construct the appropriate return value for our caller. 85513e81737a433b23f8c662d10d1d57356122a8caaDaniel Dunbar return GetUndefRValue(RetTy); 85611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 857639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar case ABIArgInfo::Coerce: { 85889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar // FIXME: Avoid the conversion through memory if possible. 859adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "coerce"); 86054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CreateCoercedStore(CI, V, *this); 861ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson if (RetTy->isAnyComplexType()) 862ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson return RValue::getComplex(LoadComplexFromAddr(V, false)); 8633403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 864ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson return RValue::getAggregate(V); 8653403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner return RValue::get(EmitLoadOfScalar(V, false, RetTy)); 866639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 8678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 8688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 8698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 87017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 8712c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 8722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar assert(0 && "Unhandled ABIArgInfo::Kind"); 8732c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return RValue::get(0); 87417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 875b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar 876b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar/* VarArg handling */ 877b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar 878b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty) { 879b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar return CGM.getTypes().getABIInfo().EmitVAArg(VAListAddr, Ty, *this); 880b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar} 881