CGCall.cpp revision f04d69bbb25eb681fff1a108f13f67c6ca70cf6a
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
306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarstatic llvm::cl::opt<bool>
316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel DunbarUseX86_64ABI("use-x86_64-abi",
326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar           llvm::cl::desc("Enable use of experimental x86_64 ABI."),
336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar           llvm::cl::init(false));
346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/
360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
370dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation.
380dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
3945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeNoProto *FTNP)
4045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  : IsVariadic(true)
4145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar{
4245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  ArgTypes.push_back(FTNP->getResultType());
4345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
4445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
4545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeProto *FTP)
4645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  : IsVariadic(FTP->isVariadic())
4745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar{
4845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  ArgTypes.push_back(FTP->getResultType());
4945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
5045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ArgTypes.push_back(FTP->getArgType(i));
5145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
5245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
5345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar// FIXME: Is there really any reason to have this still?
540dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD)
550dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar{
560dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionType *FTy = FD->getType()->getAsFunctionType();
570dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(FTy);
5845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
590dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(FTy->getResultType());
6045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  if (FTP) {
6145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    IsVariadic = FTP->isVariadic();
620dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
630dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar      ArgTypes.push_back(FTP->getArgType(i));
6445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  } else {
6545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    IsVariadic = true;
6645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
670dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
680dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
690dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const ObjCMethodDecl *MD,
700dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar                               const ASTContext &Context)
7145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  : IsVariadic(MD->isVariadic())
720dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar{
730dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(MD->getResultType());
740dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(MD->getSelfDecl()->getType());
750dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  ArgTypes.push_back(Context.getObjCSelType());
760dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  for (ObjCMethodDecl::param_const_iterator i = MD->param_begin(),
770dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar         e = MD->param_end(); i != e; ++i)
780dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    ArgTypes.push_back((*i)->getType());
790dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
800dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
815323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGFunctionInfo::argtypes_begin() const {
825323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.begin();
835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
845323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
855323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGFunctionInfo::argtypes_end() const {
865323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.end();
870dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
880dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
890dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/
900dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
915323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarCGCallInfo::CGCallInfo(QualType _ResultType, const CallArgList &_Args) {
925323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  ArgTypes.push_back(_ResultType);
935323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  for (CallArgList::const_iterator i = _Args.begin(), e = _Args.end(); i!=e; ++i)
940dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    ArgTypes.push_back(i->second);
950dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
960dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
975323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGCallInfo::argtypes_begin() const {
985323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.begin();
995323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
1005323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
1015323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGCallInfo::argtypes_end() const {
1025323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  return ArgTypes.end();
1030dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
10417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
10517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar/***/
10617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
1078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// ABIArgInfo - Helper class to encapsulate information about how a
1088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// specific C type should be passed to or returned from a function.
1092c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarclass ABIArgInfo {
1102c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic:
1112c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  enum Kind {
1122c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Default,
1133aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar    StructRet, /// Only valid for return values. The return value
1143aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar               /// should be passed through a pointer to a caller
1153aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar               /// allocated location passed as an implicit first
1163aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar               /// argument to the function.
1178951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
11811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    Ignore,    /// Ignore the argument (treat as void). Useful for
11911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar               /// void and empty structs.
12011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
1215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    Coerce,    /// Only valid for aggregate return types, the argument
1225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// should be accessed by coercion to a provided type.
1238951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1248951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    ByVal,     /// Only valid for aggregate argument types. The
1258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar               /// structure should be passed "byval" with the
1268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar               /// specified alignment (0 indicates default
1278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar               /// alignment).
1288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    Expand,    /// Only valid for aggregate argument types. The
1308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar               /// structure should be expanded into consecutive
1315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// arguments for its constituent fields. Currently
1325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// expand is only allowed on structures whose fields
1335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// are all scalar types or are themselves expandable
1345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar               /// types.
1358951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1368951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    KindFirst=Default, KindLast=Expand
1372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  };
1382c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarprivate:
1402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  Kind TheKind;
141639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  const llvm::Type *TypeData;
1428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  unsigned UIntData;
1432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1448951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  ABIArgInfo(Kind K, const llvm::Type *TD=0,
1458951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar             unsigned UI=0) : TheKind(K),
1468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar                              TypeData(TD),
1478951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar                              UIntData(0) {}
1482c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic:
1492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  static ABIArgInfo getDefault() {
1508951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo(Default);
1512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
1522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  static ABIArgInfo getStructRet() {
1538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo(StructRet);
1542c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
15511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  static ABIArgInfo getIgnore() {
15611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    return ABIArgInfo(Ignore);
15711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  }
158639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  static ABIArgInfo getCoerce(const llvm::Type *T) {
1592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    return ABIArgInfo(Coerce, T);
1602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
1618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  static ABIArgInfo getByVal(unsigned Alignment) {
1628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo(ByVal, 0, Alignment);
1638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  }
1645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  static ABIArgInfo getExpand() {
1655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    return ABIArgInfo(Expand);
1665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
1672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1682c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  Kind getKind() const { return TheKind; }
1692c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  bool isDefault() const { return TheKind == Default; }
1702c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  bool isStructRet() const { return TheKind == StructRet; }
17111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  bool isIgnore() const { return TheKind == Ignore; }
1722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  bool isCoerce() const { return TheKind == Coerce; }
1738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  bool isByVal() const { return TheKind == ByVal; }
1745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  bool isExpand() const { return TheKind == Expand; }
17545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
17645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  // Coerce accessors
177639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  const llvm::Type *getCoerceToType() const {
17845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    assert(TheKind == Coerce && "Invalid kind!");
17945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    return TypeData;
18045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
1818951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  // ByVal accessors
1838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  unsigned getByValAlignment() const {
1848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(TheKind == ByVal && "Invalid kind!");
1858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return UIntData;
1868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  }
1872c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar};
1882c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1892c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/
1902c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/* FIXME: All of this stuff should be part of the target interface
1926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar   somehow. It is currently here because it is not clear how to factor
1936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar   the targets to support this, since the Targets currently live in a
1946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar   layer below types n'stuff.
1956b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar */
1966b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1976b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// ABIInfo - Target specific hooks for defining how a type should be
1986b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// passed or returned from functions.
1996b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass clang::ABIInfo {
2006b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic:
2016b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ~ABIInfo();
2026b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
2036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyReturnType(QualType RetTy,
2046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                        ASTContext &Context) const = 0;
2056b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
2066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyArgumentType(QualType Ty,
2076b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                          ASTContext &Context) const = 0;
2086b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
2096b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
2106b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIInfo::~ABIInfo() {}
2116b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
212834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isEmptyStruct - Return true iff a structure has no non-empty
213834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// members. Note that a structure with a flexible array member is not
214834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered empty.
215834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool isEmptyStruct(QualType T) {
216834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordType *RT = T->getAsStructureType();
217834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!RT)
218834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
219834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordDecl *RD = RT->getDecl();
220834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (RD->hasFlexibleArrayMember())
221834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return false;
222f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(),
223834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar         e = RD->field_end(); i != e; ++i) {
224834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
225834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (!isEmptyStruct(FD->getType()))
226834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return false;
227834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
228834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return true;
229834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
230834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
231834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isSingleElementStruct - Determine if a structure is a "single
232834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// element struct", i.e. it has exactly one non-empty field or
233834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// exactly one field which is itself a single element
234834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// struct. Structures with flexible array members are never
235834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered single element structs.
236834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar///
237834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// \return The field declaration for the single non-empty field, if
238834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// it exists.
239834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic const FieldDecl *isSingleElementStruct(QualType T) {
240834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordType *RT = T->getAsStructureType();
241834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!RT)
242834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
243834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
244834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordDecl *RD = RT->getDecl();
245834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (RD->hasFlexibleArrayMember())
246834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
247834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
248834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const FieldDecl *Found = 0;
249f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(),
250834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar         e = RD->field_end(); i != e; ++i) {
251834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
252834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    QualType FT = FD->getType();
253834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
254834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (isEmptyStruct(FT)) {
255834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      // Ignore
256834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    } else if (Found) {
257834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return 0;
258834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    } else if (!CodeGenFunction::hasAggregateLLVMType(FT)) {
259834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      Found = FD;
260834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    } else {
261834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      Found = isSingleElementStruct(FT);
262834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (!Found)
263834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return 0;
264834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
265834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
266834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
267834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return Found;
268834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
269834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
270834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
271834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!Ty->getAsBuiltinType() && !Ty->isPointerType())
272834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return false;
273834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
274834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  uint64_t Size = Context.getTypeSize(Ty);
275834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return Size == 32 || Size == 64;
276834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
277834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
278834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool areAllFields32Or64BitBasicType(const RecordDecl *RD,
279834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar                                           ASTContext &Context) {
280f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(),
281834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar         e = RD->field_end(); i != e; ++i) {
282834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
283834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
284834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (!is32Or64BitBasicType(FD->getType(), Context))
285834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return false;
286834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
287834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // If this is a bit-field we need to make sure it is still a
288834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // 32-bit or 64-bit type.
289834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (Expr *BW = FD->getBitWidth()) {
290834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      unsigned Width = BW->getIntegerConstantExprValue(Context).getZExtValue();
291834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (Width <= 16)
292834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return false;
293834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
294834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
295834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return true;
296834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
297834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
2986b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarnamespace {
2996b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// DefaultABIInfo - The default implementation for ABI specific
3006b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// details. This implementation provides information which results in
3016b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// sensible LLVM IR generation, but does not conform to any
3026b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// particular ABI.
3036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass DefaultABIInfo : public ABIInfo {
3046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyReturnType(QualType RetTy,
3056b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                        ASTContext &Context) const;
3066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
3076b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyArgumentType(QualType RetTy,
3086b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                          ASTContext &Context) const;
3096b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
3106b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
3116b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// X86_32ABIInfo - The X86-32 ABI information.
3126b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass X86_32ABIInfo : public ABIInfo {
3136b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic:
3146b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyReturnType(QualType RetTy,
3156b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                        ASTContext &Context) const;
3166b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
3176b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  virtual ABIArgInfo classifyArgumentType(QualType RetTy,
3186b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                          ASTContext &Context) const;
3196b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
3206b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
3216b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
3226b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
3236b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                            ASTContext &Context) const {
3242c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
325834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Classify "single element" structs as their element type.
326834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *SeltFD = isSingleElementStruct(RetTy);
327834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (SeltFD) {
328834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      QualType SeltTy = SeltFD->getType()->getDesugaredType();
329834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (const BuiltinType *BT = SeltTy->getAsBuiltinType()) {
330834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // FIXME: This is gross, it would be nice if we could just
331834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // pass back SeltTy and have clients deal with it. Is it worth
332834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // supporting coerce to both LLVM and clang Types?
333834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        if (BT->isIntegerType()) {
334834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          uint64_t Size = Context.getTypeSize(SeltTy);
335834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::IntegerType::get((unsigned) Size));
336834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        } else if (BT->getKind() == BuiltinType::Float) {
337834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::Type::FloatTy);
338834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        } else if (BT->getKind() == BuiltinType::Double) {
339834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::Type::DoubleTy);
340834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        }
341834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      } else if (SeltTy->isPointerType()) {
342834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // FIXME: It would be really nice if this could come out as
343834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        // the proper pointer type.
344834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        llvm::Type *PtrTy =
345834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
346834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getCoerce(PtrTy);
347834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      }
348834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
349834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
350639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    uint64_t Size = Context.getTypeSize(RetTy);
351639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    if (Size == 8) {
352639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getCoerce(llvm::Type::Int8Ty);
353639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    } else if (Size == 16) {
354639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getCoerce(llvm::Type::Int16Ty);
355639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    } else if (Size == 32) {
356639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getCoerce(llvm::Type::Int32Ty);
357639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    } else if (Size == 64) {
358639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getCoerce(llvm::Type::Int64Ty);
359639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    } else {
360639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar      return ABIArgInfo::getStructRet();
361639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    }
3622c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
3632c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    return ABIArgInfo::getDefault();
3642c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
3652c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar}
3662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
3676b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
3686b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                              ASTContext &Context) const {
369f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
370834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Structures with flexible arrays are always byval.
371834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (const RecordType *RT = Ty->getAsStructureType())
372834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (RT->getDecl()->hasFlexibleArrayMember())
373834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getByVal(0);
374834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
375834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Expand empty structs (i.e. ignore)
376834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
377834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (Ty->isStructureType() && Size == 0)
378834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return ABIArgInfo::getExpand();
379834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
380834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Expand structs with size <= 128-bits which consist only of
381834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // basic types (int, long long, float, double, xxx*). This is
382834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // non-recursive and does not ignore empty fields.
383834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (const RecordType *RT = Ty->getAsStructureType()) {
384834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (Context.getTypeSize(Ty) <= 4*32 &&
385834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          areAllFields32Or64BitBasicType(RT->getDecl(), Context))
386834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getExpand();
387834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
388834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
3898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo::getByVal(0);
3908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  } else {
3918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    return ABIArgInfo::getDefault();
3928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  }
3938951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar}
3948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
3956f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarnamespace {
3966f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar/// X86_32ABIInfo - The X86_64 ABI information.
3976f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarclass X86_64ABIInfo : public ABIInfo {
3986f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  enum Class {
3996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Integer = 0,
4006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    SSE,
4016f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    SSEUp,
4026f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    X87,
4036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    X87Up,
4046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ComplexX87,
4056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    NoClass,
4066f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Memory
4076f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  };
4086f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
4096f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// classify - Determine the x86_64 register classes in which the
4106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// given type T should be passed.
4116f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
4126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// \param Lo - The classification for the low word of the type.
4136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// \param Hi - The classification for the high word of the type.
414f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar  /// \param OffsetBase - The byte position of the type in the root
415f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar  /// structure. Some parameters are classified different depending on
416f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar  /// whether they straddle an eightbyte boundary.
4176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
4186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// If a word is unused its result will be NoClass; if a type should
4196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// be passed in Memory then at least the classification of \arg Lo
4206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// will be Memory.
4216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
4226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// The \arg Lo class will be NoClass iff the argument is ignored.
4236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
4246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
4256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// be NoClass.
426f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar  void classify(QualType T, ASTContext &Context, unsigned OffsetBase,
4276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                Class &Lo, Class &Hi) const;
4286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
4296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarpublic:
4306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  virtual ABIArgInfo classifyReturnType(QualType RetTy,
4316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                                        ASTContext &Context) const;
4326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
4336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  virtual ABIArgInfo classifyArgumentType(QualType RetTy,
4346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                                          ASTContext &Context) const;
4356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar};
4366f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}
4376f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
4386f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarvoid X86_64ABIInfo::classify(QualType Ty,
4396f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                             ASTContext &Context,
440f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar                             unsigned OffsetBase,
4416f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                             Class &Lo, Class &Hi) const {
4426f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  Lo = Memory;
4436f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  Hi = NoClass;
4446f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  if (const BuiltinType *BT = Ty->getAsBuiltinType()) {
4456f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    BuiltinType::Kind k = BT->getKind();
4466f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
44711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    if (k == BuiltinType::Void) {
44811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      Lo = NoClass;
44911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
4506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = Integer;
4516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    } else if (k == BuiltinType::Float || k == BuiltinType::Double) {
4526f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = SSE;
4536f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    } else if (k == BuiltinType::LongDouble) {
4546f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = X87;
4556f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Hi = X87Up;
4566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    }
4577a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar
4587a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    // FIXME: _Decimal32 and _Decimal64 are SSE.
4597a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
4606f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // FIXME: __int128 is (Integer, Integer).
4616f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  } else if (Ty->isPointerLikeType() || Ty->isBlockPointerType() ||
4626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar             Ty->isObjCQualifiedInterfaceType()) {
4636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Lo = Integer;
4647a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar  } else if (const VectorType *VT = Ty->getAsVectorType()) {
4657a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    unsigned Size = Context.getTypeSize(VT);
4667a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    if (Size == 64) {
4677a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      // FIXME: For some reason, gcc appears to be treating <1 x
4687a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      // double> as INTEGER; this seems wrong, but we will match for
4697a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      // now (icc rejects <1 x double>, so...).
4707a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Lo = (VT->getElementType() == Context.DoubleTy) ? Integer : SSE;
4717a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    } else if (Size == 128) {
4727a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Lo = SSE;
4737a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Hi = SSEUp;
4747a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    }
4756f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  } else if (const ComplexType *CT = Ty->getAsComplexType()) {
4766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    QualType ET = CT->getElementType();
4776f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
478eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar    if (ET->isIntegerType()) {
479eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      unsigned Size = Context.getTypeSize(Ty);
480eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      if (Size <= 64)
481eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar        Lo = Integer;
482eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      else if (Size <= 128)
483eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar        Lo = Hi = Integer;
484eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar    } else if (ET == Context.FloatTy)
4856f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = SSE;
4866f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    else if (ET == Context.DoubleTy)
4876f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = Hi = SSE;
4886f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    else if (ET == Context.LongDoubleTy)
4896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = ComplexX87;
490f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar
491f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    // If this complex type crosses an eightbyte boundary then it
492f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    // should be split.
493f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    unsigned EB_Real = (OffsetBase) >> 3;
494f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    unsigned EB_Imag = (OffsetBase + Context.getTypeSize(ET)) >> 3;
495f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    if (Hi == NoClass && EB_Real != EB_Imag)
496f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar      Hi = Lo;
49799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar  } else if (const RecordType *RT = Ty->getAsRecordType()) {
49899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    unsigned Size = Context.getTypeSize(Ty);
49999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
50099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
50199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // than two eightbytes, ..., it has class MEMORY.
50299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (Size > 128)
50399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      return;
50499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
50599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    const RecordDecl *RD = RT->getDecl();
50699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
50799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // Assume variable sized types are passed in memory.
50899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (RD->hasFlexibleArrayMember())
50999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      return;
51099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
51199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
51299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
51399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // Reset Lo class, this will be recomputed.
51499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    Lo = NoClass;
51599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    unsigned idx = 0;
51699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    for (RecordDecl::field_iterator i = RD->field_begin(),
51799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar           e = RD->field_end(); i != e; ++i, ++idx) {
518f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar      unsigned Offset = OffsetBase + Layout.getFieldOffset(idx);
51999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
52099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //  AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
52199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //  fields, it has class MEMORY.
52299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      if (Offset % Context.getTypeAlign(i->getType())) {
52399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Lo = Memory;
52499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        return;
52599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      }
52699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
52799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // Determine which half of the structure we are classifying.
52899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //
52999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // AMD64-ABI 3.2.3p2: Rule 3. f the size of the aggregate
53099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // exceeds a single eightbyte, each is classified
53199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // separately. Each eightbyte gets initialized to class
53299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // NO_CLASS.
53399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      Class &Target = Offset < 64 ? Lo : Hi;
53499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
53599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // Classify this field.
53699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      Class FieldLo, FieldHi;
537f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar      classify(i->getType(), Context, Offset, FieldLo, FieldHi);
53899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
53999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // Merge the lo field classifcation.
54099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //
54199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
54299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // classified recursively so that always two fields are
54399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // considered. The resulting class is calculated according to
54499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // the classes of the fields in the eightbyte:
54599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //
54699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // (a) If both classes are equal, this is the resulting class.
54799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //
54899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // (b) If one of the classes is NO_CLASS, the resulting class is
54999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // the other class.
55099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //
55199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // (c) If one of the classes is MEMORY, the result is the MEMORY
55299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // class.
55399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //
55499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // (d) If one of the classes is INTEGER, the result is the
55599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // INTEGER.
55699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //
55799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
55899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // MEMORY is used as class.
55999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      //
56099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // (f) Otherwise class SSE is used.
56199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      if (Target == FieldLo || FieldLo == NoClass) ;
56299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      else if (FieldLo == Memory) {
56399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        // Memory is never over-ridden, just bail.
56499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Lo = Memory;
56599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        return;
56699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      }
5677f102f8c815a38e7df72b7d032c31529b98047f7Daniel Dunbar      else if (Target == NoClass)
5687f102f8c815a38e7df72b7d032c31529b98047f7Daniel Dunbar        Target = FieldLo;
56999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      else if (Target == Integer || FieldLo == Integer)
57099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Target = Integer;
57199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      else if (FieldLo == X87 || FieldLo == X87Up || FieldLo == ComplexX87) {
57299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        // As before, just bail once we generate a memory class.
57399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Lo = Memory;
57499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        return;
57599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      } else
57699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Target = SSE;
57799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
57899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // It isn't clear from the ABI spec what the role of the high
57999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // classification is here, but since this should only happen
58099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // when we have a struct with a two eightbyte member, we can
58199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // just push the field high class into the overall high class.
58299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      if (FieldHi != NoClass)
58399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Hi = FieldHi;
58499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    }
58599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
58699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
58799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    //
58899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // (a) If one of the classes is MEMORY, the whole argument is
58999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // passed in memory.
59099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    //
59199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // (b) If SSEUP is not preceeded by SSE, it is converted to SSE.
59299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
59399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // The first of these conditions is guaranteed by how we implement
59499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // the merge (just bail). I don't believe the second is actually
59599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // possible at all.
59699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    assert(Lo != Memory && "Unexpected memory classification.");
59799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (Hi == SSEUp && Lo != SSE)
59899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Hi = SSE;
5996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
6006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}
6016f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
602d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy,
603d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar                                            ASTContext &Context) const {
6046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
6056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // classification algorithm.
6066f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  X86_64ABIInfo::Class Lo, Hi;
607f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar  classify(RetTy, Context, 0, Lo, Hi);
6086f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6096f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  const llvm::Type *ResType = 0;
6106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  switch (Lo) {
6116f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case NoClass:
61211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    return ABIArgInfo::getIgnore();
6136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6146f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSEUp:
6156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87Up:
6166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(0 && "Invalid classification for lo word.");
6176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
6196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // hidden argument, i.e. structret.
6206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Memory:
6216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    return ABIArgInfo::getStructRet();
6226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
6246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // available register of the sequence %rax, %rdx is used.
6256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Integer:
6266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::Int64Ty; break;
6276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
6296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // available SSE register of the sequence %xmm0, %xmm1 is used.
6306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSE:
6316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::DoubleTy; break;
6326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
6346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // returned on the X87 stack in %st0 as 80-bit x87 number.
6356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87:
6366f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::X86_FP80Ty; break;
6376f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6386f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
6396f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // part of the value is returned in %st0 and the imaginary part in
6406f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // %st1.
6416f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case ComplexX87:
6426f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(Hi == NoClass && "Unexpected ComplexX87 classification.");
6436f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::VectorType::get(llvm::Type::X86_FP80Ty, 2);
6446f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
6456f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
6466f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6476f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  switch (Hi) {
6486f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // Memory was handled previously, and ComplexX87 and X87 should
6496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // never occur as hi classes.
6506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Memory:
6516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87:
6526f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case ComplexX87:
6536f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(0 && "Invalid classification for hi word.");
6546f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6556f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case NoClass: break;
6566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Integer:
657b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL);
658b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    break;
6596f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSE:
660b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
661b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    break;
6626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
6646f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // is passed in the upper half of the last used SSE register.
6656f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    //
6666f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // SSEUP should always be preceeded by SSE, just widen.
6676f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSEUp:
6686f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(Lo == SSE && "Unexpected SSEUp classification.");
6696f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2);
6706f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
6716f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6726f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
673b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    // returned together with the previous X87 value in %st0.
6746f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    //
6756f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // X87UP should always be preceeded by X87, so we don't need to do
6766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // anything here.
6776f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87Up:
6786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(Lo == X87 && "Unexpected X87Up classification.");
6796f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
6806f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
6816f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
6826f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  return ABIArgInfo::getCoerce(ResType);
683d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar}
684d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar
685d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty,
686d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar                                              ASTContext &Context) const {
687d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar  return ABIArgInfo::getDefault();
688d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar}
689d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar
6906b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy,
6916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                            ASTContext &Context) const {
6926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return ABIArgInfo::getDefault();
6936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
6946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
6956b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty,
6966b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                              ASTContext &Context) const {
6976b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return ABIArgInfo::getDefault();
6986b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
6996b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7006b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarconst ABIInfo &CodeGenTypes::getABIInfo() const {
7016b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  if (TheABIInfo)
7026b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    return *TheABIInfo;
7036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  // For now we just cache this in the CodeGenTypes and don't bother
7056b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  // to free it.
7066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  const char *TargetPrefix = getContext().Target.getTargetPrefix();
7076b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  if (strcmp(TargetPrefix, "x86") == 0) {
708d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    switch (getContext().Target.getPointerWidth(0)) {
709d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    case 32:
7106b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar      return *(TheABIInfo = new X86_32ABIInfo());
711d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    case 64:
7126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      if (UseX86_64ABI)
7136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar        return *(TheABIInfo = new X86_64ABIInfo());
714d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    }
7156b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  }
7166b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7176b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return *(TheABIInfo = new DefaultABIInfo);
7186b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
7196b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
7206b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// getABIReturnInfo - Wrap the ABIInfo getABIReturnInfo, altering
7216b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// "default" types to StructRet when appropriate for simplicity.
7226b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarstatic ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT) {
7236b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  assert(!Ty->isArrayType() &&
7246b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar         "Array types cannot be passed directly.");
7256b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo Info = CGT.getABIInfo().classifyReturnType(Ty, CGT.getContext());
726f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  // Ensure default on aggregate types is StructRet.
727f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty))
728f035738e346da0a82538ab236aef218a27373635Daniel Dunbar    return ABIArgInfo::getStructRet();
729f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  return Info;
730f035738e346da0a82538ab236aef218a27373635Daniel Dunbar}
731f035738e346da0a82538ab236aef218a27373635Daniel Dunbar
7326b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// getABIArgumentInfo - Wrap the ABIInfo getABIReturnInfo, altering
7336b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// "default" types to ByVal when appropriate for simplicity.
7346b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarstatic ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT) {
7356b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  assert(!Ty->isArrayType() &&
7366b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar         "Array types cannot be passed directly.");
7376b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo Info = CGT.getABIInfo().classifyArgumentType(Ty, CGT.getContext());
738f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  // Ensure default on aggregate types is ByVal.
739f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty))
740f035738e346da0a82538ab236aef218a27373635Daniel Dunbar    return ABIArgInfo::getByVal(0);
741f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  return Info;
742f035738e346da0a82538ab236aef218a27373635Daniel Dunbar}
743f035738e346da0a82538ab236aef218a27373635Daniel Dunbar
7442c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/
7452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
7465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty,
7475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    std::vector<const llvm::Type*> &ArgTys) {
7485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
7495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
7505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordDecl *RD = RT->getDecl();
7515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(!RD->hasFlexibleArrayMember() &&
7525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Cannot expand structure with flexible array.");
7535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
754f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(),
7555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         e = RD->field_end(); i != e; ++i) {
7565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    const FieldDecl *FD = *i;
7575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    assert(!FD->isBitField() &&
7585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar           "Cannot expand structure with bit-field members.");
7595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
7615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
7625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(FT, ArgTys);
7635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
7645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ArgTys.push_back(ConvertType(FT));
7655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
7665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
7675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
7685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator
7705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
7715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    llvm::Function::arg_iterator AI) {
7725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
7735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
7745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
7765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(LV.isSimple() &&
7775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Unexpected non-simple lvalue during struct expansion.");
7785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = LV.getAddress();
7795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  for (RecordDecl::field_iterator i = RD->field_begin(),
7805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         e = RD->field_end(); i != e; ++i) {
7815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
7825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
7835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
7855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
7865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
7875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      AI = ExpandTypeFromArgs(FT, LV, AI);
7885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
7895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitStoreThroughLValue(RValue::get(AI), LV, FT);
7905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ++AI;
7915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
7925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
7935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  return AI;
7955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
7965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid
7985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
7995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                  llvm::SmallVector<llvm::Value*, 16> &Args) {
8005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
8015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
8025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
8045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
8055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = RV.getAggregateAddr();
8065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  for (RecordDecl::field_iterator i = RD->field_begin(),
8075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         e = RD->field_end(); i != e; ++i) {
8085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
8095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
8105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
8125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
8135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
8145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
8155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
8165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      RValue RV = EmitLoadOfLValue(LV, FT);
8175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      assert(RV.isScalar() &&
8185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar             "Unexpected non-scalar rvalue during struct expansion.");
8195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Args.push_back(RV.getScalarVal());
8205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
8215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
8225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
8235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/
8255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
82645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType *
82762d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel DunbarCodeGenTypes::GetFunctionType(const CGCallInfo &CI, bool IsVariadic) {
82862d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar  return GetFunctionType(CI.argtypes_begin(), CI.argtypes_end(), IsVariadic);
82962d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar}
83062d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar
83162d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbarconst llvm::FunctionType *
83245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI) {
83362d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar  return GetFunctionType(FI.argtypes_begin(), FI.argtypes_end(), FI.isVariadic());
83462d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar}
83562d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar
83662d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbarconst llvm::FunctionType *
83762d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel DunbarCodeGenTypes::GetFunctionType(ArgTypeIterator begin, ArgTypeIterator end,
83862d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar                              bool IsVariadic) {
83945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  std::vector<const llvm::Type*> ArgTys;
84045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
84145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  const llvm::Type *ResultType = 0;
84245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
84345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  QualType RetTy = *begin;
8446b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo RetAI = getABIReturnInfo(RetTy, *this);
8458951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  switch (RetAI.getKind()) {
8468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::ByVal:
8478951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
8488951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
8498951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
85045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Default:
85145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    if (RetTy->isVoidType()) {
85245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar      ResultType = llvm::Type::VoidTy;
85345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    } else {
85462d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar      ResultType = ConvertType(RetTy);
85545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    }
85645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
85745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
85845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::StructRet: {
85945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ResultType = llvm::Type::VoidTy;
86062d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *STy = ConvertType(RetTy);
86145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
86245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
86345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
86445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
86511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
86611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    ResultType = llvm::Type::VoidTy;
86711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    break;
86811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
86945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Coerce:
870639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    ResultType = RetAI.getCoerceToType();
87145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
87245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
87345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
87445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  for (++begin; begin != end; ++begin) {
8756b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo AI = getABIArgumentInfo(*begin, *this);
87662d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *Ty = ConvertType(*begin);
8778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
8788951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
87911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
88011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
88111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
8825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
8838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::StructRet:
8848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for non-return argument");
8858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
8868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::ByVal:
88745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar      // byval arguments are always on the stack, which is addr space #0.
88845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar      ArgTys.push_back(llvm::PointerType::getUnqual(Ty));
8898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled");
8908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
8918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
8928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Default:
8938951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      ArgTys.push_back(Ty);
8948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
8958951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
8968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
8975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(*begin, ArgTys);
8988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
8998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
90045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
90145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
90262d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar  return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic);
90345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
90445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
905b768807c49a1c7085def099b848631856af766faDaniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(QualType RetTy) {
9066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return getABIReturnInfo(RetTy, getTypes()).isStructRet();
9073913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar}
9083913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar
909761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patelvoid CodeGenModule::ConstructAttributeList(const Decl *TargetDecl,
9102c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar                                           ArgTypeIterator begin,
9112c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar                                           ArgTypeIterator end,
912761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                           AttributeListType &PAL) {
9135323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned FuncAttrs = 0;
914a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  unsigned RetAttrs = 0;
9155323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
9165323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (TargetDecl) {
9175323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (TargetDecl->getAttr<NoThrowAttr>())
918761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoUnwind;
9195323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    if (TargetDecl->getAttr<NoReturnAttr>())
920761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoReturn;
921232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson    if (TargetDecl->getAttr<PureAttr>())
922232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadOnly;
923232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson    if (TargetDecl->getAttr<ConstAttr>())
924232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadNone;
9255323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
9265323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
9272c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  QualType RetTy = *begin;
9285323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned Index = 1;
9296b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo RetAI = getABIReturnInfo(RetTy, getTypes());
93045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  switch (RetAI.getKind()) {
9312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Default:
9322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isPromotableIntegerType()) {
9332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      if (RetTy->isSignedIntegerType()) {
934a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel        RetAttrs |= llvm::Attribute::SExt;
9352c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      } else if (RetTy->isUnsignedIntegerType()) {
936a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel        RetAttrs |= llvm::Attribute::ZExt;
9372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      }
9382c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    }
9392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
9402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
9412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::StructRet:
942761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    PAL.push_back(llvm::AttributeWithIndex::get(Index,
943761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                                  llvm::Attribute::StructRet|
944761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                                  llvm::Attribute::NoAlias));
9455323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    ++Index;
9462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
9472c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
94811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
9492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
9502c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
9518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
9528951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::ByVal:
9538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
9548951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
9555323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
9562c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
957a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (RetAttrs)
958a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
9595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  for (++begin; begin != end; ++begin) {
9605323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    QualType ParamType = *begin;
961761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    unsigned Attributes = 0;
9626b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo AI = getABIArgumentInfo(ParamType, getTypes());
9638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
9648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
9658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::StructRet:
9665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
9678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for non-return argument");
9688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
9698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::ByVal:
970761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      Attributes |= llvm::Attribute::ByVal;
9718951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled");
9728951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
9738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
9748951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Default:
9758951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      if (ParamType->isPromotableIntegerType()) {
9768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        if (ParamType->isSignedIntegerType()) {
977761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel          Attributes |= llvm::Attribute::SExt;
9788951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        } else if (ParamType->isUnsignedIntegerType()) {
979761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel          Attributes |= llvm::Attribute::ZExt;
9808951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        }
9815323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      }
9828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
9838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
98411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
98511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      // Skip increment, no matching LLVM parameter.
98611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      continue;
98711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
9885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
9895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      std::vector<const llvm::Type*> Tys;
9905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: This is rather inefficient. Do we ever actually need
9915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // to do anything here? The result should be just reconstructed
9925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // on the other side, so extension should be a non-issue.
9935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      getTypes().GetExpandedTypes(ParamType, Tys);
9945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Index += Tys.size();
9955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
9965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
9975323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
9988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
999761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    if (Attributes)
1000761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes));
10015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++Index;
10025323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
1003a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (FuncAttrs)
1004a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs));
1005a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel
10065323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
10075323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
100817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn,
100917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         QualType RetTy,
101017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         const FunctionArgList &Args) {
101117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
101217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Function::arg_iterator AI = Fn->arg_begin();
101317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
101417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Name the struct return argument.
10152c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (CGM.ReturnTypeUsesSret(RetTy)) {
101617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    AI->setName("agg.result");
101717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    ++AI;
101817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
101917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
102017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
10215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar       i != e; ++i) {
102217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    const VarDecl *Arg = i->first;
10235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType Ty = i->second;
10246b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo ArgI = getABIArgumentInfo(Ty, CGM.getTypes());
10258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
10268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (ArgI.getKind()) {
10278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::ByVal:
10288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Default: {
10298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
10308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      llvm::Value* V = AI;
10315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
10328951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        // This must be a promotion, for something like
10338951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        // "void a(x) short x; {..."
10345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        V = EmitScalarConversion(V, Ty, Arg->getType());
103517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      }
10368951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      EmitParmDecl(*Arg, V);
10378951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
10388951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
10398951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
10405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
10415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // If this was structure was expand into multiple arguments then
10425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // we need to create a temporary and reconstruct it from the
10435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // arguments.
104439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      std::string Name = Arg->getNameAsString();
10455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      llvm::Value *Temp = CreateTempAlloca(ConvertType(Ty),
10465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                           (Name + ".addr").c_str());
10475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: What are the right qualifiers here?
10485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      llvm::Function::arg_iterator End =
10495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI);
10505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitParmDecl(*Arg, Temp);
10515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
10525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // Name the arguments used in expansion and increment AI.
10535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      unsigned Index = 0;
10545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      for (; AI != End; ++AI, ++Index)
10555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        AI->setName(Name + "." + llvm::utostr(Index));
10565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
10575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
105811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
105911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
106011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
106111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
10625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
10638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::StructRet:
10648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for non-return argument");
10658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
10665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
10675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++AI;
106817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
106917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  assert(AI == Fn->arg_end() && "Argument mismatch!");
107017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
107117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
107254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
107354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// a pointer to an object of type \arg Ty.
107454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar///
107554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// This safely handles the case when the src type is smaller than the
107654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// destination type; in this situation the values of bits which not
107754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// present in the src are undefined.
107854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
107954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar                                      const llvm::Type *Ty,
108054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar                                      CodeGenFunction &CGF) {
108154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  const llvm::Type *SrcTy =
108254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    cast<llvm::PointerType>(SrcPtr->getType())->getElementType();
108354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  unsigned SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy);
108454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  unsigned DstSize = CGF.CGM.getTargetData().getTypePaddedSize(Ty);
108554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar
108654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  // If load is legal, just bitcase the src pointer.
108754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  if (SrcSize == DstSize) {
108854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    llvm::Value *Casted =
108954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
109054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    return CGF.Builder.CreateLoad(Casted);
109154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  } else {
109254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    assert(SrcSize < DstSize && "Coercion is losing source bits!");
109354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar
109454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
109554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    // simple.
109654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
109754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    llvm::Value *Casted =
109854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
109954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
110054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    return CGF.Builder.CreateLoad(Tmp);
110154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  }
110254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar}
110354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar
110454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src,
110554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// where the source and destination may have different types.
110654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar///
110754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// This safely handles the case when the src type is larger than the
110854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// destination type; the upper bits of the src will be lost.
110954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src,
111054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar                               llvm::Value *DstPtr,
111154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar                               CodeGenFunction &CGF) {
111254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  const llvm::Type *SrcTy = Src->getType();
111354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  const llvm::Type *DstTy =
111454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    cast<llvm::PointerType>(DstPtr->getType())->getElementType();
111554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar
111654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  unsigned SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy);
111754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  unsigned DstSize = CGF.CGM.getTargetData().getTypePaddedSize(DstTy);
111854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar
111954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  // If store is legal, just bitcase the src pointer.
112054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  if (SrcSize == DstSize) {
112154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    llvm::Value *Casted =
112254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
112354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CGF.Builder.CreateStore(Src, Casted);
112454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  } else {
112554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    assert(SrcSize > DstSize && "Coercion is missing bits!");
112654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar
112754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
112854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    // simple.
112954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy);
113054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CGF.Builder.CreateStore(Src, Tmp);
113154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    llvm::Value *Casted =
113254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
113354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CGF.Builder.CreateStore(CGF.Builder.CreateLoad(Casted), DstPtr);
113454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar  }
113554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar}
113654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar
113717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(QualType RetTy,
113817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         llvm::Value *ReturnValue) {
11392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  llvm::Value *RV = 0;
11402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
11412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  // Functions with no result always return void.
11422c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (ReturnValue) {
11436b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes());
11442c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
11452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    switch (RetAI.getKind()) {
11462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    case ABIArgInfo::StructRet:
11473aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      if (RetTy->isAnyComplexType()) {
11483aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        // FIXME: Volatile
11493aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
11503aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        StoreComplexToAddr(RT, CurFn->arg_begin(), false);
11513aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
11523aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
11533aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else {
11543aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        Builder.CreateStore(Builder.CreateLoad(ReturnValue),
11553aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar                            CurFn->arg_begin());
11563aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      }
11572c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
11588951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
11592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    case ABIArgInfo::Default:
11602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      RV = Builder.CreateLoad(ReturnValue);
11612c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
11622c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
116311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
116411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
116511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
1166639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    case ABIArgInfo::Coerce: {
116754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this);
11688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
1169639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    }
11708951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
11718951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::ByVal:
11728951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
11738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for return argument");
117417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
117517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
11762c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
11772c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (RV) {
11782c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRet(RV);
11792c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
11802c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRetVoid();
11812c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
118217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
118317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
118417b708d61827cd86278e9580b041dd6cbadf07d3Daniel DunbarRValue CodeGenFunction::EmitCall(llvm::Value *Callee,
11852c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar                                 QualType RetTy,
118617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                 const CallArgList &CallArgs) {
118717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::SmallVector<llvm::Value*, 16> Args;
118817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
118917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Handle struct-return functions by passing a pointer to the
119017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // location that we would like to return into.
11916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes());
11922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
11932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::StructRet:
119417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    // Create a temporary alloca to hold the result of the call. :(
11955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    Args.push_back(CreateTempAlloca(ConvertType(RetTy)));
11962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
11972c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
11982c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Default:
119911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
12002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
12012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
12028951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
12038951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::ByVal:
12048951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
12058951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
120617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
120717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
120817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
120917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar       I != E; ++I) {
12106b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    ABIArgInfo ArgInfo = getABIArgumentInfo(I->second, CGM.getTypes());
121117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    RValue RV = I->first;
12125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
12135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    switch (ArgInfo.getKind()) {
12145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::ByVal: // Default is byval
12155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Default:
12165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (RV.isScalar()) {
12175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getScalarVal());
12185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else if (RV.isComplex()) {
12195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        // Make a temporary alloca to pass the argument.
12205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(CreateTempAlloca(ConvertType(I->second)));
12215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
12225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else {
12235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getAggregateAddr());
12245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      }
12255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
12265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
122711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
122811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
122911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
12305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::StructRet:
12315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
12325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      assert(0 && "Invalid ABI kind for non-return argument");
12335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
12345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
12355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand:
12365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(I->second, RV, Args);
12375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
123817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
123917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
124017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
124117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size());
12422c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  CGCallInfo CallInfo(RetTy, CallArgs);
124317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
12445323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set.
1245761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CodeGen::AttributeListType AttributeList;
1246761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CGM.ConstructAttributeList(0,
1247b768807c49a1c7085def099b848631856af766faDaniel Dunbar                             CallInfo.argtypes_begin(), CallInfo.argtypes_end(),
1248761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                             AttributeList);
1249761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CI->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(),
1250761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                         AttributeList.size()));
125117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
125217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (const llvm::Function *F = dyn_cast<llvm::Function>(Callee))
125317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setCallingConv(F->getCallingConv());
125417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  if (CI->getType() != llvm::Type::VoidTy)
125517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setName("call");
12562c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
12572c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
12582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::StructRet:
12592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isAnyComplexType())
12605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
12613aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar    else if (CodeGenFunction::hasAggregateLLVMType(RetTy))
12625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getAggregate(Args[0]);
12633aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar    else
12643aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      return RValue::get(Builder.CreateLoad(Args[0]));
12658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
12662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Default:
12672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    return RValue::get(RetTy->isVoidType() ? 0 : CI);
12682c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
126911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
1270cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar    if (RetTy->isVoidType())
1271cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar      return RValue::get(0);
1272cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
1273cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar      llvm::Value *Res =
1274cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar        llvm::UndefValue::get(llvm::PointerType::getUnqual(ConvertType(RetTy)));
1275cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar      return RValue::getAggregate(Res);
1276cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar    }
1277cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar    return RValue::get(llvm::UndefValue::get(ConvertType(RetTy)));
127811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
1279639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  case ABIArgInfo::Coerce: {
128054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    llvm::Value *V = CreateTempAlloca(ConvertType(RetTy), "coerce");
128154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CreateCoercedStore(CI, V, *this);
1282ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson    if (RetTy->isAnyComplexType())
1283ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getComplex(LoadComplexFromAddr(V, false));
128411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    else if (CodeGenFunction::hasAggregateLLVMType(RetTy))
1285ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getAggregate(V);
128611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    else
128711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      return RValue::get(Builder.CreateLoad(V));
1288639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  }
12898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
12908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::ByVal:
12918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
12928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
129317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
12942c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
12952c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  assert(0 && "Unhandled ABIArgInfo::Kind");
12962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  return RValue::get(0);
129717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
1298