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