CGCall.cpp revision 2736071ea3a46f90e65c93418961611d96c10ab9
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"
222811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth#include "clang/CodeGen/CodeGenOptions.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
3604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallstatic unsigned ClangCallConvToLLVMCallConv(CallingConv CC) {
3704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  switch (CC) {
3804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  default: return llvm::CallingConv::C;
3904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  case CC_X86StdCall: return llvm::CallingConv::X86_StdCall;
4004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  case CC_X86FastCall: return llvm::CallingConv::X86_FastCall;
41f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor  case CC_X86ThisCall: return llvm::CallingConv::X86_ThisCall;
4204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  }
4304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall}
4404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
450b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// Derives the 'this' type for codegen purposes, i.e. ignoring method
460b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// qualification.
470b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// FIXME: address space qualification?
48ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCallstatic CanQualType GetThisType(ASTContext &Context, const CXXRecordDecl *RD) {
49ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  QualType RecTy = Context.getTagDeclType(RD)->getCanonicalTypeInternal();
50ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  return Context.getPointerType(CanQualType::CreateUnsafe(RecTy));
510b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall}
520b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
530b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// Returns the canonical formal type of the given C++ method.
54ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCallstatic CanQual<FunctionProtoType> GetFormalType(const CXXMethodDecl *MD) {
55ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  return MD->getType()->getCanonicalTypeUnqualified()
56ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall           .getAs<FunctionProtoType>();
570b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall}
580b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
590b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// Returns the "extra-canonicalized" return type, which discards
600b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// qualifiers on the return type.  Codegen doesn't care about them,
610b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// and it makes ABI code a little easier to be able to assume that
620b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// all parameter and return types are top-level unqualified.
63ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCallstatic CanQualType GetReturnType(QualType RetTy) {
64ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  return RetTy->getCanonicalTypeUnqualified().getUnqualifiedType();
650b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall}
660b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
670b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCallconst CGFunctionInfo &
68ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCallCodeGenTypes::getFunctionInfo(CanQual<FunctionNoProtoType> FTNP) {
69ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  return getFunctionInfo(FTNP->getResultType().getUnqualifiedType(),
70ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall                         llvm::SmallVector<CanQualType, 16>(),
71264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                         FTNP->getExtInfo());
7245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
7345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
740b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall/// \param Args - contains any initial parameters besides those
750b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall///   in the formal type
760b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCallstatic const CGFunctionInfo &getFunctionInfo(CodeGenTypes &CGT,
77ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall                                  llvm::SmallVectorImpl<CanQualType> &ArgTys,
78ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall                                             CanQual<FunctionProtoType> FTP) {
79541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
8045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
81541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar    ArgTys.push_back(FTP->getArgType(i));
82ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  CanQualType ResTy = FTP->getResultType().getUnqualifiedType();
83ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  return CGT.getFunctionInfo(ResTy, ArgTys,
84264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                             FTP->getExtInfo());
850b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall}
860b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
870b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCallconst CGFunctionInfo &
88ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCallCodeGenTypes::getFunctionInfo(CanQual<FunctionProtoType> FTP) {
89ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  llvm::SmallVector<CanQualType, 16> ArgTys;
900b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  return ::getFunctionInfo(*this, ArgTys, FTP);
91bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar}
92bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
9304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallstatic CallingConv getCallingConventionForDecl(const Decl *D) {
94bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  // Set the appropriate calling convention for the Function.
95bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  if (D->hasAttr<StdCallAttr>())
9604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    return CC_X86StdCall;
97bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
98bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar  if (D->hasAttr<FastCallAttr>())
9904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    return CC_X86FastCall;
100bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
101f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor  if (D->hasAttr<ThisCallAttr>())
102f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor    return CC_X86ThisCall;
103f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor
10404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  return CC_C;
10545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar}
10645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
107375c31c4673f83f925de221752cf801c2fbbb246Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXRecordDecl *RD,
108375c31c4673f83f925de221752cf801c2fbbb246Anders Carlsson                                                 const FunctionProtoType *FTP) {
109ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  llvm::SmallVector<CanQualType, 16> ArgTys;
1100b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
111375c31c4673f83f925de221752cf801c2fbbb246Anders Carlsson  // Add the 'this' pointer.
1120b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  ArgTys.push_back(GetThisType(Context, RD));
1130b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
1140b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  return ::getFunctionInfo(*this, ArgTys,
115ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall              FTP->getCanonicalTypeUnqualified().getAs<FunctionProtoType>());
116375c31c4673f83f925de221752cf801c2fbbb246Anders Carlsson}
117375c31c4673f83f925de221752cf801c2fbbb246Anders Carlsson
118f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) {
119ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  llvm::SmallVector<CanQualType, 16> ArgTys;
1200b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
1213eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  // Add the 'this' pointer unless this is a static method.
1223eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (MD->isInstance())
1230b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall    ArgTys.push_back(GetThisType(Context, MD->getParent()));
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1250b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  return ::getFunctionInfo(*this, ArgTys, GetFormalType(MD));
126f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson}
127f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson
128f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXConstructorDecl *D,
129f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson                                                    CXXCtorType Type) {
130ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  llvm::SmallVector<CanQualType, 16> ArgTys;
131f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson
132f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson  // Add the 'this' pointer.
1330b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  ArgTys.push_back(GetThisType(Context, D->getParent()));
134f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson
135f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson  // Check if we need to add a VTT parameter (which has type void **).
136f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson  if (Type == Ctor_Base && D->getParent()->getNumVBases() != 0)
137f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson    ArgTys.push_back(Context.getPointerType(Context.VoidPtrTy));
1380b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
1390b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  return ::getFunctionInfo(*this, ArgTys, GetFormalType(D));
140f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson}
141f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson
142f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXDestructorDecl *D,
143f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson                                                    CXXDtorType Type) {
144ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  llvm::SmallVector<CanQualType, 16> ArgTys;
145f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson
146f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson  // Add the 'this' pointer.
147ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  ArgTys.push_back(GetThisType(Context, D->getParent()));
148f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson
149f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson  // Check if we need to add a VTT parameter (which has type void **).
150f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson  if (Type == Dtor_Base && D->getParent()->getNumVBases() != 0)
151f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson    ArgTys.push_back(Context.getPointerType(Context.VoidPtrTy));
1520b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
1530b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  return ::getFunctionInfo(*this, ArgTys, GetFormalType(D));
154f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson}
155f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson
156541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const FunctionDecl *FD) {
1573eb67ca786ef75bad43d30349c7334b921ba0dbcChris Lattner  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
158f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson    if (MD->isInstance())
159f6f8ae561ef78af169cbd2c067cae7ee4b2044e9Anders Carlsson      return getFunctionInfo(MD);
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
161ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  CanQualType FTy = FD->getType()->getCanonicalTypeUnqualified();
162ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  assert(isa<FunctionType>(FTy));
1630b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  if (isa<FunctionNoProtoType>(FTy))
164ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall    return getFunctionInfo(FTy.getAs<FunctionNoProtoType>());
165ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  assert(isa<FunctionProtoType>(FTy));
166ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  return getFunctionInfo(FTy.getAs<FunctionProtoType>());
1670dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
1680dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
169541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbarconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) {
170ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  llvm::SmallVector<CanQualType, 16> ArgTys;
171ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  ArgTys.push_back(Context.getCanonicalParamType(MD->getSelfDecl()->getType()));
172ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  ArgTys.push_back(Context.getCanonicalParamType(Context.getObjCSelType()));
173541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy?
1742073216a1075767b5d25c23d1462b7034686d94dChris Lattner  for (ObjCMethodDecl::param_iterator i = MD->param_begin(),
1750b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall         e = MD->param_end(); i != e; ++i) {
1760b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall    ArgTys.push_back(Context.getCanonicalParamType((*i)->getType()));
1770b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  }
1780b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  return getFunctionInfo(GetReturnType(MD->getResultType()),
1790b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall                         ArgTys,
180264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                         FunctionType::ExtInfo(
181264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                             /*NoReturn*/ false,
182425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola                             /*RegParm*/ 0,
183264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                             getCallingConventionForDecl(MD)));
1840dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
1850dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
186b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlssonconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(GlobalDecl GD) {
187b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson  // FIXME: Do we need to handle ObjCMethodDecl?
188b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson  const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
189b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson
190b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson  if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD))
191b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson    return getFunctionInfo(CD, GD.getCtorType());
192b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson
193b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson  if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(FD))
194b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson    return getFunctionInfo(DD, GD.getDtorType());
195b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson
196b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson  return getFunctionInfo(FD);
197b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson}
198b2bcf1c176b200b36f371e189ce22f93c86cdf45Anders Carlsson
1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
200bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                                                    const CallArgList &Args,
201264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                            const FunctionType::ExtInfo &Info) {
202541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
203ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  llvm::SmallVector<CanQualType, 16> ArgTys;
2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CallArgList::const_iterator i = Args.begin(), e = Args.end();
205725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar       i != e; ++i)
2060b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall    ArgTys.push_back(Context.getCanonicalParamType(i->second));
207264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  return getFunctionInfo(GetReturnType(ResTy), ArgTys, Info);
2080dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
2090dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
211bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                                                    const FunctionArgList &Args,
212264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                            const FunctionType::ExtInfo &Info) {
213541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar  // FIXME: Kill copy.
214ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  llvm::SmallVector<CanQualType, 16> ArgTys;
2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
216bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar       i != e; ++i)
2170b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall    ArgTys.push_back(Context.getCanonicalParamType(i->second));
218264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  return getFunctionInfo(GetReturnType(ResTy), ArgTys, Info);
219541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar}
220541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
221ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCallconst CGFunctionInfo &CodeGenTypes::getFunctionInfo(CanQualType ResTy,
222ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall                           const llvm::SmallVectorImpl<CanQualType> &ArgTys,
223264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                            const FunctionType::ExtInfo &Info) {
224ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall#ifndef NDEBUG
225ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall  for (llvm::SmallVectorImpl<CanQualType>::const_iterator
226ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall         I = ArgTys.begin(), E = ArgTys.end(); I != E; ++I)
227ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall    assert(I->isCanonicalAsParam());
228ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall#endif
229ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall
230425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola  unsigned CC = ClangCallConvToLLVMCallConv(Info.getCC());
23104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
23240a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  // Lookup or create unique function info.
23340a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  llvm::FoldingSetNodeID ID;
234264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  CGFunctionInfo::Profile(ID, Info, ResTy,
235bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar                          ArgTys.begin(), ArgTys.end());
23640a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
23740a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  void *InsertPos = 0;
23840a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, InsertPos);
23940a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  if (FI)
24040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    return *FI;
24140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
24288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Construct the function info.
243425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola  FI = new CGFunctionInfo(CC, Info.getNoReturn(), Info.getRegParm(), ResTy, ArgTys);
24435e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar  FunctionInfos.InsertNode(FI, InsertPos);
245541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
24688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // Compute ABI information.
247a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson  getABIInfo().computeInfo(*FI, getContext(), TheModule.getContext());
248541b63b1a9db77e4a8670e9823711c2c12e58afbDaniel Dunbar
24988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  return *FI;
2500dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
25117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
252bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel DunbarCGFunctionInfo::CGFunctionInfo(unsigned _CallingConvention,
25304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall                               bool _NoReturn,
254425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola                               unsigned _RegParm,
255ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall                               CanQualType ResTy,
256ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall                               const llvm::SmallVectorImpl<CanQualType> &ArgTys)
257ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar  : CallingConvention(_CallingConvention),
25804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    EffectiveCallingConvention(_CallingConvention),
259425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    NoReturn(_NoReturn), RegParm(_RegParm)
260bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar{
26188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  NumArgs = ArgTys.size();
26288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args = new ArgInfo[1 + NumArgs];
26388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  Args[0].type = ResTy;
26488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  for (unsigned i = 0; i < NumArgs; ++i)
26588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    Args[1 + i].type = ArgTys[i];
26688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar}
26788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
26888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar/***/
26988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid CodeGenTypes::GetExpandedTypes(QualType Ty,
2715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    std::vector<const llvm::Type*> &ArgTys) {
2725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
2735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
2745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordDecl *RD = RT->getDecl();
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(!RD->hasFlexibleArrayMember() &&
2765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar         "Cannot expand structure with flexible array.");
2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
27917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis         i != e; ++i) {
2805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    const FieldDecl *FD = *i;
2811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(!FD->isBitField() &&
2825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar           "Cannot expand structure with bit-field members.");
2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
2855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
2865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      GetExpandedTypes(FT, ArgTys);
2875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
2885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ArgTys.push_back(ConvertType(FT));
2895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
2905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
2915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
2925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpllvm::Function::arg_iterator
2945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
2955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                    llvm::Function::arg_iterator AI) {
2965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
2975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
2985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
2995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(LV.isSimple() &&
3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         "Unexpected non-simple lvalue during struct expansion.");
3025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = LV.getAddress();
30317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
30417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis         i != e; ++i) {
3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    FieldDecl *FD = *i;
3065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
3075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
3085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
309e6d2a534851a649485cb087e9dfcaf8a65886858Anders Carlsson    LValue LV = EmitLValueForField(Addr, FD, 0);
3105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
3115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      AI = ExpandTypeFromArgs(FT, LV, AI);
3125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
3135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitStoreThroughLValue(RValue::get(AI), LV, FT);
3145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ++AI;
3155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
3165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
3175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
3185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  return AI;
3195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
3205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
3221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
3235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar                                  llvm::SmallVector<llvm::Value*, 16> &Args) {
3245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  const RecordType *RT = Ty->getAsStructureType();
3255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RT && "Can only expand structure types.");
3265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
3275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  RecordDecl *RD = RT->getDecl();
3285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
3295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  llvm::Value *Addr = RV.getAggregateAddr();
33017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
33117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis         i != e; ++i) {
3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    FieldDecl *FD = *i;
3335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    QualType FT = FD->getType();
3341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    // FIXME: What are the right qualifiers here?
336e6d2a534851a649485cb087e9dfcaf8a65886858Anders Carlsson    LValue LV = EmitLValueForField(Addr, FD, 0);
3375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    if (CodeGenFunction::hasAggregateLLVMType(FT)) {
3385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
3395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    } else {
3405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      RValue RV = EmitLoadOfLValue(LV, FT);
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(RV.isScalar() &&
3425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar             "Unexpected non-scalar rvalue during struct expansion.");
3435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Args.push_back(RV.getScalarVal());
3445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
3455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar  }
3465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar}
3475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
348275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
349275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty.
350275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
351275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the
352275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not
353275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined.
354275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
355275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      const llvm::Type *Ty,
356275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                                      CodeGenFunction &CGF) {
3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const llvm::Type *SrcTy =
358275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(SrcPtr->getType())->getElementType();
3599408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
3609408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(Ty);
361275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
362b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  // If load is legal, just bitcast the src pointer.
3637ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar  if (SrcSize >= DstSize) {
364f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // Generally SrcSize is never greater than DstSize, since this means we are
365f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // losing bits. However, this can happen in cases where the structure has
366f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // additional padding, for example due to a user specified alignment.
3677ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar    //
368f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: Assert that we aren't truncating non-padding bits when have access
369f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // to that information.
370275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
371275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
372386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
373386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
374386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
375386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    return Load;
376275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
377275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
378275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
379275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::Value *Casted =
381275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::StoreInst *Store =
383386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar      CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
384386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
385386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Store->setAlignment(1);
386275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    return CGF.Builder.CreateLoad(Tmp);
387275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
388275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
389275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
390275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src,
391275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types.
392275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar///
393275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the
394275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost.
395275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src,
396275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               llvm::Value *DstPtr,
397d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson                               bool DstIsVolatile,
398275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar                               CodeGenFunction &CGF) {
399275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  const llvm::Type *SrcTy = Src->getType();
4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const llvm::Type *DstTy =
401275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    cast<llvm::PointerType>(DstPtr->getType())->getElementType();
402275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
4039408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t SrcSize = CGF.CGM.getTargetData().getTypeAllocSize(SrcTy);
4049408c45009b417e758749b3d95cdfb87dcb68ea9Duncan Sands  uint64_t DstSize = CGF.CGM.getTargetData().getTypeAllocSize(DstTy);
405275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
40688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  // If store is legal, just bitcast the src pointer.
407fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar  if (SrcSize <= DstSize) {
408275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Casted =
409275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
410386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned store.
411d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    CGF.Builder.CreateStore(Src, Casted, DstIsVolatile)->setAlignment(1);
412275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  } else {
413275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // Otherwise do coercion through memory. This is stupid, but
414275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    // simple.
415fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar
416fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // Generally SrcSize is never greater than DstSize, since this means we are
417fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // losing bits. However, this can happen in cases where the structure has
418fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // additional padding, for example due to a user specified alignment.
419fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    //
420fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // FIXME: Assert that we aren't truncating non-padding bits when have access
421fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar    // to that information.
422275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy);
423275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar    CGF.Builder.CreateStore(Src, Tmp);
4241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::Value *Casted =
425275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar      CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
426386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Casted);
427386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    // FIXME: Use better alignment / avoid requiring aligned load.
428386621f5e12f5db95af3b82250b08fdae3e3d321Daniel Dunbar    Load->setAlignment(1);
429d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    CGF.Builder.CreateStore(Load, DstPtr, DstIsVolatile);
430275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar  }
431275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar}
432275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar
4335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/
4345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
43588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) {
43611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  return FI.getReturnInfo().isIndirect();
437bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar}
438bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
439c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCallconst llvm::FunctionType *CodeGenTypes::GetFunctionType(GlobalDecl GD) {
440c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const CGFunctionInfo &FI = getFunctionInfo(GD);
441c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
442c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // For definition purposes, don't consider a K&R function variadic.
443c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  bool Variadic = false;
444c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (const FunctionProtoType *FPT =
445c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall        cast<FunctionDecl>(GD.getDecl())->getType()->getAs<FunctionProtoType>())
446c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    Variadic = FPT->isVariadic();
447c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
448c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  return GetFunctionType(FI, Variadic);
449c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall}
450c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
45145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType *
452bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
45345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  std::vector<const llvm::Type*> ArgTys;
45445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
45545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  const llvm::Type *ResultType = 0;
45645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
457a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
458b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
4598951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  switch (RetAI.getKind()) {
4608951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
4618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    assert(0 && "Invalid ABI kind for return argument");
4628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
463cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
46446327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
46546327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    ResultType = ConvertType(RetTy);
46646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    break;
46746327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar
46811e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect: {
46911e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    assert(!RetAI.getIndirectAlign() && "Align unused on indirect return.");
4700032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    ResultType = llvm::Type::getVoidTy(getLLVMContext());
47162d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar    const llvm::Type *STy = ConvertType(RetTy);
47245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
47345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
47445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
47545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
47611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
4770032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    ResultType = llvm::Type::getVoidTy(getLLVMContext());
47811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    break;
47911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
48045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  case ABIArgInfo::Coerce:
481639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar    ResultType = RetAI.getCoerceToType();
48245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar    break;
48345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
4841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
48688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
48788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
49011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
49111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
49211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
4935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Coerce:
49489c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      ArgTys.push_back(AI.getCoerceToType());
49589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
49689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
497adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Indirect: {
49811e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar      // indirect arguments are always on the stack, which is addr space #0.
499adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      const llvm::Type *LTy = ConvertTypeForMem(it->type);
500adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar      ArgTys.push_back(llvm::PointerType::getUnqual(LTy));
5018951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
502adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    }
503cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
504cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
50546327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
5061f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      ArgTys.push_back(ConvertType(it->type));
5078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
51088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar      GetExpandedTypes(it->type, ArgTys);
5118951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
5128951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
51345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  }
51445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
515bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic);
5163913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar}
5173913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar
518ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlssonstatic bool HasIncompleteReturnTypeOrArgumentTypes(const FunctionProtoType *T) {
519ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson  if (const TagType *TT = T->getResultType()->getAs<TagType>()) {
520ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson    if (!TT->getDecl()->isDefinition())
521ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson      return true;
522ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson  }
523ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson
524ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
525ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson    if (const TagType *TT = T->getArgType(i)->getAs<TagType>()) {
526ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson      if (!TT->getDecl()->isDefinition())
527ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson        return true;
528ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson    }
529ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson  }
530ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson
531ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson  return false;
532ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson}
533ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson
534ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlssonconst llvm::Type *
535046c294a43024874ff35656c6e785b64e72f1f36Anders CarlssonCodeGenTypes::GetFunctionTypeForVTable(const CXXMethodDecl *MD) {
536ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson  const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
537ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson
538ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson  if (!HasIncompleteReturnTypeOrArgumentTypes(FPT))
539ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson    return GetFunctionType(getFunctionInfo(MD), FPT->isVariadic());
540ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson
541ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson  return llvm::OpaqueType::get(getLLVMContext());
542ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson}
543ecf282b0486873309fd58ec4d3ec0dbf983b33d4Anders Carlsson
544a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbarvoid CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
54588b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                           const Decl *TargetDecl,
546ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar                                           AttributeListType &PAL,
547ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar                                           unsigned &CallingConv) {
5485323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned FuncAttrs = 0;
549a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  unsigned RetAttrs = 0;
5505323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
551ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar  CallingConv = FI.getEffectiveCallingConvention();
552ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar
55304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (FI.isNoReturn())
55404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    FuncAttrs |= llvm::Attribute::NoReturn;
55504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
5561102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: handle sseregparm someday...
5575323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  if (TargetDecl) {
55840b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis    if (TargetDecl->hasAttr<NoThrowAttr>())
559761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoUnwind;
56040b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis    if (TargetDecl->hasAttr<NoReturnAttr>())
561761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      FuncAttrs |= llvm::Attribute::NoReturn;
56240b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis    if (TargetDecl->hasAttr<ConstAttr>())
563232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson      FuncAttrs |= llvm::Attribute::ReadNone;
56440b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis    else if (TargetDecl->hasAttr<PureAttr>())
56564c2e0762628eba26c100642521b6100c2515cc5Daniel Dunbar      FuncAttrs |= llvm::Attribute::ReadOnly;
56676168e289ca4b307259e3bc9b3353f03b05bb6b9Ryan Flynn    if (TargetDecl->hasAttr<MallocAttr>())
56776168e289ca4b307259e3bc9b3353f03b05bb6b9Ryan Flynn      RetAttrs |= llvm::Attribute::NoAlias;
5685323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
5695323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
5702811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth  if (CodeGenOpts.OptimizeSize)
5717ab1c3ebd02c31bfa1333cc51de1261c1499d6f7Daniel Dunbar    FuncAttrs |= llvm::Attribute::OptimizeForSize;
5722811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth  if (CodeGenOpts.DisableRedZone)
57324095dad88dd9d48aa16afa6416417073af251b5Devang Patel    FuncAttrs |= llvm::Attribute::NoRedZone;
5742811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth  if (CodeGenOpts.NoImplicitFloat)
575acebb397fa5d63835a0de9cee144987057ec1333Devang Patel    FuncAttrs |= llvm::Attribute::NoImplicitFloat;
57624095dad88dd9d48aa16afa6416417073af251b5Devang Patel
577a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar  QualType RetTy = FI.getReturnType();
5785323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  unsigned Index = 1;
579b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = FI.getReturnInfo();
58045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  switch (RetAI.getKind()) {
581cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
582cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   if (RetTy->isSignedIntegerType()) {
583cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     RetAttrs |= llvm::Attribute::SExt;
584cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   } else if (RetTy->isUnsignedIntegerType()) {
585cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     RetAttrs |= llvm::Attribute::ZExt;
586cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   }
587cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov   // FALLTHROUGH
58846327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
5892c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
5902c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
59111e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
5921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    PAL.push_back(llvm::AttributeWithIndex::get(Index,
593fb97cf24158aa7f1fd74374052f99733ef331bb9Chris Lattner                                                llvm::Attribute::StructRet));
5945323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    ++Index;
5950ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    // sret disables readnone and readonly
5960ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar    FuncAttrs &= ~(llvm::Attribute::ReadOnly |
5970ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                   llvm::Attribute::ReadNone);
5982c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
5992c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
60011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
6012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  case ABIArgInfo::Coerce:
6022c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    break;
6038951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
6048951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
6051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(0 && "Invalid ABI kind for return argument");
6065323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
6072c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
608a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (RetAttrs)
609a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
6101102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
6111102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: we need to honour command line settings also...
6121102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // FIXME: RegParm should be reduced in case of nested functions and/or global
6131102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  // register variable.
614425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola  signed RegParm = FI.getRegParm();
6151102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
6161102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned PointerWidth = getContext().Target.getPointerWidth(0);
6171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
61888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar         ie = FI.arg_end(); it != ie; ++it) {
61988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    QualType ParamType = it->type;
62088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &AI = it->info;
621761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    unsigned Attributes = 0;
6221102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
623d8e10d26b5a24257fe13c289b653fd450326eeffJohn McCall    // 'restrict' -> 'noalias' is done in EmitFunctionProlog when we
624d8e10d26b5a24257fe13c289b653fd450326eeffJohn McCall    // have the corresponding parameter variable.  It doesn't make
625d8e10d26b5a24257fe13c289b653fd450326eeffJohn McCall    // sense to do it here because parameters are so fucked up.
626079b49550dafc5eefa27c58817e613fd1b1c4309Nuno Lopes
6278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (AI.getKind()) {
62889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce:
62989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
63089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
63111e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
6320a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson      if (AI.getIndirectByVal())
6330a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson        Attributes |= llvm::Attribute::ByVal;
6340a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson
6351102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      Attributes |=
63611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar        llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign());
6370ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      // byval disables readnone and readonly.
6380ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar      FuncAttrs &= ~(llvm::Attribute::ReadOnly |
6390ac86f0821a2ba7ae09793fee4451bef99e9b2f3Daniel Dunbar                     llvm::Attribute::ReadNone);
6408951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
641cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
642cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
643cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     if (ParamType->isSignedIntegerType()) {
644cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov       Attributes |= llvm::Attribute::SExt;
645cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     } else if (ParamType->isUnsignedIntegerType()) {
646cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov       Attributes |= llvm::Attribute::ZExt;
647cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     }
648cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov     // FALLS THROUGH
64946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
6501102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      if (RegParm > 0 &&
6511102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (ParamType->isIntegerType() || ParamType->isPointerType())) {
6521102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        RegParm -=
6531102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          (Context.getTypeSize(ParamType) + PointerWidth - 1) / PointerWidth;
6541102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov        if (RegParm >= 0)
6551102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov          Attributes |= llvm::Attribute::InReg;
6561102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      }
6571102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov      // FIXME: handle sseregparm someday...
6588951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
6591102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov
66011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
66111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      // Skip increment, no matching LLVM parameter.
6621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      continue;
66311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
6645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
6651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      std::vector<const llvm::Type*> Tys;
666f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is rather inefficient. Do we ever actually need to do
667f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // anything here? The result should be just reconstructed on the other
668f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // side, so extension should be a non-issue.
6695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      getTypes().GetExpandedTypes(ParamType, Tys);
6705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      Index += Tys.size();
6715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
6725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
6735323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar    }
6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
675761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    if (Attributes)
676761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel      PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes));
6775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++Index;
6785323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar  }
679a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel  if (FuncAttrs)
680a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel    PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs));
6815323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar}
6825323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar
68388b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
68488b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar                                         llvm::Function *Fn,
68517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         const FunctionArgList &Args) {
6860cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  // If this is an implicit-return-zero function, go ahead and
6870cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  // initialize the return value.  TODO: it might be nice to have
6880cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  // a more general mechanism for this that didn't require synthesized
6890cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  // return statements.
69089ed31d3f9eeb8ec77c284a5cf404a74bf5e7acfAnders Carlsson  if (const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl)) {
6910cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall    if (FD->hasImplicitReturnZero()) {
6920cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall      QualType RetTy = FD->getResultType().getUnqualifiedType();
6930cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall      const llvm::Type* LLVMTy = CGM.getTypes().ConvertType(RetTy);
694c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson      llvm::Constant* Zero = llvm::Constant::getNullValue(LLVMTy);
6950cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall      Builder.CreateStore(Zero, ReturnValue);
6960cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall    }
6970cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall  }
6980cfeb63f532973777f6fe75d3468c3acad4adfe3John McCall
699f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from FunctionArgList; lift up and
700f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // simplify.
7015251afa21d3583f2740fd4f83659d008625a7260Daniel Dunbar
70217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Emit allocs for param decls.  Give the LLVM Argument nodes names.
70317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::Function::arg_iterator AI = Fn->arg_begin();
7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Name the struct return argument.
70688b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar  if (CGM.ReturnTypeUsesSret(FI)) {
70717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    AI->setName("agg.result");
70817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    ++AI;
70917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
7101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7114b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(FI.arg_size() == Args.size() &&
7124b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
713b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = FI.arg_begin();
71417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
715b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       i != e; ++i, ++info_it) {
71617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    const VarDecl *Arg = i->first;
717b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    QualType Ty = info_it->type;
718b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgI = info_it->info;
7198951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
7208951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    switch (ArgI.getKind()) {
7211f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    case ABIArgInfo::Indirect: {
7221f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      llvm::Value* V = AI;
7231f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
7241f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Do nothing, aggregates and complex variables are accessed by
7251f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // reference.
7261f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
7271f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Load scalar value from indirect argument.
728adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
7291f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
7301f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // This must be a promotion, for something like
7311f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          // "void a(x) short x; {..."
7321f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
7331f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        }
7341f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      EmitParmDecl(*Arg, V);
7361f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
7371f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar    }
738cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
739cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
74046327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct: {
7418951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
7428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      llvm::Value* V = AI;
7432fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      if (hasAggregateLLVMType(Ty)) {
7442fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // Create a temporary alloca to hold the argument; the rest of
7452fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // codegen expects to access aggregates & complex values by
7462fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        // reference.
747195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar        V = CreateMemTemp(Ty);
7482fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Builder.CreateStore(AI, V);
7492fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      } else {
750d8e10d26b5a24257fe13c289b653fd450326eeffJohn McCall        if (Arg->getType().isRestrictQualified())
751d8e10d26b5a24257fe13c289b653fd450326eeffJohn McCall          AI->addAttr(llvm::Attribute::NoAlias);
752d8e10d26b5a24257fe13c289b653fd450326eeffJohn McCall
7532fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
7542fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // This must be a promotion, for something like
7552fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          // "void a(x) short x; {..."
7562fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
7572fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        }
75817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar      }
7598951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      EmitParmDecl(*Arg, V);
7608951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
7618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand: {
764b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar      // If this structure was expanded into multiple arguments then
7655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // we need to create a temporary and reconstruct it from the
7665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // arguments.
767195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar      llvm::Value *Temp = CreateMemTemp(Ty, Arg->getName() + ".addr");
7685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // FIXME: What are the right qualifiers here?
7691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      llvm::Function::arg_iterator End =
7700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall        ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp, Qualifiers()), AI);
7715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      EmitParmDecl(*Arg, Temp);
7725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
7735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      // Name the arguments used in expansion and increment AI.
7745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      unsigned Index = 0;
7755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      for (; AI != End; ++AI, ++Index)
776259e9ccf882d11491ad149aec5e6d7a061c9f938Daniel Dunbar        AI->setName(Arg->getName() + "." + llvm::Twine(Index));
7775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      continue;
7785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    }
77911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
78011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
7818b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      // Initialize the local variable appropriately.
7821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (hasAggregateLLVMType(Ty)) {
783195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar        EmitParmDecl(*Arg, CreateMemTemp(Ty));
7848b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      } else {
7858b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar        EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType())));
7868b979d9e4c41fb67eb276996bdaa608fb4b11ccdDaniel Dunbar      }
7871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78859e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799Daniel Dunbar      // Skip increment, no matching LLVM parameter.
7891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      continue;
79011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
79189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
79289c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      assert(AI != Fn->arg_end() && "Argument mismatch!");
793f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // FIXME: This is very wasteful; EmitParmDecl is just going to drop the
794f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // result in a new alloca anyway, so we could just store into that
795f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump      // directly if we broke the abstraction down more.
796195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar      llvm::Value *V = CreateMemTemp(Ty, "coerce");
797d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      CreateCoercedStore(AI, V, /*DestIsVolatile=*/false, *this);
79889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // Match to what EmitParmDecl is expecting for this type.
7998b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      if (!CodeGenFunction::hasAggregateLLVMType(Ty)) {
800adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar        V = EmitLoadOfScalar(V, false, Ty);
8018b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
8028b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // This must be a promotion, for something like
8038b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          // "void a(x) short x; {..."
8048b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar          V = EmitScalarConversion(V, Ty, Arg->getType());
8058b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar        }
8068b29a387788bbb7a7c3b64c37473bc46299d2132Daniel Dunbar      }
80789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      EmitParmDecl(*Arg, V);
80889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
80989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
8108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    }
8115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
8125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    ++AI;
81317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
81417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  assert(AI == Fn->arg_end() && "Argument mismatch!");
81517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
81617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
81788b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
81817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar                                         llvm::Value *ReturnValue) {
8192c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  llvm::Value *RV = 0;
8202c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
8212c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  // Functions with no result always return void.
822cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  if (ReturnValue) {
82388b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel Dunbar    QualType RetTy = FI.getReturnType();
824b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &RetAI = FI.getReturnInfo();
825cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov
8262c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    switch (RetAI.getKind()) {
82711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
8283aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      if (RetTy->isAnyComplexType()) {
8293aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
8303aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar        StoreComplexToAddr(RT, CurFn->arg_begin(), false);
8313aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
832b17daf9ab790ae71aacad2cc4aa11cd8d86c25d1Eli Friedman        // Do nothing; aggregrates get evaluated directly into the destination.
8333aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      } else {
834cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov        EmitStoreOfScalar(Builder.CreateLoad(ReturnValue), CurFn->arg_begin(),
835b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson                          false, RetTy);
8363aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar      }
8372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
8388951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
839cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
84046327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
8412fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // The internal return value temp always will have
8422fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      // pointer-to-return-type type.
8432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      RV = Builder.CreateLoad(ReturnValue);
8442c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar      break;
8452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
84611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
84711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
8481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
849adc8bdd6ab6f4f90d16f696f16948e46acf66267Daniel Dunbar    case ABIArgInfo::Coerce:
85054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar      RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this);
8518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar      break;
8528951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
8538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar    case ABIArgInfo::Expand:
8541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(0 && "Invalid ABI kind for return argument");
85517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
85617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
8571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  if (RV) {
8592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRet(RV);
8602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  } else {
8612c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    Builder.CreateRetVoid();
8622c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  }
86317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
86417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
8652736071ea3a46f90e65c93418961611d96c10ab9John McCallRValue CodeGenFunction::EmitDelegateCallArg(const VarDecl *Param) {
8662736071ea3a46f90e65c93418961611d96c10ab9John McCall  // StartFunction converted the ABI-lowered parameter(s) into a
8672736071ea3a46f90e65c93418961611d96c10ab9John McCall  // local alloca.  We need to turn that into an r-value suitable
8682736071ea3a46f90e65c93418961611d96c10ab9John McCall  // for EmitCall.
8692736071ea3a46f90e65c93418961611d96c10ab9John McCall  llvm::Value *Local = GetAddrOfLocalVar(Param);
8702736071ea3a46f90e65c93418961611d96c10ab9John McCall
8712736071ea3a46f90e65c93418961611d96c10ab9John McCall  QualType ArgType = Param->getType();
8722736071ea3a46f90e65c93418961611d96c10ab9John McCall
8732736071ea3a46f90e65c93418961611d96c10ab9John McCall  // For the most part, we just need to load the alloca, except:
8742736071ea3a46f90e65c93418961611d96c10ab9John McCall  // 1) aggregate r-values are actually pointers to temporaries, and
8752736071ea3a46f90e65c93418961611d96c10ab9John McCall  // 2) references to aggregates are pointers directly to the aggregate.
8762736071ea3a46f90e65c93418961611d96c10ab9John McCall  // I don't know why references to non-aggregates are different here.
8772736071ea3a46f90e65c93418961611d96c10ab9John McCall  if (const ReferenceType *RefType = ArgType->getAs<ReferenceType>()) {
8782736071ea3a46f90e65c93418961611d96c10ab9John McCall    if (hasAggregateLLVMType(RefType->getPointeeType()))
8792736071ea3a46f90e65c93418961611d96c10ab9John McCall      return RValue::getAggregate(Local);
8802736071ea3a46f90e65c93418961611d96c10ab9John McCall
8812736071ea3a46f90e65c93418961611d96c10ab9John McCall    // Locals which are references to scalars are represented
8822736071ea3a46f90e65c93418961611d96c10ab9John McCall    // with allocas holding the pointer.
8832736071ea3a46f90e65c93418961611d96c10ab9John McCall    return RValue::get(Builder.CreateLoad(Local));
8842736071ea3a46f90e65c93418961611d96c10ab9John McCall  }
8852736071ea3a46f90e65c93418961611d96c10ab9John McCall
8862736071ea3a46f90e65c93418961611d96c10ab9John McCall  if (ArgType->isAnyComplexType())
8872736071ea3a46f90e65c93418961611d96c10ab9John McCall    return RValue::getComplex(LoadComplexFromAddr(Local, /*volatile*/ false));
8882736071ea3a46f90e65c93418961611d96c10ab9John McCall
8892736071ea3a46f90e65c93418961611d96c10ab9John McCall  if (hasAggregateLLVMType(ArgType))
8902736071ea3a46f90e65c93418961611d96c10ab9John McCall    return RValue::getAggregate(Local);
8912736071ea3a46f90e65c93418961611d96c10ab9John McCall
8922736071ea3a46f90e65c93418961611d96c10ab9John McCall  return RValue::get(EmitLoadOfScalar(Local, false, ArgType));
8932736071ea3a46f90e65c93418961611d96c10ab9John McCall}
8942736071ea3a46f90e65c93418961611d96c10ab9John McCall
8950139bb96494b4c4ba0824617d5d2495dc7e44c76Anders CarlssonRValue CodeGenFunction::EmitCallArg(const Expr *E, QualType ArgType) {
8964029ca7ae9d3ffd7738fe2ed8782bebc30f36fd6Anders Carlsson  if (ArgType->isReferenceType())
897a64a869312066ff6119d1d7ae03f88ce499e3f82Anders Carlsson    return EmitReferenceBindingToExpr(E);
8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8990139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson  return EmitAnyExprToTemp(E);
9000139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson}
9010139bb96494b4c4ba0824617d5d2495dc7e44c76Anders Carlsson
90288b5396b0897f28d22ae3debf4a0d97b33b6c362Daniel DunbarRValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 llvm::Value *Callee,
904f3c47c9525153aea2de0ec4bd615b9cf2d81c103Anders Carlsson                                 ReturnValueSlot ReturnValue,
905c0ef9f59937c3971c48b6fed37cf5bd8985c024bDaniel Dunbar                                 const CallArgList &CallArgs,
906dd5c98f709837e5dd3da08d44d1ce407975df2cfDavid Chisnall                                 const Decl *TargetDecl,
9074b02afcb45cd1a384de7d45f440a8be091dd500bDavid Chisnall                                 llvm::Instruction **callOrInvoke) {
908f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: We no longer need the types from CallArgs; lift up and simplify.
90917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  llvm::SmallVector<llvm::Value*, 16> Args;
91017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
91117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // Handle struct-return functions by passing a pointer to the
91217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  // location that we would like to return into.
913bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar  QualType RetTy = CallInfo.getReturnType();
914b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  const ABIArgInfo &RetAI = CallInfo.getReturnInfo();
9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9175db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // If the call returns a temporary with struct return, create a temporary
918d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson  // alloca to hold the result, unless one is given to us.
919d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson  if (CGM.ReturnTypeUsesSret(CallInfo)) {
920d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    llvm::Value *Value = ReturnValue.getValue();
921d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    if (!Value)
922195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar      Value = CreateMemTemp(RetTy);
923d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    Args.push_back(Value);
924d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson  }
9251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9264b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar  assert(CallInfo.arg_size() == CallArgs.size() &&
9274b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar         "Mismatch between function signature & arguments.");
928b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar  CGFunctionInfo::const_arg_iterator info_it = CallInfo.arg_begin();
9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
930b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar       I != E; ++I, ++info_it) {
931b225be44aaab85a603e80dbe0eb3d81638b20d23Daniel Dunbar    const ABIArgInfo &ArgInfo = info_it->info;
93217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    RValue RV = I->first;
9335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar
9345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    switch (ArgInfo.getKind()) {
93511e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    case ABIArgInfo::Indirect:
9361f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      if (RV.isScalar() || RV.isComplex()) {
9371f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        // Make a temporary alloca to pass the argument.
938195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar        Args.push_back(CreateMemTemp(I->second));
9391f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        if (RV.isScalar())
940b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson          EmitStoreOfScalar(RV.getScalarVal(), Args.back(), false, I->second);
9411f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        else
9421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
9431f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      } else {
9441f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar        Args.push_back(RV.getAggregateAddr());
9451f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      }
9461f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar      break;
9471f7459814ed78067a8f0db3e1082b45ec89c16abDaniel Dunbar
948cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    case ABIArgInfo::Extend:
94946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    case ABIArgInfo::Direct:
9505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      if (RV.isScalar()) {
9515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar        Args.push_back(RV.getScalarVal());
9525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else if (RV.isComplex()) {
9532fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        llvm::Value *Tmp = llvm::UndefValue::get(ConvertType(I->second));
9542fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().first, 0);
9552fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Tmp = Builder.CreateInsertValue(Tmp, RV.getComplexVal().second, 1);
9562fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Tmp);
9575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      } else {
9582fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar        Args.push_back(Builder.CreateLoad(RV.getAggregateAddr()));
9595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      }
9605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
9611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
96211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar    case ABIArgInfo::Ignore:
96311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar      break;
96411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
96589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    case ABIArgInfo::Coerce: {
96689c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      // FIXME: Avoid the conversion through memory if possible.
96789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      llvm::Value *SrcPtr;
96889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      if (RV.isScalar()) {
969195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar        SrcPtr = CreateMemTemp(I->second, "coerce");
970b4aa4664ec851573624a7a29c6c750fc1d5cc268Anders Carlsson        EmitStoreOfScalar(RV.getScalarVal(), SrcPtr, false, I->second);
97189c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      } else if (RV.isComplex()) {
972195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar        SrcPtr = CreateMemTemp(I->second, "coerce");
97389c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        StoreComplexToAddr(RV.getComplexVal(), SrcPtr, false);
9741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      } else
97589c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar        SrcPtr = RV.getAggregateAddr();
9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Args.push_back(CreateCoercedLoad(SrcPtr, ArgInfo.getCoerceToType(),
97789c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar                                       *this));
97889c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar      break;
97989c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar    }
98089c9d8e7f0700d27b1d93dc3832eb1af9b92c221Daniel Dunbar
9815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar    case ABIArgInfo::Expand:
9825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      ExpandTypeToArgs(I->second, RV, Args);
9835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      break;
98417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    }
98517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
9861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9875db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // If the callee is a bitcast of a function to a varargs pointer to function
9885db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // type, check to see if we can remove the bitcast.  This handles some cases
9895db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  // with unprototyped functions.
9905db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner  if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Callee))
9915db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner    if (llvm::Function *CalleeF = dyn_cast<llvm::Function>(CE->getOperand(0))) {
9925db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::PointerType *CurPT=cast<llvm::PointerType>(Callee->getType());
9935db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::FunctionType *CurFT =
9945db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        cast<llvm::FunctionType>(CurPT->getElementType());
9955db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      const llvm::FunctionType *ActualFT = CalleeF->getFunctionType();
9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9975db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      if (CE->getOpcode() == llvm::Instruction::BitCast &&
9985db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          ActualFT->getReturnType() == CurFT->getReturnType() &&
999d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner          ActualFT->getNumParams() == CurFT->getNumParams() &&
1000d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner          ActualFT->getNumParams() == Args.size()) {
10015db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        bool ArgsMatch = true;
10025db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        for (unsigned i = 0, e = ActualFT->getNumParams(); i != e; ++i)
10035db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          if (ActualFT->getParamType(i) != CurFT->getParamType(i)) {
10045db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner            ArgsMatch = false;
10055db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner            break;
10065db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          }
10071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10085db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // Strip the cast if we can get away with it.  This is a nice cleanup,
10095db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // but also allows us to inline the function at -O0 if it is marked
10105db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        // always_inline.
10115db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner        if (ArgsMatch)
10125db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner          Callee = CalleeF;
10135db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner      }
10145db7ae59bb0115ccc420ff1d688abc8706559b57Chris Lattner    }
10151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
101617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar
10179834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::BasicBlock *InvokeDest = getInvokeDest();
1018ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar  unsigned CallingConv;
1019761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  CodeGen::AttributeListType AttributeList;
1020ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar  CGM.ConstructAttributeList(CallInfo, TargetDecl, AttributeList, CallingConv);
10219834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  llvm::AttrListPtr Attrs = llvm::AttrListPtr::get(AttributeList.begin(),
10229834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar                                                   AttributeList.end());
10231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1024d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::CallSite CS;
1025d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (!InvokeDest || (Attrs.getFnAttributes() & llvm::Attribute::NoUnwind)) {
1026beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad    CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size());
10279834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar  } else {
10289834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    llvm::BasicBlock *Cont = createBasicBlock("invoke.cont");
10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CS = Builder.CreateInvoke(Callee, Cont, InvokeDest,
1030beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad                              Args.data(), Args.data()+Args.size());
10319834ffbe54788239c8361d3cfe5826fd277ddfb2Daniel Dunbar    EmitBlock(Cont);
1032f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar  }
10334b02afcb45cd1a384de7d45f440a8be091dd500bDavid Chisnall  if (callOrInvoke) {
10344b02afcb45cd1a384de7d45f440a8be091dd500bDavid Chisnall    *callOrInvoke = CS.getInstruction();
1035dd5c98f709837e5dd3da08d44d1ce407975df2cfDavid Chisnall  }
1036f4fe0f082f21048c0777ad5aeac04a5a94db1f46Daniel Dunbar
1037d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  CS.setAttributes(Attrs);
1038ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar  CS.setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
1039d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
1040d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // If the call doesn't return, finish the basic block and clear the
1041d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // insertion point; this allows the rest of IRgen to discard
1042d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  // unreachable code.
1043d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  if (CS.doesNotReturn()) {
1044d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.CreateUnreachable();
1045d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    Builder.ClearInsertionPoint();
10461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1047f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // FIXME: For now, emit a dummy basic block because expr emitters in
1048f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // generally are not ready to handle emitting expressions at unreachable
1049f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump    // points.
1050d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    EnsureInsertPoint();
10511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1052d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    // Return a reasonable RValue.
1053d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar    return GetUndefRValue(RetTy);
10541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1055d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar
1056d14151d5f52fa9048d41d7539299243e05755ec4Daniel Dunbar  llvm::Instruction *CI = CS.getInstruction();
1057ffbb15e54a6dc120087003d1e42448b8705bd58aBenjamin Kramer  if (Builder.isNamePreserving() && !CI->getType()->isVoidTy())
105817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar    CI->setName("call");
10592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
10602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  switch (RetAI.getKind()) {
106111e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar  case ABIArgInfo::Indirect:
10622c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar    if (RetTy->isAnyComplexType())
10635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
10643403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
10655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar      return RValue::getAggregate(Args[0]);
10663403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(EmitLoadOfScalar(Args[0], false, RetTy));
10678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
1068cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov  case ABIArgInfo::Extend:
106946327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar  case ABIArgInfo::Direct:
10702fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar    if (RetTy->isAnyComplexType()) {
10712fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Real = Builder.CreateExtractValue(CI, 0);
10722fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      llvm::Value *Imag = Builder.CreateExtractValue(CI, 1);
10732fbf2f547cf23c0dd89719c2b5c5d6c6f0fa469cDaniel Dunbar      return RValue::getComplex(std::make_pair(Real, Imag));
10743403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
10753403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
1076d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      llvm::Value *DestPtr = ReturnValue.getValue();
1077d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      bool DestIsVolatile = ReturnValue.isVolatile();
1078d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson
1079d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      if (!DestPtr) {
1080195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar        DestPtr = CreateMemTemp(RetTy, "agg.tmp");
1081d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson        DestIsVolatile = false;
1082d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      }
1083d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      Builder.CreateStore(CI, DestPtr, DestIsVolatile);
1084d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      return RValue::getAggregate(DestPtr);
10853403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    }
10863403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    return RValue::get(CI);
10872c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
108811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar  case ABIArgInfo::Ignore:
10890bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // If we are ignoring an argument that had a result, make sure to
10900bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    // construct the appropriate return value for our caller.
109113e81737a433b23f8c662d10d1d57356122a8caaDaniel Dunbar    return GetUndefRValue(RetTy);
109211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar
1093639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  case ABIArgInfo::Coerce: {
1094d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    llvm::Value *DestPtr = ReturnValue.getValue();
1095d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    bool DestIsVolatile = ReturnValue.isVolatile();
1096d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson
1097d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    if (!DestPtr) {
1098195337d2e5d4625ae9dc1328c7cdbc7115b0261bDaniel Dunbar      DestPtr = CreateMemTemp(RetTy, "coerce");
1099d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      DestIsVolatile = false;
1100d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    }
1101d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson
1102d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    CreateCoercedStore(CI, DestPtr, DestIsVolatile, *this);
1103ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson    if (RetTy->isAnyComplexType())
1104d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      return RValue::getComplex(LoadComplexFromAddr(DestPtr, false));
11053403084886b3d0fc23eee2b5708f0ac0329423e0Chris Lattner    if (CodeGenFunction::hasAggregateLLVMType(RetTy))
1106d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson      return RValue::getAggregate(DestPtr);
1107d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson    return RValue::get(EmitLoadOfScalar(DestPtr, false, RetTy));
1108639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar  }
11098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar
11108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar  case ABIArgInfo::Expand:
11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(0 && "Invalid ABI kind for return argument");
111217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar  }
11132c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar
11142c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  assert(0 && "Unhandled ABIArgInfo::Kind");
11152c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar  return RValue::get(0);
111617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar}
1117b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
1118b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar/* VarArg handling */
1119b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar
1120b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbarllvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty) {
1121b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar  return CGM.getTypes().getABIInfo().EmitVAArg(VAListAddr, Ty, *this);
1122b4094ea09eee7d3a847cadf181a81efc99003dafDaniel Dunbar}
1123