CGCall.cpp revision d0646bd7c11c12b34971b55e5c1bdd8439401b4c
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" 180dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/ASTContext.h" 190dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/Decl.h" 200dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/DeclObjC.h" 215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar#include "llvm/ADT/StringExtras.h" 22d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel#include "llvm/Attributes.h" 230dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace clang; 240dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace CodeGen; 250dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 260dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/ 270dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 280dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation. 290dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 3045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeNoProto *FTNP) 3145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar : IsVariadic(true) 3245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar{ 3345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTNP->getResultType()); 3445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 3545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 3645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeProto *FTP) 3745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar : IsVariadic(FTP->isVariadic()) 3845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar{ 3945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTP->getResultType()); 4045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 4145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTP->getArgType(i)); 4245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 4345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 4445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar// FIXME: Is there really any reason to have this still? 450dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD) 460dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar{ 470dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const FunctionType *FTy = FD->getType()->getAsFunctionType(); 480dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(FTy); 4945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 500dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(FTy->getResultType()); 5145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar if (FTP) { 5245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar IsVariadic = FTP->isVariadic(); 530dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 540dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(FTP->getArgType(i)); 5545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } else { 5645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar IsVariadic = true; 5745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 580dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 590dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 600dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const ObjCMethodDecl *MD, 610dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const ASTContext &Context) 6245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar : IsVariadic(MD->isVariadic()) 630dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar{ 640dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(MD->getResultType()); 650dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(MD->getSelfDecl()->getType()); 660dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(Context.getObjCSelType()); 670dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar for (ObjCMethodDecl::param_const_iterator i = MD->param_begin(), 680dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar e = MD->param_end(); i != e; ++i) 690dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back((*i)->getType()); 700dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 710dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 725323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGFunctionInfo::argtypes_begin() const { 735323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.begin(); 745323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 755323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 765323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGFunctionInfo::argtypes_end() const { 775323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.end(); 780dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 790dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 800dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/ 810dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 825323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarCGCallInfo::CGCallInfo(QualType _ResultType, const CallArgList &_Args) { 835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar ArgTypes.push_back(_ResultType); 845323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar for (CallArgList::const_iterator i = _Args.begin(), e = _Args.end(); i!=e; ++i) 850dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(i->second); 860dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 870dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 885323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGCallInfo::argtypes_begin() const { 895323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.begin(); 905323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 915323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 925323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGCallInfo::argtypes_end() const { 935323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.end(); 940dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 9517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 9617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar/***/ 9717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// ABIArgInfo - Helper class to encapsulate information about how a 998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// specific C type should be passed to or returned from a function. 1002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarclass ABIArgInfo { 1012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic: 1022c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar enum Kind { 1032c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Default, 1048951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar StructRet, /// Only valid for aggregate return types. 1058951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Coerce, /// Only valid for aggregate return types, the argument 1075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// should be accessed by coercion to a provided type. 1088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ByVal, /// Only valid for aggregate argument types. The 1108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// structure should be passed "byval" with the 1118951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// specified alignment (0 indicates default 1128951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// alignment). 1138951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1148951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar Expand, /// Only valid for aggregate argument types. The 1158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// structure should be expanded into consecutive 1165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// arguments for its constituent fields. Currently 1175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// expand is only allowed on structures whose fields 1185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// are all scalar types or are themselves expandable 1195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// types. 1208951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1218951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar KindFirst=Default, KindLast=Expand 1222c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar }; 1232c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1242c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarprivate: 1252c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Kind TheKind; 126639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar const llvm::Type *TypeData; 1278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned UIntData; 1282c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ABIArgInfo(Kind K, const llvm::Type *TD=0, 1308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned UI=0) : TheKind(K), 1318951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar TypeData(TD), 1328951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar UIntData(0) {} 1332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic: 1342c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar static ABIArgInfo getDefault() { 1358951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(Default); 1362c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 1372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar static ABIArgInfo getStructRet() { 1388951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(StructRet); 1392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 140639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar static ABIArgInfo getCoerce(const llvm::Type *T) { 141639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar assert(T->isSingleValueType() && "Can only coerce to simple types"); 1422c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return ABIArgInfo(Coerce, T); 1432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 1448951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar static ABIArgInfo getByVal(unsigned Alignment) { 1458951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(ByVal, 0, Alignment); 1468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 1475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar static ABIArgInfo getExpand() { 1485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return ABIArgInfo(Expand); 1495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1502c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Kind getKind() const { return TheKind; } 1522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isDefault() const { return TheKind == Default; } 1532c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isStructRet() const { return TheKind == StructRet; } 1542c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isCoerce() const { return TheKind == Coerce; } 1558951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar bool isByVal() const { return TheKind == ByVal; } 1565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar bool isExpand() const { return TheKind == Expand; } 15745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 15845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar // Coerce accessors 159639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar const llvm::Type *getCoerceToType() const { 16045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar assert(TheKind == Coerce && "Invalid kind!"); 16145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar return TypeData; 16245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 1638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // ByVal accessors 1658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned getByValAlignment() const { 1668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(TheKind == ByVal && "Invalid kind!"); 1678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return UIntData; 1688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 1692c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar}; 1702c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1712c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/ 1722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 173834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isEmptyStruct - Return true iff a structure has no non-empty 174834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// members. Note that a structure with a flexible array member is not 175834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered empty. 176834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool isEmptyStruct(QualType T) { 177834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordType *RT = T->getAsStructureType(); 178834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!RT) 179834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 180834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 181834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RD->hasFlexibleArrayMember()) 182834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 183834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar for (RecordDecl::field_const_iterator i = RD->field_begin(), 184834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 185834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 186834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!isEmptyStruct(FD->getType())) 187834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 188834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 189834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return true; 190834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 191834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 192834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isSingleElementStruct - Determine if a structure is a "single 193834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// element struct", i.e. it has exactly one non-empty field or 194834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// exactly one field which is itself a single element 195834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// struct. Structures with flexible array members are never 196834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered single element structs. 197834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// 198834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// \return The field declaration for the single non-empty field, if 199834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// it exists. 200834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic const FieldDecl *isSingleElementStruct(QualType T) { 201834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordType *RT = T->getAsStructureType(); 202834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!RT) 203834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 204834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 205834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 206834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RD->hasFlexibleArrayMember()) 207834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 208834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 209834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *Found = 0; 210834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar for (RecordDecl::field_const_iterator i = RD->field_begin(), 211834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 212834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 213834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar QualType FT = FD->getType(); 214834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 215834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (isEmptyStruct(FT)) { 216834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Ignore 217834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (Found) { 218834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 219834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (!CodeGenFunction::hasAggregateLLVMType(FT)) { 220834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar Found = FD; 221834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else { 222834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar Found = isSingleElementStruct(FT); 223834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!Found) 224834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 225834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 226834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 227834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 228834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return Found; 229834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 230834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 231834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) { 232834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!Ty->getAsBuiltinType() && !Ty->isPointerType()) 233834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 234834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 235834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 236834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return Size == 32 || Size == 64; 237834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 238834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 239834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool areAllFields32Or64BitBasicType(const RecordDecl *RD, 240834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar ASTContext &Context) { 241834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar for (RecordDecl::field_const_iterator i = RD->field_begin(), 242834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 243834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 244834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 245834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!is32Or64BitBasicType(FD->getType(), Context)) 246834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 247834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 248834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // If this is a bit-field we need to make sure it is still a 249834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // 32-bit or 64-bit type. 250834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Expr *BW = FD->getBitWidth()) { 251834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar unsigned Width = BW->getIntegerConstantExprValue(Context).getZExtValue(); 252834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Width <= 16) 253834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 254834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 255834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 256834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return true; 257834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 258834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 259639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbarstatic ABIArgInfo classifyReturnType(QualType RetTy, 260639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar ASTContext &Context) { 2616660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar assert(!RetTy->isArrayType() && 2626660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar "Array types cannot be passed directly."); 2632c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 264834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Classify "single element" structs as their element type. 265834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *SeltFD = isSingleElementStruct(RetTy); 266834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (SeltFD) { 267834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar QualType SeltTy = SeltFD->getType()->getDesugaredType(); 268834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const BuiltinType *BT = SeltTy->getAsBuiltinType()) { 269834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // FIXME: This is gross, it would be nice if we could just 270834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // pass back SeltTy and have clients deal with it. Is it worth 271834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // supporting coerce to both LLVM and clang Types? 272834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (BT->isIntegerType()) { 273834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(SeltTy); 274834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::IntegerType::get((unsigned) Size)); 275834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (BT->getKind() == BuiltinType::Float) { 276834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::FloatTy); 277834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (BT->getKind() == BuiltinType::Double) { 278834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::DoubleTy); 279834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 280834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (SeltTy->isPointerType()) { 281834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // FIXME: It would be really nice if this could come out as 282834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // the proper pointer type. 283834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar llvm::Type *PtrTy = 284834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 285834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(PtrTy); 286834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 287834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 288834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 289639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar uint64_t Size = Context.getTypeSize(RetTy); 290639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar if (Size == 8) { 291639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int8Ty); 292639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 16) { 293639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int16Ty); 294639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 32) { 295639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int32Ty); 296639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 64) { 297639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int64Ty); 298639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else { 299639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getStructRet(); 300639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 3012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else { 3022c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return ABIArgInfo::getDefault(); 3032c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 3042c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar} 3052c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 3068951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbarstatic ABIArgInfo classifyArgumentType(QualType Ty, 307f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ASTContext &Context) { 3088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(!Ty->isArrayType() && "Array types cannot be passed directly."); 309f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(Ty)) { 310834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Structures with flexible arrays are always byval. 311834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const RecordType *RT = Ty->getAsStructureType()) 312834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RT->getDecl()->hasFlexibleArrayMember()) 313834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getByVal(0); 314834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 315834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Expand empty structs (i.e. ignore) 316834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 317834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Ty->isStructureType() && Size == 0) 318834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getExpand(); 319834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 320834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Expand structs with size <= 128-bits which consist only of 321834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // basic types (int, long long, float, double, xxx*). This is 322834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // non-recursive and does not ignore empty fields. 323834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const RecordType *RT = Ty->getAsStructureType()) { 324834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Context.getTypeSize(Ty) <= 4*32 && 325834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar areAllFields32Or64BitBasicType(RT->getDecl(), Context)) 326834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getExpand(); 327834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 328834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 3298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo::getByVal(0); 3308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } else { 3318951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo::getDefault(); 3328951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 3338951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar} 3348951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 335f035738e346da0a82538ab236aef218a27373635Daniel Dunbarstatic ABIArgInfo getABIReturnInfo(QualType Ty, 336f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ASTContext &Context) { 337f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo Info = classifyReturnType(Ty, Context); 338f035738e346da0a82538ab236aef218a27373635Daniel Dunbar // Ensure default on aggregate types is StructRet. 339f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty)) 340f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return ABIArgInfo::getStructRet(); 341f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return Info; 342f035738e346da0a82538ab236aef218a27373635Daniel Dunbar} 343f035738e346da0a82538ab236aef218a27373635Daniel Dunbar 344f035738e346da0a82538ab236aef218a27373635Daniel Dunbarstatic ABIArgInfo getABIArgumentInfo(QualType Ty, 345f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ASTContext &Context) { 346f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo Info = classifyArgumentType(Ty, Context); 347f035738e346da0a82538ab236aef218a27373635Daniel Dunbar // Ensure default on aggregate types is ByVal. 348f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty)) 349f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return ABIArgInfo::getByVal(0); 350f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return Info; 351f035738e346da0a82538ab236aef218a27373635Daniel Dunbar} 352f035738e346da0a82538ab236aef218a27373635Daniel Dunbar 3532c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/ 3542c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 3555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty, 3565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> &ArgTys) { 3575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 3585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 3595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordDecl *RD = RT->getDecl(); 3605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(!RD->hasFlexibleArrayMember() && 3615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with flexible array."); 3625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 3635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (RecordDecl::field_const_iterator i = RD->field_begin(), 3645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 3655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const FieldDecl *FD = *i; 3665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(!FD->isBitField() && 3675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with bit-field members."); 3685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 3695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 3705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 3715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar GetExpandedTypes(FT, ArgTys); 3725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 3735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ArgTys.push_back(ConvertType(FT)); 3745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 3755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 3765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 3775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 3785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator 3795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV, 3805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator AI) { 3815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 3825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 3835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 3845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 3855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(LV.isSimple() && 3865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-simple lvalue during struct expansion."); 3875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = LV.getAddress(); 3885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), 3895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 3905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar FieldDecl *FD = *i; 3915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 3925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 3935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 3945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 3955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 3965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI = ExpandTypeFromArgs(FT, LV, AI); 3975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 3985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitStoreThroughLValue(RValue::get(AI), LV, FT); 3995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 4005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 4015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 4025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 4035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return AI; 4045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 4055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 4065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid 4075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV, 4085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::SmallVector<llvm::Value*, 16> &Args) { 4095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 4105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 4115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 4125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 4135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isAggregate() && "Unexpected rvalue during struct expansion"); 4145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = RV.getAggregateAddr(); 4155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), 4165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 4175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar FieldDecl *FD = *i; 4185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 4195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 4205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 4215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 4225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 4235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args); 4245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 4255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RValue RV = EmitLoadOfLValue(LV, FT); 4265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isScalar() && 4275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-scalar rvalue during struct expansion."); 4285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 4295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 4305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 4315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 4325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 4335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/ 4345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 43545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType * 43662d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel DunbarCodeGenTypes::GetFunctionType(const CGCallInfo &CI, bool IsVariadic) { 43762d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar return GetFunctionType(CI.argtypes_begin(), CI.argtypes_end(), IsVariadic); 43862d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar} 43962d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar 44062d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbarconst llvm::FunctionType * 44145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI) { 44262d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar return GetFunctionType(FI.argtypes_begin(), FI.argtypes_end(), FI.isVariadic()); 44362d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar} 44462d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar 44562d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbarconst llvm::FunctionType * 44662d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel DunbarCodeGenTypes::GetFunctionType(ArgTypeIterator begin, ArgTypeIterator end, 44762d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar bool IsVariadic) { 44845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar std::vector<const llvm::Type*> ArgTys; 44945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 45045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar const llvm::Type *ResultType = 0; 45145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 45245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar QualType RetTy = *begin; 453f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, getContext()); 4548951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (RetAI.getKind()) { 4558951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 4568951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 4578951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 4588951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 45945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::Default: 46045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar if (RetTy->isVoidType()) { 46145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ResultType = llvm::Type::VoidTy; 46245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } else { 46362d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar ResultType = ConvertType(RetTy); 46445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 46545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 46645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 46745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::StructRet: { 46845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ResultType = llvm::Type::VoidTy; 46962d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar const llvm::Type *STy = ConvertType(RetTy); 47045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace())); 47145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 47245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 47345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 47445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::Coerce: 475639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar ResultType = RetAI.getCoerceToType(); 47645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 47745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 47845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 47945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar for (++begin; begin != end; ++begin) { 480f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo AI = getABIArgumentInfo(*begin, getContext()); 48162d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar const llvm::Type *Ty = ConvertType(*begin); 4828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 4838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 4845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 4858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 4868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 4878951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 4888951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 48945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar // byval arguments are always on the stack, which is addr space #0. 49045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTys.push_back(llvm::PointerType::getUnqual(Ty)); 4918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled"); 4928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 4938951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 4948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: 4958951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ArgTys.push_back(Ty); 4968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 4978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 4988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 4995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar GetExpandedTypes(*begin, ArgTys); 5008951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 5018951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 50245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 50345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 50462d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic); 50545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 50645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 507b768807c49a1c7085def099b848631856af766faDaniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(QualType RetTy) { 508f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return getABIReturnInfo(RetTy, getContext()).isStructRet(); 5093913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar} 5103913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar 511b768807c49a1c7085def099b848631856af766faDaniel Dunbarvoid CodeGenModule::ConstructParamAttrList(const Decl *TargetDecl, 5122c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar ArgTypeIterator begin, 5132c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar ArgTypeIterator end, 5142c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar ParamAttrListType &PAL) { 5155323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned FuncAttrs = 0; 5165323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 5175323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl) { 5185323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl->getAttr<NoThrowAttr>()) 5195323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar FuncAttrs |= llvm::ParamAttr::NoUnwind; 5205323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl->getAttr<NoReturnAttr>()) 5215323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar FuncAttrs |= llvm::ParamAttr::NoReturn; 5225323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 5235323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 5242c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar QualType RetTy = *begin; 5255323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned Index = 1; 526f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, getContext()); 52745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar switch (RetAI.getKind()) { 5282c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 5292c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isPromotableIntegerType()) { 5302c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isSignedIntegerType()) { 5312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar FuncAttrs |= llvm::ParamAttr::SExt; 5322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else if (RetTy->isUnsignedIntegerType()) { 5332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar FuncAttrs |= llvm::ParamAttr::ZExt; 5342c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 5352c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 5362c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 5372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 5382c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 539d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel PAL.push_back(llvm::FnAttributeWithIndex::get(Index, 540834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar llvm::ParamAttr::StructRet| 541834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar llvm::ParamAttr::NoAlias)); 5425323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar ++Index; 5432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 5442c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 5452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Coerce: 5462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 5478951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5488951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 5498951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 5508951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 5515323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 5522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 5535323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (FuncAttrs) 554d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel PAL.push_back(llvm::FnAttributeWithIndex::get(0, FuncAttrs)); 5555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (++begin; begin != end; ++begin) { 5565323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar QualType ParamType = *begin; 5575323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned ParamAttrs = 0; 558f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo AI = getABIArgumentInfo(ParamType, getContext()); 5598951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5608951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 5618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 5625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 5638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 5648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 5665323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar ParamAttrs |= llvm::ParamAttr::ByVal; 5678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled"); 5688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 5698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5708951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: 5718951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar if (ParamType->isPromotableIntegerType()) { 5728951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar if (ParamType->isSignedIntegerType()) { 5738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ParamAttrs |= llvm::ParamAttr::SExt; 5748951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } else if (ParamType->isUnsignedIntegerType()) { 5758951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ParamAttrs |= llvm::ParamAttr::ZExt; 5768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 5775323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 5788951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 5798951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 5815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> Tys; 5825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: This is rather inefficient. Do we ever actually need 5835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // to do anything here? The result should be just reconstructed 5845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // on the other side, so extension should be a non-issue. 5855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar getTypes().GetExpandedTypes(ParamType, Tys); 5865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Index += Tys.size(); 5875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 5885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 5895323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 5908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 5915323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (ParamAttrs) 592d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel PAL.push_back(llvm::FnAttributeWithIndex::get(Index, ParamAttrs)); 5935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++Index; 5945323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 5955323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 5965323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 59717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn, 59817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar QualType RetTy, 59917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const FunctionArgList &Args) { 60017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Emit allocs for param decls. Give the LLVM Argument nodes names. 60117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Function::arg_iterator AI = Fn->arg_begin(); 60217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 60317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Name the struct return argument. 6042c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (CGM.ReturnTypeUsesSret(RetTy)) { 60517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar AI->setName("agg.result"); 60617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar ++AI; 60717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 60817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 60917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); 6105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar i != e; ++i) { 61117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const VarDecl *Arg = i->first; 6125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType Ty = i->second; 613f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo ArgI = getABIArgumentInfo(Ty, getContext()); 6148951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 6158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (ArgI.getKind()) { 6168951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 6178951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: { 6188951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI != Fn->arg_end() && "Argument mismatch!"); 6198951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar llvm::Value* V = AI; 6205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 6218951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // This must be a promotion, for something like 6228951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // "void a(x) short x; {..." 6235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 62417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 6258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar EmitParmDecl(*Arg, V); 6268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 6278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 6288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 6295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 6305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // If this was structure was expand into multiple arguments then 6315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // we need to create a temporary and reconstruct it from the 6325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // arguments. 6335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::string Name(Arg->getName()); 6345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Temp = CreateTempAlloca(ConvertType(Ty), 6355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar (Name + ".addr").c_str()); 6365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 6375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator End = 6385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI); 6395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitParmDecl(*Arg, Temp); 6405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 6415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // Name the arguments used in expansion and increment AI. 6425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar unsigned Index = 0; 6435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (; AI != End; ++AI, ++Index) 6445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI->setName(Name + "." + llvm::utostr(Index)); 6455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 6465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 6478951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 6485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 6498951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 6508951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 6518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 6525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 6535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 65417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 65517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar assert(AI == Fn->arg_end() && "Argument mismatch!"); 65617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 65717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 65817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(QualType RetTy, 65917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Value *ReturnValue) { 6602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar llvm::Value *RV = 0; 6612c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 6622c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar // Functions with no result always return void. 6632c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (ReturnValue) { 664f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, getContext()); 6652c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 6662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 6672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 66817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy); 6692c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 6708951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 6712c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 6722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar RV = Builder.CreateLoad(ReturnValue); 6732c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 6742c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 675639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar case ABIArgInfo::Coerce: { 676639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar const llvm::Type *CoerceToPTy = 677639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar llvm::PointerType::getUnqual(RetAI.getCoerceToType()); 678639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar RV = Builder.CreateLoad(Builder.CreateBitCast(ReturnValue, CoerceToPTy)); 6798951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 680639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 6818951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 6828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 6838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 6848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 68517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 68617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 6872c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 6882c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RV) { 6892c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRet(RV); 6902c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else { 6912c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRetVoid(); 6922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 69317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 69417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 69517b708d61827cd86278e9580b041dd6cbadf07d3Daniel DunbarRValue CodeGenFunction::EmitCall(llvm::Value *Callee, 6962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar QualType RetTy, 69717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const CallArgList &CallArgs) { 69817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::SmallVector<llvm::Value*, 16> Args; 69917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 70017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Handle struct-return functions by passing a pointer to the 70117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // location that we would like to return into. 702f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, getContext()); 7032c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 7042c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 70517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Create a temporary alloca to hold the result of the call. :( 7065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(CreateTempAlloca(ConvertType(RetTy))); 7072c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 7082c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 7092c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 7102c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Coerce: 7112c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 7128951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 7138951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 7148951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 7158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 71617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 71717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 71817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end(); 71917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar I != E; ++I) { 720f035738e346da0a82538ab236aef218a27373635Daniel Dunbar ABIArgInfo ArgInfo = getABIArgumentInfo(I->second, getContext()); 72117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar RValue RV = I->first; 7225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar switch (ArgInfo.getKind()) { 7245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::ByVal: // Default is byval 7255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Default: 7265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (RV.isScalar()) { 7275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 7285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else if (RV.isComplex()) { 7295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // Make a temporary alloca to pass the argument. 7305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(CreateTempAlloca(ConvertType(I->second))); 7315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar StoreComplexToAddr(RV.getComplexVal(), Args.back(), false); 7325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 7335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getAggregateAddr()); 7345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 7355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 7365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::StructRet: 7385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 7395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 7405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 7415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: 7435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(I->second, RV, Args); 7445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 74517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 74617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 74717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 74817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size()); 7492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar CGCallInfo CallInfo(RetTy, CallArgs); 75017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 7515323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set. 75217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CodeGen::ParamAttrListType ParamAttrList; 753b768807c49a1c7085def099b848631856af766faDaniel Dunbar CGM.ConstructParamAttrList(0, 754b768807c49a1c7085def099b848631856af766faDaniel Dunbar CallInfo.argtypes_begin(), CallInfo.argtypes_end(), 755b768807c49a1c7085def099b848631856af766faDaniel Dunbar ParamAttrList); 75617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(), 75717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar ParamAttrList.size())); 75817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 75917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar if (const llvm::Function *F = dyn_cast<llvm::Function>(Callee)) 76017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setCallingConv(F->getCallingConv()); 76117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar if (CI->getType() != llvm::Type::VoidTy) 76217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setName("call"); 7632c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 7642c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 7652c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 7662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isAnyComplexType()) 7675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getComplex(LoadComplexFromAddr(Args[0], false)); 7682c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar else 7692c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar // Struct return. 7705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getAggregate(Args[0]); 7718951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 7722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 7732c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return RValue::get(RetTy->isVoidType() ? 0 : CI); 7742c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 775639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar case ABIArgInfo::Coerce: { 776639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar const llvm::Type *CoerceToPTy = 777639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar llvm::PointerType::getUnqual(RetAI.getCoerceToType()); 778639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertType(RetTy), "tmp"); 779639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar Builder.CreateStore(CI, Builder.CreateBitCast(V, CoerceToPTy)); 780639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return RValue::getAggregate(V); 781639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 7828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 7838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 7848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 7858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 78617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 7872c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 7882c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar assert(0 && "Unhandled ABIArgInfo::Kind"); 7892c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return RValue::get(0); 79017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 791