CGCall.cpp revision 6857d9d43b082ae825c29cca80f2f6b7c3aa4e5f
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"
245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar#include "llvm/ADT/StringExtras.h"
25d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel#include "llvm/Attributes.h"
26d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar#include "llvm/Support/CallSite.h"
27be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar#include "llvm/Support/MathExtras.h"
2854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar#include "llvm/Target/TargetData.h"
299eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
309eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar#include "ABIInfo.h"
319eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace clang;
330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace CodeGen;
340dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/
360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
370dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation.
380dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
39541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst
4072564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionNoProtoType *FTNP) {
41541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(FTNP->getResultType(),
42541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                         llvm::SmallVector<QualType, 16>());
4345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
4445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
45541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst
4672564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionProtoType *FTP) {
47541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
48541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
4945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
50541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(FTP->getArgType(i));
51541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(FTP->getResultType(), ArgTys);
5245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
5345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
54f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) {
55f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  llvm::SmallVector<QualType, 16> ArgTys;
563eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  // Add the 'this' pointer unless this is a static method.
573eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (MD->isInstance())
583eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner    ArgTys.push_back(MD->getThisType(Context));
59f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
60f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  const FunctionProtoType *FTP = MD->getType()->getAsFunctionProtoType();
61f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
62f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    ArgTys.push_back(FTP->getArgType(i));
63f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  return getFunctionInfo(FTP->getResultType(), ArgTys);
64f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson}
65f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
66541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionDecl *FD) {
673eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
68f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    if (MD->isInstance())
69f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson      return getFunctionInfo(MD);
70f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
710dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionType *FTy = FD->getType()->getAsFunctionType();
7272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  if (const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(FTy))
73541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    return getFunctionInfo(FTP);
7472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  return getFunctionInfo(cast<FunctionNoProtoType>(FTy));
750dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
760dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
77541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) {
78541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
79541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  ArgTys.push_back(MD->getSelfDecl()->getType());
80541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  ArgTys.push_back(Context.getObjCSelType());
81541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy?
822073216a1075767b5d25c23d1462b7034686d94dChris Lattner  for (ObjCMethodDecl::param_iterator i = MD->param_begin(),
830dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar         e = MD->param_end(); i != e; ++i)
84541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back((*i)->getType());
85541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(MD->getResultType(), ArgTys);
860dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
870dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
88541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
89541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                                                    const CallArgList &Args) {
90541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
91541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
92725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar  for (CallArgList::const_iterator i = Args.begin(), e = Args.end();
93725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar       i != e; ++i)
94541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(i->second);
95541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(ResTy, ArgTys);
960dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
970dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
98541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
99541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                                                  const FunctionArgList &Args) {
100541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
101541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
102bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
103bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar       i != e; ++i)
104541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(i->second);
105541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(ResTy, ArgTys);
106541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar}
107541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
108541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
109541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                               const llvm::SmallVector<QualType, 16> &ArgTys) {
11040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  // Lookup or create unique function info.
11140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  llvm::FoldingSetNodeID ID;
11240a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  CGFunctionInfo::Profile(ID, ResTy, ArgTys.begin(), ArgTys.end());
11340a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
11440a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  void *InsertPos = 0;
11540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos);
11640a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  if (FI)
11740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    return *FI;
11840a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
11988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Construct the function info.
12040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  FI = new CGFunctionInfo(ResTy, ArgTys);
12135e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar  FunctionInfos.InsertNode(FI, InsertPos);
122541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
12388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Compute ABI information.
1246bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  getABIInfo().computeInfo(*FI, getContext());
125541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
12688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  return *FI;
1270dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
12817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
12917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar/***/
13017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
1316b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIInfo::~ABIInfo() {}
1326b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1336f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbarvoid ABIArgInfo::dump() const {
1346f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  fprintf(stderr, "(ABIArgInfo Kind=");
1356f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  switch (TheKind) {
1366f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  case Direct:
1376f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    fprintf(stderr, "Direct");
1386f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
1396f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  case Ignore:
1406f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    fprintf(stderr, "Ignore");
1416f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
1426f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  case Coerce:
1436f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    fprintf(stderr, "Coerce Type=");
1446f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    getCoerceToType()->print(llvm::errs());
1456f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
14611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case Indirect:
14711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    fprintf(stderr, "Indirect Align=%d", getIndirectAlign());
1486f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
1496f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  case Expand:
1506f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    fprintf(stderr, "Expand");
1516f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    break;
1526f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  }
1536f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar  fprintf(stderr, ")\n");
1546f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar}
1556f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar
1566f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar/***/
1576f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar
158573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbarstatic bool isEmptyRecord(ASTContext &Context, QualType T);
159573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
160573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar/// isEmptyField - Return true iff a the field is "empty", that is it
161573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar/// is an unnamed bit-field or an (array of) empty record(s).
162573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbarstatic bool isEmptyField(ASTContext &Context, const FieldDecl *FD) {
163573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar  if (FD->isUnnamedBitfield())
164573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    return true;
165573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
166573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar  QualType FT = FD->getType();
167cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar  // Constant arrays of empty records count as empty, strip them off.
168cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar  while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT))
169cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    FT = AT->getElementType();
170573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
171573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar  return isEmptyRecord(Context, FT);
172573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar}
173573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
174573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar/// isEmptyRecord - Return true iff a structure contains only empty
175573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar/// fields. Note that a structure with a flexible array member is not
176834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered empty.
1776ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregorstatic bool isEmptyRecord(ASTContext &Context, QualType T) {
1785bde6f41506535ddaf6e9ff60bd1488db8ded952Daniel Dunbar  const RecordType *RT = T->getAsRecordType();
179834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!RT)
180834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
181834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordDecl *RD = RT->getDecl();
182834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (RD->hasFlexibleArrayMember())
183834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return false;
1846ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
185573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar         e = RD->field_end(Context); i != e; ++i)
186573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    if (!isEmptyField(Context, *i))
187834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return false;
188834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return true;
189834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
190834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
191834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isSingleElementStruct - Determine if a structure is a "single
192834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// element struct", i.e. it has exactly one non-empty field or
193834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// exactly one field which is itself a single element
194834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// struct. Structures with flexible array members are never
195834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered single element structs.
196834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar///
197834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// \return The field declaration for the single non-empty field, if
198834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// it exists.
199dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbarstatic const Type *isSingleElementStruct(QualType T, ASTContext &Context) {
200834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordType *RT = T->getAsStructureType();
201834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!RT)
202834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
203834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
204834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  const RecordDecl *RD = RT->getDecl();
205834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (RD->hasFlexibleArrayMember())
206834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return 0;
207834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
208dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar  const Type *Found = 0;
2096ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
2106ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(Context); i != e; ++i) {
211834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
212834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    QualType FT = FD->getType();
213834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
214573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    // Ignore empty fields.
215573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    if (isEmptyField(Context, FD))
216573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar      continue;
217573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar
218cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    // If we already found an element then this isn't a single-element
219cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    // struct.
220fcab2ca966d5176839f8698535e0d807bd968629Daniel Dunbar    if (Found)
221834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return 0;
222fcab2ca966d5176839f8698535e0d807bd968629Daniel Dunbar
223cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    // Treat single element arrays as the element.
224cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) {
225cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar      if (AT->getSize().getZExtValue() != 1)
226cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar        break;
227cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar      FT = AT->getElementType();
228cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar    }
229cc401dc651a91f53f9f9a39956732be8f537e7faDaniel Dunbar
230fcab2ca966d5176839f8698535e0d807bd968629Daniel Dunbar    if (!CodeGenFunction::hasAggregateLLVMType(FT)) {
231dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar      Found = FT.getTypePtr();
232834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    } else {
233dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar      Found = isSingleElementStruct(FT, Context);
234834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (!Found)
235834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return 0;
236834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
237834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
238834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
239834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return Found;
240834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
241834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
242834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
243834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  if (!Ty->getAsBuiltinType() && !Ty->isPointerType())
244834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    return false;
245834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
246834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  uint64_t Size = Context.getTypeSize(Ty);
247834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return Size == 32 || Size == 64;
248834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
249834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
250834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool areAllFields32Or64BitBasicType(const RecordDecl *RD,
251834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar                                           ASTContext &Context) {
2526ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
2536ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(Context); i != e; ++i) {
254834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    const FieldDecl *FD = *i;
255834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
256834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (!is32Or64BitBasicType(FD->getType(), Context))
257834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      return false;
258834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
259f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: Reject bit-fields wholesale; there are two problems, we don't know
260f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // how to expand them yet, and the predicate for telling if a bitfield still
261f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // counts as "basic" is more complicated than what we were doing previously.
262e06a75f4c8ea30b6a99d5aa1dce5feda64da09c6Daniel Dunbar    if (FD->isBitField())
263e06a75f4c8ea30b6a99d5aa1dce5feda64da09c6Daniel Dunbar      return false;
264834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  }
265e06a75f4c8ea30b6a99d5aa1dce5feda64da09c6Daniel Dunbar
266834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar  return true;
267834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar}
268834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
2696b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarnamespace {
2706b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// DefaultABIInfo - The default implementation for ABI specific
2716b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// details. This implementation provides information which results in
2726bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar/// self-consistent and sensible LLVM IR generation, but does not
2736bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar/// conform to any particular ABI.
2746b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass DefaultABIInfo : public ABIInfo {
2756bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyReturnType(QualType RetTy,
2766bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar                                ASTContext &Context) const;
2776bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
2786bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyArgumentType(QualType RetTy,
2796bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar                                  ASTContext &Context) const;
2806bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
2816bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
2826bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
2836bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
2846bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar         it != ie; ++it)
2856bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar      it->info = classifyArgumentType(it->type, Context);
2866bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  }
287b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
288b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
289b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                 CodeGenFunction &CGF) const;
2906b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
2916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
2926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// X86_32ABIInfo - The X86-32 ABI information.
2936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass X86_32ABIInfo : public ABIInfo {
2946ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  ASTContext &Context;
2959fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman  bool IsDarwin;
2969fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman
297dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar  static bool isRegisterSize(unsigned Size) {
298dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar    return (Size == 8 || Size == 16 || Size == 32 || Size == 64);
299dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar  }
300dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar
301cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  static bool shouldReturnTypeInRegister(QualType Ty, ASTContext &Context);
302cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
3036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic:
3046bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyReturnType(QualType RetTy,
3056bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar                                ASTContext &Context) const;
3066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
3076bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyArgumentType(QualType RetTy,
3086bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar                                  ASTContext &Context) const;
3096bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
3106bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
3116bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
3126bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
3136bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar         it != ie; ++it)
3146bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar      it->info = classifyArgumentType(it->type, Context);
3156bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  }
316b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
317b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
318b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                 CodeGenFunction &CGF) const;
3199fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman
3206ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  X86_32ABIInfo(ASTContext &Context, bool d)
3216ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor    : ABIInfo(), Context(Context), IsDarwin(d) {}
3226b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar};
3236b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
3246b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
325cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
326cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar/// shouldReturnTypeInRegister - Determine if the given type should be
327cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar/// passed in a register (for the Darwin ABI).
328cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbarbool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty,
329cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar                                               ASTContext &Context) {
330cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  uint64_t Size = Context.getTypeSize(Ty);
331cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
332cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // Type must be register sized.
333cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (!isRegisterSize(Size))
334cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    return false;
335cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
336cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (Ty->isVectorType()) {
337cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    // 64- and 128- bit vectors inside structures are not returned in
338cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    // registers.
339cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    if (Size == 64 || Size == 128)
340cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar      return false;
341cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
342cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    return true;
343cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  }
344cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
345cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // If this is a builtin, pointer, or complex type, it is ok.
346cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (Ty->getAsBuiltinType() || Ty->isPointerType() || Ty->isAnyComplexType())
347cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    return true;
348cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
349cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // Arrays are treated like records.
350cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty))
351cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    return shouldReturnTypeInRegister(AT->getElementType(), Context);
352cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
353cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // Otherwise, it must be a record type.
354cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  const RecordType *RT = Ty->getAsRecordType();
355cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  if (!RT) return false;
356cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
357cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // Structure types are passed in register if all fields would be
358cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  // passed in a register.
3596ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RT->getDecl()->field_begin(Context),
3606ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RT->getDecl()->field_end(Context); i != e; ++i) {
361cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    const FieldDecl *FD = *i;
362cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
363573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    // Empty fields are ignored.
364573b907e8ba3b74fc69cddaf63496c7bb5994196Daniel Dunbar    if (isEmptyField(Context, FD))
365cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar      continue;
366cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
367cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    // Check fields recursively.
368cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    if (!shouldReturnTypeInRegister(FD->getType(), Context))
369cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar      return false;
370cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  }
371cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
372cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar  return true;
373cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar}
374cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar
3756b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
3766b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar                                            ASTContext &Context) const {
3770bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  if (RetTy->isVoidType()) {
3780bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getIgnore();
379360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar  } else if (const VectorType *VT = RetTy->getAsVectorType()) {
380360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar    // On Darwin, some vectors are returned in registers.
381360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar    if (IsDarwin) {
382360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      uint64_t Size = Context.getTypeSize(RetTy);
383360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar
384360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // 128-bit vectors are a special case; they are returned in
385360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // registers and we need to make sure to pick a type the LLVM
386360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // backend will like.
387360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      if (Size == 128)
388360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar        return ABIArgInfo::getCoerce(llvm::VectorType::get(llvm::Type::Int64Ty,
389360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar                                                           2));
390360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar
391360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // Always return in register if it fits in a general purpose
392360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      // register, or if it is 64 bits and has a single element.
393360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      if ((Size == 8 || Size == 16 || Size == 32) ||
394360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar          (Size == 64 && VT->getNumElements() == 1))
395360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar        return ABIArgInfo::getCoerce(llvm::IntegerType::get(Size));
396360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar
397360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar      return ABIArgInfo::getIndirect(0);
398360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar    }
399360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar
400360431660b2245a109f5c6870729126dbcdea254Daniel Dunbar    return ABIArgInfo::getDirect();
4010bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
4028e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar    // Structures with flexible arrays are always indirect.
4038e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar    if (const RecordType *RT = RetTy->getAsStructureType())
4048e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar      if (RT->getDecl()->hasFlexibleArrayMember())
4058e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar        return ABIArgInfo::getIndirect(0);
4068e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar
4079fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman    // Outside of Darwin, structs and unions are always indirect.
4089fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman    if (!IsDarwin && !RetTy->isAnyComplexType())
4099fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman      return ABIArgInfo::getIndirect(0);
4108e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar
411834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Classify "single element" structs as their element type.
412dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar    if (const Type *SeltTy = isSingleElementStruct(RetTy, Context)) {
413834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (const BuiltinType *BT = SeltTy->getAsBuiltinType()) {
414834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        if (BT->isIntegerType()) {
4152e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          // We need to use the size of the structure, padding
4162e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          // bit-fields can adjust that to be larger than the single
4172e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          // element type.
4182e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          uint64_t Size = Context.getTypeSize(RetTy);
419834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::IntegerType::get((unsigned) Size));
420834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        } else if (BT->getKind() == BuiltinType::Float) {
4212e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          assert(Context.getTypeSize(RetTy) == Context.getTypeSize(SeltTy) &&
4222e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar                 "Unexpect single element structure size!");
423834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::Type::FloatTy);
424834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        } else if (BT->getKind() == BuiltinType::Double) {
4252e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar          assert(Context.getTypeSize(RetTy) == Context.getTypeSize(SeltTy) &&
4262e0011650fe149bf55916c6f25558bf9bfebf537Daniel Dunbar                 "Unexpect single element structure size!");
427834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          return ABIArgInfo::getCoerce(llvm::Type::DoubleTy);
428834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        }
429834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      } else if (SeltTy->isPointerType()) {
430f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump        // FIXME: It would be really nice if this could come out as the proper
431f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump        // pointer type.
432834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        llvm::Type *PtrTy =
433834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
434834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getCoerce(PtrTy);
435dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar      } else if (SeltTy->isVectorType()) {
436dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        // 64- and 128-bit vectors are never returned in a
437dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        // register when inside a structure.
438dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        uint64_t Size = Context.getTypeSize(RetTy);
439dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        if (Size == 64 || Size == 128)
440dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar          return ABIArgInfo::getIndirect(0);
441dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar
442dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar        return classifyReturnType(QualType(SeltTy, 0), Context);
443834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      }
444834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
445834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
446836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar    // Small structures which are register sized are generally returned
447836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar    // in a register.
448836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar    if (X86_32ABIInfo::shouldReturnTypeInRegister(RetTy, Context)) {
449836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar      uint64_t Size = Context.getTypeSize(RetTy);
450836a0641ba4109b2c1254eec247ba4d2731bc2b7Daniel Dunbar      return ABIArgInfo::getCoerce(llvm::IntegerType::get(Size));
451cf6bde343ff5653744ca782e04d5a9c54b260042Daniel Dunbar    }
452dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar
453dfc6b80ee13a9102cd67e0b2398fa999eebcbf8eDaniel Dunbar    return ABIArgInfo::getIndirect(0);
4542c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
4550bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getDirect();
4562c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
4572c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar}
4582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
4596b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
460b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                               ASTContext &Context) const {
46111e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  // FIXME: Set alignment on indirect arguments.
462f035738e346da0a82538ab236aef218a27373635Daniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
46311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    // Structures with flexible arrays are always indirect.
464834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (const RecordType *RT = Ty->getAsStructureType())
465834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (RT->getDecl()->hasFlexibleArrayMember())
46611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar        return ABIArgInfo::getIndirect(0);
467834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
4683170c93d26bdc8b360c4ea3b1cedba50bbd818c1Daniel Dunbar    // Ignore empty structs.
469834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
470834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (Ty->isStructureType() && Size == 0)
4713170c93d26bdc8b360c4ea3b1cedba50bbd818c1Daniel Dunbar      return ABIArgInfo::getIgnore();
472834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
473834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // Expand structs with size <= 128-bits which consist only of
474834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // basic types (int, long long, float, double, xxx*). This is
475834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    // non-recursive and does not ignore empty fields.
476834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    if (const RecordType *RT = Ty->getAsStructureType()) {
477834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar      if (Context.getTypeSize(Ty) <= 4*32 &&
478834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar          areAllFields32Or64BitBasicType(RT->getDecl(), Context))
479834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar        return ABIArgInfo::getExpand();
480834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar    }
481834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar
48211e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    return ABIArgInfo::getIndirect(0);
4838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  } else {
4840bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getDirect();
4858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  }
4868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar}
4878951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
488b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *X86_32ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
489b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                      CodeGenFunction &CGF) const {
490b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
491b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  const llvm::Type *BPP = llvm::PointerType::getUnqual(BP);
492b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
493b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  CGBuilderTy &Builder = CGF.Builder;
494b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP,
495b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                                       "ap");
496b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
497b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Type *PTy =
498b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar    llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
499b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy);
500b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
501570f0cf734f321b902eb18dd1b07f53543f0a393Daniel Dunbar  uint64_t Offset =
502570f0cf734f321b902eb18dd1b07f53543f0a393Daniel Dunbar    llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4);
503b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  llvm::Value *NextAddr =
504b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar    Builder.CreateGEP(Addr,
505570f0cf734f321b902eb18dd1b07f53543f0a393Daniel Dunbar                      llvm::ConstantInt::get(llvm::Type::Int32Ty, Offset),
506b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                      "ap.next");
507b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  Builder.CreateStore(NextAddr, VAListAddrAsBPP);
508b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
509b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return AddrTyped;
510b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
511b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
5126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarnamespace {
513c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar/// X86_64ABIInfo - The X86_64 ABI information.
5146f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarclass X86_64ABIInfo : public ABIInfo {
5156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  enum Class {
5166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Integer = 0,
5176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    SSE,
5186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    SSEUp,
5196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    X87,
5206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    X87Up,
5216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ComplexX87,
5226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    NoClass,
5236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    Memory
5246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  };
5256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
5268562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  /// merge - Implement the X86_64 ABI merging algorithm.
5278562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  ///
528c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// Merge an accumulating classification \arg Accum with a field
529c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// classification \arg Field.
530c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
531c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Accum - The accumulating classification. This should
532c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// always be either NoClass or the result of a previous merge
533c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// call. In addition, this should never be Memory (the caller
534c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// should just return Memory for the aggregate).
535c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Class merge(Class Accum, Class Field) const;
5368562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
5376f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// classify - Determine the x86_64 register classes in which the
5386f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// given type T should be passed.
5396f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
540c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Lo - The classification for the parts of the type
541c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// residing in the low word of the containing object.
542c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
543c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param Hi - The classification for the parts of the type
544c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// residing in the high word of the containing object.
545c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  ///
546c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  /// \param OffsetBase - The bit offset of this type in the
547cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar  /// containing object.  Some parameters are classified different
548cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar  /// depending on whether they straddle an eightbyte boundary.
5496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
5506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// If a word is unused its result will be NoClass; if a type should
5516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// be passed in Memory then at least the classification of \arg Lo
5526f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// will be Memory.
5536f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
5546f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// The \arg Lo class will be NoClass iff the argument is ignored.
5556f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  ///
5566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
5576e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar  /// also be ComplexX87.
558e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar  void classify(QualType T, ASTContext &Context, uint64_t OffsetBase,
5596f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                Class &Lo, Class &Hi) const;
560c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
561644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  /// getCoerceResult - Given a source type \arg Ty and an LLVM type
562644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  /// to coerce to, chose the best way to pass Ty in the same place
563644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  /// that \arg CoerceTo would be passed, but while keeping the
564644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  /// emitted code as simple as possible.
565644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  ///
566f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  /// FIXME: Note, this should be cleaned up to just take an enumeration of all
567f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  /// the ways we might want to pass things, instead of constructing an LLVM
568f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  /// type. This makes this code more explicit, and it makes it clearer that we
569f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  /// are also doing this for correctness in the case of passing scalar types.
570644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  ABIArgInfo getCoerceResult(QualType Ty,
571644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar                             const llvm::Type *CoerceTo,
572644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar                             ASTContext &Context) const;
573644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
5746bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  ABIArgInfo classifyReturnType(QualType RetTy,
57559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar                                ASTContext &Context) const;
57659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
57759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  ABIArgInfo classifyArgumentType(QualType Ty,
57859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar                                  ASTContext &Context,
5793b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar                                  unsigned &neededInt,
5803b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar                                  unsigned &neededSSE) const;
58159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
58259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbarpublic:
58359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const;
584b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
585b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
586b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                 CodeGenFunction &CGF) const;
5876f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar};
5886f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}
5896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
590c450357c436c05aa02ef88d406de962d98ac50beDaniel DunbarX86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum,
591c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar                                          Class Field) const {
5928562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
5938562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // classified recursively so that always two fields are
5948562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // considered. The resulting class is calculated according to
5958562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // the classes of the fields in the eightbyte:
5968562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
5978562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (a) If both classes are equal, this is the resulting class.
5988562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
5998562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (b) If one of the classes is NO_CLASS, the resulting class is
6008562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // the other class.
6018562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6028562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (c) If one of the classes is MEMORY, the result is the MEMORY
6038562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // class.
6048562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6058562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (d) If one of the classes is INTEGER, the result is the
6068562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // INTEGER.
6078562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6088562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
6098562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // MEMORY is used as class.
6108562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  //
6118562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  // (f) Otherwise class SSE is used.
612100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar
613100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  // Accum should never be memory (we should have returned) or
614100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  // ComplexX87 (because this cannot be passed in a structure).
615100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  assert((Accum != Memory && Accum != ComplexX87) &&
616c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar         "Invalid accumulated classification during merge.");
617c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  if (Accum == Field || Field == NoClass)
618c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Accum;
619c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Field == Memory)
620c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Memory;
621c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Accum == NoClass)
622c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Field;
623c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  else if (Accum == Integer || Field == Integer)
624c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Integer;
62520e95c5eb400c864bbd4421624fdf7b25ce70f56Daniel Dunbar  else if (Field == X87 || Field == X87Up || Field == ComplexX87 ||
62620e95c5eb400c864bbd4421624fdf7b25ce70f56Daniel Dunbar           Accum == X87 || Accum == X87Up)
627c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return Memory;
6288562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  else
629c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    return SSE;
6308562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar}
6318562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
6326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarvoid X86_64ABIInfo::classify(QualType Ty,
6336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                             ASTContext &Context,
634e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar                             uint64_t OffsetBase,
6356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar                             Class &Lo, Class &Hi) const {
636f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: This code can be simplified by introducing a simple value class for
637f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // Class pairs with appropriate constructor methods for the various
638f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // situations.
6399a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar
640f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: Some of the split computations are wrong; unaligned vectors
641f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // shouldn't be passed in registers for example, so there is no chance they
642f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // can straddle an eightbyte. Verify & simplify.
643e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar
644c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Lo = Hi = NoClass;
645c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
646c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Class &Current = OffsetBase < 64 ? Lo : Hi;
647c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  Current = Memory;
648c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
6496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  if (const BuiltinType *BT = Ty->getAsBuiltinType()) {
6506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    BuiltinType::Kind k = BT->getKind();
6516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
65211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    if (k == BuiltinType::Void) {
653c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = NoClass;
6542df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner    } else if (k == BuiltinType::Int128 || k == BuiltinType::UInt128) {
655ae69e005a9072a30262dfe87360b034d4b8e45f2Chris Lattner      Lo = Integer;
656ae69e005a9072a30262dfe87360b034d4b8e45f2Chris Lattner      Hi = Integer;
65711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
658c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = Integer;
6596f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    } else if (k == BuiltinType::Float || k == BuiltinType::Double) {
660c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = SSE;
6616f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    } else if (k == BuiltinType::LongDouble) {
6626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = X87;
6636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Hi = X87Up;
6646f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    }
6657a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    // FIXME: _Decimal32 and _Decimal64 are SSE.
6667a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
667708762b66a813543078a6d1c4fc2b69ee4361ec7Anders Carlsson  } else if (const EnumType *ET = Ty->getAsEnumType()) {
668708762b66a813543078a6d1c4fc2b69ee4361ec7Anders Carlsson    // Classify the underlying integer type.
669708762b66a813543078a6d1c4fc2b69ee4361ec7Anders Carlsson    classify(ET->getDecl()->getIntegerType(), Context, OffsetBase, Lo, Hi);
6708958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar  } else if (Ty->hasPointerRepresentation()) {
671c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = Integer;
6727a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar  } else if (const VectorType *VT = Ty->getAsVectorType()) {
673e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar    uint64_t Size = Context.getTypeSize(VT);
674e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar    if (Size == 32) {
675e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      // gcc passes all <4 x char>, <2 x short>, <1 x int>, <1 x
676e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      // float> as integer.
677e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      Current = Integer;
678e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar
679e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      // If this type crosses an eightbyte boundary, it should be
680e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      // split.
681e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      uint64_t EB_Real = (OffsetBase) / 64;
682e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      uint64_t EB_Imag = (OffsetBase + Size - 1) / 64;
683e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar      if (EB_Real != EB_Imag)
684e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar        Hi = Lo;
685e28099bf301ad8b0b77cb11f94caad3c38d97ddaDaniel Dunbar    } else if (Size == 64) {
6860af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      // gcc passes <1 x double> in memory. :(
6870af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::Double))
688d4cd1b07169c698bd003be102bd73a7da7e24b25Daniel Dunbar        return;
6890af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar
6900af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      // gcc passes <1 x long long> as INTEGER.
6910af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::LongLong))
6920af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar        Current = Integer;
6930af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar      else
6940af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar        Current = SSE;
695e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar
696e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar      // If this type crosses an eightbyte boundary, it should be
697e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar      // split.
698cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar      if (OffsetBase && OffsetBase != 64)
699e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar        Hi = Lo;
7007a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    } else if (Size == 128) {
7017a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Lo = SSE;
7027a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar      Hi = SSEUp;
7037a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar    }
7046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  } else if (const ComplexType *CT = Ty->getAsComplexType()) {
7053327f6ead9362e5689674a4aaab5b7f23ea0dea3Daniel Dunbar    QualType ET = Context.getCanonicalType(CT->getElementType());
7066f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
707e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
7080af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar    if (ET->isIntegralType()) {
709eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      if (Size <= 64)
710c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        Current = Integer;
711eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar      else if (Size <= 128)
712eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar        Lo = Hi = Integer;
713eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar    } else if (ET == Context.FloatTy)
714c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = SSE;
7156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    else if (ET == Context.DoubleTy)
7166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar      Lo = Hi = SSE;
7176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    else if (ET == Context.LongDoubleTy)
718c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Current = ComplexX87;
719f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar
720f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    // If this complex type crosses an eightbyte boundary then it
721f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    // should be split.
722cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar    uint64_t EB_Real = (OffsetBase) / 64;
723cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar    uint64_t EB_Imag = (OffsetBase + Context.getTypeSize(ET)) / 64;
724f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar    if (Hi == NoClass && EB_Real != EB_Imag)
725f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar      Hi = Lo;
7268562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar  } else if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
7278562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Arrays are treated like structures.
7288562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
7298562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
7308562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
7318562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
7328562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // than two eightbytes, ..., it has class MEMORY.
7338562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    if (Size > 128)
7348562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      return;
7358562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
7368562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
7378562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // fields, it has class MEMORY.
7388562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    //
7398562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Only need to check alignment of array base.
740c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (OffsetBase % Context.getTypeAlign(AT->getElementType()))
7418562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      return;
7428562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar
7438562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // Otherwise implement simplified merge. We could be smarter about
7448562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    // this, but it isn't worth it and would be harder to verify.
745c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = NoClass;
7468562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t EltSize = Context.getTypeSize(AT->getElementType());
7478562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    uint64_t ArraySize = AT->getSize().getZExtValue();
7488562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
7498562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      Class FieldLo, FieldHi;
7508562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      classify(AT->getElementType(), Context, Offset, FieldLo, FieldHi);
751c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = merge(Lo, FieldLo);
752c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = merge(Hi, FieldHi);
753c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      if (Lo == Memory || Hi == Memory)
754c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        break;
7558562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar    }
756c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
757c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // Do post merger cleanup (see below). Only case we worry about is Memory.
758c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (Hi == Memory)
759c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = Memory;
760c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
76199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar  } else if (const RecordType *RT = Ty->getAsRecordType()) {
762e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar    uint64_t Size = Context.getTypeSize(Ty);
76399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
76499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
76599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // than two eightbytes, ..., it has class MEMORY.
76699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (Size > 128)
76799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      return;
76899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
76999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    const RecordDecl *RD = RT->getDecl();
77099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
77199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // Assume variable sized types are passed in memory.
77299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (RD->hasFlexibleArrayMember())
77399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      return;
77499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
77599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
77699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
77799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // Reset Lo class, this will be recomputed.
778c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    Current = NoClass;
77999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    unsigned idx = 0;
7806ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor    for (RecordDecl::field_iterator i = RD->field_begin(Context),
7816ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor           e = RD->field_end(Context); i != e; ++i, ++idx) {
7828562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
783dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      bool BitField = i->isBitField();
78499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
7858562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
7868562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar      // fields, it has class MEMORY.
787dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      //
7888e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar      // Note, skip this test for bit-fields, see below.
789dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      if (!BitField && Offset % Context.getTypeAlign(i->getType())) {
79099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        Lo = Memory;
79199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar        return;
79299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      }
79399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
79499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      // Classify this field.
795c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      //
796c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate
797c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // exceeds a single eightbyte, each is classified
798c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // separately. Each eightbyte gets initialized to class
799c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      // NO_CLASS.
80099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar      Class FieldLo, FieldHi;
801dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar
8028e03444e924665d4d90f5cfc0624c815256e0309Daniel Dunbar      // Bit-fields require special handling, they do not force the
803dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      // structure to be passed in memory even if unaligned, and
804dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      // therefore they can straddle an eightbyte.
805dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      if (BitField) {
8068236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar        // Ignore padding bit-fields.
8078236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar        if (i->isUnnamedBitfield())
8088236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar          continue;
8098236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar
810dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
8119a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman        uint64_t Size = i->getBitWidth()->EvaluateAsInt(Context).getZExtValue();
812dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar
813dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        uint64_t EB_Lo = Offset / 64;
814dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        uint64_t EB_Hi = (Offset + Size - 1) / 64;
815dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        FieldLo = FieldHi = NoClass;
816dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        if (EB_Lo) {
817dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          assert(EB_Hi == EB_Lo && "Invalid classification, type > 16 bytes.");
818dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          FieldLo = NoClass;
819dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          FieldHi = Integer;
820dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        } else {
821dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          FieldLo = Integer;
822dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar          FieldHi = EB_Hi ? Integer : NoClass;
823dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        }
824dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar      } else
825dd81d44fac2631e6ca9fe1f52366aea0f51b03e1Daniel Dunbar        classify(i->getType(), Context, Offset, FieldLo, FieldHi);
826c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = merge(Lo, FieldLo);
827c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = merge(Hi, FieldHi);
828c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      if (Lo == Memory || Hi == Memory)
829c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar        break;
83099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    }
83199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
83299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
83399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    //
83499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // (a) If one of the classes is MEMORY, the whole argument is
83599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // passed in memory.
83699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    //
83799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // (b) If SSEUP is not preceeded by SSE, it is converted to SSE.
83899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar
83999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    // The first of these conditions is guaranteed by how we implement
840c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // the merge (just bail).
841c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    //
842c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // The second condition occurs in the case of unions; for example
843c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // union { _Complex double; unsigned; }.
844c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    if (Hi == Memory)
845c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Lo = Memory;
84699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar    if (Hi == SSEUp && Lo != SSE)
847c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar      Hi = SSE;
8486f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
8496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}
8506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
851644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel DunbarABIArgInfo X86_64ABIInfo::getCoerceResult(QualType Ty,
852644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar                                          const llvm::Type *CoerceTo,
853644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar                                          ASTContext &Context) const {
854644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  if (CoerceTo == llvm::Type::Int64Ty) {
855644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar    // Integer and pointer types will end up in a general purpose
856644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar    // register.
8570af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar    if (Ty->isIntegralType() || Ty->isPointerType())
858644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar      return ABIArgInfo::getDirect();
8590af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar
860644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  } else if (CoerceTo == llvm::Type::DoubleTy) {
861f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: It would probably be better to make CGFunctionInfo only map using
862f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // canonical types than to canonize here.
8633327f6ead9362e5689674a4aaab5b7f23ea0dea3Daniel Dunbar    QualType CTy = Context.getCanonicalType(Ty);
8643327f6ead9362e5689674a4aaab5b7f23ea0dea3Daniel Dunbar
865644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar    // Float and double end up in a single SSE reg.
8663327f6ead9362e5689674a4aaab5b7f23ea0dea3Daniel Dunbar    if (CTy == Context.FloatTy || CTy == Context.DoubleTy)
867644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar      return ABIArgInfo::getDirect();
8680af9929e1ba8e5b9ae0a8999439736d249599bbeDaniel Dunbar
869644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  }
870644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
871644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  return ABIArgInfo::getCoerce(CoerceTo);
872644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
873c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
874d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy,
875d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar                                            ASTContext &Context) const {
8766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
8776f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  // classification algorithm.
8786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  X86_64ABIInfo::Class Lo, Hi;
879f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar  classify(RetTy, Context, 0, Lo, Hi);
8806f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
881c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  // Check some invariants.
882c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
883c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification.");
884c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar  assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
885c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar
8866f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  const llvm::Type *ResType = 0;
8876f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  switch (Lo) {
8886f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case NoClass:
88911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    return ABIArgInfo::getIgnore();
8906f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
8916f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSEUp:
8926f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87Up:
8936f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(0 && "Invalid classification for lo word.");
8946f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
895c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
89611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    // hidden argument.
8976f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Memory:
89811e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    return ABIArgInfo::getIndirect(0);
8996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
9016f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // available register of the sequence %rax, %rdx is used.
9026f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Integer:
9036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::Int64Ty; break;
9046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
9066f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // available SSE register of the sequence %xmm0, %xmm1 is used.
9076f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSE:
9086f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::DoubleTy; break;
9096f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
9116f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // returned on the X87 stack in %st0 as 80-bit x87 number.
9126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87:
9136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::Type::X86_FP80Ty; break;
9146f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
915c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
916c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // part of the value is returned in %st0 and the imaginary part in
917c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar    // %st1.
9186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case ComplexX87:
9196e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar    assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification.");
9203e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar    ResType = llvm::StructType::get(llvm::Type::X86_FP80Ty,
9213e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                    llvm::Type::X86_FP80Ty,
9223e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                    NULL);
9236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
9246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
9256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  switch (Hi) {
9276e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar    // Memory was handled previously and X87 should
9286e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar    // never occur as a hi class.
9296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Memory:
9306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87:
9316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(0 && "Invalid classification for hi word.");
9326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9336e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar  case ComplexX87: // Previously handled.
9346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case NoClass: break;
9356e53e9b8795022ed08d5e59b8d78b2c616c2ef9aDaniel Dunbar
9366f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case Integer:
937b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL);
938b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    break;
9396f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSE:
940b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
941b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    break;
9426f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9436f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
9446f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // is passed in the upper half of the last used SSE register.
9456f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    //
9466f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // SSEUP should always be preceeded by SSE, just widen.
9476f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case SSEUp:
9486f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    assert(Lo == SSE && "Unexpected SSEUp classification.");
9496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2);
9506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
9516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
9526f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
953b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar    // returned together with the previous X87 value in %st0.
9546f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  case X87Up:
955100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // If X87Up is preceeded by X87, we don't need to do
956100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // anything. However, in some cases with unions it may not be
957100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // preceeded by X87. In such situations we follow gcc and pass the
958100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // extra bits in an SSE reg.
959100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    if (Lo != X87)
960100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar      ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
9616f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar    break;
9626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar  }
9636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar
964644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  return getCoerceResult(RetTy, ResType, Context);
965d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar}
966d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar
96759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel DunbarABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, ASTContext &Context,
9683b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar                                               unsigned &neededInt,
9693b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar                                               unsigned &neededSSE) const {
97059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  X86_64ABIInfo::Class Lo, Hi;
97159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  classify(Ty, Context, 0, Lo, Hi);
97259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
97359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // Check some invariants.
97459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // FIXME: Enforce these by construction.
97559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
97659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification.");
97759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
97859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
9793b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar  neededInt = 0;
9803b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar  neededSSE = 0;
98159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  const llvm::Type *ResType = 0;
98259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  switch (Lo) {
98359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case NoClass:
98459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    return ABIArgInfo::getIgnore();
98559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
98659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 1. If the class is MEMORY, pass the argument
98759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // on the stack.
98859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case Memory:
98959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
99059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 5. If the class is X87, X87UP or
99159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // COMPLEX_X87, it is passed in memory.
99259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case X87:
99359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case ComplexX87:
994245f5534a520c23e703fd239632273c551be50b3Daniel Dunbar    return ABIArgInfo::getIndirect(0);
99559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
99659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case SSEUp:
99759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case X87Up:
99859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    assert(0 && "Invalid classification for lo word.");
99959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
100059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 2. If the class is INTEGER, the next
100159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8
100259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // and %r9 is used.
100359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case Integer:
100459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ++neededInt;
100559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::Type::Int64Ty;
100659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
100759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
100859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next
100959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // available SSE register is used, the registers are taken in the
101059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // order from %xmm0 to %xmm7.
101159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case SSE:
101259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ++neededSSE;
101359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::Type::DoubleTy;
101459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
101559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  }
101659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
101759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  switch (Hi) {
101859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // Memory was handled previously, ComplexX87 and X87 should
101959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // never occur as hi classes, and X87Up must be preceed by X87,
102059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // which is passed in memory.
102159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case Memory:
102259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case X87:
102359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case ComplexX87:
102459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    assert(0 && "Invalid classification for hi word.");
1025100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    break;
102659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
102759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case NoClass: break;
102859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case Integer:
102959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL);
103059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ++neededInt;
103159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
1032100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar
1033100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // X87Up generally doesn't occur here (long double is passed in
1034100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar    // memory), except in situations involving unions.
1035100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  case X87Up:
1036100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  case SSE:
103759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
103859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ++neededSSE;
103959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
104059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
104159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the
104259e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // eightbyte is passed in the upper half of the last used SSE
104359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    // register.
104459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  case SSEUp:
104559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    assert(Lo == SSE && "Unexpected SSEUp classification.");
104659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2);
104759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar    break;
104859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  }
104959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
1050644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar  return getCoerceResult(Ty, ResType, Context);
1051d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar}
1052d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar
105359e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbarvoid X86_64ABIInfo::computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
105459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
105559e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
105659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // Keep track of the number of assigned registers.
105759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  unsigned freeIntRegs = 6, freeSSERegs = 8;
105859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
105959e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers
106059e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  // get assigned (in left-to-right order) for passing as follows...
106159e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar  for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
10623b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar       it != ie; ++it) {
10633b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    unsigned neededInt, neededSSE;
10643b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    it->info = classifyArgumentType(it->type, Context, neededInt, neededSSE);
10653b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar
10663b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    // AMD64-ABI 3.2.3p3: If there are no registers available for any
10673b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    // eightbyte of an argument, the whole argument is passed on the
10683b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    // stack. If registers have already been assigned for some
10693b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    // eightbytes of such an argument, the assignments get reverted.
10703b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    if (freeIntRegs >= neededInt && freeSSERegs >= neededSSE) {
10713b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar      freeIntRegs -= neededInt;
10723b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar      freeSSERegs -= neededSSE;
10733b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    } else {
1074245f5534a520c23e703fd239632273c551be50b3Daniel Dunbar      it->info = ABIArgInfo::getIndirect(0);
10753b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar    }
10763b4e9cd0655467f66332575b816a958d319e8ca6Daniel Dunbar  }
107759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar}
107859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar
1079be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbarstatic llvm::Value *EmitVAArgFromMemory(llvm::Value *VAListAddr,
1080be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                        QualType Ty,
1081be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                        CodeGenFunction &CGF) {
1082be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *overflow_arg_area_p =
1083be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_p");
1084be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *overflow_arg_area =
1085be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateLoad(overflow_arg_area_p, "overflow_arg_area");
1086be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1087be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a 16
1088be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // byte boundary if alignment needed by type exceeds 8 byte boundary.
1089c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar  uint64_t Align = CGF.getContext().getTypeAlign(Ty) / 8;
1090be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (Align > 8) {
1091c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    // Note that we follow the ABI & gcc here, even though the type
1092c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    // could in theory have an alignment greater than 16. This case
1093c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    // shouldn't ever matter in practice.
1094c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar
1095c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    // overflow_arg_area = (overflow_arg_area + 15) & ~15;
1096c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::Int32Ty, 15);
1097c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset);
1098c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    llvm::Value *AsInt = CGF.Builder.CreatePtrToInt(overflow_arg_area,
1099c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar                                                    llvm::Type::Int64Ty);
1100c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    llvm::Value *Mask = llvm::ConstantInt::get(llvm::Type::Int64Ty, ~15LL);
1101c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar    overflow_arg_area =
1102c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar      CGF.Builder.CreateIntToPtr(CGF.Builder.CreateAnd(AsInt, Mask),
1103c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar                                 overflow_arg_area->getType(),
1104c5bcee4dce79458c4f490490c71619e06cbde357Daniel Dunbar                                 "overflow_arg_area.align");
1105be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1106be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1107be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 8. Fetch type from l->overflow_arg_area.
1108be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  const llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
1109be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *Res =
1110be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateBitCast(overflow_arg_area,
1111be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                              llvm::PointerType::getUnqual(LTy));
1112be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1113be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to:
1114be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // l->overflow_arg_area + sizeof(type).
1115be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 10. Align l->overflow_arg_area upwards to
1116be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // an 8 byte boundary.
1117be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1118be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  uint64_t SizeInBytes = (CGF.getContext().getTypeSize(Ty) + 7) / 8;
1119be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::Int32Ty,
1120be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                               (SizeInBytes + 7)  & ~7);
1121be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset,
1122be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                            "overflow_arg_area.next");
1123be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.Builder.CreateStore(overflow_arg_area, overflow_arg_area_p);
1124be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1125be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 11. Return the fetched type.
1126be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  return Res;
1127be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar}
1128be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1129b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1130b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                      CodeGenFunction &CGF) const {
1131be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // Assume that va_list type is correct; should be pointer to LLVM type:
1132be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // struct {
1133be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //   i32 gp_offset;
1134be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //   i32 fp_offset;
1135be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //   i8* overflow_arg_area;
1136be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //   i8* reg_save_area;
1137be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // };
1138be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  unsigned neededInt, neededSSE;
1139be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  ABIArgInfo AI = classifyArgumentType(Ty, CGF.getContext(),
1140be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                       neededInt, neededSSE);
1141be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1142be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed
1143be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // in the registers. If not go to step 7.
1144be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (!neededInt && !neededSSE)
1145be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    return EmitVAArgFromMemory(VAListAddr, Ty, CGF);
1146be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1147be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 2. Compute num_gp to hold the number of
1148be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // general purpose registers needed to pass type and num_fp to hold
1149be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // the number of floating point registers needed.
1150be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1151be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 3. Verify whether arguments fit into
1152be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // registers. In the case: l->gp_offset > 48 - num_gp * 8 or
1153be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // l->fp_offset > 304 - num_fp * 16 go to step 7.
1154be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  //
1155be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // NOTE: 304 is a typo, there are (6 * 8 + 8 * 16) = 176 bytes of
1156be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // register save space).
1157be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1158be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *InRegs = 0;
1159be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *gp_offset_p = 0, *gp_offset = 0;
1160be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *fp_offset_p = 0, *fp_offset = 0;
1161be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededInt) {
1162be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    gp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "gp_offset_p");
1163be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset");
1164be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    InRegs =
1165be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar      CGF.Builder.CreateICmpULE(gp_offset,
1166be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                llvm::ConstantInt::get(llvm::Type::Int32Ty,
1167be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                                       48 - neededInt * 8),
1168be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                "fits_in_gp");
1169be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1170be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1171be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededSSE) {
1172be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    fp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 1, "fp_offset_p");
1173be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset");
1174be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    llvm::Value *FitsInFP =
1175be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar      CGF.Builder.CreateICmpULE(fp_offset,
1176be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                llvm::ConstantInt::get(llvm::Type::Int32Ty,
117790dafa1638edaffbba4b50f504d1470428a2d25dDaniel Dunbar                                                       176 - neededSSE * 16),
1178be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                "fits_in_fp");
1179f231346438e61e59ff7b72d5ecbd58b6ae484211Daniel Dunbar    InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP;
1180be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1181be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1182be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
1183be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem");
1184be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
1185be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock);
1186be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1187be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // Emit code to load the value if it was passed in registers.
1188be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1189be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.EmitBlock(InRegBlock);
1190be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1191be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 4. Fetch type from l->reg_save_area with
1192be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // an offset of l->gp_offset and/or l->fp_offset. This may require
1193be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // copying to a temporary location in case the parameter is passed
1194be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // in different register classes or requires an alignment greater
1195be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // than 8 for general purpose registers and 16 for XMM registers.
11963e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar  //
1197f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: This really results in shameful code when we end up needing to
1198f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // collect arguments from different places; often what should result in a
1199f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // simple assembling of a structure from scattered addresses has many more
1200f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // loads than necessary. Can we clean this up?
1201be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  const llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
1202be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *RegAddr =
1203be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateLoad(CGF.Builder.CreateStructGEP(VAListAddr, 3),
1204be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                           "reg_save_area");
1205be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededInt && neededSSE) {
120655e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    // FIXME: Cleanup.
120755e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    assert(AI.isCoerce() && "Unexpected ABI info for mixed regs");
120855e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType());
120955e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(ST);
121055e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs");
121155e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::Type *TyLo = ST->getElementType(0);
121255e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::Type *TyHi = ST->getElementType(1);
121355e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    assert((TyLo->isFloatingPoint() ^ TyHi->isFloatingPoint()) &&
121455e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar           "Unexpected ABI info for mixed regs");
121555e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::Type *PTyLo = llvm::PointerType::getUnqual(TyLo);
121655e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    const llvm::Type *PTyHi = llvm::PointerType::getUnqual(TyHi);
121755e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *GPAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset);
121855e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *FPAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset);
121955e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *RegLoAddr = TyLo->isFloatingPoint() ? FPAddr : GPAddr;
122055e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *RegHiAddr = TyLo->isFloatingPoint() ? GPAddr : FPAddr;
122155e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    llvm::Value *V =
122255e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar      CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegLoAddr, PTyLo));
122355e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
122455e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegHiAddr, PTyHi));
122555e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
122655e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar
122755e5d8956be516d66db2196bd0ce3c30ebf5fbf0Daniel Dunbar    RegAddr = CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(LTy));
1228be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  } else if (neededInt) {
1229be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    RegAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset);
1230be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    RegAddr = CGF.Builder.CreateBitCast(RegAddr,
1231be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                        llvm::PointerType::getUnqual(LTy));
1232be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  } else {
12333e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar    if (neededSSE == 1) {
12343e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      RegAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset);
12353e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      RegAddr = CGF.Builder.CreateBitCast(RegAddr,
12363e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                          llvm::PointerType::getUnqual(LTy));
12373e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar    } else {
12383e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      assert(neededSSE == 2 && "Invalid number of needed registers!");
12393e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      // SSE registers are spaced 16 bytes apart in the register save
12403e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      // area, we need to collect the two eightbytes together.
12413e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      llvm::Value *RegAddrLo = CGF.Builder.CreateGEP(RegAddr, fp_offset);
12423e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      llvm::Value *RegAddrHi =
12433e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar        CGF.Builder.CreateGEP(RegAddrLo,
12443e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                              llvm::ConstantInt::get(llvm::Type::Int32Ty, 16));
12453e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      const llvm::Type *DblPtrTy =
12463e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar        llvm::PointerType::getUnqual(llvm::Type::DoubleTy);
12473e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      const llvm::StructType *ST = llvm::StructType::get(llvm::Type::DoubleTy,
12483e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                                         llvm::Type::DoubleTy,
12493e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                                         NULL);
12503e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      llvm::Value *V, *Tmp = CGF.CreateTempAlloca(ST);
12513e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrLo,
12523e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                                           DblPtrTy));
12533e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
12543e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrHi,
12553e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                                           DblPtrTy));
12563e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
12573e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar      RegAddr = CGF.Builder.CreateBitCast(Tmp,
12583e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar                                          llvm::PointerType::getUnqual(LTy));
12593e030b4c04546229c81449fde66f71b23b3fc550Daniel Dunbar    }
1260be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1261be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1262be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // AMD64-ABI 3.5.7p5: Step 5. Set:
1263be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // l->gp_offset = l->gp_offset + num_gp * 8
1264be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // l->fp_offset = l->fp_offset + num_fp * 16.
1265be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededInt) {
1266be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::Int32Ty,
1267be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                                 neededInt * 8);
1268be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset),
1269be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                            gp_offset_p);
1270be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1271be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  if (neededSSE) {
1272be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::Int32Ty,
1273be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                                 neededSSE * 16);
1274be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar    CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset),
1275be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                            fp_offset_p);
1276be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  }
1277be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.EmitBranch(ContBlock);
1278be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1279be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // Emit code to load the value if it was passed in memory.
1280be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1281be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.EmitBlock(InMemBlock);
1282be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::Value *MemAddr = EmitVAArgFromMemory(VAListAddr, Ty, CGF);
1283be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1284be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  // Return the appropriate result.
1285be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1286be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  CGF.EmitBlock(ContBlock);
1287be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  llvm::PHINode *ResAddr = CGF.Builder.CreatePHI(RegAddr->getType(),
1288be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar                                                 "vaarg.addr");
1289be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  ResAddr->reserveOperandSpace(2);
1290be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  ResAddr->addIncoming(RegAddr, InRegBlock);
1291be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  ResAddr->addIncoming(MemAddr, InMemBlock);
1292be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar
1293be9eb0937c667e2823971966adf960f86d3985d6Daniel Dunbar  return ResAddr;
1294b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
1295b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
129670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta// ABI Info for PIC16
129770aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Guptaclass PIC16ABIInfo : public ABIInfo {
129870aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  ABIArgInfo classifyReturnType(QualType RetTy,
129970aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                ASTContext &Context) const;
130070aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
130170aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  ABIArgInfo classifyArgumentType(QualType RetTy,
130270aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                  ASTContext &Context) const;
130370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
130470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
130570aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
130670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
130770aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta         it != ie; ++it)
130870aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta      it->info = classifyArgumentType(it->type, Context);
130970aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  }
131070aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
131170aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
131270aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                 CodeGenFunction &CGF) const;
131370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
131470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta};
131570aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
131670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv GuptaABIArgInfo PIC16ABIInfo::classifyReturnType(QualType RetTy,
131770aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                              ASTContext &Context) const {
131870aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  if (RetTy->isVoidType()) {
131970aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    return ABIArgInfo::getIgnore();
132070aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  } else {
132170aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    return ABIArgInfo::getDirect();
132270aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  }
132370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta}
132470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
132570aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv GuptaABIArgInfo PIC16ABIInfo::classifyArgumentType(QualType Ty,
132670aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                                ASTContext &Context) const {
132770aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  return ABIArgInfo::getDirect();
132870aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta}
132970aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
133070aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Guptallvm::Value *PIC16ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
133170aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta                                       CodeGenFunction &CGF) const {
133270aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  return 0;
133370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta}
133470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta
1335a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedmanclass ARMABIInfo : public ABIInfo {
1336a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  ABIArgInfo classifyReturnType(QualType RetTy,
1337a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                ASTContext &Context) const;
1338a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1339a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  ABIArgInfo classifyArgumentType(QualType RetTy,
1340a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                  ASTContext &Context) const;
1341a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1342a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const;
1343a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1344a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1345a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                 CodeGenFunction &CGF) const;
1346a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman};
1347a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1348a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedmanvoid ARMABIInfo::computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
1349a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
1350a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
1351a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman       it != ie; ++it) {
1352a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    it->info = classifyArgumentType(it->type, Context);
1353a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  }
1354a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman}
1355a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1356a027ea94d6e4f501f9fa690ac728f68c62612a7dEli FriedmanABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty,
1357a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                            ASTContext &Context) const {
1358a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  if (!CodeGenFunction::hasAggregateLLVMType(Ty)) {
1359a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return ABIArgInfo::getDirect();
1360a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  }
1361f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: This is kind of nasty... but there isn't much choice because the ARM
1362f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // backend doesn't support byval.
1363a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  // FIXME: This doesn't handle alignment > 64 bits.
1364a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  const llvm::Type* ElemTy;
1365a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  unsigned SizeRegs;
1366a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  if (Context.getTypeAlign(Ty) > 32) {
1367a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    ElemTy = llvm::Type::Int64Ty;
1368a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    SizeRegs = (Context.getTypeSize(Ty) + 63) / 64;
1369a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  } else {
1370a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    ElemTy = llvm::Type::Int32Ty;
1371a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    SizeRegs = (Context.getTypeSize(Ty) + 31) / 32;
1372a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  }
1373a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  std::vector<const llvm::Type*> LLVMFields;
1374a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  LLVMFields.push_back(llvm::ArrayType::get(ElemTy, SizeRegs));
1375a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  const llvm::Type* STy = llvm::StructType::get(LLVMFields, true);
1376a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  return ABIArgInfo::getCoerce(STy);
1377a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman}
1378a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1379a027ea94d6e4f501f9fa690ac728f68c62612a7dEli FriedmanABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy,
1380a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                          ASTContext &Context) const {
1381a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  if (RetTy->isVoidType()) {
1382a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return ABIArgInfo::getIgnore();
1383a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
1384a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    // Aggregates <= 4 bytes are returned in r0; other aggregates
1385a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    // are returned indirectly.
1386a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    uint64_t Size = Context.getTypeSize(RetTy);
1387a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    if (Size <= 32)
1388a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman      return ABIArgInfo::getCoerce(llvm::Type::Int32Ty);
1389a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return ABIArgInfo::getIndirect(0);
1390a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  } else {
1391a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return ABIArgInfo::getDirect();
1392a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  }
1393a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman}
1394a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1395a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedmanllvm::Value *ARMABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1396a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                      CodeGenFunction &CGF) const {
1397a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  // FIXME: Need to handle alignment
1398a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
1399a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  const llvm::Type *BPP = llvm::PointerType::getUnqual(BP);
1400a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1401a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  CGBuilderTy &Builder = CGF.Builder;
1402a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP,
1403a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                                                       "ap");
1404a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
1405a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Type *PTy =
1406a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
1407a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy);
1408a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1409a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  uint64_t Offset =
1410a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4);
1411a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  llvm::Value *NextAddr =
1412a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    Builder.CreateGEP(Addr,
1413a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                      llvm::ConstantInt::get(llvm::Type::Int32Ty, Offset),
1414a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman                      "ap.next");
1415a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  Builder.CreateStore(NextAddr, VAListAddrAsBPP);
1416a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
1417a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  return AddrTyped;
1418a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman}
1419a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman
14206b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy,
1421b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                              ASTContext &Context) const {
14220bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  if (RetTy->isVoidType()) {
14230bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getIgnore();
14240bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
142511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    return ABIArgInfo::getIndirect(0);
14260bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  } else {
14270bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getDirect();
14280bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  }
14296b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
14306b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
14316b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty,
1432b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                                ASTContext &Context) const {
14330bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
143411e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    return ABIArgInfo::getIndirect(0);
14350bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  } else {
14360bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    return ABIArgInfo::getDirect();
14370bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar  }
14386b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
14396b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
1440b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *DefaultABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1441b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar                                       CodeGenFunction &CGF) const {
1442b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return 0;
1443b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
1444b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
14456b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarconst ABIInfo &CodeGenTypes::getABIInfo() const {
14466b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  if (TheABIInfo)
14476b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar    return *TheABIInfo;
14486b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
14496b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  // For now we just cache this in the CodeGenTypes and don't bother
14506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  // to free it.
14516b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  const char *TargetPrefix = getContext().Target.getTargetPrefix();
14526b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  if (strcmp(TargetPrefix, "x86") == 0) {
14539fd58e85d59f8244c7ba289ae4f9b4f5e0b4c98fEli Friedman    bool IsDarwin = strstr(getContext().Target.getTargetTriple(), "darwin");
1454d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    switch (getContext().Target.getPointerWidth(0)) {
1455d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    case 32:
14566ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor      return *(TheABIInfo = new X86_32ABIInfo(Context, IsDarwin));
1457d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    case 64:
145811a76ed8e34901f2b997896a8c0833c6c17bc586Daniel Dunbar      return *(TheABIInfo = new X86_64ABIInfo());
1459d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar    }
1460a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman  } else if (strcmp(TargetPrefix, "arm") == 0) {
1461a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    // FIXME: Support for OABI?
1462a027ea94d6e4f501f9fa690ac728f68c62612a7dEli Friedman    return *(TheABIInfo = new ARMABIInfo());
146370aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta  } else if (strcmp(TargetPrefix, "pic16") == 0) {
146470aa5f9e9f3ec77327f701562efc53d7c36c5843Sanjiv Gupta    return *(TheABIInfo = new PIC16ABIInfo());
14656b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  }
14666b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
14676b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar  return *(TheABIInfo = new DefaultABIInfo);
14686b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}
14696b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar
14702c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/
14712c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
147288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel DunbarCGFunctionInfo::CGFunctionInfo(QualType ResTy,
147388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar                               const llvm::SmallVector<QualType, 16> &ArgTys) {
147488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  NumArgs = ArgTys.size();
147588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args = new ArgInfo[1 + NumArgs];
147688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args[0].type = ResTy;
147788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (unsigned i = 0; i < NumArgs; ++i)
147888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    Args[1 + i].type = ArgTys[i];
147988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar}
148088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
148188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar/***/
148288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
14835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty,
14845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    std::vector<const llvm::Type*> &ArgTys) {
14855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
14865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
14875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordDecl *RD = RT->getDecl();
14885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(!RD->hasFlexibleArrayMember() &&
14895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Cannot expand structure with flexible array.");
14905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
14916ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
14926ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(Context); i != e; ++i) {
14935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    const FieldDecl *FD = *i;
14945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    assert(!FD->isBitField() &&
14955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar           "Cannot expand structure with bit-field members.");
14965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
14975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
14985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
14995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(FT, ArgTys);
15005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
15015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ArgTys.push_back(ConvertType(FT));
15025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
15035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
15045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
15055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator
15075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
15085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    llvm::Function::arg_iterator AI) {
15095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
15105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
15115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
15135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(LV.isSimple() &&
15145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Unexpected non-simple lvalue during struct expansion.");
15155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = LV.getAddress();
15166ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(getContext()),
15176ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(getContext()); i != e; ++i) {
15185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
15195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
15205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
15225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
15235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
15245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      AI = ExpandTypeFromArgs(FT, LV, AI);
15255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
15265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitStoreThroughLValue(RValue::get(AI), LV, FT);
15275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ++AI;
15285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
15295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
15305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  return AI;
15325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
15335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid
15355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
15365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                  llvm::SmallVector<llvm::Value*, 16> &Args) {
15375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
15385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
15395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
15415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
15425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = RV.getAggregateAddr();
15436ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(getContext()),
15446ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(getContext()); i != e; ++i) {
15455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
15465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
15475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
15485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
15495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
15505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
15515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
15525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
15535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      RValue RV = EmitLoadOfLValue(LV, FT);
15545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      assert(RV.isScalar() &&
15555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar             "Unexpected non-scalar rvalue during struct expansion.");
15565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Args.push_back(RV.getScalarVal());
15575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
15585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
15595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
15605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1561275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
1562275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty.
1563275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
1564275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the
1565275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not
1566275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined.
1567275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
1568275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      const llvm::Type *Ty,
1569275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      CodeGenFunction &CGF) {
1570275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy =
1571275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(SrcPtr->getType())->getElementType();
15729408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
15739408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(Ty);
1574275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
1575b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  // If load is legal, just bitcast the src pointer.
15767ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar  if (SrcSize >= DstSize) {
1577f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // Generally SrcSize is never greater than DstSize, since this means we are
1578f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // losing bits. However, this can happen in cases where the structure has
1579f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // additional padding, for example due to a user specified alignment.
15807ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar    //
1581f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: Assert that we aren't truncating non-padding bits when have access
1582f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // to that information.
1583275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
1584275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
1585386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
1586386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
1587386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
1588386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    return Load;
1589275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
1590275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
1591275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
1592275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
1593275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
1594275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
1595386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::StoreInst *Store =
1596386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar      CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
1597386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
1598386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Store->setAlignment(1);
1599275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    return CGF.Builder.CreateLoad(Tmp);
1600275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
1601275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
1602275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
1603275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src,
1604275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types.
1605275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
1606275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the
1607275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost.
1608275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src,
1609275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               llvm::Value *DstPtr,
1610275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               CodeGenFunction &CGF) {
1611275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy = Src->getType();
1612275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *DstTy =
1613275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(DstPtr->getType())->getElementType();
1614275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
16159408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
16169408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(DstTy);
1617275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
161888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // If store is legal, just bitcast the src pointer.
16197ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar  if (SrcSize >= DstSize) {
1620f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // Generally SrcSize is never greater than DstSize, since this means we are
1621f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // losing bits. However, this can happen in cases where the structure has
1622f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // additional padding, for example due to a user specified alignment.
16237ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar    //
1624f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: Assert that we aren't truncating non-padding bits when have access
1625f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // to that information.
1626275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
1627275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
1628386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
1629386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    CGF.Builder.CreateStore(Src, Casted)->setAlignment(1);
1630275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
1631275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
1632275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
1633275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy);
1634275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(Src, Tmp);
1635275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
1636275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
1637386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
1638386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
1639386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
1640386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    CGF.Builder.CreateStore(Load, DstPtr);
1641275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
1642275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
1643275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
16445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/
16455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
164688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) {
164711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  return FI.getReturnInfo().isIndirect();
1648bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar}
1649bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
165045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType *
1651bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
165245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  std::vector<const llvm::Type*> ArgTys;
165345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
165445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  const llvm::Type *ResultType = 0;
165545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
1656a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
1657b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
16588951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  switch (RetAI.getKind()) {
16598951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
16608951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
16618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
166246327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
166346327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    ResultType = ConvertType(RetTy);
166446327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    break;
166546327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar
166611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect: {
166711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    assert(!RetAI.getIndirectAlign() && "Align unused on indirect return.");
166845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ResultType = llvm::Type::VoidTy;
166962d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *STy = ConvertType(RetTy);
167045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
167145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
167245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
167345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
167411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
167511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    ResultType = llvm::Type::VoidTy;
167611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    break;
167711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
167845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Coerce:
1679639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    ResultType = RetAI.getCoerceToType();
168045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
168145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
168245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
168388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
168488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
168588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
16868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
16878951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
168811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
168911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
169011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
16915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
169289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      ArgTys.push_back(AI.getCoerceToType());
169389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
169489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
1695adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Indirect: {
169611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar      // indirect arguments are always on the stack, which is addr space #0.
1697adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      const llvm::Type *LTy = ConvertTypeForMem(it->type);
1698adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      ArgTys.push_back(llvm::PointerType::getUnqual(LTy));
16998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
1700adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    }
17018951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
170246327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
17031f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      ArgTys.push_back(ConvertType(it->type));
17048951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
17058951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
17068951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
170788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar      GetExpandedTypes(it->type, ArgTys);
17088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
17098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
171045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
171145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
1712bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic);
17133913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar}
17143913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar
1715a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbarvoid CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
171688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                           const Decl *TargetDecl,
1717761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                           AttributeListType &PAL) {
17185323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned FuncAttrs = 0;
1719a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  unsigned RetAttrs = 0;
17205323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
17211102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: handle sseregparm someday...
17225323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (TargetDecl) {
1723b11fa0d25d86169f0e0a29d5398116c0212bb787Daniel Dunbar    if (TargetDecl->hasAttr<NoThrowAttr>())
1724761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoUnwind;
1725b11fa0d25d86169f0e0a29d5398116c0212bb787Daniel Dunbar    if (TargetDecl->hasAttr<NoReturnAttr>())
1726761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoReturn;
1727b11fa0d25d86169f0e0a29d5398116c0212bb787Daniel Dunbar    if (TargetDecl->hasAttr<ConstAttr>())
1728232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadNone;
1729b11fa0d25d86169f0e0a29d5398116c0212bb787Daniel Dunbar    else if (TargetDecl->hasAttr<PureAttr>())
173064c2e0762628eba26c100642521b6100c2515cc5Daniel Dunbar      FuncAttrs |= llvm::Attribute::ReadOnly;
17315323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
17325323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
1733a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
17345323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned Index = 1;
1735b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
173645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  switch (RetAI.getKind()) {
173746327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
17382c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isPromotableIntegerType()) {
17392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      if (RetTy->isSignedIntegerType()) {
1740a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel        RetAttrs |= llvm::Attribute::SExt;
17412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      } else if (RetTy->isUnsignedIntegerType()) {
1742a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel        RetAttrs |= llvm::Attribute::ZExt;
17432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      }
17442c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    }
17452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
17462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
174711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
1748761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    PAL.push_back(llvm::AttributeWithIndex::get(Index,
1749725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::StructRet |
1750725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::NoAlias));
17515323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    ++Index;
17520ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    // sret disables readnone and readonly
17530ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    FuncAttrs &= ~(llvm::Attribute::ReadOnly |
17540ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                   llvm::Attribute::ReadNone);
17552c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
17562c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
175711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
17582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
17592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
17608951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
17618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
17628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
17635323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
17642c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
1765a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (RetAttrs)
1766a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
17671102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
17681102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: we need to honour command line settings also...
17691102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: RegParm should be reduced in case of nested functions and/or global
17701102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // register variable.
17711102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  signed RegParm = 0;
17721102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  if (TargetDecl)
17731102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov    if (const RegparmAttr *RegParmAttr = TargetDecl->getAttr<RegparmAttr>())
17741102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      RegParm = RegParmAttr->getNumParams();
17751102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
17761102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned PointerWidth = getContext().Target.getPointerWidth(0);
177788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
177888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
177988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    QualType ParamType = it->type;
178088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
1781761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    unsigned Attributes = 0;
17821102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
17838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
178489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce:
178589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
178689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
178711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
1788761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      Attributes |= llvm::Attribute::ByVal;
17891102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      Attributes |=
179011e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar        llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign());
17910ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      // byval disables readnone and readonly.
17920ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      FuncAttrs &= ~(llvm::Attribute::ReadOnly |
17930ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                     llvm::Attribute::ReadNone);
17948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
17958951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
179646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
17978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      if (ParamType->isPromotableIntegerType()) {
17988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        if (ParamType->isSignedIntegerType()) {
1799761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel          Attributes |= llvm::Attribute::SExt;
18008951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        } else if (ParamType->isUnsignedIntegerType()) {
1801761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel          Attributes |= llvm::Attribute::ZExt;
18028951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar        }
18035323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar      }
18041102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      if (RegParm > 0 &&
18051102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (ParamType->isIntegerType() || ParamType->isPointerType())) {
18061102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        RegParm -=
18071102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (Context.getTypeSize(ParamType) + PointerWidth - 1) / PointerWidth;
18081102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        if (RegParm >= 0)
18091102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          Attributes |= llvm::Attribute::InReg;
18101102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      }
18111102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      // FIXME: handle sseregparm someday...
18128951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
18131102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
181411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
181511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      // Skip increment, no matching LLVM parameter.
181611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      continue;
181711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
18185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
18195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      std::vector<const llvm::Type*> Tys;
1820f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is rather inefficient. Do we ever actually need to do
1821f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // anything here? The result should be just reconstructed on the other
1822f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // side, so extension should be a non-issue.
18235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      getTypes().GetExpandedTypes(ParamType, Tys);
18245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Index += Tys.size();
18255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
18265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
18275323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
18288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1829761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    if (Attributes)
1830761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes));
18315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++Index;
18325323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
1833a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (FuncAttrs)
1834a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs));
18355323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
18365323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
183788b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
183888b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                         llvm::Function *Fn,
183917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         const FunctionArgList &Args) {
1840f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from FunctionArgList; lift up and
1841f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // simplify.
18425251afa21d3583f2740fd4f83659d008625a7260Daniel Dunbar
184317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
184417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Function::arg_iterator AI = Fn->arg_begin();
184517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
184617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Name the struct return argument.
184788b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar  if (CGM.ReturnTypeUsesSret(FI)) {
184817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    AI->setName("agg.result");
184917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    ++AI;
185017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
1851b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar
18524b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(FI.arg_size() == Args.size() &&
18534b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
1854b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = FI.arg_begin();
185517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
1856b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       i != e; ++i, ++info_it) {
185717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    const VarDecl *Arg = i->first;
1858b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    QualType Ty = info_it->type;
1859b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgI = info_it->info;
18608951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
18618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (ArgI.getKind()) {
18621f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    case ABIArgInfo::Indirect: {
18631f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      llvm::Value* V = AI;
18641f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
18651f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Do nothing, aggregates and complex variables are accessed by
18661f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // reference.
18671f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
18681f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Load scalar value from indirect argument.
1869adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
18701f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
18711f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // This must be a promotion, for something like
18721f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // "void a(x) short x; {..."
18731f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
18741f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        }
18751f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
18761f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      EmitParmDecl(*Arg, V);
18771f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
18781f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    }
18791f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar
188046327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct: {
18818951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
18828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      llvm::Value* V = AI;
18832fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
18842fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // Create a temporary alloca to hold the argument; the rest of
18852fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // codegen expects to access aggregates & complex values by
18862fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // reference.
1887adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = CreateTempAlloca(ConvertTypeForMem(Ty));
18882fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Builder.CreateStore(AI, V);
18892fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      } else {
18902fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
18912fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // This must be a promotion, for something like
18922fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // "void a(x) short x; {..."
18932fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
18942fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        }
189517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      }
18968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      EmitParmDecl(*Arg, V);
18978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
18988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
18998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
19005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
1901b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar      // If this structure was expanded into multiple arguments then
19025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // we need to create a temporary and reconstruct it from the
19035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // arguments.
190439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      std::string Name = Arg->getNameAsString();
1905adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *Temp = CreateTempAlloca(ConvertTypeForMem(Ty),
19065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                           (Name + ".addr").c_str());
19075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: What are the right qualifiers here?
19085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      llvm::Function::arg_iterator End =
19095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI);
19105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitParmDecl(*Arg, Temp);
19115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
19125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // Name the arguments used in expansion and increment AI.
19135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      unsigned Index = 0;
19145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      for (; AI != End; ++AI, ++Index)
19155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        AI->setName(Name + "." + llvm::utostr(Index));
19165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
19175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
191811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
191911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
19208b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      // Initialize the local variable appropriately.
19218b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
1922adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        EmitParmDecl(*Arg, CreateTempAlloca(ConvertTypeForMem(Ty)));
19238b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      } else {
19248b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar        EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType())));
19258b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      }
19268b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar
192759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar      // Skip increment, no matching LLVM parameter.
192859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar      continue;
192911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
193089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
193189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
1932f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is very wasteful; EmitParmDecl is just going to drop the
1933f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // result in a new alloca anyway, so we could just store into that
1934f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // directly if we broke the abstraction down more.
1935adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(Ty), "coerce");
193689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      CreateCoercedStore(AI, V, *this);
193789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // Match to what EmitParmDecl is expecting for this type.
19388b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      if (!CodeGenFunction::hasAggregateLLVMType(Ty)) {
1939adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
19408b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
19418b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // This must be a promotion, for something like
19428b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // "void a(x) short x; {..."
19438b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
19448b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        }
19458b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      }
194689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      EmitParmDecl(*Arg, V);
194789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
194889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
19498951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
19505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
19515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++AI;
195217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
195317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  assert(AI == Fn->arg_end() && "Argument mismatch!");
195417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
195517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
195688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
195717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         llvm::Value *ReturnValue) {
19582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  llvm::Value *RV = 0;
19592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
19602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  // Functions with no result always return void.
19612c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (ReturnValue) {
196288b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar    QualType RetTy = FI.getReturnType();
1963b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &RetAI = FI.getReturnInfo();
19642c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
19652c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    switch (RetAI.getKind()) {
196611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
19673aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      if (RetTy->isAnyComplexType()) {
19683aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
19693aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        StoreComplexToAddr(RT, CurFn->arg_begin(), false);
19703aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
19713aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
19723aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else {
1973adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        EmitStoreOfScalar(Builder.CreateLoad(ReturnValue), CurFn->arg_begin(),
1974b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson                          false, RetTy);
19753aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      }
19762c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
19778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
197846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
19792fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // The internal return value temp always will have
19802fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // pointer-to-return-type type.
19812c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      RV = Builder.CreateLoad(ReturnValue);
19822c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
19832c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
198411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
198511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
198611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
1987adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Coerce:
198854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this);
19898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
19908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
19918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
19928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for return argument");
199317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
199417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
19952c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
19962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (RV) {
19972c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRet(RV);
19982c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
19992c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRetVoid();
20002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
200117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
200217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
20030139bb96494b4c4ba0824617d5d2495dc7e44c76Anders CarlssonRValue CodeGenFunction::EmitCallArg(const Expr *E, QualType ArgType) {
20044029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson  if (ArgType->isReferenceType())
20054029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson    return EmitReferenceBindingToExpr(E, ArgType);
20064029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson
20070139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson  return EmitAnyExprToTemp(E);
20080139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson}
20090139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson
201088b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel DunbarRValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
201188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                 llvm::Value *Callee,
2012c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const CallArgList &CallArgs,
2013c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const Decl *TargetDecl) {
2014f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from CallArgs; lift up and simplify.
201517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::SmallVector<llvm::Value*, 16> Args;
201617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
201717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Handle struct-return functions by passing a pointer to the
201817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // location that we would like to return into.
2019bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  QualType RetTy = CallInfo.getReturnType();
2020b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = CallInfo.getReturnInfo();
20212969a0243b0939286a45d0ba58dd3e1de226ac60Daniel Dunbar  if (CGM.ReturnTypeUsesSret(CallInfo)) {
202217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    // Create a temporary alloca to hold the result of the call. :(
2023adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    Args.push_back(CreateTempAlloca(ConvertTypeForMem(RetTy)));
202417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
202517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
20264b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(CallInfo.arg_size() == CallArgs.size() &&
20274b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
2028b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = CallInfo.arg_begin();
202917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
2030b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       I != E; ++I, ++info_it) {
2031b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgInfo = info_it->info;
203217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    RValue RV = I->first;
20335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
20345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    switch (ArgInfo.getKind()) {
203511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
20361f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (RV.isScalar() || RV.isComplex()) {
20371f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Make a temporary alloca to pass the argument.
2038adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        Args.push_back(CreateTempAlloca(ConvertTypeForMem(I->second)));
20391f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (RV.isScalar())
2040b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson          EmitStoreOfScalar(RV.getScalarVal(), Args.back(), false, I->second);
20411f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        else
20421f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
20431f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
20441f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        Args.push_back(RV.getAggregateAddr());
20451f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
20461f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
20471f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar
204846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
20495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (RV.isScalar()) {
20505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getScalarVal());
20515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else if (RV.isComplex()) {
20522fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        llvm::Value *Tmp = llvm::UndefValue::get(ConvertType(I->second));
20532fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().first, 0);
20542fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().second, 1);
20552fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Tmp);
20565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else {
20572fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Builder.CreateLoad(RV.getAggregateAddr()));
20585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      }
20595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
20605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
206111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
206211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
206311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
206489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
206589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // FIXME: Avoid the conversion through memory if possible.
206689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      llvm::Value *SrcPtr;
206789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      if (RV.isScalar()) {
20685a1be6e16ba306c349a3c3f80e9dce800976bc24Daniel Dunbar        SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce");
2069b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson        EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, I->second);
207089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      } else if (RV.isComplex()) {
2071adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce");
207289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        StoreComplexToAddr(RV.getComplexVal(), SrcPtr, false);
207389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      } else
207489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        SrcPtr = RV.getAggregateAddr();
207589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      Args.push_back(CreateCoercedLoad(SrcPtr, ArgInfo.getCoerceToType(),
207689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar                                       *this));
207789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
207889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
207989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
20805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand:
20815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(I->second, RV, Args);
20825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
208317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
208417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
208517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
20869834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::BasicBlock *InvokeDest = getInvokeDest();
2087761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CodeGen::AttributeListType AttributeList;
2088c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar  CGM.ConstructAttributeList(CallInfo, TargetDecl, AttributeList);
20899834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::AttrListPtr Attrs = llvm::AttrListPtr::get(AttributeList.begin(),
20909834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar                                                   AttributeList.end());
2091725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar
2092d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::CallSite CS;
2093d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (!InvokeDest || (Attrs.getFnAttributes() & llvm::Attribute::NoUnwind)) {
2094beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad    CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size());
20959834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  } else {
20969834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    llvm::BasicBlock *Cont = createBasicBlock("invoke.cont");
2097d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    CS = Builder.CreateInvoke(Callee, Cont, InvokeDest,
2098beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad                              Args.data(), Args.data()+Args.size());
20999834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    EmitBlock(Cont);
2100f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar  }
2101f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar
2102d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  CS.setAttributes(Attrs);
21036857d9d43b082ae825c29cca80f2f6b7c3aa4e5fTorok Edwin  if (const llvm::Function *F =  dyn_cast<llvm::Function>(Callee->stripPointerCasts()))
2104d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    CS.setCallingConv(F->getCallingConv());
2105d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
2106d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // If the call doesn't return, finish the basic block and clear the
2107d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // insertion point; this allows the rest of IRgen to discard
2108d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // unreachable code.
2109d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (CS.doesNotReturn()) {
2110d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.CreateUnreachable();
2111d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.ClearInsertionPoint();
2112d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
2113f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: For now, emit a dummy basic block because expr emitters in
2114f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // generally are not ready to handle emitting expressions at unreachable
2115f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // points.
2116d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    EnsureInsertPoint();
2117d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
2118d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    // Return a reasonable RValue.
2119d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    return GetUndefRValue(RetTy);
2120d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  }
2121d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
2122d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::Instruction *CI = CS.getInstruction();
21233403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner  if (Builder.isNamePreserving() && CI->getType() != llvm::Type::VoidTy)
212417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setName("call");
21252c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
21262c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
212711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
21282c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isAnyComplexType())
21295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
21303403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
21315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getAggregate(Args[0]);
21323403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(Args[0], false, RetTy));
21338951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
213446327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
21352fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar    if (RetTy->isAnyComplexType()) {
21362fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Real = Builder.CreateExtractValue(CI, 0);
21372fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Imag = Builder.CreateExtractValue(CI, 1);
21382fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getComplex(std::make_pair(Real, Imag));
21393403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
21403403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
2141adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "agg.tmp");
21422fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      Builder.CreateStore(CI, V);
21432fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getAggregate(V);
21443403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
21453403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(CI);
21462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
214711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
21480bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // If we are ignoring an argument that had a result, make sure to
21490bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // construct the appropriate return value for our caller.
215013e81737a433b23f8c662d10d1d57356122a8caaDaniel Dunbar    return GetUndefRValue(RetTy);
215111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
2152639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  case ABIArgInfo::Coerce: {
215389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    // FIXME: Avoid the conversion through memory if possible.
2154adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "coerce");
215554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CreateCoercedStore(CI, V, *this);
2156ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson    if (RetTy->isAnyComplexType())
2157ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getComplex(LoadComplexFromAddr(V, false));
21583403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
2159ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getAggregate(V);
21603403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(V, false, RetTy));
2161639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  }
21628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
21638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
21648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
216517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
21662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
21672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  assert(0 && "Unhandled ABIArgInfo::Kind");
21682c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  return RValue::get(0);
216917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
2170b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
2171b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar/* VarArg handling */
2172b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
2173b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty) {
2174b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return CGM.getTypes().getABIInfo().EmitVAArg(VAListAddr, Ty, *this);
2175b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
2176