CGCall.cpp revision bb36d331f439f49859efcfb4435c61762fbba6f9
10dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----- CGCall.h - Encapsulate calling convention details ----*- C++ -*-===//
20dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
30dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//                     The LLVM Compiler Infrastructure
40dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
50dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// This file is distributed under the University of Illinois Open Source
60dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// License. See LICENSE.TXT for details.
70dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
80dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----------------------------------------------------------------------===//
90dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
100dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// These classes wrap the information about a call or function
110dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// definition used to handle ABI compliancy.
120dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//
130dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----------------------------------------------------------------------===//
140dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
150dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "CGCall.h"
160dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "CodeGenFunction.h"
17b768807c49a1c7085def099b848631856af766faDaniel Dunbar#include "CodeGenModule.h"
186b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar#include "clang/Basic/TargetInfo.h"
190dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/ASTContext.h"
200dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/Decl.h"
210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/DeclObjC.h"
2299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar#include "clang/AST/RecordLayout.h"
235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar#include "llvm/ADT/StringExtras.h"
24d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel#include "llvm/Attributes.h"
256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar#include "llvm/Support/CommandLine.h"
2654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar#include "llvm/Target/TargetData.h"
270dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace clang;
280dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace CodeGen;
290dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
300dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/
310dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation.
330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
34bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeNoProto *FTNP) {
3545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  ArgTypes.push_back(FTNP->getResultType());
3645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
3745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
38bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeProto *FTP) {
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?
45bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD) {
460dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionType *FTy = FD->getType()->getAsFunctionType();
470dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(FTy);
4845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
490dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(FTy->getResultType());
5045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  if (FTP) {
510dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
520dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar      ArgTypes.push_back(FTP->getArgType(i));
5345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
540dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
550dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
560dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const ObjCMethodDecl *MD,
57bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar                               const ASTContext &Context) {
580dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(MD->getResultType());
590dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(MD->getSelfDecl()->getType());
600dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(Context.getObjCSelType());
610dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  for (ObjCMethodDecl::param_const_iterator i = MD->param_begin(),
620dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar         e = MD->param_end(); i != e; ++i)
630dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    ArgTypes.push_back((*i)->getType());
640dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
650dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
66bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(QualType ResTy, const CallArgList &Args) {
67725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar  ArgTypes.push_back(ResTy);
68725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar  for (CallArgList::const_iterator i = Args.begin(), e = Args.end();
69725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar       i != e; ++i)
700dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    ArgTypes.push_back(i->second);
710dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
720dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
73bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(QualType ResTy, const FunctionArgList &Args) {
74bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  ArgTypes.push_back(ResTy);
75bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
76bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar       i != e; ++i)
77bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar    ArgTypes.push_back(i->second);
78bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar}
79bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
80725ad31086e3d6c41afa10c43db44f2e7060a961Daniel DunbarArgTypeIterator CGFunctionInfo::argtypes_begin() const {
815323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.begin();
825323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
84725ad31086e3d6c41afa10c43db44f2e7060a961Daniel DunbarArgTypeIterator CGFunctionInfo::argtypes_end() const {
855323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.end();
860dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
8717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
8817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar/***/
8917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// ABIArgInfo - Helper class to encapsulate information about how a
918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// specific C type should be passed to or returned from a function.
922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarclass ABIArgInfo {
932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic:
942c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  enum Kind {
952c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Default,
963aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar    StructRet, /// Only valid for return values. The return value
973aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar               /// should be passed through a pointer to a caller
983aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar               /// allocated location passed as an implicit first
993aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar               /// argument to the function.
1008951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
10111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    Ignore,    /// Ignore the argument (treat as void). Useful for
10211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar               /// void and empty structs.
10311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
1045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    Coerce,    /// Only valid for aggregate return types, the argument
1055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// should be accessed by coercion to a provided type.
1068951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    ByVal,     /// Only valid for aggregate argument types. The
1088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar               /// structure should be passed "byval" with the
1098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar               /// specified alignment (0 indicates default
1108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar               /// alignment).
1118951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1128951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    Expand,    /// Only valid for aggregate argument types. The
1138951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar               /// structure should be expanded into consecutive
1145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// arguments for its constituent fields. Currently
1155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// expand is only allowed on structures whose fields
1165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// are all scalar types or are themselves expandable
1175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// types.
1188951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1198951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    KindFirst=Default, KindLast=Expand
1202c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  };
1212c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1222c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarprivate:
1232c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  Kind TheKind;
124639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  const llvm::Type *TypeData;
1258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  unsigned UIntData;
1262c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  ABIArgInfo(Kind K, const llvm::Type *TD=0,
1288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar             unsigned UI=0) : TheKind(K),
1298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar                              TypeData(TD),
1308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar                              UIntData(0) {}
1312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic:
1322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  static ABIArgInfo getDefault() {
1338951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo(Default);
1342c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
1352c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  static ABIArgInfo getStructRet() {
1368951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo(StructRet);
1372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
13811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  static ABIArgInfo getIgnore() {
13911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    return ABIArgInfo(Ignore);
14011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  }
141639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  static ABIArgInfo getCoerce(const llvm::Type *T) {
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; }
15411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  bool isIgnore() const { return TheKind == Ignore; }
1552c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  bool isCoerce() const { return TheKind == Coerce; }
1568951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  bool isByVal() const { return TheKind == ByVal; }
1575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  bool isExpand() const { return TheKind == Expand; }
15845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
15945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  // Coerce accessors
160639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  const llvm::Type *getCoerceToType() const {
16145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    assert(TheKind == Coerce && "Invalid kind!");
16245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    return TypeData;
16345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
1648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  // ByVal accessors
1668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  unsigned getByValAlignment() const {
1678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(TheKind == ByVal && "Invalid kind!");
1688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return UIntData;
1698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  }
1702c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar};
1712c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/
1732c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1746b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/* FIXME: All of this stuff should be part of the target interface
1756b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar   somehow. It is currently here because it is not clear how to factor
1766b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar   the targets to support this, since the Targets currently live in a
1776b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar   layer below types n'stuff.
1786b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar */
1796b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1806b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// ABIInfo - Target specific hooks for defining how a type should be
1816b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// passed or returned from functions.
1826b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass clang::ABIInfo {
1836b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic:
1846b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ~ABIInfo();
1856b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1866b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyReturnType(QualType RetTy,
1876b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                        ASTContext &Context) const = 0;
1886b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1896b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyArgumentType(QualType Ty,
1906b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                          ASTContext &Context) const = 0;
1916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
1926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIInfo::~ABIInfo() {}
1946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
195834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isEmptyStruct - Return true iff a structure has no non-empty
196834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// members. Note that a structure with a flexible array member is not
197834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered empty.
198834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool isEmptyStruct(QualType T) {
199834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordType *RT = T->getAsStructureType();
200834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!RT)
201834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
202834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordDecl *RD = RT->getDecl();
203834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (RD->hasFlexibleArrayMember())
204834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return false;
205f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(),
206834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar         e = RD->field_end(); i != e; ++i) {
207834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
208834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (!isEmptyStruct(FD->getType()))
209834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return false;
210834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
211834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return true;
212834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
213834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
214834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isSingleElementStruct - Determine if a structure is a "single
215834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// element struct", i.e. it has exactly one non-empty field or
216834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// exactly one field which is itself a single element
217834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// struct. Structures with flexible array members are never
218834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered single element structs.
219834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar///
220834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// \return The field declaration for the single non-empty field, if
221834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// it exists.
222834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic const FieldDecl *isSingleElementStruct(QualType T) {
223834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordType *RT = T->getAsStructureType();
224834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!RT)
225834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
226834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
227834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordDecl *RD = RT->getDecl();
228834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (RD->hasFlexibleArrayMember())
229834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
230834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
231834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const FieldDecl *Found = 0;
232f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(),
233834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar         e = RD->field_end(); i != e; ++i) {
234834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
235834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    QualType FT = FD->getType();
236834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
237834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (isEmptyStruct(FT)) {
238834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      // Ignore
239834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    } else if (Found) {
240834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return 0;
241834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    } else if (!CodeGenFunction::hasAggregateLLVMType(FT)) {
242834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      Found = FD;
243834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    } else {
244834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      Found = isSingleElementStruct(FT);
245834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (!Found)
246834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return 0;
247834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
248834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
249834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
250834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return Found;
251834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
252834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
253834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
254834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!Ty->getAsBuiltinType() && !Ty->isPointerType())
255834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return false;
256834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
257834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  uint64_t Size = Context.getTypeSize(Ty);
258834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return Size == 32 || Size == 64;
259834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
260834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
261834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool areAllFields32Or64BitBasicType(const RecordDecl *RD,
262834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar                                           ASTContext &Context) {
263f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(),
264834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar         e = RD->field_end(); i != e; ++i) {
265834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
266834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
267834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (!is32Or64BitBasicType(FD->getType(), Context))
268834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return false;
269834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
270834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // If this is a bit-field we need to make sure it is still a
271834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // 32-bit or 64-bit type.
272834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (Expr *BW = FD->getBitWidth()) {
273834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      unsigned Width = BW->getIntegerConstantExprValue(Context).getZExtValue();
274834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (Width <= 16)
275834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return false;
276834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
277834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
278834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return true;
279834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
280834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
2816b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarnamespace {
2826b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// DefaultABIInfo - The default implementation for ABI specific
2836b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// details. This implementation provides information which results in
2846b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// sensible LLVM IR generation, but does not conform to any
2856b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// particular ABI.
2866b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass DefaultABIInfo : public ABIInfo {
2876b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyReturnType(QualType RetTy,
2886b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                        ASTContext &Context) const;
2896b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
2906b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyArgumentType(QualType RetTy,
2916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                          ASTContext &Context) const;
2926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
2936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
2946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// X86_32ABIInfo - The X86-32 ABI information.
2956b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass X86_32ABIInfo : public ABIInfo {
2966b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic:
2976b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyReturnType(QualType RetTy,
2986b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                        ASTContext &Context) const;
2996b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
3006b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyArgumentType(QualType RetTy,
3016b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                          ASTContext &Context) const;
3026b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
3036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
3046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
3056b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
3066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                            ASTContext &Context) const {
3072c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
308834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Classify "single element" structs as their element type.
309834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *SeltFD = isSingleElementStruct(RetTy);
310834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (SeltFD) {
311834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      QualType SeltTy = SeltFD->getType()->getDesugaredType();
312834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (const BuiltinType *BT = SeltTy->getAsBuiltinType()) {
313834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // FIXME: This is gross, it would be nice if we could just
314834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // pass back SeltTy and have clients deal with it. Is it worth
315834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // supporting coerce to both LLVM and clang Types?
316834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        if (BT->isIntegerType()) {
317834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          uint64_t Size = Context.getTypeSize(SeltTy);
318834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::IntegerType::get((unsigned) Size));
319834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        } else if (BT->getKind() == BuiltinType::Float) {
320834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::Type::FloatTy);
321834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        } else if (BT->getKind() == BuiltinType::Double) {
322834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::Type::DoubleTy);
323834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        }
324834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      } else if (SeltTy->isPointerType()) {
325834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // FIXME: It would be really nice if this could come out as
326834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // the proper pointer type.
327834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        llvm::Type *PtrTy =
328834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
329834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getCoerce(PtrTy);
330834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      }
331834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
332834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
333639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    uint64_t Size = Context.getTypeSize(RetTy);
334639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    if (Size == 8) {
335639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getCoerce(llvm::Type::Int8Ty);
336639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    } else if (Size == 16) {
337639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getCoerce(llvm::Type::Int16Ty);
338639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    } else if (Size == 32) {
339639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getCoerce(llvm::Type::Int32Ty);
340639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    } else if (Size == 64) {
341639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getCoerce(llvm::Type::Int64Ty);
342639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    } else {
343639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getStructRet();
344639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    }
3452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
3462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    return ABIArgInfo::getDefault();
3472c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
3482c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar}
3492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
3506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
3516b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                              ASTContext &Context) const {
352f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
353834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Structures with flexible arrays are always byval.
354834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (const RecordType *RT = Ty->getAsStructureType())
355834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (RT->getDecl()->hasFlexibleArrayMember())
356834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getByVal(0);
357834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
358834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Expand empty structs (i.e. ignore)
359834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
360834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (Ty->isStructureType() && Size == 0)
361834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return ABIArgInfo::getExpand();
362834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
363834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Expand structs with size <= 128-bits which consist only of
364834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // basic types (int, long long, float, double, xxx*). This is
365834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // non-recursive and does not ignore empty fields.
366834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (const RecordType *RT = Ty->getAsStructureType()) {
367834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (Context.getTypeSize(Ty) <= 4*32 &&
368834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          areAllFields32Or64BitBasicType(RT->getDecl(), Context))
369834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getExpand();
370834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
371834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
3728951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo::getByVal(0);
3738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  } else {
3748951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo::getDefault();
3758951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  }
3768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar}
3778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
3786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarnamespace {
379c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar/// X86_64ABIInfo - The X86_64 ABI information.
3806f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarclass X86_64ABIInfo : public ABIInfo {
3816f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  enum Class {
3826f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Integer = 0,
3836f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    SSE,
3846f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    SSEUp,
3856f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    X87,
3866f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    X87Up,
3876f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ComplexX87,
3886f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    NoClass,
3896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Memory
3906f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  };
3916f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
3928562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  /// merge - Implement the X86_64 ABI merging algorithm.
3938562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  ///
394c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// Merge an accumulating classification \arg Accum with a field
395c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// classification \arg Field.
396c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
397c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Accum - The accumulating classification. This should
398c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// always be either NoClass or the result of a previous merge
399c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// call. In addition, this should never be Memory (the caller
400c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// should just return Memory for the aggregate).
401c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Class merge(Class Accum, Class Field) const;
4028562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
4036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// classify - Determine the x86_64 register classes in which the
4046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// given type T should be passed.
4056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
406c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Lo - The classification for the parts of the type
407c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// residing in the low word of the containing object.
408c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
409c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Hi - The classification for the parts of the type
410c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// residing in the high word of the containing object.
411c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
412c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param OffsetBase - The bit offset of this type in the
413cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar  /// containing object.  Some parameters are classified different
414cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar  /// depending on whether they straddle an eightbyte boundary.
4156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
4166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// If a word is unused its result will be NoClass; if a type should
4176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// be passed in Memory then at least the classification of \arg Lo
4186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// will be Memory.
4196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
4206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// The \arg Lo class will be NoClass iff the argument is ignored.
4216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
4226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
4236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// be NoClass.
424e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar  void classify(QualType T, ASTContext &Context, uint64_t OffsetBase,
4256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                Class &Lo, Class &Hi) const;
426c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
4276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarpublic:
4286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  virtual ABIArgInfo classifyReturnType(QualType RetTy,
4296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                                        ASTContext &Context) const;
4306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
4316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  virtual ABIArgInfo classifyArgumentType(QualType RetTy,
4326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                                          ASTContext &Context) const;
4336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar};
4346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}
4356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
436c450357c436c05aa02ef88d406de962d98ac50beDaniel DunbarX86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum,
437c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar                                          Class Field) const {
4388562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
4398562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // classified recursively so that always two fields are
4408562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // considered. The resulting class is calculated according to
4418562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // the classes of the fields in the eightbyte:
4428562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
4438562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (a) If both classes are equal, this is the resulting class.
4448562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
4458562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (b) If one of the classes is NO_CLASS, the resulting class is
4468562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // the other class.
4478562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
4488562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (c) If one of the classes is MEMORY, the result is the MEMORY
4498562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // class.
4508562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
4518562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (d) If one of the classes is INTEGER, the result is the
4528562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // INTEGER.
4538562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
4548562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
4558562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // MEMORY is used as class.
4568562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
4578562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (f) Otherwise class SSE is used.
458c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Accum == NoClass || Accum == Integer ||
459c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar          Accum == SSE || Accum == SSEUp) &&
460c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar         "Invalid accumulated classification during merge.");
461c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  if (Accum == Field || Field == NoClass)
462c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Accum;
463c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Field == Memory)
464c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Memory;
465c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Accum == NoClass)
466c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Field;
467c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Accum == Integer || Field == Integer)
468c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Integer;
469c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Field == X87 || Field == X87Up || Field == ComplexX87)
470c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Memory;
4718562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  else
472c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return SSE;
4738562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar}
4748562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
4756f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarvoid X86_64ABIInfo::classify(QualType Ty,
4766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                             ASTContext &Context,
477e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar                             uint64_t OffsetBase,
4786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                             Class &Lo, Class &Hi) const {
4799a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar  // FIXME: This code can be simplified by introducing a simple value
4809a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar  // class for Class pairs with appropriate constructor methods for
4819a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar  // the various situations.
4829a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar
483c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Lo = Hi = NoClass;
484c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
485c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Class &Current = OffsetBase < 64 ? Lo : Hi;
486c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Current = Memory;
487c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
4886f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  if (const BuiltinType *BT = Ty->getAsBuiltinType()) {
4896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    BuiltinType::Kind k = BT->getKind();
4906f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
49111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    if (k == BuiltinType::Void) {
492c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = NoClass;
49311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
494c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = Integer;
4956f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    } else if (k == BuiltinType::Float || k == BuiltinType::Double) {
496c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = SSE;
4976f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    } else if (k == BuiltinType::LongDouble) {
4986f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = X87;
4996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Hi = X87Up;
5006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    }
5017a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    // FIXME: _Decimal32 and _Decimal64 are SSE.
5027a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
5036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // FIXME: __int128 is (Integer, Integer).
5046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  } else if (Ty->isPointerLikeType() || Ty->isBlockPointerType() ||
5056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar             Ty->isObjCQualifiedInterfaceType()) {
506c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = Integer;
5077a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar  } else if (const VectorType *VT = Ty->getAsVectorType()) {
508e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar    uint64_t Size = Context.getTypeSize(VT);
5097a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    if (Size == 64) {
510d4cd1b07169c698bd003be102bd73a7da7e24b25Daniel Dunbar      // gcc passes <1 x double> in memory.
511c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      if (VT->getElementType() == Context.DoubleTy)
512d4cd1b07169c698bd003be102bd73a7da7e24b25Daniel Dunbar        return;
513d4cd1b07169c698bd003be102bd73a7da7e24b25Daniel Dunbar
514c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = SSE;
515e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar
516e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar      // If this type crosses an eightbyte boundary, it should be
517e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar      // split.
518cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar      if (OffsetBase && OffsetBase != 64)
519e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar        Hi = Lo;
5207a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    } else if (Size == 128) {
5217a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Lo = SSE;
5227a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Hi = SSEUp;
5237a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    }
5246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  } else if (const ComplexType *CT = Ty->getAsComplexType()) {
5256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    QualType ET = CT->getElementType();
5266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
527e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
528eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar    if (ET->isIntegerType()) {
529eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      if (Size <= 64)
530c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        Current = Integer;
531eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      else if (Size <= 128)
532eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar        Lo = Hi = Integer;
533eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar    } else if (ET == Context.FloatTy)
534c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = SSE;
5356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    else if (ET == Context.DoubleTy)
5366f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = Hi = SSE;
5376f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    else if (ET == Context.LongDoubleTy)
538c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = ComplexX87;
539f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar
540f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    // If this complex type crosses an eightbyte boundary then it
541f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    // should be split.
542cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar    uint64_t EB_Real = (OffsetBase) / 64;
543cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar    uint64_t EB_Imag = (OffsetBase + Context.getTypeSize(ET)) / 64;
544f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    if (Hi == NoClass && EB_Real != EB_Imag)
545f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar      Hi = Lo;
5468562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  } else if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
5478562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Arrays are treated like structures.
5488562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
5498562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
5508562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
5518562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
5528562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // than two eightbytes, ..., it has class MEMORY.
5538562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    if (Size > 128)
5548562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      return;
5558562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
5568562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
5578562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // fields, it has class MEMORY.
5588562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    //
5598562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Only need to check alignment of array base.
560c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (OffsetBase % Context.getTypeAlign(AT->getElementType()))
5618562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      return;
5628562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
5638562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Otherwise implement simplified merge. We could be smarter about
5648562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // this, but it isn't worth it and would be harder to verify.
565c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = NoClass;
5668562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t EltSize = Context.getTypeSize(AT->getElementType());
5678562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t ArraySize = AT->getSize().getZExtValue();
5688562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
5698562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      Class FieldLo, FieldHi;
5708562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      classify(AT->getElementType(), Context, Offset, FieldLo, FieldHi);
571c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = merge(Lo, FieldLo);
572c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = merge(Hi, FieldHi);
573c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      if (Lo == Memory || Hi == Memory)
574c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        break;
5758562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    }
576c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
577c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // Do post merger cleanup (see below). Only case we worry about is Memory.
578c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (Hi == Memory)
579c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = Memory;
580c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
58199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar  } else if (const RecordType *RT = Ty->getAsRecordType()) {
582e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
58399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
58499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
58599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // than two eightbytes, ..., it has class MEMORY.
58699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (Size > 128)
58799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      return;
58899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
58999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    const RecordDecl *RD = RT->getDecl();
59099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
59199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // Assume variable sized types are passed in memory.
59299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (RD->hasFlexibleArrayMember())
59399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      return;
59499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
59599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
59699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
59799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // Reset Lo class, this will be recomputed.
598c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = NoClass;
59999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    unsigned idx = 0;
60099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    for (RecordDecl::field_iterator i = RD->field_begin(),
60199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar           e = RD->field_end(); i != e; ++i, ++idx) {
6028562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
60399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
6048562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
6058562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      // fields, it has class MEMORY.
60699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      if (Offset % Context.getTypeAlign(i->getType())) {
60799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Lo = Memory;
60899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        return;
60999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      }
61099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
61199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // Classify this field.
612c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      //
613c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate
614c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // exceeds a single eightbyte, each is classified
615c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // separately. Each eightbyte gets initialized to class
616c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // NO_CLASS.
61799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      Class FieldLo, FieldHi;
618f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar      classify(i->getType(), Context, Offset, FieldLo, FieldHi);
619c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = merge(Lo, FieldLo);
620c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = merge(Hi, FieldHi);
621c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      if (Lo == Memory || Hi == Memory)
622c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        break;
62399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    }
62499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
62599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
62699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    //
62799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // (a) If one of the classes is MEMORY, the whole argument is
62899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // passed in memory.
62999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    //
63099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // (b) If SSEUP is not preceeded by SSE, it is converted to SSE.
63199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
63299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // The first of these conditions is guaranteed by how we implement
633c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // the merge (just bail).
634c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    //
635c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // The second condition occurs in the case of unions; for example
636c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // union { _Complex double; unsigned; }.
637c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (Hi == Memory)
638c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = Memory;
63999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (Hi == SSEUp && Lo != SSE)
640c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = SSE;
6416f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
6426f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}
6436f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
644c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
645d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy,
646d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar                                            ASTContext &Context) const {
6476f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
6486f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // classification algorithm.
6496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  X86_64ABIInfo::Class Lo, Hi;
650f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar  classify(RetTy, Context, 0, Lo, Hi);
6516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
652c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  // Check some invariants.
653c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
654c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification.");
655c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
656c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
6576f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  const llvm::Type *ResType = 0;
6586f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  switch (Lo) {
6596f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case NoClass:
66011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    return ABIArgInfo::getIgnore();
6616f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSEUp:
6636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87Up:
6646f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(0 && "Invalid classification for lo word.");
6656f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
666c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
667c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // hidden argument, i.e. structret.
6686f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Memory:
6696f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    return ABIArgInfo::getStructRet();
6706f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6716f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
6726f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // available register of the sequence %rax, %rdx is used.
6736f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Integer:
6746f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::Int64Ty; break;
6756f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
6776f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // available SSE register of the sequence %xmm0, %xmm1 is used.
6786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSE:
6796f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::DoubleTy; break;
6806f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6816f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
6826f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // returned on the X87 stack in %st0 as 80-bit x87 number.
6836f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87:
6846f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::X86_FP80Ty; break;
6856f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
686c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
687c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // part of the value is returned in %st0 and the imaginary part in
688c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // %st1.
6896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case ComplexX87:
6906f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(Hi == NoClass && "Unexpected ComplexX87 classification.");
6916f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::VectorType::get(llvm::Type::X86_FP80Ty, 2);
6926f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
6936f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
6946f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6956f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  switch (Hi) {
6966f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // Memory was handled previously, and ComplexX87 and X87 should
6976f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // never occur as hi classes.
6986f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Memory:
6996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87:
7006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case ComplexX87:
7016f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(0 && "Invalid classification for hi word.");
7026f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
7036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case NoClass: break;
7046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Integer:
705b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL);
706b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    break;
7076f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSE:
708b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
709b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    break;
7106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
7116f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
7126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // is passed in the upper half of the last used SSE register.
7136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    //
7146f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // SSEUP should always be preceeded by SSE, just widen.
7156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSEUp:
7166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(Lo == SSE && "Unexpected SSEUp classification.");
7176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2);
7186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
7196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
7206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
721b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    // returned together with the previous X87 value in %st0.
7226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    //
7236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // X87UP should always be preceeded by X87, so we don't need to do
7246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // anything here.
7256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87Up:
7266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(Lo == X87 && "Unexpected X87Up classification.");
7276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
7286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
7296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
7306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  return ABIArgInfo::getCoerce(ResType);
731d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar}
732d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar
733d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty,
734d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar                                              ASTContext &Context) const {
735d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar  return ABIArgInfo::getDefault();
736d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar}
737d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar
7386b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy,
7396b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                            ASTContext &Context) const {
7406b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return ABIArgInfo::getDefault();
7416b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
7426b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7436b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty,
7446b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                              ASTContext &Context) const {
7456b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return ABIArgInfo::getDefault();
7466b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
7476b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7486b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarconst ABIInfo &CodeGenTypes::getABIInfo() const {
7496b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  if (TheABIInfo)
7506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    return *TheABIInfo;
7516b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7526b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  // For now we just cache this in the CodeGenTypes and don't bother
7536b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  // to free it.
7546b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  const char *TargetPrefix = getContext().Target.getTargetPrefix();
7556b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  if (strcmp(TargetPrefix, "x86") == 0) {
756d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    switch (getContext().Target.getPointerWidth(0)) {
757d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    case 32:
7586b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar      return *(TheABIInfo = new X86_32ABIInfo());
759d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    case 64:
76011a76ed8e34901f2b997896a8c0833c6c17bc586Daniel Dunbar      return *(TheABIInfo = new X86_64ABIInfo());
761d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    }
7626b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  }
7636b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7646b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return *(TheABIInfo = new DefaultABIInfo);
7656b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
7666b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7676b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// getABIReturnInfo - Wrap the ABIInfo getABIReturnInfo, altering
7686b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// "default" types to StructRet when appropriate for simplicity.
7696b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarstatic ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT) {
7706b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  assert(!Ty->isArrayType() &&
7716b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar         "Array types cannot be passed directly.");
7726b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo Info = CGT.getABIInfo().classifyReturnType(Ty, CGT.getContext());
773f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  // Ensure default on aggregate types is StructRet.
774f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty))
775f035738e346da0a82538ab236aef218a27373635Daniel Dunbar    return ABIArgInfo::getStructRet();
776f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  return Info;
777f035738e346da0a82538ab236aef218a27373635Daniel Dunbar}
778f035738e346da0a82538ab236aef218a27373635Daniel Dunbar
7796b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// getABIArgumentInfo - Wrap the ABIInfo getABIReturnInfo, altering
7806b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// "default" types to ByVal when appropriate for simplicity.
7816b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarstatic ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT) {
7826b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  assert(!Ty->isArrayType() &&
7836b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar         "Array types cannot be passed directly.");
7846b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo Info = CGT.getABIInfo().classifyArgumentType(Ty, CGT.getContext());
785f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  // Ensure default on aggregate types is ByVal.
786f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty))
787f035738e346da0a82538ab236aef218a27373635Daniel Dunbar    return ABIArgInfo::getByVal(0);
788f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  return Info;
789f035738e346da0a82538ab236aef218a27373635Daniel Dunbar}
790f035738e346da0a82538ab236aef218a27373635Daniel Dunbar
7912c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/
7922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
7935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty,
7945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    std::vector<const llvm::Type*> &ArgTys) {
7955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
7965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
7975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordDecl *RD = RT->getDecl();
7985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(!RD->hasFlexibleArrayMember() &&
7995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Cannot expand structure with flexible array.");
8005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
801f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(),
8025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         e = RD->field_end(); i != e; ++i) {
8035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    const FieldDecl *FD = *i;
8045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    assert(!FD->isBitField() &&
8055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar           "Cannot expand structure with bit-field members.");
8065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
8085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
8095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(FT, ArgTys);
8105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
8115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ArgTys.push_back(ConvertType(FT));
8125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
8135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
8145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
8155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator
8175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
8185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    llvm::Function::arg_iterator AI) {
8195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
8205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
8215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
8235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(LV.isSimple() &&
8245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Unexpected non-simple lvalue during struct expansion.");
8255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = LV.getAddress();
8265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  for (RecordDecl::field_iterator i = RD->field_begin(),
8275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         e = RD->field_end(); i != e; ++i) {
8285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
8295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
8305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
8325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
8335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
8345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      AI = ExpandTypeFromArgs(FT, LV, AI);
8355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
8365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitStoreThroughLValue(RValue::get(AI), LV, FT);
8375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ++AI;
8385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
8395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
8405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  return AI;
8425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
8435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid
8455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
8465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                  llvm::SmallVector<llvm::Value*, 16> &Args) {
8475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
8485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
8495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
8515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
8525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = RV.getAggregateAddr();
8535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  for (RecordDecl::field_iterator i = RD->field_begin(),
8545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         e = RD->field_end(); i != e; ++i) {
8555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
8565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
8575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
8595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
8605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
8615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
8625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
8635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      RValue RV = EmitLoadOfLValue(LV, FT);
8645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      assert(RV.isScalar() &&
8655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar             "Unexpected non-scalar rvalue during struct expansion.");
8665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Args.push_back(RV.getScalarVal());
8675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
8685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
8695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
8705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
871275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
872275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty.
873275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
874275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the
875275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not
876275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined.
877275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
878275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      const llvm::Type *Ty,
879275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      CodeGenFunction &CGF) {
880275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy =
881275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(SrcPtr->getType())->getElementType();
882275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy);
883275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(Ty);
884275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
885275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  // If load is legal, just bitcase the src pointer.
886275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  if (SrcSize == DstSize) {
887275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
888275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
889275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    return CGF.Builder.CreateLoad(Casted);
890275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
891275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    assert(SrcSize < DstSize && "Coercion is losing source bits!");
892275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
893275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
894275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
895275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
896275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
897275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
898275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
899275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    return CGF.Builder.CreateLoad(Tmp);
900275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
901275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
902275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
903275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src,
904275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types.
905275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
906275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the
907275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost.
908275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src,
909275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               llvm::Value *DstPtr,
910275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               CodeGenFunction &CGF) {
911275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy = Src->getType();
912275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *DstTy =
913275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(DstPtr->getType())->getElementType();
914275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
915275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy);
916275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(DstTy);
917275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
918275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  // If store is legal, just bitcase the src pointer.
919275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  if (SrcSize == DstSize) {
920275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
921275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
922275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(Src, Casted);
923275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
924275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    assert(SrcSize > DstSize && "Coercion is missing bits!");
925275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
926275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
927275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
928275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy);
929275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(Src, Tmp);
930275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
931275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
932275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(CGF.Builder.CreateLoad(Casted), DstPtr);
933275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
934275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
935275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
9365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/
9375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
938bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(QualType RetTy) {
939bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  return getABIReturnInfo(RetTy, getTypes()).isStructRet();
940bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar}
941bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
94245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType *
943bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
94445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  std::vector<const llvm::Type*> ArgTys;
94545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
94645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  const llvm::Type *ResultType = 0;
94745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
94836b5f5ee026b6725bff9c5b8faba635d7dfeeb7dDaniel Dunbar  ArgTypeIterator begin = FI.argtypes_begin(), end = FI.argtypes_end();
94945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  QualType RetTy = *begin;
9506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo RetAI = getABIReturnInfo(RetTy, *this);
9518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  switch (RetAI.getKind()) {
9528951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::ByVal:
9538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
9548951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
9558951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
95645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Default:
95745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    if (RetTy->isVoidType()) {
95845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar      ResultType = llvm::Type::VoidTy;
95945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    } else {
96062d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar      ResultType = ConvertType(RetTy);
96145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    }
96245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
96345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
96445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::StructRet: {
96545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ResultType = llvm::Type::VoidTy;
96662d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *STy = ConvertType(RetTy);
96745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
96845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
96945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
97045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
97111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
97211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    ResultType = llvm::Type::VoidTy;
97311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    break;
97411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
97545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Coerce:
976639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    ResultType = RetAI.getCoerceToType();
97745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
97845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
97945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
98045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  for (++begin; begin != end; ++begin) {
9816b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo AI = getABIArgumentInfo(*begin, *this);
98262d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *Ty = ConvertType(*begin);
9838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
9848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
98511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
98611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
98711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
9885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
9898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::StructRet:
9908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for non-return argument");
9918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
9928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::ByVal:
99345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar      // byval arguments are always on the stack, which is addr space #0.
99445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar      ArgTys.push_back(llvm::PointerType::getUnqual(Ty));
9958951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled");
9968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
9978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
9988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Default:
9998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      ArgTys.push_back(Ty);
10008951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
10018951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
10028951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
10035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(*begin, ArgTys);
10048951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
10058951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
100645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
100745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
1008bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic);
10093913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar}
10103913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar
1011761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patelvoid CodeGenModule::ConstructAttributeList(const Decl *TargetDecl,
1012725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                           const CGFunctionInfo &Info,
1013761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                           AttributeListType &PAL) {
10145323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned FuncAttrs = 0;
1015a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  unsigned RetAttrs = 0;
10165323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
10175323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (TargetDecl) {
10185323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (TargetDecl->getAttr<NoThrowAttr>())
1019761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoUnwind;
10205323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (TargetDecl->getAttr<NoReturnAttr>())
1021761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoReturn;
1022232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson    if (TargetDecl->getAttr<PureAttr>())
1023232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadOnly;
1024232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson    if (TargetDecl->getAttr<ConstAttr>())
1025232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadNone;
10265323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
10275323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
1028725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar  ArgTypeIterator begin = Info.argtypes_begin(), end = Info.argtypes_end();
10292c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  QualType RetTy = *begin;
10305323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned Index = 1;
10316b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo RetAI = getABIReturnInfo(RetTy, getTypes());
103245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  switch (RetAI.getKind()) {
10332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Default:
10342c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isPromotableIntegerType()) {
10352c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      if (RetTy->isSignedIntegerType()) {
1036a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel        RetAttrs |= llvm::Attribute::SExt;
10372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      } else if (RetTy->isUnsignedIntegerType()) {
1038a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel        RetAttrs |= llvm::Attribute::ZExt;
10392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      }
10402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    }
10412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
10422c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
10432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::StructRet:
1044761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    PAL.push_back(llvm::AttributeWithIndex::get(Index,
1045725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::StructRet |
1046725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::NoAlias));
10475323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    ++Index;
10482c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
10492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
105011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
10512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
10522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
10538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
10548951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::ByVal:
10558951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
10568951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
10575323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
10582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1059a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (RetAttrs)
1060a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
10615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  for (++begin; begin != end; ++begin) {
10625323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    QualType ParamType = *begin;
1063761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    unsigned Attributes = 0;
10646b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo AI = getABIArgumentInfo(ParamType, getTypes());
10658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
10668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
10678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::StructRet:
10685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
10698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for non-return argument");
10708951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
10718951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::ByVal:
1072761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      Attributes |= llvm::Attribute::ByVal;
10738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled");
10748951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
10758951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
10768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Default:
10778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      if (ParamType->isPromotableIntegerType()) {
10788951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        if (ParamType->isSignedIntegerType()) {
1079761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel          Attributes |= llvm::Attribute::SExt;
10808951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        } else if (ParamType->isUnsignedIntegerType()) {
1081761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel          Attributes |= llvm::Attribute::ZExt;
10828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        }
10835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      }
10848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
10858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
108611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
108711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      // Skip increment, no matching LLVM parameter.
108811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      continue;
108911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
10905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
10915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      std::vector<const llvm::Type*> Tys;
10925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: This is rather inefficient. Do we ever actually need
10935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // to do anything here? The result should be just reconstructed
10945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // on the other side, so extension should be a non-issue.
10955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      getTypes().GetExpandedTypes(ParamType, Tys);
10965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Index += Tys.size();
10975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
10985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
10995323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
11008951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1101761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    if (Attributes)
1102761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes));
11035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++Index;
11045323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
1105a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (FuncAttrs)
1106a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs));
1107a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel
11085323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
11095323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
111017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn,
111117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         QualType RetTy,
111217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         const FunctionArgList &Args) {
1113bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  CGFunctionInfo FnInfo(RetTy, Args);
1114bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
111517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
111617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Function::arg_iterator AI = Fn->arg_begin();
111717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
111817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Name the struct return argument.
11192c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (CGM.ReturnTypeUsesSret(RetTy)) {
112017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    AI->setName("agg.result");
112117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    ++AI;
112217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
112317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
112417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
11255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar       i != e; ++i) {
112617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    const VarDecl *Arg = i->first;
11275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType Ty = i->second;
11286b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo ArgI = getABIArgumentInfo(Ty, CGM.getTypes());
11298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
11308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (ArgI.getKind()) {
11318951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::ByVal:
11328951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Default: {
11338951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
11348951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      llvm::Value* V = AI;
11355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
11368951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        // This must be a promotion, for something like
11378951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        // "void a(x) short x; {..."
11385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        V = EmitScalarConversion(V, Ty, Arg->getType());
113917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      }
11408951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      EmitParmDecl(*Arg, V);
11418951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
11428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
11438951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
11445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
11455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // If this was structure was expand into multiple arguments then
11465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // we need to create a temporary and reconstruct it from the
11475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // arguments.
114839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      std::string Name = Arg->getNameAsString();
11495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      llvm::Value *Temp = CreateTempAlloca(ConvertType(Ty),
11505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                           (Name + ".addr").c_str());
11515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: What are the right qualifiers here?
11525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      llvm::Function::arg_iterator End =
11535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI);
11545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitParmDecl(*Arg, Temp);
11555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
11565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // Name the arguments used in expansion and increment AI.
11575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      unsigned Index = 0;
11585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      for (; AI != End; ++AI, ++Index)
11595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        AI->setName(Name + "." + llvm::utostr(Index));
11605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
11615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
116211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
116311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
116411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
116511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
11665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
11678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::StructRet:
11688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for non-return argument");
11698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
11705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
11715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++AI;
117217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
117317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  assert(AI == Fn->arg_end() && "Argument mismatch!");
117417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
117517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
117617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(QualType RetTy,
117717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         llvm::Value *ReturnValue) {
11782c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  llvm::Value *RV = 0;
11792c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
11802c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  // Functions with no result always return void.
11812c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (ReturnValue) {
11826b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes());
11832c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
11842c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    switch (RetAI.getKind()) {
11852c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    case ABIArgInfo::StructRet:
11863aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      if (RetTy->isAnyComplexType()) {
11873aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        // FIXME: Volatile
11883aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
11893aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        StoreComplexToAddr(RT, CurFn->arg_begin(), false);
11903aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
11913aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
11923aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else {
11933aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        Builder.CreateStore(Builder.CreateLoad(ReturnValue),
11943aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar                            CurFn->arg_begin());
11953aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      }
11962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
11978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
11982c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    case ABIArgInfo::Default:
11992c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      RV = Builder.CreateLoad(ReturnValue);
12002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
12012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
120211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
120311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
120411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
1205639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    case ABIArgInfo::Coerce: {
120654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this);
12078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
1208639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    }
12098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
12108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::ByVal:
12118951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
12128951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for return argument");
121317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
121417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
12152c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
12162c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (RV) {
12172c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRet(RV);
12182c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
12192c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRetVoid();
12202c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
122117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
122217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
122317b708d61827cd86278e9580b041dd6cbadf07d3Daniel DunbarRValue CodeGenFunction::EmitCall(llvm::Value *Callee,
1224bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar                                 const CGFunctionInfo &CallInfo,
122517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                 const CallArgList &CallArgs) {
122617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::SmallVector<llvm::Value*, 16> Args;
122717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
122817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Handle struct-return functions by passing a pointer to the
122917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // location that we would like to return into.
1230bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  QualType RetTy = CallInfo.getReturnType();
12316b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes());
12322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
12332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::StructRet:
123417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    // Create a temporary alloca to hold the result of the call. :(
12355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    Args.push_back(CreateTempAlloca(ConvertType(RetTy)));
12362c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
12372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
12382c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Default:
123911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
12402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
12412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
12428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
12438951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::ByVal:
12448951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
12458951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
124617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
124717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
124817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
124917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar       I != E; ++I) {
12506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo ArgInfo = getABIArgumentInfo(I->second, CGM.getTypes());
125117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    RValue RV = I->first;
12525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
12535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    switch (ArgInfo.getKind()) {
12545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::ByVal: // Default is byval
12555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Default:
12565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (RV.isScalar()) {
12575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getScalarVal());
12585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else if (RV.isComplex()) {
12595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        // Make a temporary alloca to pass the argument.
12605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(CreateTempAlloca(ConvertType(I->second)));
12615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
12625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else {
12635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getAggregateAddr());
12645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      }
12655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
12665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
126711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
126811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
126911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
12705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::StructRet:
12715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
12725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      assert(0 && "Invalid ABI kind for non-return argument");
12735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
12745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
12755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand:
12765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(I->second, RV, Args);
12775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
127817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
127917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
128017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
128117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size());
128217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
12835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set.
1284761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CodeGen::AttributeListType AttributeList;
1285725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar  CGM.ConstructAttributeList(0, CallInfo, AttributeList);
1286761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CI->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(),
1287725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                           AttributeList.size()));
1288725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar
128917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (const llvm::Function *F = dyn_cast<llvm::Function>(Callee))
129017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setCallingConv(F->getCallingConv());
129117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (CI->getType() != llvm::Type::VoidTy)
129217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setName("call");
12932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
12942c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
12952c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::StructRet:
12962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isAnyComplexType())
12975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
12983aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar    else if (CodeGenFunction::hasAggregateLLVMType(RetTy))
12995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getAggregate(Args[0]);
13003aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar    else
13013aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      return RValue::get(Builder.CreateLoad(Args[0]));
13028951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
13032c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Default:
13042c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    return RValue::get(RetTy->isVoidType() ? 0 : CI);
13052c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
130611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
1307cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar    if (RetTy->isVoidType())
1308cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar      return RValue::get(0);
1309cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
1310cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar      llvm::Value *Res =
1311cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar        llvm::UndefValue::get(llvm::PointerType::getUnqual(ConvertType(RetTy)));
1312cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar      return RValue::getAggregate(Res);
1313cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar    }
1314cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar    return RValue::get(llvm::UndefValue::get(ConvertType(RetTy)));
131511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
1316639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  case ABIArgInfo::Coerce: {
131754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    llvm::Value *V = CreateTempAlloca(ConvertType(RetTy), "coerce");
131854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CreateCoercedStore(CI, V, *this);
1319ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson    if (RetTy->isAnyComplexType())
1320ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getComplex(LoadComplexFromAddr(V, false));
132111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    else if (CodeGenFunction::hasAggregateLLVMType(RetTy))
1322ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getAggregate(V);
132311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    else
132411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      return RValue::get(Builder.CreateLoad(V));
1325639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  }
13268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
13278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::ByVal:
13288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
13298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
133017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
13312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
13322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  assert(0 && "Unhandled ABIArgInfo::Kind");
13332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  return RValue::get(0);
133417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
1335