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