CGCall.cpp revision acebb397fa5d63835a0de9cee144987057ec1333
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"
21f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson#include "clang/AST/DeclCXX.h"
220dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/DeclObjC.h"
2399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar#include "clang/AST/RecordLayout.h"
2424095dad88dd9d48aa16afa6416417073af251b5Devang Patel#include "clang/Frontend/CompileOptions.h"
255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar#include "llvm/ADT/StringExtras.h"
26d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel#include "llvm/Attributes.h"
27d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar#include "llvm/Support/CallSite.h"
28be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar#include "llvm/Support/MathExtras.h"
2954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar#include "llvm/Target/TargetData.h"
309eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
319eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar#include "ABIInfo.h"
329eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace clang;
340dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace CodeGen;
350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/
370dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
380dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation.
390dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
40541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst
4172564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionNoProtoType *FTNP) {
42541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(FTNP->getResultType(),
43541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                         llvm::SmallVector<QualType, 16>());
4445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
4545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
46541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst
4772564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionProtoType *FTP) {
48541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
49541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
5045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
51541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(FTP->getArgType(i));
52541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(FTP->getResultType(), ArgTys);
5345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
5445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
55f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) {
56f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  llvm::SmallVector<QualType, 16> ArgTys;
573eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  // Add the 'this' pointer unless this is a static method.
583eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (MD->isInstance())
593eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner    ArgTys.push_back(MD->getThisType(Context));
60f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
61f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  const FunctionProtoType *FTP = MD->getType()->getAsFunctionProtoType();
62f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
63f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    ArgTys.push_back(FTP->getArgType(i));
64f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  return getFunctionInfo(FTP->getResultType(), ArgTys);
65f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson}
66f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
67541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionDecl *FD) {
683eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
69f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    if (MD->isInstance())
70f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson      return getFunctionInfo(MD);
71f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
720dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionType *FTy = FD->getType()->getAsFunctionType();
7372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  if (const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(FTy))
74541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    return getFunctionInfo(FTP);
7572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  return getFunctionInfo(cast<FunctionNoProtoType>(FTy));
760dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
770dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
78541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) {
79541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
80541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  ArgTys.push_back(MD->getSelfDecl()->getType());
81541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  ArgTys.push_back(Context.getObjCSelType());
82541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy?
832073216a1075767b5d25c23d1462b7034686d94dChris Lattner  for (ObjCMethodDecl::param_iterator i = MD->param_begin(),
840dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar         e = MD->param_end(); i != e; ++i)
85541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back((*i)->getType());
86541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(MD->getResultType(), ArgTys);
870dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
880dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
89541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
90541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                                                    const CallArgList &Args) {
91541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
92541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
93725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar  for (CallArgList::const_iterator i = Args.begin(), e = Args.end();
94725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar       i != e; ++i)
95541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(i->second);
96541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(ResTy, ArgTys);
970dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
980dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
99541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
100541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                                                  const FunctionArgList &Args) {
101541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
102541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
103bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
104bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar       i != e; ++i)
105541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(i->second);
106541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(ResTy, ArgTys);
107541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar}
108541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
109541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
110541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                               const llvm::SmallVector<QualType, 16> &ArgTys) {
11140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  // Lookup or create unique function info.
11240a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  llvm::FoldingSetNodeID ID;
11340a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  CGFunctionInfo::Profile(ID, ResTy, ArgTys.begin(), ArgTys.end());
11440a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
11540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  void *InsertPos = 0;
11640a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos);
11740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  if (FI)
11840a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    return *FI;
11940a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
12088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Construct the function info.
12140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  FI = new CGFunctionInfo(ResTy, ArgTys);
12235e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar  FunctionInfos.InsertNode(FI, InsertPos);
123541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
12488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Compute ABI information.
1256bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  getABIInfo().computeInfo(*FI, getContext());
126541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
12788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  return *FI;
1280dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
12917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
13017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar/***/
13117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
1326b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIInfo::~ABIInfo() {}
1336b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1346f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbarvoid ABIArgInfo::dump() const {
1356f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  fprintf(stderr, "(ABIArgInfo Kind=");
1366f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  switch (TheKind) {
1376f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  case Direct:
1386f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    fprintf(stderr, "Direct");
1396f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
1406f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  case Ignore:
1416f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    fprintf(stderr, "Ignore");
1426f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
1436f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  case Coerce:
1446f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    fprintf(stderr, "Coerce Type=");
1456f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    getCoerceToType()->print(llvm::errs());
1466f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
14711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case Indirect:
14811e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    fprintf(stderr, "Indirect Align=%d", getIndirectAlign());
1496f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
1506f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  case Expand:
1516f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    fprintf(stderr, "Expand");
1526f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
1536f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  }
1546f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  fprintf(stderr, ")\n");
1556f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar}
1566f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar
1576f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar/***/
1586f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar
159573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbarstatic bool isEmptyRecord(ASTContext &Context, QualType T);
160573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
161573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar/// isEmptyField - Return true iff a the field is "empty", that is it
162573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar/// is an unnamed bit-field or an (array of) empty record(s).
163573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbarstatic bool isEmptyField(ASTContext &Context, const FieldDecl *FD) {
164573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar  if (FD->isUnnamedBitfield())
165573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    return true;
166573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
167573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar  QualType FT = FD->getType();
168cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar  // Constant arrays of empty records count as empty, strip them off.
169cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar  while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT))
170cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    FT = AT->getElementType();
171573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
172573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar  return isEmptyRecord(Context, FT);
173573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar}
174573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
175573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar/// isEmptyRecord - Return true iff a structure contains only empty
176573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar/// fields. Note that a structure with a flexible array member is not
177834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered empty.
1786ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregorstatic bool isEmptyRecord(ASTContext &Context, QualType T) {
1795bde6f41506535ddaf6e9ff60bd1488db8ded952Daniel Dunbar  const RecordType *RT = T->getAsRecordType();
180834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!RT)
181834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
182834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordDecl *RD = RT->getDecl();
183834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (RD->hasFlexibleArrayMember())
184834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return false;
1856ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
186573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar         e = RD->field_end(Context); i != e; ++i)
187573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    if (!isEmptyField(Context, *i))
188834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return false;
189834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return true;
190834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
191834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
192834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isSingleElementStruct - Determine if a structure is a "single
193834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// element struct", i.e. it has exactly one non-empty field or
194834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// exactly one field which is itself a single element
195834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// struct. Structures with flexible array members are never
196834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered single element structs.
197834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar///
198834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// \return The field declaration for the single non-empty field, if
199834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// it exists.
200dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbarstatic const Type *isSingleElementStruct(QualType T, ASTContext &Context) {
201834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordType *RT = T->getAsStructureType();
202834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!RT)
203834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
204834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
205834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordDecl *RD = RT->getDecl();
206834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (RD->hasFlexibleArrayMember())
207834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
208834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
209dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar  const Type *Found = 0;
2106ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
2116ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(Context); i != e; ++i) {
212834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
213834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    QualType FT = FD->getType();
214834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
215573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    // Ignore empty fields.
216573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    if (isEmptyField(Context, FD))
217573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar      continue;
218573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
219cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    // If we already found an element then this isn't a single-element
220cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    // struct.
221fcab2ca966d5176839f8698535e0d807bd968629Daniel Dunbar    if (Found)
222834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return 0;
223fcab2ca966d5176839f8698535e0d807bd968629Daniel Dunbar
224cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    // Treat single element arrays as the element.
225cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) {
226cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar      if (AT->getSize().getZExtValue() != 1)
227cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar        break;
228cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar      FT = AT->getElementType();
229cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    }
230cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar
231fcab2ca966d5176839f8698535e0d807bd968629Daniel Dunbar    if (!CodeGenFunction::hasAggregateLLVMType(FT)) {
232dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar      Found = FT.getTypePtr();
233834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    } else {
234dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar      Found = isSingleElementStruct(FT, Context);
235834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (!Found)
236834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return 0;
237834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
238834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
239834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
240834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return Found;
241834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
242834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
243834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
244834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!Ty->getAsBuiltinType() && !Ty->isPointerType())
245834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return false;
246834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
247834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  uint64_t Size = Context.getTypeSize(Ty);
248834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return Size == 32 || Size == 64;
249834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
250834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
251834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool areAllFields32Or64BitBasicType(const RecordDecl *RD,
252834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar                                           ASTContext &Context) {
2536ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
2546ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(Context); i != e; ++i) {
255834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
256834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
257834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (!is32Or64BitBasicType(FD->getType(), Context))
258834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return false;
259834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
260f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: Reject bit-fields wholesale; there are two problems, we don't know
261f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // how to expand them yet, and the predicate for telling if a bitfield still
262f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // counts as "basic" is more complicated than what we were doing previously.
263e06a75f4c8ea30b6a99d5aa1dce5feda64da09c6Daniel Dunbar    if (FD->isBitField())
264e06a75f4c8ea30b6a99d5aa1dce5feda64da09c6Daniel Dunbar      return false;
265834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
266e06a75f4c8ea30b6a99d5aa1dce5feda64da09c6Daniel Dunbar
267834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return true;
268834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
269834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
2706b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarnamespace {
2716b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// DefaultABIInfo - The default implementation for ABI specific
2726b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// details. This implementation provides information which results in
2736bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar/// self-consistent and sensible LLVM IR generation, but does not
2746bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar/// conform to any particular ABI.
2756b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass DefaultABIInfo : public ABIInfo {
2766bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyReturnType(QualType RetTy,
2776bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar                                ASTContext &Context) const;
2786bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
2796bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyArgumentType(QualType RetTy,
2806bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar                                  ASTContext &Context) const;
2816bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
2826bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
2836bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
2846bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
2856bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar         it != ie; ++it)
2866bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar      it->info = classifyArgumentType(it->type, Context);
2876bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  }
288b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
289b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
290b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                 CodeGenFunction &CGF) const;
2916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
2926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
2936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// X86_32ABIInfo - The X86-32 ABI information.
2946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass X86_32ABIInfo : public ABIInfo {
2956ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  ASTContext &Context;
2969fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman  bool IsDarwin;
2979fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman
298dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar  static bool isRegisterSize(unsigned Size) {
299dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar    return (Size == 8 || Size == 16 || Size == 32 || Size == 64);
300dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar  }
301dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar
302cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  static bool shouldReturnTypeInRegister(QualType Ty, ASTContext &Context);
303cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
3046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic:
3056bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyReturnType(QualType RetTy,
3066bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar                                ASTContext &Context) const;
3076b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
3086bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyArgumentType(QualType RetTy,
3096bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar                                  ASTContext &Context) const;
3106bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
3116bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
3126bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
3136bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
3146bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar         it != ie; ++it)
3156bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar      it->info = classifyArgumentType(it->type, Context);
3166bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  }
317b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
318b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
319b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                 CodeGenFunction &CGF) const;
3209fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman
3216ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  X86_32ABIInfo(ASTContext &Context, bool d)
3226ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor    : ABIInfo(), Context(Context), IsDarwin(d) {}
3236b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
3246b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
3256b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
326cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
327cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar/// shouldReturnTypeInRegister - Determine if the given type should be
328cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar/// passed in a register (for the Darwin ABI).
329cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbarbool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty,
330cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar                                               ASTContext &Context) {
331cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  uint64_t Size = Context.getTypeSize(Ty);
332cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
333cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // Type must be register sized.
334cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (!isRegisterSize(Size))
335cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    return false;
336cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
337cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (Ty->isVectorType()) {
338cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    // 64- and 128- bit vectors inside structures are not returned in
339cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    // registers.
340cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    if (Size == 64 || Size == 128)
341cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar      return false;
342cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
343cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    return true;
344cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  }
345cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
346cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // If this is a builtin, pointer, or complex type, it is ok.
347cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (Ty->getAsBuiltinType() || Ty->isPointerType() || Ty->isAnyComplexType())
348cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    return true;
349cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
350cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // Arrays are treated like records.
351cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty))
352cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    return shouldReturnTypeInRegister(AT->getElementType(), Context);
353cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
354cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // Otherwise, it must be a record type.
355cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  const RecordType *RT = Ty->getAsRecordType();
356cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (!RT) return false;
357cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
358cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // Structure types are passed in register if all fields would be
359cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // passed in a register.
3606ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RT->getDecl()->field_begin(Context),
3616ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RT->getDecl()->field_end(Context); i != e; ++i) {
362cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    const FieldDecl *FD = *i;
363cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
364573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    // Empty fields are ignored.
365573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    if (isEmptyField(Context, FD))
366cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar      continue;
367cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
368cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    // Check fields recursively.
369cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    if (!shouldReturnTypeInRegister(FD->getType(), Context))
370cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar      return false;
371cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  }
372cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
373cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  return true;
374cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar}
375cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
3766b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
3776b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                            ASTContext &Context) const {
3780bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  if (RetTy->isVoidType()) {
3790bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getIgnore();
380360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar  } else if (const VectorType *VT = RetTy->getAsVectorType()) {
381360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar    // On Darwin, some vectors are returned in registers.
382360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar    if (IsDarwin) {
383360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      uint64_t Size = Context.getTypeSize(RetTy);
384360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar
385360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // 128-bit vectors are a special case; they are returned in
386360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // registers and we need to make sure to pick a type the LLVM
387360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // backend will like.
388360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      if (Size == 128)
389360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar        return ABIArgInfo::getCoerce(llvm::VectorType::get(llvm::Type::Int64Ty,
390360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar                                                           2));
391360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar
392360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // Always return in register if it fits in a general purpose
393360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // register, or if it is 64 bits and has a single element.
394360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      if ((Size == 8 || Size == 16 || Size == 32) ||
395360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar          (Size == 64 && VT->getNumElements() == 1))
396360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar        return ABIArgInfo::getCoerce(llvm::IntegerType::get(Size));
397360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar
398360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      return ABIArgInfo::getIndirect(0);
399360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar    }
400360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar
401360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar    return ABIArgInfo::getDirect();
4020bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
4038e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar    // Structures with flexible arrays are always indirect.
4048e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar    if (const RecordType *RT = RetTy->getAsStructureType())
4058e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar      if (RT->getDecl()->hasFlexibleArrayMember())
4068e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar        return ABIArgInfo::getIndirect(0);
4078e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar
4089fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman    // Outside of Darwin, structs and unions are always indirect.
4099fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman    if (!IsDarwin && !RetTy->isAnyComplexType())
4109fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman      return ABIArgInfo::getIndirect(0);
4118e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar
412834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Classify "single element" structs as their element type.
413dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar    if (const Type *SeltTy = isSingleElementStruct(RetTy, Context)) {
414834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (const BuiltinType *BT = SeltTy->getAsBuiltinType()) {
415834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        if (BT->isIntegerType()) {
4162e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          // We need to use the size of the structure, padding
4172e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          // bit-fields can adjust that to be larger than the single
4182e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          // element type.
4192e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          uint64_t Size = Context.getTypeSize(RetTy);
420834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::IntegerType::get((unsigned) Size));
421834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        } else if (BT->getKind() == BuiltinType::Float) {
4222e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          assert(Context.getTypeSize(RetTy) == Context.getTypeSize(SeltTy) &&
4232e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar                 "Unexpect single element structure size!");
424834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::Type::FloatTy);
425834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        } else if (BT->getKind() == BuiltinType::Double) {
4262e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          assert(Context.getTypeSize(RetTy) == Context.getTypeSize(SeltTy) &&
4272e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar                 "Unexpect single element structure size!");
428834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::Type::DoubleTy);
429834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        }
430834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      } else if (SeltTy->isPointerType()) {
431f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump        // FIXME: It would be really nice if this could come out as the proper
432f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump        // pointer type.
433834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        llvm::Type *PtrTy =
434834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
435834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getCoerce(PtrTy);
436dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar      } else if (SeltTy->isVectorType()) {
437dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        // 64- and 128-bit vectors are never returned in a
438dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        // register when inside a structure.
439dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        uint64_t Size = Context.getTypeSize(RetTy);
440dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        if (Size == 64 || Size == 128)
441dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar          return ABIArgInfo::getIndirect(0);
442dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar
443dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        return classifyReturnType(QualType(SeltTy, 0), Context);
444834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      }
445834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
446834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
447836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar    // Small structures which are register sized are generally returned
448836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar    // in a register.
449836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar    if (X86_32ABIInfo::shouldReturnTypeInRegister(RetTy, Context)) {
450836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar      uint64_t Size = Context.getTypeSize(RetTy);
451836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar      return ABIArgInfo::getCoerce(llvm::IntegerType::get(Size));
452cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    }
453dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar
454dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar    return ABIArgInfo::getIndirect(0);
4552c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
4560bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getDirect();
4572c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
4582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar}
4592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
4606b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
461b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                               ASTContext &Context) const {
46211e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  // FIXME: Set alignment on indirect arguments.
463f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
46411e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    // Structures with flexible arrays are always indirect.
465834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (const RecordType *RT = Ty->getAsStructureType())
466834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (RT->getDecl()->hasFlexibleArrayMember())
46711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar        return ABIArgInfo::getIndirect(0);
468834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
4693170c93d26bdc8b360c4ea3b1cedba50bbd818c1Daniel Dunbar    // Ignore empty structs.
470834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
471834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (Ty->isStructureType() && Size == 0)
4723170c93d26bdc8b360c4ea3b1cedba50bbd818c1Daniel Dunbar      return ABIArgInfo::getIgnore();
473834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
474834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Expand structs with size <= 128-bits which consist only of
475834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // basic types (int, long long, float, double, xxx*). This is
476834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // non-recursive and does not ignore empty fields.
477834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (const RecordType *RT = Ty->getAsStructureType()) {
478834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (Context.getTypeSize(Ty) <= 4*32 &&
479834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          areAllFields32Or64BitBasicType(RT->getDecl(), Context))
480834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getExpand();
481834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
482834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
48311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    return ABIArgInfo::getIndirect(0);
4848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  } else {
4850bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getDirect();
4868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  }
4878951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar}
4888951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
489b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *X86_32ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
490b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                      CodeGenFunction &CGF) const {
491b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
492b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  const llvm::Type *BPP = llvm::PointerType::getUnqual(BP);
493b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
494b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  CGBuilderTy &Builder = CGF.Builder;
495b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP,
496b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                                       "ap");
497b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
498b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Type *PTy =
499b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar    llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
500b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy);
501b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
502570f0cf734f321b902eb18dd1b07f53543f0a393Daniel Dunbar  uint64_t Offset =
503570f0cf734f321b902eb18dd1b07f53543f0a393Daniel Dunbar    llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4);
504b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Value *NextAddr =
505b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar    Builder.CreateGEP(Addr,
506570f0cf734f321b902eb18dd1b07f53543f0a393Daniel Dunbar                      llvm::ConstantInt::get(llvm::Type::Int32Ty, Offset),
507b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                      "ap.next");
508b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  Builder.CreateStore(NextAddr, VAListAddrAsBPP);
509b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
510b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return AddrTyped;
511b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
512b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
5136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarnamespace {
514c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar/// X86_64ABIInfo - The X86_64 ABI information.
5156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarclass X86_64ABIInfo : public ABIInfo {
5166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  enum Class {
5176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Integer = 0,
5186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    SSE,
5196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    SSEUp,
5206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    X87,
5216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    X87Up,
5226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ComplexX87,
5236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    NoClass,
5246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Memory
5256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  };
5266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
5278562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  /// merge - Implement the X86_64 ABI merging algorithm.
5288562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  ///
529c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// Merge an accumulating classification \arg Accum with a field
530c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// classification \arg Field.
531c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
532c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Accum - The accumulating classification. This should
533c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// always be either NoClass or the result of a previous merge
534c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// call. In addition, this should never be Memory (the caller
535c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// should just return Memory for the aggregate).
536c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Class merge(Class Accum, Class Field) const;
5378562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
5386f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// classify - Determine the x86_64 register classes in which the
5396f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// given type T should be passed.
5406f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
541c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Lo - The classification for the parts of the type
542c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// residing in the low word of the containing object.
543c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
544c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Hi - The classification for the parts of the type
545c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// residing in the high word of the containing object.
546c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
547c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param OffsetBase - The bit offset of this type in the
548cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar  /// containing object.  Some parameters are classified different
549cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar  /// depending on whether they straddle an eightbyte boundary.
5506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
5516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// If a word is unused its result will be NoClass; if a type should
5526f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// be passed in Memory then at least the classification of \arg Lo
5536f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// will be Memory.
5546f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
5556f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// The \arg Lo class will be NoClass iff the argument is ignored.
5566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
5576f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
5586e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar  /// also be ComplexX87.
559e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar  void classify(QualType T, ASTContext &Context, uint64_t OffsetBase,
5606f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                Class &Lo, Class &Hi) const;
561c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
562644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  /// getCoerceResult - Given a source type \arg Ty and an LLVM type
563644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  /// to coerce to, chose the best way to pass Ty in the same place
564644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  /// that \arg CoerceTo would be passed, but while keeping the
565644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  /// emitted code as simple as possible.
566644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  ///
567f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  /// FIXME: Note, this should be cleaned up to just take an enumeration of all
568f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  /// the ways we might want to pass things, instead of constructing an LLVM
569f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  /// type. This makes this code more explicit, and it makes it clearer that we
570f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  /// are also doing this for correctness in the case of passing scalar types.
571644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  ABIArgInfo getCoerceResult(QualType Ty,
572644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar                             const llvm::Type *CoerceTo,
573644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar                             ASTContext &Context) const;
574644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
57586e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar  /// getIndirectResult - Give a source type \arg Ty, return a suitable result
57686e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar  /// such that the argument will be passed in memory.
57786e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar  ABIArgInfo getIndirectResult(QualType Ty,
57886e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar                               ASTContext &Context) const;
57986e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar
5806bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyReturnType(QualType RetTy,
58159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar                                ASTContext &Context) const;
58259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
58359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  ABIArgInfo classifyArgumentType(QualType Ty,
58459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar                                  ASTContext &Context,
5853b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar                                  unsigned &neededInt,
5863b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar                                  unsigned &neededSSE) const;
58759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
58859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbarpublic:
58959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const;
590b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
591b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
592b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                 CodeGenFunction &CGF) const;
5936f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar};
5946f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}
5956f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
596c450357c436c05aa02ef88d406de962d98ac50beDaniel DunbarX86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum,
597c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar                                          Class Field) const {
5988562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
5998562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // classified recursively so that always two fields are
6008562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // considered. The resulting class is calculated according to
6018562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // the classes of the fields in the eightbyte:
6028562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6038562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (a) If both classes are equal, this is the resulting class.
6048562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6058562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (b) If one of the classes is NO_CLASS, the resulting class is
6068562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // the other class.
6078562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6088562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (c) If one of the classes is MEMORY, the result is the MEMORY
6098562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // class.
6108562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6118562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (d) If one of the classes is INTEGER, the result is the
6128562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // INTEGER.
6138562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6148562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
6158562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // MEMORY is used as class.
6168562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6178562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (f) Otherwise class SSE is used.
618100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar
619100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  // Accum should never be memory (we should have returned) or
620100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  // ComplexX87 (because this cannot be passed in a structure).
621100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  assert((Accum != Memory && Accum != ComplexX87) &&
622c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar         "Invalid accumulated classification during merge.");
623c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  if (Accum == Field || Field == NoClass)
624c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Accum;
625c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Field == Memory)
626c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Memory;
627c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Accum == NoClass)
628c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Field;
629c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Accum == Integer || Field == Integer)
630c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Integer;
63120e95c5eb400c864bbd4421624fdf7b25ce70f56Daniel Dunbar  else if (Field == X87 || Field == X87Up || Field == ComplexX87 ||
63220e95c5eb400c864bbd4421624fdf7b25ce70f56Daniel Dunbar           Accum == X87 || Accum == X87Up)
633c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Memory;
6348562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  else
635c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return SSE;
6368562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar}
6378562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
6386f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarvoid X86_64ABIInfo::classify(QualType Ty,
6396f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                             ASTContext &Context,
640e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar                             uint64_t OffsetBase,
6416f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                             Class &Lo, Class &Hi) const {
642f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: This code can be simplified by introducing a simple value class for
643f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // Class pairs with appropriate constructor methods for the various
644f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // situations.
6459a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar
646f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: Some of the split computations are wrong; unaligned vectors
647f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // shouldn't be passed in registers for example, so there is no chance they
648f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // can straddle an eightbyte. Verify & simplify.
649e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar
650c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Lo = Hi = NoClass;
651c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
652c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Class &Current = OffsetBase < 64 ? Lo : Hi;
653c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Current = Memory;
654c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
6556f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  if (const BuiltinType *BT = Ty->getAsBuiltinType()) {
6566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    BuiltinType::Kind k = BT->getKind();
6576f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
65811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    if (k == BuiltinType::Void) {
659c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = NoClass;
6602df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner    } else if (k == BuiltinType::Int128 || k == BuiltinType::UInt128) {
661ae69e005a9072a30262dfe87360b034d4b8e45f2Chris Lattner      Lo = Integer;
662ae69e005a9072a30262dfe87360b034d4b8e45f2Chris Lattner      Hi = Integer;
66311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
664c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = Integer;
6656f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    } else if (k == BuiltinType::Float || k == BuiltinType::Double) {
666c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = SSE;
6676f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    } else if (k == BuiltinType::LongDouble) {
6686f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = X87;
6696f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Hi = X87Up;
6706f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    }
6717a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    // FIXME: _Decimal32 and _Decimal64 are SSE.
6727a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
673708762b66a813543078a6d1c4fc2b69ee4361ec7Anders Carlsson  } else if (const EnumType *ET = Ty->getAsEnumType()) {
674708762b66a813543078a6d1c4fc2b69ee4361ec7Anders Carlsson    // Classify the underlying integer type.
675708762b66a813543078a6d1c4fc2b69ee4361ec7Anders Carlsson    classify(ET->getDecl()->getIntegerType(), Context, OffsetBase, Lo, Hi);
6768958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar  } else if (Ty->hasPointerRepresentation()) {
677c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = Integer;
6787a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar  } else if (const VectorType *VT = Ty->getAsVectorType()) {
679e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar    uint64_t Size = Context.getTypeSize(VT);
680e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar    if (Size == 32) {
681e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      // gcc passes all <4 x char>, <2 x short>, <1 x int>, <1 x
682e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      // float> as integer.
683e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      Current = Integer;
684e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar
685e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      // If this type crosses an eightbyte boundary, it should be
686e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      // split.
687e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      uint64_t EB_Real = (OffsetBase) / 64;
688e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      uint64_t EB_Imag = (OffsetBase + Size - 1) / 64;
689e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      if (EB_Real != EB_Imag)
690e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar        Hi = Lo;
691e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar    } else if (Size == 64) {
6920af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      // gcc passes <1 x double> in memory. :(
6930af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::Double))
694d4cd1b07169c698bd003be102bd73a7da7e24b25Daniel Dunbar        return;
6950af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar
6960af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      // gcc passes <1 x long long> as INTEGER.
6970af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::LongLong))
6980af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar        Current = Integer;
6990af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      else
7000af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar        Current = SSE;
701e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar
702e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar      // If this type crosses an eightbyte boundary, it should be
703e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar      // split.
704cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar      if (OffsetBase && OffsetBase != 64)
705e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar        Hi = Lo;
7067a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    } else if (Size == 128) {
7077a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Lo = SSE;
7087a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Hi = SSEUp;
7097a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    }
7106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  } else if (const ComplexType *CT = Ty->getAsComplexType()) {
7113327f6ead9362e5689674a4aaab5b7f23ea0dea3Daniel Dunbar    QualType ET = Context.getCanonicalType(CT->getElementType());
7126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
713e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
7140af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar    if (ET->isIntegralType()) {
715eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      if (Size <= 64)
716c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        Current = Integer;
717eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      else if (Size <= 128)
718eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar        Lo = Hi = Integer;
719eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar    } else if (ET == Context.FloatTy)
720c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = SSE;
7216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    else if (ET == Context.DoubleTy)
7226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = Hi = SSE;
7236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    else if (ET == Context.LongDoubleTy)
724c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = ComplexX87;
725f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar
726f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    // If this complex type crosses an eightbyte boundary then it
727f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    // should be split.
728cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar    uint64_t EB_Real = (OffsetBase) / 64;
729cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar    uint64_t EB_Imag = (OffsetBase + Context.getTypeSize(ET)) / 64;
730f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    if (Hi == NoClass && EB_Real != EB_Imag)
731f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar      Hi = Lo;
7328562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  } else if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
7338562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Arrays are treated like structures.
7348562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
7358562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
7368562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
7378562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
7388562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // than two eightbytes, ..., it has class MEMORY.
7398562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    if (Size > 128)
7408562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      return;
7418562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
7428562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
7438562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // fields, it has class MEMORY.
7448562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    //
7458562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Only need to check alignment of array base.
746c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (OffsetBase % Context.getTypeAlign(AT->getElementType()))
7478562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      return;
7488562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
7498562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Otherwise implement simplified merge. We could be smarter about
7508562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // this, but it isn't worth it and would be harder to verify.
751c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = NoClass;
7528562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t EltSize = Context.getTypeSize(AT->getElementType());
7538562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t ArraySize = AT->getSize().getZExtValue();
7548562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
7558562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      Class FieldLo, FieldHi;
7568562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      classify(AT->getElementType(), Context, Offset, FieldLo, FieldHi);
757c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = merge(Lo, FieldLo);
758c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = merge(Hi, FieldHi);
759c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      if (Lo == Memory || Hi == Memory)
760c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        break;
7618562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    }
762c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
763c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // Do post merger cleanup (see below). Only case we worry about is Memory.
764c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (Hi == Memory)
765c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = Memory;
766c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
76799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar  } else if (const RecordType *RT = Ty->getAsRecordType()) {
768e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
76999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
77099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
77199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // than two eightbytes, ..., it has class MEMORY.
77299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (Size > 128)
77399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      return;
77499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
77599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    const RecordDecl *RD = RT->getDecl();
77699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
77799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // Assume variable sized types are passed in memory.
77899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (RD->hasFlexibleArrayMember())
77999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      return;
78099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
78199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
78299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
78399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // Reset Lo class, this will be recomputed.
784c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = NoClass;
78599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    unsigned idx = 0;
7866ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor    for (RecordDecl::field_iterator i = RD->field_begin(Context),
7876ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor           e = RD->field_end(Context); i != e; ++i, ++idx) {
7888562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
789dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      bool BitField = i->isBitField();
79099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
7918562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
7928562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      // fields, it has class MEMORY.
793dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      //
7948e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar      // Note, skip this test for bit-fields, see below.
795dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      if (!BitField && Offset % Context.getTypeAlign(i->getType())) {
79699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Lo = Memory;
79799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        return;
79899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      }
79999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
80099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // Classify this field.
801c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      //
802c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate
803c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // exceeds a single eightbyte, each is classified
804c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // separately. Each eightbyte gets initialized to class
805c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // NO_CLASS.
80699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      Class FieldLo, FieldHi;
807dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar
8088e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar      // Bit-fields require special handling, they do not force the
809dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      // structure to be passed in memory even if unaligned, and
810dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      // therefore they can straddle an eightbyte.
811dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      if (BitField) {
8128236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar        // Ignore padding bit-fields.
8138236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar        if (i->isUnnamedBitfield())
8148236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar          continue;
8158236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar
816dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
8179a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman        uint64_t Size = i->getBitWidth()->EvaluateAsInt(Context).getZExtValue();
818dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar
819dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        uint64_t EB_Lo = Offset / 64;
820dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        uint64_t EB_Hi = (Offset + Size - 1) / 64;
821dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        FieldLo = FieldHi = NoClass;
822dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        if (EB_Lo) {
823dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          assert(EB_Hi == EB_Lo && "Invalid classification, type > 16 bytes.");
824dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          FieldLo = NoClass;
825dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          FieldHi = Integer;
826dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        } else {
827dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          FieldLo = Integer;
828dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          FieldHi = EB_Hi ? Integer : NoClass;
829dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        }
830dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      } else
831dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        classify(i->getType(), Context, Offset, FieldLo, FieldHi);
832c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = merge(Lo, FieldLo);
833c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = merge(Hi, FieldHi);
834c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      if (Lo == Memory || Hi == Memory)
835c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        break;
83699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    }
83799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
83899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
83999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    //
84099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // (a) If one of the classes is MEMORY, the whole argument is
84199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // passed in memory.
84299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    //
84399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // (b) If SSEUP is not preceeded by SSE, it is converted to SSE.
84499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
84599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // The first of these conditions is guaranteed by how we implement
846c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // the merge (just bail).
847c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    //
848c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // The second condition occurs in the case of unions; for example
849c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // union { _Complex double; unsigned; }.
850c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (Hi == Memory)
851c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = Memory;
85299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (Hi == SSEUp && Lo != SSE)
853c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = SSE;
8546f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
8556f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}
8566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
857644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel DunbarABIArgInfo X86_64ABIInfo::getCoerceResult(QualType Ty,
858644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar                                          const llvm::Type *CoerceTo,
859644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar                                          ASTContext &Context) const {
860644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  if (CoerceTo == llvm::Type::Int64Ty) {
861644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar    // Integer and pointer types will end up in a general purpose
862644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar    // register.
8630af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar    if (Ty->isIntegralType() || Ty->isPointerType())
864644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar      return ABIArgInfo::getDirect();
8650af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar
866644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  } else if (CoerceTo == llvm::Type::DoubleTy) {
867f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: It would probably be better to make CGFunctionInfo only map using
868f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // canonical types than to canonize here.
8693327f6ead9362e5689674a4aaab5b7f23ea0dea3Daniel Dunbar    QualType CTy = Context.getCanonicalType(Ty);
8703327f6ead9362e5689674a4aaab5b7f23ea0dea3Daniel Dunbar
871644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar    // Float and double end up in a single SSE reg.
8723327f6ead9362e5689674a4aaab5b7f23ea0dea3Daniel Dunbar    if (CTy == Context.FloatTy || CTy == Context.DoubleTy)
873644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar      return ABIArgInfo::getDirect();
8740af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar
875644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  }
876644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
877644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  return ABIArgInfo::getCoerce(CoerceTo);
878644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
879c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
88086e13eeb65397f7b64173523a40c742b2702364bDaniel DunbarABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty,
88186e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar                                            ASTContext &Context) const {
88286e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar  // If this is a scalar LLVM value then assume LLVM will pass it in the right
88386e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar  // place naturally.
88486e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar  if (!CodeGenFunction::hasAggregateLLVMType(Ty))
88586e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar    return ABIArgInfo::getDirect();
88686e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar
88786e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar  // FIXME: Set alignment correctly.
88886e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar  return ABIArgInfo::getIndirect(0);
88986e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar}
89086e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar
891d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy,
892d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar                                            ASTContext &Context) const {
8936f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
8946f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // classification algorithm.
8956f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  X86_64ABIInfo::Class Lo, Hi;
896f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar  classify(RetTy, Context, 0, Lo, Hi);
8976f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
898c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  // Check some invariants.
899c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
900c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification.");
901c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
902c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
9036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  const llvm::Type *ResType = 0;
9046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  switch (Lo) {
9056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case NoClass:
90611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    return ABIArgInfo::getIgnore();
9076f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9086f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSEUp:
9096f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87Up:
9106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(0 && "Invalid classification for lo word.");
9116f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
912c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
91311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    // hidden argument.
9146f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Memory:
91586e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar    return getIndirectResult(RetTy, Context);
9166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
9186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // available register of the sequence %rax, %rdx is used.
9196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Integer:
9206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::Int64Ty; break;
9216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
9236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // available SSE register of the sequence %xmm0, %xmm1 is used.
9246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSE:
9256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::DoubleTy; break;
9266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
9286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // returned on the X87 stack in %st0 as 80-bit x87 number.
9296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87:
9306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::X86_FP80Ty; break;
9316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
932c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
933c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // part of the value is returned in %st0 and the imaginary part in
934c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // %st1.
9356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case ComplexX87:
9366e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar    assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification.");
9373e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar    ResType = llvm::StructType::get(llvm::Type::X86_FP80Ty,
9383e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                    llvm::Type::X86_FP80Ty,
9393e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                    NULL);
9406f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
9416f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
9426f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9436f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  switch (Hi) {
9446e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar    // Memory was handled previously and X87 should
9456e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar    // never occur as a hi class.
9466f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Memory:
9476f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87:
9486f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(0 && "Invalid classification for hi word.");
9496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9506e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar  case ComplexX87: // Previously handled.
9516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case NoClass: break;
9526e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar
9536f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Integer:
954b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL);
955b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    break;
9566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSE:
957b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
958b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    break;
9596f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9606f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
9616f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // is passed in the upper half of the last used SSE register.
9626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    //
9636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // SSEUP should always be preceeded by SSE, just widen.
9646f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSEUp:
9656f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(Lo == SSE && "Unexpected SSEUp classification.");
9666f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2);
9676f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
9686f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9696f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
970b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    // returned together with the previous X87 value in %st0.
9716f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87Up:
972100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // If X87Up is preceeded by X87, we don't need to do
973100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // anything. However, in some cases with unions it may not be
974100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // preceeded by X87. In such situations we follow gcc and pass the
975100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // extra bits in an SSE reg.
976100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    if (Lo != X87)
977100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar      ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
9786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
9796f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
9806f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
981644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  return getCoerceResult(RetTy, ResType, Context);
982d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar}
983d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar
98459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel DunbarABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, ASTContext &Context,
9853b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar                                               unsigned &neededInt,
9863b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar                                               unsigned &neededSSE) const {
98759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  X86_64ABIInfo::Class Lo, Hi;
98859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  classify(Ty, Context, 0, Lo, Hi);
98959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
99059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // Check some invariants.
99159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // FIXME: Enforce these by construction.
99259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
99359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification.");
99459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
99559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
9963b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar  neededInt = 0;
9973b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar  neededSSE = 0;
99859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  const llvm::Type *ResType = 0;
99959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  switch (Lo) {
100059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case NoClass:
100159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    return ABIArgInfo::getIgnore();
100259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
100359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 1. If the class is MEMORY, pass the argument
100459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // on the stack.
100559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case Memory:
100659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
100759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 5. If the class is X87, X87UP or
100859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // COMPLEX_X87, it is passed in memory.
100959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case X87:
101059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case ComplexX87:
101186e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar    return getIndirectResult(Ty, Context);
101259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
101359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case SSEUp:
101459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case X87Up:
101559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    assert(0 && "Invalid classification for lo word.");
101659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
101759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 2. If the class is INTEGER, the next
101859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8
101959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // and %r9 is used.
102059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case Integer:
102159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ++neededInt;
102259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::Type::Int64Ty;
102359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
102459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
102559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next
102659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // available SSE register is used, the registers are taken in the
102759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // order from %xmm0 to %xmm7.
102859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case SSE:
102959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ++neededSSE;
103059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::Type::DoubleTy;
103159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
103259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  }
103359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
103459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  switch (Hi) {
103559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // Memory was handled previously, ComplexX87 and X87 should
103659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // never occur as hi classes, and X87Up must be preceed by X87,
103759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // which is passed in memory.
103859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case Memory:
103959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case X87:
104059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case ComplexX87:
104159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    assert(0 && "Invalid classification for hi word.");
1042100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    break;
104359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
104459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case NoClass: break;
104559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case Integer:
104659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL);
104759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ++neededInt;
104859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
1049100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar
1050100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // X87Up generally doesn't occur here (long double is passed in
1051100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // memory), except in situations involving unions.
1052100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  case X87Up:
1053100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  case SSE:
105459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
105559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ++neededSSE;
105659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
105759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
105859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the
105959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // eightbyte is passed in the upper half of the last used SSE
106059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // register.
106159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case SSEUp:
106259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    assert(Lo == SSE && "Unexpected SSEUp classification.");
106359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2);
106459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
106559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  }
106659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
1067644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  return getCoerceResult(Ty, ResType, Context);
1068d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar}
1069d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar
107059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbarvoid X86_64ABIInfo::computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
107159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
107259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
107359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // Keep track of the number of assigned registers.
107459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  unsigned freeIntRegs = 6, freeSSERegs = 8;
10753a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar
10763a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar  // If the return value is indirect, then the hidden argument is consuming one
10773a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar  // integer register.
10783a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar  if (FI.getReturnInfo().isIndirect())
10793a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar    --freeIntRegs;
108059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
108159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers
108259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // get assigned (in left-to-right order) for passing as follows...
108359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
10843b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar       it != ie; ++it) {
10853b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    unsigned neededInt, neededSSE;
10863b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    it->info = classifyArgumentType(it->type, Context, neededInt, neededSSE);
10873b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar
10883b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    // AMD64-ABI 3.2.3p3: If there are no registers available for any
10893b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    // eightbyte of an argument, the whole argument is passed on the
10903b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    // stack. If registers have already been assigned for some
10913b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    // eightbytes of such an argument, the assignments get reverted.
10923b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    if (freeIntRegs >= neededInt && freeSSERegs >= neededSSE) {
10933b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar      freeIntRegs -= neededInt;
10943b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar      freeSSERegs -= neededSSE;
10953b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    } else {
109686e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar      it->info = getIndirectResult(it->type, Context);
10973b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    }
10983b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar  }
109959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar}
110059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
1101be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbarstatic llvm::Value *EmitVAArgFromMemory(llvm::Value *VAListAddr,
1102be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                        QualType Ty,
1103be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                        CodeGenFunction &CGF) {
1104be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *overflow_arg_area_p =
1105be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_p");
1106be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *overflow_arg_area =
1107be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateLoad(overflow_arg_area_p, "overflow_arg_area");
1108be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1109be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a 16
1110be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // byte boundary if alignment needed by type exceeds 8 byte boundary.
1111c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar  uint64_t Align = CGF.getContext().getTypeAlign(Ty) / 8;
1112be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (Align > 8) {
1113c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    // Note that we follow the ABI & gcc here, even though the type
1114c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    // could in theory have an alignment greater than 16. This case
1115c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    // shouldn't ever matter in practice.
1116c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar
1117c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    // overflow_arg_area = (overflow_arg_area + 15) & ~15;
1118c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::Int32Ty, 15);
1119c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset);
1120c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    llvm::Value *AsInt = CGF.Builder.CreatePtrToInt(overflow_arg_area,
1121c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar                                                    llvm::Type::Int64Ty);
1122c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    llvm::Value *Mask = llvm::ConstantInt::get(llvm::Type::Int64Ty, ~15LL);
1123c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    overflow_arg_area =
1124c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar      CGF.Builder.CreateIntToPtr(CGF.Builder.CreateAnd(AsInt, Mask),
1125c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar                                 overflow_arg_area->getType(),
1126c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar                                 "overflow_arg_area.align");
1127be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1128be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1129be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 8. Fetch type from l->overflow_arg_area.
1130be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  const llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
1131be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *Res =
1132be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateBitCast(overflow_arg_area,
1133be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                              llvm::PointerType::getUnqual(LTy));
1134be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1135be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to:
1136be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // l->overflow_arg_area + sizeof(type).
1137be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 10. Align l->overflow_arg_area upwards to
1138be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // an 8 byte boundary.
1139be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1140be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  uint64_t SizeInBytes = (CGF.getContext().getTypeSize(Ty) + 7) / 8;
1141be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::Int32Ty,
1142be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                               (SizeInBytes + 7)  & ~7);
1143be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset,
1144be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                            "overflow_arg_area.next");
1145be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.Builder.CreateStore(overflow_arg_area, overflow_arg_area_p);
1146be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1147be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 11. Return the fetched type.
1148be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  return Res;
1149be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar}
1150be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1151b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1152b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                      CodeGenFunction &CGF) const {
1153be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // Assume that va_list type is correct; should be pointer to LLVM type:
1154be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // struct {
1155be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //   i32 gp_offset;
1156be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //   i32 fp_offset;
1157be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //   i8* overflow_arg_area;
1158be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //   i8* reg_save_area;
1159be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // };
1160be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  unsigned neededInt, neededSSE;
1161be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  ABIArgInfo AI = classifyArgumentType(Ty, CGF.getContext(),
1162be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                       neededInt, neededSSE);
1163be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1164be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed
1165be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // in the registers. If not go to step 7.
1166be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (!neededInt && !neededSSE)
1167be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    return EmitVAArgFromMemory(VAListAddr, Ty, CGF);
1168be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1169be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 2. Compute num_gp to hold the number of
1170be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // general purpose registers needed to pass type and num_fp to hold
1171be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // the number of floating point registers needed.
1172be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1173be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 3. Verify whether arguments fit into
1174be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // registers. In the case: l->gp_offset > 48 - num_gp * 8 or
1175be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // l->fp_offset > 304 - num_fp * 16 go to step 7.
1176be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //
1177be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // NOTE: 304 is a typo, there are (6 * 8 + 8 * 16) = 176 bytes of
1178be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // register save space).
1179be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1180be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *InRegs = 0;
1181be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *gp_offset_p = 0, *gp_offset = 0;
1182be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *fp_offset_p = 0, *fp_offset = 0;
1183be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededInt) {
1184be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    gp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "gp_offset_p");
1185be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset");
1186be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    InRegs =
1187be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar      CGF.Builder.CreateICmpULE(gp_offset,
1188be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                llvm::ConstantInt::get(llvm::Type::Int32Ty,
1189be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                                       48 - neededInt * 8),
1190be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                "fits_in_gp");
1191be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1192be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1193be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededSSE) {
1194be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    fp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 1, "fp_offset_p");
1195be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset");
1196be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    llvm::Value *FitsInFP =
1197be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar      CGF.Builder.CreateICmpULE(fp_offset,
1198be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                llvm::ConstantInt::get(llvm::Type::Int32Ty,
119990dafa1638edaffbba4b50f504d1470428a2d25dDaniel Dunbar                                                       176 - neededSSE * 16),
1200be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                "fits_in_fp");
1201f231346438e61e59ff7b72d5ecbd58b6ae484211Daniel Dunbar    InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP;
1202be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1203be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1204be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
1205be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem");
1206be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
1207be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock);
1208be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1209be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // Emit code to load the value if it was passed in registers.
1210be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1211be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.EmitBlock(InRegBlock);
1212be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1213be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 4. Fetch type from l->reg_save_area with
1214be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // an offset of l->gp_offset and/or l->fp_offset. This may require
1215be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // copying to a temporary location in case the parameter is passed
1216be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // in different register classes or requires an alignment greater
1217be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // than 8 for general purpose registers and 16 for XMM registers.
12183e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar  //
1219f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: This really results in shameful code when we end up needing to
1220f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // collect arguments from different places; often what should result in a
1221f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // simple assembling of a structure from scattered addresses has many more
1222f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // loads than necessary. Can we clean this up?
1223be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  const llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
1224be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *RegAddr =
1225be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateLoad(CGF.Builder.CreateStructGEP(VAListAddr, 3),
1226be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                           "reg_save_area");
1227be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededInt && neededSSE) {
122855e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    // FIXME: Cleanup.
122955e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    assert(AI.isCoerce() && "Unexpected ABI info for mixed regs");
123055e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType());
123155e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(ST);
123255e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs");
123355e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::Type *TyLo = ST->getElementType(0);
123455e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::Type *TyHi = ST->getElementType(1);
123555e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    assert((TyLo->isFloatingPoint() ^ TyHi->isFloatingPoint()) &&
123655e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar           "Unexpected ABI info for mixed regs");
123755e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::Type *PTyLo = llvm::PointerType::getUnqual(TyLo);
123855e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::Type *PTyHi = llvm::PointerType::getUnqual(TyHi);
123955e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *GPAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset);
124055e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *FPAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset);
124155e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *RegLoAddr = TyLo->isFloatingPoint() ? FPAddr : GPAddr;
124255e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *RegHiAddr = TyLo->isFloatingPoint() ? GPAddr : FPAddr;
124355e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *V =
124455e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar      CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegLoAddr, PTyLo));
124555e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
124655e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegHiAddr, PTyHi));
124755e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
124855e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar
124955e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    RegAddr = CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(LTy));
1250be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  } else if (neededInt) {
1251be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    RegAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset);
1252be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    RegAddr = CGF.Builder.CreateBitCast(RegAddr,
1253be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                        llvm::PointerType::getUnqual(LTy));
1254be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  } else {
12553e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar    if (neededSSE == 1) {
12563e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      RegAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset);
12573e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      RegAddr = CGF.Builder.CreateBitCast(RegAddr,
12583e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                          llvm::PointerType::getUnqual(LTy));
12593e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar    } else {
12603e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      assert(neededSSE == 2 && "Invalid number of needed registers!");
12613e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      // SSE registers are spaced 16 bytes apart in the register save
12623e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      // area, we need to collect the two eightbytes together.
12633e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      llvm::Value *RegAddrLo = CGF.Builder.CreateGEP(RegAddr, fp_offset);
12643e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      llvm::Value *RegAddrHi =
12653e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar        CGF.Builder.CreateGEP(RegAddrLo,
12663e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                              llvm::ConstantInt::get(llvm::Type::Int32Ty, 16));
12673e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      const llvm::Type *DblPtrTy =
12683e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar        llvm::PointerType::getUnqual(llvm::Type::DoubleTy);
12693e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      const llvm::StructType *ST = llvm::StructType::get(llvm::Type::DoubleTy,
12703e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                                         llvm::Type::DoubleTy,
12713e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                                         NULL);
12723e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      llvm::Value *V, *Tmp = CGF.CreateTempAlloca(ST);
12733e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrLo,
12743e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                                           DblPtrTy));
12753e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
12763e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrHi,
12773e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                                           DblPtrTy));
12783e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
12793e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      RegAddr = CGF.Builder.CreateBitCast(Tmp,
12803e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                          llvm::PointerType::getUnqual(LTy));
12813e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar    }
1282be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1283be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1284be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 5. Set:
1285be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // l->gp_offset = l->gp_offset + num_gp * 8
1286be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // l->fp_offset = l->fp_offset + num_fp * 16.
1287be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededInt) {
1288be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::Int32Ty,
1289be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                                 neededInt * 8);
1290be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset),
1291be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                            gp_offset_p);
1292be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1293be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededSSE) {
1294be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::Int32Ty,
1295be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                                 neededSSE * 16);
1296be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset),
1297be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                            fp_offset_p);
1298be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1299be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.EmitBranch(ContBlock);
1300be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1301be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // Emit code to load the value if it was passed in memory.
1302be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1303be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.EmitBlock(InMemBlock);
1304be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *MemAddr = EmitVAArgFromMemory(VAListAddr, Ty, CGF);
1305be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1306be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // Return the appropriate result.
1307be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1308be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.EmitBlock(ContBlock);
1309be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::PHINode *ResAddr = CGF.Builder.CreatePHI(RegAddr->getType(),
1310be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                                 "vaarg.addr");
1311be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  ResAddr->reserveOperandSpace(2);
1312be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  ResAddr->addIncoming(RegAddr, InRegBlock);
1313be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  ResAddr->addIncoming(MemAddr, InMemBlock);
1314be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1315be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  return ResAddr;
1316b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
1317b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
131870aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta// ABI Info for PIC16
131970aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Guptaclass PIC16ABIInfo : public ABIInfo {
132070aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  ABIArgInfo classifyReturnType(QualType RetTy,
132170aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                ASTContext &Context) const;
132270aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
132370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  ABIArgInfo classifyArgumentType(QualType RetTy,
132470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                  ASTContext &Context) const;
132570aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
132670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
132770aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
132870aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
132970aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta         it != ie; ++it)
133070aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta      it->info = classifyArgumentType(it->type, Context);
133170aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  }
133270aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
133370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
133470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                 CodeGenFunction &CGF) const;
133570aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
133670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta};
133770aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
133870aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv GuptaABIArgInfo PIC16ABIInfo::classifyReturnType(QualType RetTy,
133970aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                              ASTContext &Context) const {
134070aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  if (RetTy->isVoidType()) {
134170aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    return ABIArgInfo::getIgnore();
134270aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  } else {
134370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    return ABIArgInfo::getDirect();
134470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  }
134570aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta}
134670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
134770aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv GuptaABIArgInfo PIC16ABIInfo::classifyArgumentType(QualType Ty,
134870aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                                ASTContext &Context) const {
134970aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  return ABIArgInfo::getDirect();
135070aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta}
135170aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
135270aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Guptallvm::Value *PIC16ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
135370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                       CodeGenFunction &CGF) const {
135470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  return 0;
135570aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta}
135670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
1357a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedmanclass ARMABIInfo : public ABIInfo {
1358a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  ABIArgInfo classifyReturnType(QualType RetTy,
1359a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                ASTContext &Context) const;
1360a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1361a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  ABIArgInfo classifyArgumentType(QualType RetTy,
1362a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                  ASTContext &Context) const;
1363a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1364a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const;
1365a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1366a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1367a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                 CodeGenFunction &CGF) const;
1368a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman};
1369a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1370a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedmanvoid ARMABIInfo::computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
1371a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
1372a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
1373a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman       it != ie; ++it) {
1374a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    it->info = classifyArgumentType(it->type, Context);
1375a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  }
1376a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman}
1377a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1378a027ea94d6e4f501f9fa690ac728f68c62612a7dEli FriedmanABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty,
1379a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                            ASTContext &Context) const {
1380a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  if (!CodeGenFunction::hasAggregateLLVMType(Ty)) {
1381a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return ABIArgInfo::getDirect();
1382a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  }
1383f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: This is kind of nasty... but there isn't much choice because the ARM
1384f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // backend doesn't support byval.
1385a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  // FIXME: This doesn't handle alignment > 64 bits.
1386a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  const llvm::Type* ElemTy;
1387a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  unsigned SizeRegs;
1388a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  if (Context.getTypeAlign(Ty) > 32) {
1389a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    ElemTy = llvm::Type::Int64Ty;
1390a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    SizeRegs = (Context.getTypeSize(Ty) + 63) / 64;
1391a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  } else {
1392a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    ElemTy = llvm::Type::Int32Ty;
1393a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    SizeRegs = (Context.getTypeSize(Ty) + 31) / 32;
1394a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  }
1395a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  std::vector<const llvm::Type*> LLVMFields;
1396a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  LLVMFields.push_back(llvm::ArrayType::get(ElemTy, SizeRegs));
1397a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  const llvm::Type* STy = llvm::StructType::get(LLVMFields, true);
1398a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  return ABIArgInfo::getCoerce(STy);
1399a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman}
1400a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1401a027ea94d6e4f501f9fa690ac728f68c62612a7dEli FriedmanABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy,
1402a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                          ASTContext &Context) const {
1403a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  if (RetTy->isVoidType()) {
1404a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return ABIArgInfo::getIgnore();
1405a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
1406a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    // Aggregates <= 4 bytes are returned in r0; other aggregates
1407a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    // are returned indirectly.
1408a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    uint64_t Size = Context.getTypeSize(RetTy);
1409a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    if (Size <= 32)
1410a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman      return ABIArgInfo::getCoerce(llvm::Type::Int32Ty);
1411a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return ABIArgInfo::getIndirect(0);
1412a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  } else {
1413a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return ABIArgInfo::getDirect();
1414a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  }
1415a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman}
1416a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1417a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedmanllvm::Value *ARMABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1418a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                      CodeGenFunction &CGF) const {
1419a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  // FIXME: Need to handle alignment
1420a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
1421a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  const llvm::Type *BPP = llvm::PointerType::getUnqual(BP);
1422a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1423a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  CGBuilderTy &Builder = CGF.Builder;
1424a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP,
1425a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                                       "ap");
1426a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
1427a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Type *PTy =
1428a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
1429a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy);
1430a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1431a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  uint64_t Offset =
1432a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4);
1433a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Value *NextAddr =
1434a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    Builder.CreateGEP(Addr,
1435a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                      llvm::ConstantInt::get(llvm::Type::Int32Ty, Offset),
1436a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                      "ap.next");
1437a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  Builder.CreateStore(NextAddr, VAListAddrAsBPP);
1438a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1439a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  return AddrTyped;
1440a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman}
1441a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
14426b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy,
1443b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                              ASTContext &Context) const {
14440bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  if (RetTy->isVoidType()) {
14450bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getIgnore();
14460bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
144711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    return ABIArgInfo::getIndirect(0);
14480bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  } else {
14490bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getDirect();
14500bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  }
14516b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
14526b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
14536b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty,
1454b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                                ASTContext &Context) const {
14550bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
145611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    return ABIArgInfo::getIndirect(0);
14570bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  } else {
14580bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getDirect();
14590bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  }
14606b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
14616b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1462b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *DefaultABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1463b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                       CodeGenFunction &CGF) const {
1464b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return 0;
1465b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
1466b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
14676b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarconst ABIInfo &CodeGenTypes::getABIInfo() const {
14686b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  if (TheABIInfo)
14696b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    return *TheABIInfo;
14706b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
14716b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  // For now we just cache this in the CodeGenTypes and don't bother
14726b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  // to free it.
14736b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  const char *TargetPrefix = getContext().Target.getTargetPrefix();
14746b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  if (strcmp(TargetPrefix, "x86") == 0) {
14759fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman    bool IsDarwin = strstr(getContext().Target.getTargetTriple(), "darwin");
1476d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    switch (getContext().Target.getPointerWidth(0)) {
1477d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    case 32:
14786ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor      return *(TheABIInfo = new X86_32ABIInfo(Context, IsDarwin));
1479d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    case 64:
148011a76ed8e34901f2b997896a8c0833c6c17bc586Daniel Dunbar      return *(TheABIInfo = new X86_64ABIInfo());
1481d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    }
1482a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  } else if (strcmp(TargetPrefix, "arm") == 0) {
1483a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    // FIXME: Support for OABI?
1484a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return *(TheABIInfo = new ARMABIInfo());
148570aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  } else if (strcmp(TargetPrefix, "pic16") == 0) {
148670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    return *(TheABIInfo = new PIC16ABIInfo());
14876b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  }
14886b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
14896b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return *(TheABIInfo = new DefaultABIInfo);
14906b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
14916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
14922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/
14932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
149488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel DunbarCGFunctionInfo::CGFunctionInfo(QualType ResTy,
149588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar                               const llvm::SmallVector<QualType, 16> &ArgTys) {
149688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  NumArgs = ArgTys.size();
149788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args = new ArgInfo[1 + NumArgs];
149888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args[0].type = ResTy;
149988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (unsigned i = 0; i < NumArgs; ++i)
150088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    Args[1 + i].type = ArgTys[i];
150188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar}
150288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
150388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar/***/
150488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
15055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty,
15065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    std::vector<const llvm::Type*> &ArgTys) {
15075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
15085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
15095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordDecl *RD = RT->getDecl();
15105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(!RD->hasFlexibleArrayMember() &&
15115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Cannot expand structure with flexible array.");
15125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15136ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
15146ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(Context); i != e; ++i) {
15155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    const FieldDecl *FD = *i;
15165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    assert(!FD->isBitField() &&
15175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar           "Cannot expand structure with bit-field members.");
15185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
15205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
15215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(FT, ArgTys);
15225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
15235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ArgTys.push_back(ConvertType(FT));
15245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
15255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
15265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
15275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator
15295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
15305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    llvm::Function::arg_iterator AI) {
15315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
15325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
15335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
15355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(LV.isSimple() &&
15365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Unexpected non-simple lvalue during struct expansion.");
15375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = LV.getAddress();
15386ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(getContext()),
15396ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(getContext()); i != e; ++i) {
15405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
15415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
15425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
15445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
15455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
15465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      AI = ExpandTypeFromArgs(FT, LV, AI);
15475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
15485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitStoreThroughLValue(RValue::get(AI), LV, FT);
15495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ++AI;
15505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
15515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
15525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  return AI;
15545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
15555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid
15575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
15585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                  llvm::SmallVector<llvm::Value*, 16> &Args) {
15595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
15605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
15615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
15635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
15645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = RV.getAggregateAddr();
15656ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(getContext()),
15666ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(getContext()); i != e; ++i) {
15675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
15685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
15695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
15715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
15725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
15735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
15745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
15755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      RValue RV = EmitLoadOfLValue(LV, FT);
15765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      assert(RV.isScalar() &&
15775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar             "Unexpected non-scalar rvalue during struct expansion.");
15785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Args.push_back(RV.getScalarVal());
15795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
15805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
15815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
15825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1583275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
1584275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty.
1585275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
1586275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the
1587275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not
1588275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined.
1589275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
1590275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      const llvm::Type *Ty,
1591275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      CodeGenFunction &CGF) {
1592275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy =
1593275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(SrcPtr->getType())->getElementType();
15949408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
15959408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(Ty);
1596275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
1597b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  // If load is legal, just bitcast the src pointer.
15987ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar  if (SrcSize >= DstSize) {
1599f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // Generally SrcSize is never greater than DstSize, since this means we are
1600f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // losing bits. However, this can happen in cases where the structure has
1601f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // additional padding, for example due to a user specified alignment.
16027ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar    //
1603f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: Assert that we aren't truncating non-padding bits when have access
1604f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // to that information.
1605275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
1606275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
1607386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
1608386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
1609386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
1610386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    return Load;
1611275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
1612275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
1613275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
1614275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
1615275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
1616275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
1617386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::StoreInst *Store =
1618386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar      CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
1619386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
1620386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Store->setAlignment(1);
1621275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    return CGF.Builder.CreateLoad(Tmp);
1622275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
1623275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
1624275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
1625275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src,
1626275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types.
1627275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
1628275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the
1629275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost.
1630275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src,
1631275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               llvm::Value *DstPtr,
1632275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               CodeGenFunction &CGF) {
1633275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy = Src->getType();
1634275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *DstTy =
1635275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(DstPtr->getType())->getElementType();
1636275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
16379408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
16389408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(DstTy);
1639275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
164088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // If store is legal, just bitcast the src pointer.
1641fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar  if (SrcSize <= DstSize) {
1642275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
1643275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
1644386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
1645386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    CGF.Builder.CreateStore(Src, Casted)->setAlignment(1);
1646275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
1647275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
1648275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
1649fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar
1650fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // Generally SrcSize is never greater than DstSize, since this means we are
1651fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // losing bits. However, this can happen in cases where the structure has
1652fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // additional padding, for example due to a user specified alignment.
1653fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    //
1654fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // FIXME: Assert that we aren't truncating non-padding bits when have access
1655fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // to that information.
1656275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy);
1657275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(Src, Tmp);
1658275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
1659275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
1660386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
1661386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
1662386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
1663386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    CGF.Builder.CreateStore(Load, DstPtr);
1664275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
1665275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
1666275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
16675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/
16685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
166988b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) {
167011e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  return FI.getReturnInfo().isIndirect();
1671bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar}
1672bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
167345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType *
1674bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
167545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  std::vector<const llvm::Type*> ArgTys;
167645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
167745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  const llvm::Type *ResultType = 0;
167845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
1679a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
1680b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
16818951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  switch (RetAI.getKind()) {
16828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
16838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
16848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
168546327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
168646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    ResultType = ConvertType(RetTy);
168746327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    break;
168846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar
168911e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect: {
169011e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    assert(!RetAI.getIndirectAlign() && "Align unused on indirect return.");
169145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ResultType = llvm::Type::VoidTy;
169262d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *STy = ConvertType(RetTy);
169345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
169445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
169545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
169645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
169711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
169811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    ResultType = llvm::Type::VoidTy;
169911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    break;
170011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
170145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Coerce:
1702639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    ResultType = RetAI.getCoerceToType();
170345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
170445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
170545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
170688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
170788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
170888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
17098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
17108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
171111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
171211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
171311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
17145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
171589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      ArgTys.push_back(AI.getCoerceToType());
171689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
171789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
1718adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Indirect: {
171911e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar      // indirect arguments are always on the stack, which is addr space #0.
1720adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      const llvm::Type *LTy = ConvertTypeForMem(it->type);
1721adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      ArgTys.push_back(llvm::PointerType::getUnqual(LTy));
17228951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
1723adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    }
17248951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
172546327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
17261f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      ArgTys.push_back(ConvertType(it->type));
17278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
17288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
17298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
173088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar      GetExpandedTypes(it->type, ArgTys);
17318951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
17328951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
173345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
173445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
1735bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic);
17363913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar}
17373913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar
1738a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbarvoid CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
173988b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                           const Decl *TargetDecl,
1740761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                           AttributeListType &PAL) {
17415323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned FuncAttrs = 0;
1742a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  unsigned RetAttrs = 0;
17435323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
17441102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: handle sseregparm someday...
17455323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (TargetDecl) {
1746b11fa0d25d86169f0e0a29d5398116c0212bb787Daniel Dunbar    if (TargetDecl->hasAttr<NoThrowAttr>())
1747761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoUnwind;
1748b11fa0d25d86169f0e0a29d5398116c0212bb787Daniel Dunbar    if (TargetDecl->hasAttr<NoReturnAttr>())
1749761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoReturn;
1750b11fa0d25d86169f0e0a29d5398116c0212bb787Daniel Dunbar    if (TargetDecl->hasAttr<ConstAttr>())
1751232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadNone;
1752b11fa0d25d86169f0e0a29d5398116c0212bb787Daniel Dunbar    else if (TargetDecl->hasAttr<PureAttr>())
175364c2e0762628eba26c100642521b6100c2515cc5Daniel Dunbar      FuncAttrs |= llvm::Attribute::ReadOnly;
17545323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
17555323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
175624095dad88dd9d48aa16afa6416417073af251b5Devang Patel  if (CompileOpts.DisableRedZone)
175724095dad88dd9d48aa16afa6416417073af251b5Devang Patel    FuncAttrs |= llvm::Attribute::NoRedZone;
1758acebb397fa5d63835a0de9cee144987057ec1333Devang Patel  if (CompileOpts.NoImplicitFloat)
1759acebb397fa5d63835a0de9cee144987057ec1333Devang Patel    FuncAttrs |= llvm::Attribute::NoImplicitFloat;
176024095dad88dd9d48aa16afa6416417073af251b5Devang Patel
1761a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
17625323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned Index = 1;
1763b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
176445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  switch (RetAI.getKind()) {
176546327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
17662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isPromotableIntegerType()) {
17672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      if (RetTy->isSignedIntegerType()) {
1768a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel        RetAttrs |= llvm::Attribute::SExt;
17692c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      } else if (RetTy->isUnsignedIntegerType()) {
1770a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel        RetAttrs |= llvm::Attribute::ZExt;
17712c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      }
17722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    }
17732c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
17742c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
177511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
1776761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    PAL.push_back(llvm::AttributeWithIndex::get(Index,
1777725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::StructRet |
1778725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::NoAlias));
17795323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    ++Index;
17800ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    // sret disables readnone and readonly
17810ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    FuncAttrs &= ~(llvm::Attribute::ReadOnly |
17820ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                   llvm::Attribute::ReadNone);
17832c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
17842c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
178511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
17862c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
17872c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
17888951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
17898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
17908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
17915323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
17922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1793a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (RetAttrs)
1794a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
17951102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
17961102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: we need to honour command line settings also...
17971102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: RegParm should be reduced in case of nested functions and/or global
17981102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // register variable.
17991102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  signed RegParm = 0;
18001102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  if (TargetDecl)
18011102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov    if (const RegparmAttr *RegParmAttr = TargetDecl->getAttr<RegparmAttr>())
18021102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      RegParm = RegParmAttr->getNumParams();
18031102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
18041102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned PointerWidth = getContext().Target.getPointerWidth(0);
180588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
180688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
180788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    QualType ParamType = it->type;
180888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
1809761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    unsigned Attributes = 0;
18101102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
18118951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
181289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce:
181389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
181489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
181511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
1816761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      Attributes |= llvm::Attribute::ByVal;
18171102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      Attributes |=
181811e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar        llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign());
18190ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      // byval disables readnone and readonly.
18200ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      FuncAttrs &= ~(llvm::Attribute::ReadOnly |
18210ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                     llvm::Attribute::ReadNone);
18228951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
18238951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
182446327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
18258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      if (ParamType->isPromotableIntegerType()) {
18268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        if (ParamType->isSignedIntegerType()) {
1827761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel          Attributes |= llvm::Attribute::SExt;
18288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        } else if (ParamType->isUnsignedIntegerType()) {
1829761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel          Attributes |= llvm::Attribute::ZExt;
18308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        }
18315323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      }
18321102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      if (RegParm > 0 &&
18331102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (ParamType->isIntegerType() || ParamType->isPointerType())) {
18341102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        RegParm -=
18351102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (Context.getTypeSize(ParamType) + PointerWidth - 1) / PointerWidth;
18361102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        if (RegParm >= 0)
18371102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          Attributes |= llvm::Attribute::InReg;
18381102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      }
18391102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      // FIXME: handle sseregparm someday...
18408951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
18411102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
184211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
184311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      // Skip increment, no matching LLVM parameter.
184411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      continue;
184511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
18465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
18475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      std::vector<const llvm::Type*> Tys;
1848f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is rather inefficient. Do we ever actually need to do
1849f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // anything here? The result should be just reconstructed on the other
1850f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // side, so extension should be a non-issue.
18515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      getTypes().GetExpandedTypes(ParamType, Tys);
18525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Index += Tys.size();
18535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
18545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
18555323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
18568951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1857761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    if (Attributes)
1858761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes));
18595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++Index;
18605323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
1861a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (FuncAttrs)
1862a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs));
18635323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
18645323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
186588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
186688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                         llvm::Function *Fn,
186717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         const FunctionArgList &Args) {
1868f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from FunctionArgList; lift up and
1869f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // simplify.
18705251afa21d3583f2740fd4f83659d008625a7260Daniel Dunbar
187117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
187217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Function::arg_iterator AI = Fn->arg_begin();
187317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
187417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Name the struct return argument.
187588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar  if (CGM.ReturnTypeUsesSret(FI)) {
187617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    AI->setName("agg.result");
187717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    ++AI;
187817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
1879b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar
18804b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(FI.arg_size() == Args.size() &&
18814b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
1882b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = FI.arg_begin();
188317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
1884b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       i != e; ++i, ++info_it) {
188517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    const VarDecl *Arg = i->first;
1886b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    QualType Ty = info_it->type;
1887b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgI = info_it->info;
18888951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
18898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (ArgI.getKind()) {
18901f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    case ABIArgInfo::Indirect: {
18911f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      llvm::Value* V = AI;
18921f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
18931f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Do nothing, aggregates and complex variables are accessed by
18941f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // reference.
18951f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
18961f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Load scalar value from indirect argument.
1897adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
18981f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
18991f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // This must be a promotion, for something like
19001f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // "void a(x) short x; {..."
19011f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
19021f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        }
19031f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
19041f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      EmitParmDecl(*Arg, V);
19051f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
19061f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    }
19071f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar
190846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct: {
19098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
19108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      llvm::Value* V = AI;
19112fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
19122fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // Create a temporary alloca to hold the argument; the rest of
19132fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // codegen expects to access aggregates & complex values by
19142fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // reference.
1915adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = CreateTempAlloca(ConvertTypeForMem(Ty));
19162fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Builder.CreateStore(AI, V);
19172fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      } else {
19182fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
19192fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // This must be a promotion, for something like
19202fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // "void a(x) short x; {..."
19212fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
19222fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        }
192317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      }
19248951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      EmitParmDecl(*Arg, V);
19258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
19268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
19278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
19285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
1929b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar      // If this structure was expanded into multiple arguments then
19305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // we need to create a temporary and reconstruct it from the
19315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // arguments.
193239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      std::string Name = Arg->getNameAsString();
1933adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *Temp = CreateTempAlloca(ConvertTypeForMem(Ty),
19345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                           (Name + ".addr").c_str());
19355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: What are the right qualifiers here?
19365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      llvm::Function::arg_iterator End =
19375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI);
19385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitParmDecl(*Arg, Temp);
19395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
19405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // Name the arguments used in expansion and increment AI.
19415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      unsigned Index = 0;
19425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      for (; AI != End; ++AI, ++Index)
19435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        AI->setName(Name + "." + llvm::utostr(Index));
19445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
19455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
194611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
194711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
19488b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      // Initialize the local variable appropriately.
19498b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
1950adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        EmitParmDecl(*Arg, CreateTempAlloca(ConvertTypeForMem(Ty)));
19518b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      } else {
19528b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar        EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType())));
19538b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      }
19548b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar
195559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar      // Skip increment, no matching LLVM parameter.
195659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar      continue;
195711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
195889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
195989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
1960f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is very wasteful; EmitParmDecl is just going to drop the
1961f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // result in a new alloca anyway, so we could just store into that
1962f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // directly if we broke the abstraction down more.
1963adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(Ty), "coerce");
196489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      CreateCoercedStore(AI, V, *this);
196589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // Match to what EmitParmDecl is expecting for this type.
19668b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      if (!CodeGenFunction::hasAggregateLLVMType(Ty)) {
1967adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
19688b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
19698b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // This must be a promotion, for something like
19708b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // "void a(x) short x; {..."
19718b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
19728b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        }
19738b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      }
197489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      EmitParmDecl(*Arg, V);
197589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
197689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
19778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
19785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
19795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++AI;
198017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
198117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  assert(AI == Fn->arg_end() && "Argument mismatch!");
198217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
198317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
198488b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
198517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         llvm::Value *ReturnValue) {
19862c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  llvm::Value *RV = 0;
19872c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
19882c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  // Functions with no result always return void.
19892c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (ReturnValue) {
199088b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar    QualType RetTy = FI.getReturnType();
1991b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &RetAI = FI.getReturnInfo();
19922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
19932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    switch (RetAI.getKind()) {
199411e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
19953aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      if (RetTy->isAnyComplexType()) {
19963aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
19973aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        StoreComplexToAddr(RT, CurFn->arg_begin(), false);
19983aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
19993aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
20003aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else {
2001adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        EmitStoreOfScalar(Builder.CreateLoad(ReturnValue), CurFn->arg_begin(),
2002b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson                          false, RetTy);
20033aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      }
20042c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
20058951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
200646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
20072fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // The internal return value temp always will have
20082fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // pointer-to-return-type type.
20092c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      RV = Builder.CreateLoad(ReturnValue);
20102c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
20112c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
201211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
201311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
201411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
2015adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Coerce:
201654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this);
20178951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
20188951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
20198951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
20208951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for return argument");
202117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
202217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
20232c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
20242c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (RV) {
20252c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRet(RV);
20262c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
20272c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRetVoid();
20282c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
202917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
203017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
20310139bb96494b4c4ba0824617d5d2495dc7e44c76Anders CarlssonRValue CodeGenFunction::EmitCallArg(const Expr *E, QualType ArgType) {
20324029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson  if (ArgType->isReferenceType())
20334029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson    return EmitReferenceBindingToExpr(E, ArgType);
20344029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson
20350139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson  return EmitAnyExprToTemp(E);
20360139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson}
20370139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson
203888b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel DunbarRValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
203988b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                 llvm::Value *Callee,
2040c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const CallArgList &CallArgs,
2041c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const Decl *TargetDecl) {
2042f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from CallArgs; lift up and simplify.
204317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::SmallVector<llvm::Value*, 16> Args;
204417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
204517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Handle struct-return functions by passing a pointer to the
204617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // location that we would like to return into.
2047bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  QualType RetTy = CallInfo.getReturnType();
2048b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = CallInfo.getReturnInfo();
20492969a0243b0939286a45d0ba58dd3e1de226ac60Daniel Dunbar  if (CGM.ReturnTypeUsesSret(CallInfo)) {
205017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    // Create a temporary alloca to hold the result of the call. :(
2051adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    Args.push_back(CreateTempAlloca(ConvertTypeForMem(RetTy)));
205217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
205317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
20544b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(CallInfo.arg_size() == CallArgs.size() &&
20554b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
2056b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = CallInfo.arg_begin();
205717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
2058b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       I != E; ++I, ++info_it) {
2059b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgInfo = info_it->info;
206017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    RValue RV = I->first;
20615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
20625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    switch (ArgInfo.getKind()) {
206311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
20641f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (RV.isScalar() || RV.isComplex()) {
20651f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Make a temporary alloca to pass the argument.
2066adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        Args.push_back(CreateTempAlloca(ConvertTypeForMem(I->second)));
20671f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (RV.isScalar())
2068b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson          EmitStoreOfScalar(RV.getScalarVal(), Args.back(), false, I->second);
20691f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        else
20701f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
20711f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
20721f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        Args.push_back(RV.getAggregateAddr());
20731f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
20741f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
20751f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar
207646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
20775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (RV.isScalar()) {
20785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getScalarVal());
20795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else if (RV.isComplex()) {
20802fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        llvm::Value *Tmp = llvm::UndefValue::get(ConvertType(I->second));
20812fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().first, 0);
20822fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().second, 1);
20832fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Tmp);
20845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else {
20852fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Builder.CreateLoad(RV.getAggregateAddr()));
20865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      }
20875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
20885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
208911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
209011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
209111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
209289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
209389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // FIXME: Avoid the conversion through memory if possible.
209489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      llvm::Value *SrcPtr;
209589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      if (RV.isScalar()) {
20965a1be6e16ba306c349a3c3f80e9dce800976bc24Daniel Dunbar        SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce");
2097b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson        EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, I->second);
209889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      } else if (RV.isComplex()) {
2099adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce");
210089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        StoreComplexToAddr(RV.getComplexVal(), SrcPtr, false);
210189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      } else
210289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        SrcPtr = RV.getAggregateAddr();
210389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      Args.push_back(CreateCoercedLoad(SrcPtr, ArgInfo.getCoerceToType(),
210489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar                                       *this));
210589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
210689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
210789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
21085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand:
21095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(I->second, RV, Args);
21105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
211117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
211217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
211317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
21149834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::BasicBlock *InvokeDest = getInvokeDest();
2115761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CodeGen::AttributeListType AttributeList;
2116c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar  CGM.ConstructAttributeList(CallInfo, TargetDecl, AttributeList);
21179834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::AttrListPtr Attrs = llvm::AttrListPtr::get(AttributeList.begin(),
21189834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar                                                   AttributeList.end());
2119725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar
2120d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::CallSite CS;
2121d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (!InvokeDest || (Attrs.getFnAttributes() & llvm::Attribute::NoUnwind)) {
2122beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad    CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size());
21239834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  } else {
21249834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    llvm::BasicBlock *Cont = createBasicBlock("invoke.cont");
2125d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    CS = Builder.CreateInvoke(Callee, Cont, InvokeDest,
2126beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad                              Args.data(), Args.data()+Args.size());
21279834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    EmitBlock(Cont);
2128f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar  }
2129f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar
2130d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  CS.setAttributes(Attrs);
21316857d9d43b082ae825c29cca80f2f6b7c3aa4e5fTorok Edwin  if (const llvm::Function *F =  dyn_cast<llvm::Function>(Callee->stripPointerCasts()))
2132d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    CS.setCallingConv(F->getCallingConv());
2133d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
2134d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // If the call doesn't return, finish the basic block and clear the
2135d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // insertion point; this allows the rest of IRgen to discard
2136d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // unreachable code.
2137d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (CS.doesNotReturn()) {
2138d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.CreateUnreachable();
2139d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.ClearInsertionPoint();
2140d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
2141f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: For now, emit a dummy basic block because expr emitters in
2142f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // generally are not ready to handle emitting expressions at unreachable
2143f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // points.
2144d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    EnsureInsertPoint();
2145d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
2146d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    // Return a reasonable RValue.
2147d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    return GetUndefRValue(RetTy);
2148d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  }
2149d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
2150d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::Instruction *CI = CS.getInstruction();
21513403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner  if (Builder.isNamePreserving() && CI->getType() != llvm::Type::VoidTy)
215217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setName("call");
21532c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
21542c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
215511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
21562c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isAnyComplexType())
21575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
21583403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
21595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getAggregate(Args[0]);
21603403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(Args[0], false, RetTy));
21618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
216246327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
21632fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar    if (RetTy->isAnyComplexType()) {
21642fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Real = Builder.CreateExtractValue(CI, 0);
21652fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Imag = Builder.CreateExtractValue(CI, 1);
21662fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getComplex(std::make_pair(Real, Imag));
21673403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
21683403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
2169adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "agg.tmp");
21702fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      Builder.CreateStore(CI, V);
21712fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getAggregate(V);
21723403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
21733403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(CI);
21742c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
217511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
21760bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // If we are ignoring an argument that had a result, make sure to
21770bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // construct the appropriate return value for our caller.
217813e81737a433b23f8c662d10d1d57356122a8caaDaniel Dunbar    return GetUndefRValue(RetTy);
217911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
2180639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  case ABIArgInfo::Coerce: {
218189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    // FIXME: Avoid the conversion through memory if possible.
2182adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "coerce");
218354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CreateCoercedStore(CI, V, *this);
2184ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson    if (RetTy->isAnyComplexType())
2185ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getComplex(LoadComplexFromAddr(V, false));
21863403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
2187ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getAggregate(V);
21883403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(V, false, RetTy));
2189639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  }
21908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
21918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
21928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
219317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
21942c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
21952c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  assert(0 && "Unhandled ABIArgInfo::Kind");
21962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  return RValue::get(0);
219717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
2198b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
2199b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar/* VarArg handling */
2200b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
2201b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty) {
2202b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return CGM.getTypes().getABIInfo().EmitVAArg(VAListAddr, Ty, *this);
2203b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
2204