CGCall.cpp revision 45483f7a1b3e57b4603b141bee80596b2d4dd443
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
36541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst
3772564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionNoProtoType *FTNP) {
38541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(FTNP->getResultType(),
39541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                         llvm::SmallVector<QualType, 16>());
4045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
4145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
42541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst
4372564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorCGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionProtoType *FTP) {
44541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
45541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
4645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
47541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(FTP->getArgType(i));
48541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(FTP->getResultType(), ArgTys);
4945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
5045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
51f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) {
52f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  llvm::SmallVector<QualType, 16> ArgTys;
533eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  // Add the 'this' pointer unless this is a static method.
543eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (MD->isInstance())
553eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner    ArgTys.push_back(MD->getThisType(Context));
56f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
57f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  const FunctionProtoType *FTP = MD->getType()->getAsFunctionProtoType();
58f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
59f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    ArgTys.push_back(FTP->getArgType(i));
60f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson  return getFunctionInfo(FTP->getResultType(), ArgTys);
61f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson}
62f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
63541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionDecl *FD) {
643eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
65f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    if (MD->isInstance())
66f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson      return getFunctionInfo(MD);
67f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
680dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  const FunctionType *FTy = FD->getType()->getAsFunctionType();
6972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  if (const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(FTy))
70541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    return getFunctionInfo(FTP);
7172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  return getFunctionInfo(cast<FunctionNoProtoType>(FTy));
720dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
730dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
74541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) {
75541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
76541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  ArgTys.push_back(MD->getSelfDecl()->getType());
77541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  ArgTys.push_back(Context.getObjCSelType());
78541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy?
792073216a1075767b5d25c23d1462b7034686d94dChris Lattner  for (ObjCMethodDecl::param_iterator i = MD->param_begin(),
800dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar         e = MD->param_end(); i != e; ++i)
81541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back((*i)->getType());
82541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(MD->getResultType(), ArgTys);
830dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
840dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
85541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
86541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                                                    const CallArgList &Args) {
87541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
88541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
89725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar  for (CallArgList::const_iterator i = Args.begin(), e = Args.end();
90725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar       i != e; ++i)
91541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(i->second);
92541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(ResTy, ArgTys);
930dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
940dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
95541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
96541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                                                  const FunctionArgList &Args) {
97541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
98541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  llvm::SmallVector<QualType, 16> ArgTys;
99bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
100bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar       i != e; ++i)
101541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(i->second);
102541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  return getFunctionInfo(ResTy, ArgTys);
103541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar}
104541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
105541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
106541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar                               const llvm::SmallVector<QualType, 16> &ArgTys) {
10740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  // Lookup or create unique function info.
10840a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  llvm::FoldingSetNodeID ID;
10940a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  CGFunctionInfo::Profile(ID, ResTy, ArgTys.begin(), ArgTys.end());
11040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
11140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  void *InsertPos = 0;
11240a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos);
11340a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  if (FI)
11440a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    return *FI;
11540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
11688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Construct the function info.
11740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  FI = new CGFunctionInfo(ResTy, ArgTys);
11835e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar  FunctionInfos.InsertNode(FI, InsertPos);
119541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
12088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Compute ABI information.
1216bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  getABIInfo().computeInfo(*FI, getContext());
122541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
12388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  return *FI;
1240dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
12517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
12688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel DunbarCGFunctionInfo::CGFunctionInfo(QualType ResTy,
12788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar                               const llvm::SmallVector<QualType, 16> &ArgTys) {
12888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  NumArgs = ArgTys.size();
12988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args = new ArgInfo[1 + NumArgs];
13088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args[0].type = ResTy;
13188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (unsigned i = 0; i < NumArgs; ++i)
13288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    Args[1 + i].type = ArgTys[i];
13388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar}
13488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
13588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar/***/
13688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
1375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty,
1385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    std::vector<const llvm::Type*> &ArgTys) {
1395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
1405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
1415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordDecl *RD = RT->getDecl();
1425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(!RD->hasFlexibleArrayMember() &&
1435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Cannot expand structure with flexible array.");
1445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1456ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(Context),
1466ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(Context); i != e; ++i) {
1475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    const FieldDecl *FD = *i;
1485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    assert(!FD->isBitField() &&
1495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar           "Cannot expand structure with bit-field members.");
1505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
1525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
1535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(FT, ArgTys);
1545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
1555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ArgTys.push_back(ConvertType(FT));
1565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
1575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
1585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
1595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator
1615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
1625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    llvm::Function::arg_iterator AI) {
1635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
1645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
1655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
1675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(LV.isSimple() &&
1685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Unexpected non-simple lvalue during struct expansion.");
1695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = LV.getAddress();
1706ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(getContext()),
1716ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(getContext()); i != e; ++i) {
1725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
1735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
1745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
1765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
1775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
1785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      AI = ExpandTypeFromArgs(FT, LV, AI);
1795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
1805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitStoreThroughLValue(RValue::get(AI), LV, FT);
1815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ++AI;
1825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
1835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
1845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  return AI;
1865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
1875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid
1895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
1905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                  llvm::SmallVector<llvm::Value*, 16> &Args) {
1915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
1925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
1935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
1945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
1955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
1965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = RV.getAggregateAddr();
1976ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator i = RD->field_begin(getContext()),
1986ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor         e = RD->field_end(getContext()); i != e; ++i) {
1995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    FieldDecl *FD = *i;
2005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
2015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
2025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
2035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    LValue LV = EmitLValueForField(Addr, FD, false, 0);
2045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
2055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
2065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
2075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      RValue RV = EmitLoadOfLValue(LV, FT);
2085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      assert(RV.isScalar() &&
2095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar             "Unexpected non-scalar rvalue during struct expansion.");
2105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Args.push_back(RV.getScalarVal());
2115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
2125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
2135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
2145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
215275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
216275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty.
217275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
218275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the
219275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not
220275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined.
221275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
222275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      const llvm::Type *Ty,
223275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      CodeGenFunction &CGF) {
224275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy =
225275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(SrcPtr->getType())->getElementType();
2269408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
2279408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(Ty);
228275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
229b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  // If load is legal, just bitcast the src pointer.
2307ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar  if (SrcSize >= DstSize) {
231f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // Generally SrcSize is never greater than DstSize, since this means we are
232f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // losing bits. However, this can happen in cases where the structure has
233f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // additional padding, for example due to a user specified alignment.
2347ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar    //
235f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: Assert that we aren't truncating non-padding bits when have access
236f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // to that information.
237275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
238275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
239386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
240386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
241386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
242386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    return Load;
243275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
244275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
245275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
246275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
247275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
248275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
249386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::StoreInst *Store =
250386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar      CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
251386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
252386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Store->setAlignment(1);
253275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    return CGF.Builder.CreateLoad(Tmp);
254275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
255275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
256275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
257275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src,
258275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types.
259275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
260275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the
261275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost.
262275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src,
263275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               llvm::Value *DstPtr,
264275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               CodeGenFunction &CGF) {
265275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy = Src->getType();
266275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *DstTy =
267275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(DstPtr->getType())->getElementType();
268275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
2699408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
2709408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(DstTy);
271275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
27288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // If store is legal, just bitcast the src pointer.
273fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar  if (SrcSize <= DstSize) {
274275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
275275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
276386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
277386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    CGF.Builder.CreateStore(Src, Casted)->setAlignment(1);
278275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
279275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
280275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
281fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar
282fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // Generally SrcSize is never greater than DstSize, since this means we are
283fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // losing bits. However, this can happen in cases where the structure has
284fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // additional padding, for example due to a user specified alignment.
285fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    //
286fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // FIXME: Assert that we aren't truncating non-padding bits when have access
287fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // to that information.
288275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy);
289275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(Src, Tmp);
290275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
291275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
292386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
293386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
294386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
295386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    CGF.Builder.CreateStore(Load, DstPtr);
296275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
297275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
298275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
2995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/
3005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
30188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) {
30211e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  return FI.getReturnInfo().isIndirect();
303bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar}
304bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
30545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType *
306bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
30745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  std::vector<const llvm::Type*> ArgTys;
30845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
30945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  const llvm::Type *ResultType = 0;
31045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
311a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
312b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
3138951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  switch (RetAI.getKind()) {
3148951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
3158951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
3168951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
317cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
31846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
31946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    ResultType = ConvertType(RetTy);
32046327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    break;
32146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar
32211e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect: {
32311e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    assert(!RetAI.getIndirectAlign() && "Align unused on indirect return.");
32445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ResultType = llvm::Type::VoidTy;
32562d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *STy = ConvertType(RetTy);
32645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
32745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
32845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
32945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
33011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
33111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    ResultType = llvm::Type::VoidTy;
33211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    break;
33311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
33445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Coerce:
335639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    ResultType = RetAI.getCoerceToType();
33645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
33745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
33845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
33988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
34088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
34188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
3428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
3438951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
34411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
34511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
34611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
3475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
34889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      ArgTys.push_back(AI.getCoerceToType());
34989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
35089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
351adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Indirect: {
35211e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar      // indirect arguments are always on the stack, which is addr space #0.
353adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      const llvm::Type *LTy = ConvertTypeForMem(it->type);
354adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      ArgTys.push_back(llvm::PointerType::getUnqual(LTy));
3558951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
356adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    }
357cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
358cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
35946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
3601f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      ArgTys.push_back(ConvertType(it->type));
3618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
3628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
3638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
36488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar      GetExpandedTypes(it->type, ArgTys);
3658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
3668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
36745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
36845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
369bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic);
3703913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar}
3713913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar
372a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbarvoid CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
37388b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                           const Decl *TargetDecl,
374761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                           AttributeListType &PAL) {
3755323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned FuncAttrs = 0;
376a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  unsigned RetAttrs = 0;
3775323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
3781102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: handle sseregparm someday...
3795323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (TargetDecl) {
38068584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor    if (TargetDecl->hasAttr<NoThrowAttr>(getContext()))
381761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoUnwind;
38268584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor    if (TargetDecl->hasAttr<NoReturnAttr>(getContext()))
383761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoReturn;
38468584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor    if (TargetDecl->hasAttr<ConstAttr>(getContext()))
385232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadNone;
38668584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor    else if (TargetDecl->hasAttr<PureAttr>(getContext()))
38764c2e0762628eba26c100642521b6100c2515cc5Daniel Dunbar      FuncAttrs |= llvm::Attribute::ReadOnly;
3885323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
3895323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
39024095dad88dd9d48aa16afa6416417073af251b5Devang Patel  if (CompileOpts.DisableRedZone)
39124095dad88dd9d48aa16afa6416417073af251b5Devang Patel    FuncAttrs |= llvm::Attribute::NoRedZone;
392acebb397fa5d63835a0de9cee144987057ec1333Devang Patel  if (CompileOpts.NoImplicitFloat)
393acebb397fa5d63835a0de9cee144987057ec1333Devang Patel    FuncAttrs |= llvm::Attribute::NoImplicitFloat;
39424095dad88dd9d48aa16afa6416417073af251b5Devang Patel
39545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (Features.StackProtector == 1)
39645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    FuncAttrs |= llvm::Attribute::StackProtect;
39745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  else if (Features.StackProtector == 2)
39845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    FuncAttrs |= llvm::Attribute::StackProtectReq;
39945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
400a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
4015323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned Index = 1;
402b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
40345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  switch (RetAI.getKind()) {
404cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
405cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   if (RetTy->isSignedIntegerType()) {
406cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     RetAttrs |= llvm::Attribute::SExt;
407cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   } else if (RetTy->isUnsignedIntegerType()) {
408cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     RetAttrs |= llvm::Attribute::ZExt;
409cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   }
410cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   // FALLTHROUGH
41146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
4122c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
4132c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
41411e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
415761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    PAL.push_back(llvm::AttributeWithIndex::get(Index,
416725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::StructRet |
417725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar                                                llvm::Attribute::NoAlias));
4185323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    ++Index;
4190ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    // sret disables readnone and readonly
4200ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    FuncAttrs &= ~(llvm::Attribute::ReadOnly |
4210ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                   llvm::Attribute::ReadNone);
4222c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
4232c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
42411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
4252c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
4262c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
4278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
4288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
4298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
4305323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
4312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
432a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (RetAttrs)
433a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
4341102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
4351102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: we need to honour command line settings also...
4361102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: RegParm should be reduced in case of nested functions and/or global
4371102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // register variable.
4381102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  signed RegParm = 0;
4391102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  if (TargetDecl)
44068584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor    if (const RegparmAttr *RegParmAttr
44168584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor          = TargetDecl->getAttr<RegparmAttr>(getContext()))
4421102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      RegParm = RegParmAttr->getNumParams();
4431102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
4441102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned PointerWidth = getContext().Target.getPointerWidth(0);
44588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
44688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
44788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    QualType ParamType = it->type;
44888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
449761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    unsigned Attributes = 0;
4501102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
4518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
45289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce:
45389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
45489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
45511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
456761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      Attributes |= llvm::Attribute::ByVal;
4571102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      Attributes |=
45811e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar        llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign());
4590ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      // byval disables readnone and readonly.
4600ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      FuncAttrs &= ~(llvm::Attribute::ReadOnly |
4610ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                     llvm::Attribute::ReadNone);
4628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
463cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
464cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
465cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     if (ParamType->isSignedIntegerType()) {
466cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov       Attributes |= llvm::Attribute::SExt;
467cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     } else if (ParamType->isUnsignedIntegerType()) {
468cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov       Attributes |= llvm::Attribute::ZExt;
469cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     }
470cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     // FALLS THROUGH
47146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
4721102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      if (RegParm > 0 &&
4731102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (ParamType->isIntegerType() || ParamType->isPointerType())) {
4741102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        RegParm -=
4751102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (Context.getTypeSize(ParamType) + PointerWidth - 1) / PointerWidth;
4761102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        if (RegParm >= 0)
4771102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          Attributes |= llvm::Attribute::InReg;
4781102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      }
4791102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      // FIXME: handle sseregparm someday...
4808951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
4811102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
48211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
48311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      // Skip increment, no matching LLVM parameter.
48411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      continue;
48511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
4865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
4875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      std::vector<const llvm::Type*> Tys;
488f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is rather inefficient. Do we ever actually need to do
489f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // anything here? The result should be just reconstructed on the other
490f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // side, so extension should be a non-issue.
4915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      getTypes().GetExpandedTypes(ParamType, Tys);
4925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Index += Tys.size();
4935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
4945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
4955323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
4968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
497761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    if (Attributes)
498761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes));
4995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++Index;
5005323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
501a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (FuncAttrs)
502a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs));
5035323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
5045323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
50588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
50688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                         llvm::Function *Fn,
50717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         const FunctionArgList &Args) {
508f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from FunctionArgList; lift up and
509f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // simplify.
5105251afa21d3583f2740fd4f83659d008625a7260Daniel Dunbar
51117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
51217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Function::arg_iterator AI = Fn->arg_begin();
51317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
51417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Name the struct return argument.
51588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar  if (CGM.ReturnTypeUsesSret(FI)) {
51617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    AI->setName("agg.result");
51717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    ++AI;
51817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
519b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar
5204b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(FI.arg_size() == Args.size() &&
5214b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
522b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = FI.arg_begin();
52317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
524b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       i != e; ++i, ++info_it) {
52517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    const VarDecl *Arg = i->first;
526b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    QualType Ty = info_it->type;
527b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgI = info_it->info;
5288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
5298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (ArgI.getKind()) {
5301f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    case ABIArgInfo::Indirect: {
5311f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      llvm::Value* V = AI;
5321f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
5331f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Do nothing, aggregates and complex variables are accessed by
5341f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // reference.
5351f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
5361f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Load scalar value from indirect argument.
537adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
5381f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
5391f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // This must be a promotion, for something like
5401f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // "void a(x) short x; {..."
5411f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
5421f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        }
5431f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
5441f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      EmitParmDecl(*Arg, V);
5451f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
5461f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    }
547cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
548cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
54946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct: {
5508951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
5518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      llvm::Value* V = AI;
5522fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
5532fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // Create a temporary alloca to hold the argument; the rest of
5542fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // codegen expects to access aggregates & complex values by
5552fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // reference.
556adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = CreateTempAlloca(ConvertTypeForMem(Ty));
5572fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Builder.CreateStore(AI, V);
5582fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      } else {
5592fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
5602fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // This must be a promotion, for something like
5612fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // "void a(x) short x; {..."
5622fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
5632fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        }
56417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      }
5658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      EmitParmDecl(*Arg, V);
5668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
5678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
5688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
5695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
570b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar      // If this structure was expanded into multiple arguments then
5715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // we need to create a temporary and reconstruct it from the
5725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // arguments.
57339f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      std::string Name = Arg->getNameAsString();
574adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *Temp = CreateTempAlloca(ConvertTypeForMem(Ty),
5755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                           (Name + ".addr").c_str());
5765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: What are the right qualifiers here?
5775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      llvm::Function::arg_iterator End =
5785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI);
5795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitParmDecl(*Arg, Temp);
5805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
5815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // Name the arguments used in expansion and increment AI.
5825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      unsigned Index = 0;
5835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      for (; AI != End; ++AI, ++Index)
5845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        AI->setName(Name + "." + llvm::utostr(Index));
5855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
5865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
58711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
58811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
5898b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      // Initialize the local variable appropriately.
5908b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
591adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        EmitParmDecl(*Arg, CreateTempAlloca(ConvertTypeForMem(Ty)));
5928b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      } else {
5938b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar        EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType())));
5948b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      }
5958b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar
59659e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar      // Skip increment, no matching LLVM parameter.
59759e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar      continue;
59811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
59989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
60089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
601f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is very wasteful; EmitParmDecl is just going to drop the
602f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // result in a new alloca anyway, so we could just store into that
603f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // directly if we broke the abstraction down more.
604adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(Ty), "coerce");
60589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      CreateCoercedStore(AI, V, *this);
60689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // Match to what EmitParmDecl is expecting for this type.
6078b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      if (!CodeGenFunction::hasAggregateLLVMType(Ty)) {
608adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
6098b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
6108b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // This must be a promotion, for something like
6118b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // "void a(x) short x; {..."
6128b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
6138b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        }
6148b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      }
61589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      EmitParmDecl(*Arg, V);
61689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
61789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
6188951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
6195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
6205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++AI;
62117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
62217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  assert(AI == Fn->arg_end() && "Argument mismatch!");
62317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
62417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
62588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
62617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         llvm::Value *ReturnValue) {
6272c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  llvm::Value *RV = 0;
6282c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
6292c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  // Functions with no result always return void.
630cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  if (ReturnValue) {
63188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar    QualType RetTy = FI.getReturnType();
632b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &RetAI = FI.getReturnInfo();
633cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
6342c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    switch (RetAI.getKind()) {
63511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
6363aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      if (RetTy->isAnyComplexType()) {
6373aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
6383aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        StoreComplexToAddr(RT, CurFn->arg_begin(), false);
6393aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
6403aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
6413aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else {
642cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov        EmitStoreOfScalar(Builder.CreateLoad(ReturnValue), CurFn->arg_begin(),
643b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson                          false, RetTy);
6443aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      }
6452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
6468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
647cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
64846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
6492fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // The internal return value temp always will have
6502fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // pointer-to-return-type type.
6512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      RV = Builder.CreateLoad(ReturnValue);
6522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
6532c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
65411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
65511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
65611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
657adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Coerce:
65854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this);
6598951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
6608951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
6618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
6628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(0 && "Invalid ABI kind for return argument");
66317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
66417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
6652c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
6662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (RV) {
6672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRet(RV);
6682c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
6692c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRetVoid();
6702c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
67117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
67217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
6730139bb96494b4c4ba0824617d5d2495dc7e44c76Anders CarlssonRValue CodeGenFunction::EmitCallArg(const Expr *E, QualType ArgType) {
6744029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson  if (ArgType->isReferenceType())
6754029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson    return EmitReferenceBindingToExpr(E, ArgType);
6764029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson
6770139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson  return EmitAnyExprToTemp(E);
6780139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson}
6790139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson
68088b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel DunbarRValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
68188b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                 llvm::Value *Callee,
682c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const CallArgList &CallArgs,
683c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const Decl *TargetDecl) {
684f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from CallArgs; lift up and simplify.
68517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::SmallVector<llvm::Value*, 16> Args;
68617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
68717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Handle struct-return functions by passing a pointer to the
68817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // location that we would like to return into.
689bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  QualType RetTy = CallInfo.getReturnType();
690b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = CallInfo.getReturnInfo();
6915db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner
6925db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner
6935db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // If the call returns a temporary with struct return, create a temporary
6945db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // alloca to hold the result.
6955db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  if (CGM.ReturnTypeUsesSret(CallInfo))
696adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    Args.push_back(CreateTempAlloca(ConvertTypeForMem(RetTy)));
69717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
6984b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(CallInfo.arg_size() == CallArgs.size() &&
6994b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
700b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = CallInfo.arg_begin();
70117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
702b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       I != E; ++I, ++info_it) {
703b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgInfo = info_it->info;
70417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    RValue RV = I->first;
7055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    switch (ArgInfo.getKind()) {
70711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
7081f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (RV.isScalar() || RV.isComplex()) {
7091f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Make a temporary alloca to pass the argument.
710adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        Args.push_back(CreateTempAlloca(ConvertTypeForMem(I->second)));
7111f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (RV.isScalar())
712b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson          EmitStoreOfScalar(RV.getScalarVal(), Args.back(), false, I->second);
7131f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        else
7141f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
7151f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
7161f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        Args.push_back(RV.getAggregateAddr());
7171f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
7181f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
7191f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar
720cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
72146327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
7225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (RV.isScalar()) {
7235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getScalarVal());
7245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else if (RV.isComplex()) {
7252fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        llvm::Value *Tmp = llvm::UndefValue::get(ConvertType(I->second));
7262fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().first, 0);
7272fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().second, 1);
7282fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Tmp);
7295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else {
7302fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Builder.CreateLoad(RV.getAggregateAddr()));
7315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      }
7325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
7335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
73411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
73511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
73611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
73789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
73889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // FIXME: Avoid the conversion through memory if possible.
73989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      llvm::Value *SrcPtr;
74089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      if (RV.isScalar()) {
7415a1be6e16ba306c349a3c3f80e9dce800976bc24Daniel Dunbar        SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce");
742b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson        EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, I->second);
74389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      } else if (RV.isComplex()) {
744adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        SrcPtr = CreateTempAlloca(ConvertTypeForMem(I->second), "coerce");
74589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        StoreComplexToAddr(RV.getComplexVal(), SrcPtr, false);
74689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      } else
74789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        SrcPtr = RV.getAggregateAddr();
74889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      Args.push_back(CreateCoercedLoad(SrcPtr, ArgInfo.getCoerceToType(),
74989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar                                       *this));
75089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
75189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
75289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
7535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand:
7545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(I->second, RV, Args);
7555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
75617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
75717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
7585db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner
7595db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // If the callee is a bitcast of a function to a varargs pointer to function
7605db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // type, check to see if we can remove the bitcast.  This handles some cases
7615db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // with unprototyped functions.
7625db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Callee))
7635db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner    if (llvm::Function *CalleeF = dyn_cast<llvm::Function>(CE->getOperand(0))) {
7645db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::PointerType *CurPT=cast<llvm::PointerType>(Callee->getType());
7655db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::FunctionType *CurFT =
7665db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        cast<llvm::FunctionType>(CurPT->getElementType());
7675db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::FunctionType *ActualFT = CalleeF->getFunctionType();
7685db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner
7695db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      if (CE->getOpcode() == llvm::Instruction::BitCast &&
7705db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          ActualFT->getReturnType() == CurFT->getReturnType() &&
771d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner          ActualFT->getNumParams() == CurFT->getNumParams() &&
772d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner          ActualFT->getNumParams() == Args.size()) {
7735db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        bool ArgsMatch = true;
7745db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        for (unsigned i = 0, e = ActualFT->getNumParams(); i != e; ++i)
7755db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          if (ActualFT->getParamType(i) != CurFT->getParamType(i)) {
7765db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner            ArgsMatch = false;
7775db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner            break;
7785db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          }
7795db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner
7805db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // Strip the cast if we can get away with it.  This is a nice cleanup,
7815db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // but also allows us to inline the function at -O0 if it is marked
7825db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // always_inline.
7835db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        if (ArgsMatch)
7845db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          Callee = CalleeF;
7855db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      }
7865db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner    }
7875db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner
78817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
7899834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::BasicBlock *InvokeDest = getInvokeDest();
790761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CodeGen::AttributeListType AttributeList;
791c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar  CGM.ConstructAttributeList(CallInfo, TargetDecl, AttributeList);
7929834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::AttrListPtr Attrs = llvm::AttrListPtr::get(AttributeList.begin(),
7939834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar                                                   AttributeList.end());
794725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar
795d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::CallSite CS;
796d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (!InvokeDest || (Attrs.getFnAttributes() & llvm::Attribute::NoUnwind)) {
797beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad    CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size());
7989834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  } else {
7999834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    llvm::BasicBlock *Cont = createBasicBlock("invoke.cont");
800d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    CS = Builder.CreateInvoke(Callee, Cont, InvokeDest,
801beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad                              Args.data(), Args.data()+Args.size());
8029834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    EmitBlock(Cont);
803f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar  }
804f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar
805d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  CS.setAttributes(Attrs);
8065db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  if (const llvm::Function *F =
8075db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        dyn_cast<llvm::Function>(Callee->stripPointerCasts()))
808d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    CS.setCallingConv(F->getCallingConv());
809d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
810d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // If the call doesn't return, finish the basic block and clear the
811d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // insertion point; this allows the rest of IRgen to discard
812d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // unreachable code.
813d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (CS.doesNotReturn()) {
814d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.CreateUnreachable();
815d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.ClearInsertionPoint();
816d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
817f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: For now, emit a dummy basic block because expr emitters in
818f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // generally are not ready to handle emitting expressions at unreachable
819f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // points.
820d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    EnsureInsertPoint();
821d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
822d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    // Return a reasonable RValue.
823d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    return GetUndefRValue(RetTy);
824d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  }
825d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
826d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::Instruction *CI = CS.getInstruction();
8273403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner  if (Builder.isNamePreserving() && CI->getType() != llvm::Type::VoidTy)
82817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setName("call");
8292c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
8302c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
83111e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
8322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isAnyComplexType())
8335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
8343403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
8355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getAggregate(Args[0]);
8363403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(Args[0], false, RetTy));
8378951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
838cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
83946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
8402fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar    if (RetTy->isAnyComplexType()) {
8412fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Real = Builder.CreateExtractValue(CI, 0);
8422fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Imag = Builder.CreateExtractValue(CI, 1);
8432fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getComplex(std::make_pair(Real, Imag));
8443403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
8453403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
846adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "agg.tmp");
8472fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      Builder.CreateStore(CI, V);
8482fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getAggregate(V);
8493403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
8503403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(CI);
8512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
85211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
8530bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // If we are ignoring an argument that had a result, make sure to
8540bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // construct the appropriate return value for our caller.
85513e81737a433b23f8c662d10d1d57356122a8caaDaniel Dunbar    return GetUndefRValue(RetTy);
85611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
857639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  case ABIArgInfo::Coerce: {
85889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    // FIXME: Avoid the conversion through memory if possible.
859adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    llvm::Value *V = CreateTempAlloca(ConvertTypeForMem(RetTy), "coerce");
86054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar    CreateCoercedStore(CI, V, *this);
861ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson    if (RetTy->isAnyComplexType())
862ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getComplex(LoadComplexFromAddr(V, false));
8633403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
864ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson      return RValue::getAggregate(V);
8653403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(V, false, RetTy));
866639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  }
8678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
8688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
8698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
87017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
8712c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
8722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  assert(0 && "Unhandled ABIArgInfo::Kind");
8732c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  return RValue::get(0);
87417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
875b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
876b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar/* VarArg handling */
877b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
878b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty) {
879b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return CGM.getTypes().getABIInfo().EmitVAArg(VAListAddr, Ty, *this);
880b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
881