CGCall.cpp revision bac7c250c9b098ee3d637c8ed77da62e860d9244
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/Decl.h"
20f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson#include "clang/AST/DeclCXX.h"
210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/DeclObjC.h"
2224095dad88dd9d48aa16afa6416417073af251b5Devang Patel#include "clang/Frontend/CompileOptions.h"
23d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel#include "llvm/Attributes.h"
24d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar#include "llvm/Support/CallSite.h"
2554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar#include "llvm/Target/TargetData.h"
269eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
279eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar#include "ABIInfo.h"
289eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
290dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace clang;
300dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace CodeGen;
310dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/
330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
340dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation.
350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst
3772564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionNoProtoType *FTNP) {
38bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  // FIXME: Set calling convention correctly, it needs to be associated with the
39bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  // type somehow.
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getFunctionInfo(FTNP->getResultType(),
41bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                         llvm::SmallVector<QualType, 16>(), 0);
4245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
4345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst
4572564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionProtoType *FTP) {
46541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
47541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
4845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
49541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(FTP->getArgType(i));
50bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  // FIXME: Set calling convention correctly, it needs to be associated with the
51bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  // type somehow.
52bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  return getFunctionInfo(FTP->getResultType(), ArgTys, 0);
53bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar}
54bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
55bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbarstatic unsigned getCallingConventionForDecl(const Decl *D) {
56bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  // Set the appropriate calling convention for the Function.
57bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  if (D->hasAttr<StdCallAttr>())
58bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar    return llvm::CallingConv::X86_StdCall;
59bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
60bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  if (D->hasAttr<FastCallAttr>())
61bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar    return llvm::CallingConv::X86_FastCall;
62bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
63bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  return llvm::CallingConv::C;
6445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
6545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
66f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) {
67f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  llvm::SmallVector<QualType, 16> ArgTys;
683eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  // Add the 'this' pointer unless this is a static method.
693eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (MD->isInstance())
703eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner    ArgTys.push_back(MD->getThisType(Context));
711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  const FunctionProtoType *FTP = MD->getType()->getAsFunctionProtoType();
73f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
74f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    ArgTys.push_back(FTP->getArgType(i));
75bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  return getFunctionInfo(FTP->getResultType(), ArgTys,
76bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                         getCallingConventionForDecl(MD));
77f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson}
78f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
79541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionDecl *FD) {
803eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
81f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    if (MD->isInstance())
82f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson      return getFunctionInfo(MD);
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
84bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  unsigned CallingConvention = getCallingConventionForDecl(FD);
850dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionType *FTy = FD->getType()->getAsFunctionType();
86bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  if (const FunctionNoProtoType *FNTP = dyn_cast<FunctionNoProtoType>(FTy))
87bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar    return getFunctionInfo(FNTP->getResultType(),
88bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                           llvm::SmallVector<QualType, 16>(),
89bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                           CallingConvention);
90bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
91bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  const FunctionProtoType *FPT = cast<FunctionProtoType>(FTy);
92bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
93bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  // FIXME: Kill copy.
94bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i)
95bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar    ArgTys.push_back(FPT->getArgType(i));
96bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  return getFunctionInfo(FPT->getResultType(), ArgTys, CallingConvention);
970dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
980dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
99541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) {
100541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
101541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  ArgTys.push_back(MD->getSelfDecl()->getType());
102541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  ArgTys.push_back(Context.getObjCSelType());
103541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy?
1042073216a1075767b5d25c23d1462b7034686d94dChris Lattner  for (ObjCMethodDecl::param_iterator i = MD->param_begin(),
1050dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar         e = MD->param_end(); i != e; ++i)
106541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back((*i)->getType());
107bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  return getFunctionInfo(MD->getResultType(), ArgTys,
108bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                         getCallingConventionForDecl(MD));
1090dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
1100dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
112bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                                                    const CallArgList &Args,
113bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                                                    unsigned CallingConvention){
114541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
115541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CallArgList::const_iterator i = Args.begin(), e = Args.end();
117725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar       i != e; ++i)
118541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(i->second);
119bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  return getFunctionInfo(ResTy, ArgTys, CallingConvention);
1200dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
1210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
123bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                                                    const FunctionArgList &Args,
124bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                                                    unsigned CallingConvention){
125541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
126541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
128bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar       i != e; ++i)
129541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(i->second);
130bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  return getFunctionInfo(ResTy, ArgTys, CallingConvention);
131541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar}
132541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
133541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
134bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                                  const llvm::SmallVector<QualType, 16> &ArgTys,
135bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                                                    unsigned CallingConvention){
13640a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  // Lookup or create unique function info.
13740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  llvm::FoldingSetNodeID ID;
138bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  CGFunctionInfo::Profile(ID, CallingConvention, ResTy,
139bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                          ArgTys.begin(), ArgTys.end());
14040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
14140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  void *InsertPos = 0;
14240a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos);
14340a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  if (FI)
14440a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    return *FI;
14540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
14688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Construct the function info.
147bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  FI = new CGFunctionInfo(CallingConvention, ResTy, ArgTys);
14835e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar  FunctionInfos.InsertNode(FI, InsertPos);
149541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
15088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Compute ABI information.
151a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson  getABIInfo().computeInfo(*FI, getContext(), TheModule.getContext());
152541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
15388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  return *FI;
1540dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
15517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
156bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel DunbarCGFunctionInfo::CGFunctionInfo(unsigned _CallingConvention,
157bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                               QualType ResTy,
158bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                               const llvm::SmallVector<QualType, 16> &ArgTys)
159bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  : CallingConvention(_CallingConvention)
160bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar{
16188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  NumArgs = ArgTys.size();
16288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args = new ArgInfo[1 + NumArgs];
16388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args[0].type = ResTy;
16488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (unsigned i = 0; i < NumArgs; ++i)
16588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    Args[1 + i].type = ArgTys[i];
16688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar}
16788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
16888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar/***/
16988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid CodeGenTypes::GetExpandedTypes(QualType Ty,
1715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    std::vector<const llvm::Type*> &ArgTys) {
1725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
1735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
1745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordDecl *RD = RT->getDecl();
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(!RD->hasFlexibleArrayMember() &&
1765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Cannot expand structure with flexible array.");
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
17917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis         i != e; ++i) {
1805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    const FieldDecl *FD = *i;
1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(!FD->isBitField() &&
1825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar           "Cannot expand structure with bit-field members.");
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
1855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
1865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(FT, ArgTys);
1875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
1885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ArgTys.push_back(ConvertType(FT));
1895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
1905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
1915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
1925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpllvm::Function::arg_iterator
1945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
1955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    llvm::Function::arg_iterator AI) {
1965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
1975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
1985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(LV.isSimple() &&
2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         "Unexpected non-simple lvalue during struct expansion.");
2025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = LV.getAddress();
20317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
20417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis         i != e; ++i) {
2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    FieldDecl *FD = *i;
2065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
2075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
2085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
2095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
2105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
2115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      AI = ExpandTypeFromArgs(FT, LV, AI);
2125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
2135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitStoreThroughLValue(RValue::get(AI), LV, FT);
2145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ++AI;
2155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
2165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
2175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
2185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  return AI;
2195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
2205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
2235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                  llvm::SmallVector<llvm::Value*, 16> &Args) {
2245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
2255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
2265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
2275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
2285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
2295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = RV.getAggregateAddr();
23017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
23117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis         i != e; ++i) {
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    FieldDecl *FD = *i;
2335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
2365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
2375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
2385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
2395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
2405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      RValue RV = EmitLoadOfLValue(LV, FT);
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(RV.isScalar() &&
2425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar             "Unexpected non-scalar rvalue during struct expansion.");
2435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Args.push_back(RV.getScalarVal());
2445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
2455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
2465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
2475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
248275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
249275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty.
250275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
251275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the
252275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not
253275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined.
254275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
255275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      const llvm::Type *Ty,
256275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      CodeGenFunction &CGF) {
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const llvm::Type *SrcTy =
258275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(SrcPtr->getType())->getElementType();
2599408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
2609408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(Ty);
261275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
262b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  // If load is legal, just bitcast the src pointer.
2637ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar  if (SrcSize >= DstSize) {
264f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // Generally SrcSize is never greater than DstSize, since this means we are
265f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // losing bits. However, this can happen in cases where the structure has
266f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // additional padding, for example due to a user specified alignment.
2677ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar    //
268f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: Assert that we aren't truncating non-padding bits when have access
269f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // to that information.
270275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
271275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
272386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
273386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
274386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
275386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    return Load;
276275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
277275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
278275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
279275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::Value *Casted =
281275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::StoreInst *Store =
283386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar      CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
284386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
285386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Store->setAlignment(1);
286275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    return CGF.Builder.CreateLoad(Tmp);
287275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
288275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
289275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
290275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src,
291275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types.
292275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
293275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the
294275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost.
295275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src,
296275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               llvm::Value *DstPtr,
297275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               CodeGenFunction &CGF) {
298275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy = Src->getType();
2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const llvm::Type *DstTy =
300275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(DstPtr->getType())->getElementType();
301275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
3029408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
3039408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(DstTy);
304275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
30588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // If store is legal, just bitcast the src pointer.
306fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar  if (SrcSize <= DstSize) {
307275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
308275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
309386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
310386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    CGF.Builder.CreateStore(Src, Casted)->setAlignment(1);
311275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
312275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
313275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
314fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar
315fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // Generally SrcSize is never greater than DstSize, since this means we are
316fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // losing bits. However, this can happen in cases where the structure has
317fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // additional padding, for example due to a user specified alignment.
318fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    //
319fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // FIXME: Assert that we aren't truncating non-padding bits when have access
320fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // to that information.
321275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy);
322275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(Src, Tmp);
3231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::Value *Casted =
324275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
325386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
326386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
327386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
328386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    CGF.Builder.CreateStore(Load, DstPtr);
329275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
330275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
331275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
3325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/
3335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
33488b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) {
33511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  return FI.getReturnInfo().isIndirect();
336bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar}
337bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
33845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType *
339bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
34045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  std::vector<const llvm::Type*> ArgTys;
34145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
34245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  const llvm::Type *ResultType = 0;
34345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
344a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
345b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
3468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  switch (RetAI.getKind()) {
3478951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
3488951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
3498951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
350cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
35146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
35246327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    ResultType = ConvertType(RetTy);
35346327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    break;
35446327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar
35511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect: {
35611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    assert(!RetAI.getIndirectAlign() && "Align unused on indirect return.");
3570032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    ResultType = llvm::Type::getVoidTy(getLLVMContext());
35862d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *STy = ConvertType(RetTy);
35945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
36045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
36145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
36245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
36311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
3640032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    ResultType = llvm::Type::getVoidTy(getLLVMContext());
36511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    break;
36611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
36745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Coerce:
368639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    ResultType = RetAI.getCoerceToType();
36945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
37045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
37388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
37488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
37711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
37811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
37911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
3805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
38189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      ArgTys.push_back(AI.getCoerceToType());
38289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
38389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
384adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Indirect: {
38511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar      // indirect arguments are always on the stack, which is addr space #0.
386adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      const llvm::Type *LTy = ConvertTypeForMem(it->type);
387adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      ArgTys.push_back(llvm::PointerType::getUnqual(LTy));
3888951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
389adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    }
390cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
391cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
39246327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
3931f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      ArgTys.push_back(ConvertType(it->type));
3948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
39788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar      GetExpandedTypes(it->type, ArgTys);
3988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
3998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
40045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
40145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
402bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic);
4033913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar}
4043913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar
405a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbarvoid CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
40688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                           const Decl *TargetDecl,
407761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                           AttributeListType &PAL) {
4085323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned FuncAttrs = 0;
409a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  unsigned RetAttrs = 0;
4105323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
4111102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: handle sseregparm someday...
4125323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (TargetDecl) {
41340b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis    if (TargetDecl->hasAttr<NoThrowAttr>())
414761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoUnwind;
41540b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis    if (TargetDecl->hasAttr<NoReturnAttr>())
416761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoReturn;
41740b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis    if (TargetDecl->hasAttr<ConstAttr>())
418232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadNone;
41940b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis    else if (TargetDecl->hasAttr<PureAttr>())
42064c2e0762628eba26c100642521b6100c2515cc5Daniel Dunbar      FuncAttrs |= llvm::Attribute::ReadOnly;
42176168e289ca4b307259e3bc9b3353f03b05bb6b9Ryan Flynn    if (TargetDecl->hasAttr<MallocAttr>())
42276168e289ca4b307259e3bc9b3353f03b05bb6b9Ryan Flynn      RetAttrs |= llvm::Attribute::NoAlias;
4235323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
4245323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
42524095dad88dd9d48aa16afa6416417073af251b5Devang Patel  if (CompileOpts.DisableRedZone)
42624095dad88dd9d48aa16afa6416417073af251b5Devang Patel    FuncAttrs |= llvm::Attribute::NoRedZone;
427acebb397fa5d63835a0de9cee144987057ec1333Devang Patel  if (CompileOpts.NoImplicitFloat)
428acebb397fa5d63835a0de9cee144987057ec1333Devang Patel    FuncAttrs |= llvm::Attribute::NoImplicitFloat;
42924095dad88dd9d48aa16afa6416417073af251b5Devang Patel
4304ebe3e4c811a376c423a544f5e76ee2e96533324Bill Wendling  if (Features.getStackProtectorMode() == LangOptions::SSPOn)
43145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    FuncAttrs |= llvm::Attribute::StackProtect;
4324ebe3e4c811a376c423a544f5e76ee2e96533324Bill Wendling  else if (Features.getStackProtectorMode() == LangOptions::SSPReq)
43345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    FuncAttrs |= llvm::Attribute::StackProtectReq;
43445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
435a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
4365323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned Index = 1;
437b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
43845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  switch (RetAI.getKind()) {
439cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
440cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   if (RetTy->isSignedIntegerType()) {
441cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     RetAttrs |= llvm::Attribute::SExt;
442cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   } else if (RetTy->isUnsignedIntegerType()) {
443cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     RetAttrs |= llvm::Attribute::ZExt;
444cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   }
445cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   // FALLTHROUGH
44646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
4472c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
4482c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
44911e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    PAL.push_back(llvm::AttributeWithIndex::get(Index,
451725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::StructRet |
452725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::NoAlias));
4535323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    ++Index;
4540ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    // sret disables readnone and readonly
4550ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    FuncAttrs &= ~(llvm::Attribute::ReadOnly |
4560ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                   llvm::Attribute::ReadNone);
4572c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
4582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
45911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
4602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
4612c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
4628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
4638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
4641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(0 && "Invalid ABI kind for return argument");
4655323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
4662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
467a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (RetAttrs)
468a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
4691102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
4701102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: we need to honour command line settings also...
4711102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: RegParm should be reduced in case of nested functions and/or global
4721102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // register variable.
4731102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  signed RegParm = 0;
4741102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  if (TargetDecl)
4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const RegparmAttr *RegParmAttr
47640b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis          = TargetDecl->getAttr<RegparmAttr>())
4771102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      RegParm = RegParmAttr->getNumParams();
4781102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
4791102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned PointerWidth = getContext().Target.getPointerWidth(0);
4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
48188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
48288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    QualType ParamType = it->type;
48388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
484761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    unsigned Attributes = 0;
4851102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
4868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
48789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce:
48889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
48989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
49011e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
491761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      Attributes |= llvm::Attribute::ByVal;
4921102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      Attributes |=
49311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar        llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign());
4940ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      // byval disables readnone and readonly.
4950ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      FuncAttrs &= ~(llvm::Attribute::ReadOnly |
4960ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                     llvm::Attribute::ReadNone);
4978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
498cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
499cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
500cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     if (ParamType->isSignedIntegerType()) {
501cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov       Attributes |= llvm::Attribute::SExt;
502cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     } else if (ParamType->isUnsignedIntegerType()) {
503cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov       Attributes |= llvm::Attribute::ZExt;
504cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     }
505cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     // FALLS THROUGH
50646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
5071102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      if (RegParm > 0 &&
5081102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (ParamType->isIntegerType() || ParamType->isPointerType())) {
5091102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        RegParm -=
5101102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (Context.getTypeSize(ParamType) + PointerWidth - 1) / PointerWidth;
5111102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        if (RegParm >= 0)
5121102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          Attributes |= llvm::Attribute::InReg;
5131102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      }
5141102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      // FIXME: handle sseregparm someday...
5158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
5161102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
51711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
51811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      // Skip increment, no matching LLVM parameter.
5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      continue;
52011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
5215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
5221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      std::vector<const llvm::Type*> Tys;
523f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is rather inefficient. Do we ever actually need to do
524f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // anything here? The result should be just reconstructed on the other
525f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // side, so extension should be a non-issue.
5265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      getTypes().GetExpandedTypes(ParamType, Tys);
5275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Index += Tys.size();
5285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
5295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
5305323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
532761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    if (Attributes)
533761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes));
5345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++Index;
5355323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
536a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (FuncAttrs)
537a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs));
5385323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
5395323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
54088b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
54188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                         llvm::Function *Fn,
54217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         const FunctionArgList &Args) {
5430cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  // If this is an implicit-return-zero function, go ahead and
5440cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  // initialize the return value.  TODO: it might be nice to have
5450cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  // a more general mechanism for this that didn't require synthesized
5460cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  // return statements.
54789ed31d3f9eeb8ec77c284a5cf404a74bf5e7acfAnders Carlsson  if (const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl)) {
5480cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall    if (FD->hasImplicitReturnZero()) {
5490cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall      QualType RetTy = FD->getResultType().getUnqualifiedType();
5500cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall      const llvm::Type* LLVMTy = CGM.getTypes().ConvertType(RetTy);
551c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson      llvm::Constant* Zero = llvm::Constant::getNullValue(LLVMTy);
5520cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall      Builder.CreateStore(Zero, ReturnValue);
5530cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall    }
5540cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  }
5550cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall
556f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from FunctionArgList; lift up and
557f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // simplify.
5585251afa21d3583f2740fd4f83659d008625a7260Daniel Dunbar
55917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
56017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Function::arg_iterator AI = Fn->arg_begin();
5611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Name the struct return argument.
56388b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar  if (CGM.ReturnTypeUsesSret(FI)) {
56417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    AI->setName("agg.result");
56517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    ++AI;
56617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
5671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5684b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(FI.arg_size() == Args.size() &&
5694b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
570b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = FI.arg_begin();
57117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
572b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       i != e; ++i, ++info_it) {
57317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    const VarDecl *Arg = i->first;
574b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    QualType Ty = info_it->type;
575b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgI = info_it->info;
5768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
5778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (ArgI.getKind()) {
5781f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    case ABIArgInfo::Indirect: {
5791f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      llvm::Value* V = AI;
5801f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
5811f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Do nothing, aggregates and complex variables are accessed by
5821f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // reference.
5831f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
5841f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Load scalar value from indirect argument.
585adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
5861f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
5871f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // This must be a promotion, for something like
5881f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // "void a(x) short x; {..."
5891f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
5901f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        }
5911f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
5921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      EmitParmDecl(*Arg, V);
5931f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
5941f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    }
595cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
596cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
59746327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct: {
5988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
5998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      llvm::Value* V = AI;
6002fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
6012fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // Create a temporary alloca to hold the argument; the rest of
6022fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // codegen expects to access aggregates & complex values by
6032fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // reference.
604adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = CreateTempAlloca(ConvertTypeForMem(Ty));
6052fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Builder.CreateStore(AI, V);
6062fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      } else {
6072fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
6082fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // This must be a promotion, for something like
6092fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // "void a(x) short x; {..."
6102fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
6112fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        }
61217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      }
6138951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      EmitParmDecl(*Arg, V);
6148951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
6158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
6161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
618b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar      // If this structure was expanded into multiple arguments then
6195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // we need to create a temporary and reconstruct it from the
6205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // arguments.
62139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      std::string Name = Arg->getNameAsString();
6221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      llvm::Value *Temp = CreateTempAlloca(ConvertTypeForMem(Ty),
6235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                           (Name + ".addr").c_str());
6245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: What are the right qualifiers here?
6251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      llvm::Function::arg_iterator End =
6261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI);
6275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitParmDecl(*Arg, Temp);
6285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
6295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // Name the arguments used in expansion and increment AI.
6305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      unsigned Index = 0;
6315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      for (; AI != End; ++AI, ++Index)
6320ab9a25101efeb56620a99118bee116ae052a7caDaniel Dunbar        AI->setName(Name + "." + llvm::Twine(Index));
6335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
6345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
63511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
63611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
6378b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      // Initialize the local variable appropriately.
6381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (hasAggregateLLVMType(Ty)) {
639adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        EmitParmDecl(*Arg, CreateTempAlloca(ConvertTypeForMem(Ty)));
6408b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      } else {
6418b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar        EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType())));
6428b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      }
6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64459e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar      // Skip increment, no matching LLVM parameter.
6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      continue;
64611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
64789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
64889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
649f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is very wasteful; EmitParmDecl is just going to drop the
650f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // result in a new alloca anyway, so we could just store into that
651f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // directly if we broke the abstraction down more.
652adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(Ty), "coerce");
65389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      CreateCoercedStore(AI, V, *this);
65489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // Match to what EmitParmDecl is expecting for this type.
6558b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      if (!CodeGenFunction::hasAggregateLLVMType(Ty)) {
656adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
6578b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
6588b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // This must be a promotion, for something like
6598b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // "void a(x) short x; {..."
6608b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
6618b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        }
6628b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      }
66389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      EmitParmDecl(*Arg, V);
66489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
66589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
6668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
6675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
6685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++AI;
66917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
67017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  assert(AI == Fn->arg_end() && "Argument mismatch!");
67117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
67217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
67388b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
67417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         llvm::Value *ReturnValue) {
6752c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  llvm::Value *RV = 0;
6762c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
6772c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  // Functions with no result always return void.
678cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  if (ReturnValue) {
67988b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar    QualType RetTy = FI.getReturnType();
680b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &RetAI = FI.getReturnInfo();
681cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
6822c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    switch (RetAI.getKind()) {
68311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
6843aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      if (RetTy->isAnyComplexType()) {
6853aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
6863aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        StoreComplexToAddr(RT, CurFn->arg_begin(), false);
6873aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
6883aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
6893aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else {
690cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov        EmitStoreOfScalar(Builder.CreateLoad(ReturnValue), CurFn->arg_begin(),
691b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson                          false, RetTy);
6923aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      }
6932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
6948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
695cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
69646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
6972fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // The internal return value temp always will have
6982fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // pointer-to-return-type type.
6992c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      RV = Builder.CreateLoad(ReturnValue);
7002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
7012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
70211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
70311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
705adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Coerce:
70654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this);
7078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
7088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
7098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
7101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(0 && "Invalid ABI kind for return argument");
71117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
71217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7142c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (RV) {
7152c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRet(RV);
7162c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
7172c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRetVoid();
7182c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
71917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
72017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
7210139bb96494b4c4ba0824617d5d2495dc7e44c76Anders CarlssonRValue CodeGenFunction::EmitCallArg(const Expr *E, QualType ArgType) {
7224029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson  if (ArgType->isReferenceType())
7234029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson    return EmitReferenceBindingToExpr(E, ArgType);
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7250139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson  return EmitAnyExprToTemp(E);
7260139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson}
7270139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson
72888b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel DunbarRValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 llvm::Value *Callee,
730c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const CallArgList &CallArgs,
731c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const Decl *TargetDecl) {
732f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from CallArgs; lift up and simplify.
73317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::SmallVector<llvm::Value*, 16> Args;
73417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
73517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Handle struct-return functions by passing a pointer to the
73617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // location that we would like to return into.
737bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  QualType RetTy = CallInfo.getReturnType();
738b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = CallInfo.getReturnInfo();
7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7415db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // If the call returns a temporary with struct return, create a temporary
7425db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // alloca to hold the result.
7435db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  if (CGM.ReturnTypeUsesSret(CallInfo))
744adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    Args.push_back(CreateTempAlloca(ConvertTypeForMem(RetTy)));
7451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7464b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(CallInfo.arg_size() == CallArgs.size() &&
7474b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
748b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = CallInfo.arg_begin();
7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
750b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       I != E; ++I, ++info_it) {
751b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgInfo = info_it->info;
75217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    RValue RV = I->first;
7535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    switch (ArgInfo.getKind()) {
75511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
7561f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (RV.isScalar() || RV.isComplex()) {
7571f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Make a temporary alloca to pass the argument.
758adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        Args.push_back(CreateTempAlloca(ConvertTypeForMem(I->second)));
7591f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (RV.isScalar())
760b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson          EmitStoreOfScalar(RV.getScalarVal(), Args.back(), false, I->second);
7611f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        else
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
7631f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
7641f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        Args.push_back(RV.getAggregateAddr());
7651f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
7661f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
7671f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar
768cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
76946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
7705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (RV.isScalar()) {
7715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getScalarVal());
7725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else if (RV.isComplex()) {
7732fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        llvm::Value *Tmp = llvm::UndefValue::get(ConvertType(I->second));
7742fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().first, 0);
7752fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().second, 1);
7762fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Tmp);
7775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else {
7782fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Builder.CreateLoad(RV.getAggregateAddr()));
7795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      }
7805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
78311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
78411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
78589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
78689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // FIXME: Avoid the conversion through memory if possible.
78789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      llvm::Value *SrcPtr;
78889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      if (RV.isScalar()) {
7895a1be6e16ba306c349a3c3f80e9dce800976bc24Daniel Dunbar        SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce");
790b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson        EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, I->second);
79189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      } else if (RV.isComplex()) {
792adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce");
79389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        StoreComplexToAddr(RV.getComplexVal(), SrcPtr, false);
7941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      } else
79589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        SrcPtr = RV.getAggregateAddr();
7961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Args.push_back(CreateCoercedLoad(SrcPtr, ArgInfo.getCoerceToType(),
79789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar                                       *this));
79889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
79989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
80089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
8015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand:
8025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(I->second, RV, Args);
8035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
80417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
80517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8075db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // If the callee is a bitcast of a function to a varargs pointer to function
8085db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // type, check to see if we can remove the bitcast.  This handles some cases
8095db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // with unprototyped functions.
8105db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Callee))
8115db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner    if (llvm::Function *CalleeF = dyn_cast<llvm::Function>(CE->getOperand(0))) {
8125db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::PointerType *CurPT=cast<llvm::PointerType>(Callee->getType());
8135db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::FunctionType *CurFT =
8145db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        cast<llvm::FunctionType>(CurPT->getElementType());
8155db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::FunctionType *ActualFT = CalleeF->getFunctionType();
8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8175db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      if (CE->getOpcode() == llvm::Instruction::BitCast &&
8185db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          ActualFT->getReturnType() == CurFT->getReturnType() &&
819d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner          ActualFT->getNumParams() == CurFT->getNumParams() &&
820d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner          ActualFT->getNumParams() == Args.size()) {
8215db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        bool ArgsMatch = true;
8225db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        for (unsigned i = 0, e = ActualFT->getNumParams(); i != e; ++i)
8235db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          if (ActualFT->getParamType(i) != CurFT->getParamType(i)) {
8245db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner            ArgsMatch = false;
8255db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner            break;
8265db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          }
8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8285db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // Strip the cast if we can get away with it.  This is a nice cleanup,
8295db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // but also allows us to inline the function at -O0 if it is marked
8305db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // always_inline.
8315db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        if (ArgsMatch)
8325db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          Callee = CalleeF;
8335db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      }
8345db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner    }
8351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
8379834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::BasicBlock *InvokeDest = getInvokeDest();
838761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CodeGen::AttributeListType AttributeList;
839c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar  CGM.ConstructAttributeList(CallInfo, TargetDecl, AttributeList);
8409834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::AttrListPtr Attrs = llvm::AttrListPtr::get(AttributeList.begin(),
8419834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar                                                   AttributeList.end());
8421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
843d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::CallSite CS;
844d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (!InvokeDest || (Attrs.getFnAttributes() & llvm::Attribute::NoUnwind)) {
845beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad    CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size());
8469834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  } else {
8479834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    llvm::BasicBlock *Cont = createBasicBlock("invoke.cont");
8481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CS = Builder.CreateInvoke(Callee, Cont, InvokeDest,
849beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad                              Args.data(), Args.data()+Args.size());
8509834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    EmitBlock(Cont);
851f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar  }
852f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar
853d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  CS.setAttributes(Attrs);
8545db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  if (const llvm::Function *F =
8555db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        dyn_cast<llvm::Function>(Callee->stripPointerCasts()))
856d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    CS.setCallingConv(F->getCallingConv());
857d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
858d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // If the call doesn't return, finish the basic block and clear the
859d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // insertion point; this allows the rest of IRgen to discard
860d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // unreachable code.
861d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (CS.doesNotReturn()) {
862d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.CreateUnreachable();
863d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.ClearInsertionPoint();
8641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
865f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: For now, emit a dummy basic block because expr emitters in
866f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // generally are not ready to handle emitting expressions at unreachable
867f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // points.
868d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    EnsureInsertPoint();
8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
870d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    // Return a reasonable RValue.
871d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    return GetUndefRValue(RetTy);
8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
873d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
874d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::Instruction *CI = CS.getInstruction();
8750032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  if (Builder.isNamePreserving() &&
8760032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      CI->getType() != llvm::Type::getVoidTy(VMContext))
87717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setName("call");
8782c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
8792c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
88011e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
8812c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isAnyComplexType())
8825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
8833403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
8845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getAggregate(Args[0]);
8853403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(Args[0], false, RetTy));
8868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
887cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
88846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
8892fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar    if (RetTy->isAnyComplexType()) {
8902fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Real = Builder.CreateExtractValue(CI, 0);
8912fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Imag = Builder.CreateExtractValue(CI, 1);
8922fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getComplex(std::make_pair(Real, Imag));
8933403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
8943403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
895adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "agg.tmp");
8962fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      Builder.CreateStore(CI, V);
8972fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getAggregate(V);
8983403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
8993403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(CI);
9002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
90111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
9020bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // If we are ignoring an argument that had a result, make sure to
9030bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // construct the appropriate return value for our caller.
90413e81737a433b23f8c662d10d1d57356122a8caaDaniel Dunbar    return GetUndefRValue(RetTy);
90511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
906639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  case ABIArgInfo::Coerce: {
90789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    // FIXME: Avoid the conversion through memory if possible.
908adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "coerce");
90954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CreateCoercedStore(CI, V, *this);
910ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson    if (RetTy->isAnyComplexType())
911ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getComplex(LoadComplexFromAddr(V, false));
9123403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
913ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getAggregate(V);
9143403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(V, false, RetTy));
915639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  }
9168951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
9178951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
9181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(0 && "Invalid ABI kind for return argument");
91917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
9202c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
9212c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  assert(0 && "Unhandled ABIArgInfo::Kind");
9222c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  return RValue::get(0);
92317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
924b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
925b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar/* VarArg handling */
926b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
927b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty) {
928b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return CGM.getTypes().getABIInfo().EmitVAArg(VAListAddr, Ty, *this);
929b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
930